
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_net_URI__
#define __java_net_URI__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace lang
      {
          class CPStringBuilder;
      }
    }
  }
  namespace java
  {
    namespace net
    {
        class URI;
        class URL;
    }
  }
}

class java::net::URI : public ::java::lang::Object
{

  void readObject(::java::io::ObjectInputStream *);
  void writeObject(::java::io::ObjectOutputStream *);
  static ::java::lang::String * getURIGroup(::java::util::regex::Matcher *, jint);
  void parseURI(::java::lang::String *);
  static ::java::lang::String * unquote(::java::lang::String *);
  static ::java::lang::String * quote(::java::lang::String *);
  static ::java::lang::String * quoteAuthority(::java::lang::String *);
  static ::java::lang::String * quote(::java::lang::String *, ::java::lang::String *);
  static ::java::lang::String * quoteHost(::java::lang::String *);
  static ::java::lang::String * quotePath(::java::lang::String *);
  static ::java::lang::String * quoteUserInfo(::java::lang::String *);
public:
  URI(::java::lang::String *);
  URI(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, jint, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  URI(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  URI(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  URI(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  static ::java::net::URI * create(::java::lang::String *);
  ::java::net::URI * parseServerAuthority();
  ::java::net::URI * normalize();
private:
  ::java::lang::String * normalizePath(::java::lang::String *);
  void removeLastSegment(::gnu::java::lang::CPStringBuilder *);
public:
  ::java::net::URI * resolve(::java::net::URI *);
  ::java::net::URI * resolve(::java::lang::String *);
  ::java::net::URI * relativize(::java::net::URI *);
  ::java::net::URL * toURL();
  ::java::lang::String * getScheme();
  jboolean isAbsolute();
  jboolean isOpaque();
  ::java::lang::String * getRawSchemeSpecificPart();
  ::java::lang::String * getSchemeSpecificPart();
  ::java::lang::String * getRawAuthority();
  ::java::lang::String * getAuthority();
  ::java::lang::String * getRawUserInfo();
  ::java::lang::String * getUserInfo();
  ::java::lang::String * getHost();
  jint getPort();
  ::java::lang::String * getRawPath();
  ::java::lang::String * getPath();
  ::java::lang::String * getRawQuery();
  ::java::lang::String * getQuery();
  ::java::lang::String * getRawFragment();
  ::java::lang::String * getFragment();
  jboolean equals(::java::lang::Object *);
  jint hashCode();
  jint URI$compareTo(::java::net::URI *);
private:
  jint compareFragments(::java::net::URI *);
public:
  ::java::lang::String * toString();
  ::java::lang::String * toASCIIString();
private:
  static ::java::lang::String * escapeCharacters(::java::lang::String *);
public:
  jint compareTo(::java::lang::Object *);
public: // actually package-private
  static const jlong serialVersionUID = -6052424284110960213LL;
private:
  static ::java::lang::String * URI_REGEXP;
  static ::java::lang::String * AUTHORITY_REGEXP;
  static ::java::lang::String * RFC2396_DIGIT;
  static ::java::lang::String * RFC2396_LOWALPHA;
  static ::java::lang::String * RFC2396_UPALPHA;
  static ::java::lang::String * RFC2396_ALPHA;
  static ::java::lang::String * RFC2396_ALPHANUM;
  static ::java::lang::String * RFC3986_UNRESERVED;
  static ::java::lang::String * RFC3986_SUBDELIMS;
  static ::java::lang::String * RFC3986_REG_NAME;
  static ::java::lang::String * RFC3986_PCHAR;
  static ::java::lang::String * RFC3986_SEGMENT;
  static ::java::lang::String * RFC3986_PATH_SEGMENTS;
  static ::java::lang::String * RFC3986_SSP;
  static ::java::lang::String * RFC3986_HOST;
  static ::java::lang::String * RFC3986_USERINFO;
  static const jint SCHEME_GROUP = 2;
  static const jint SCHEME_SPEC_PART_GROUP = 3;
  static const jint AUTHORITY_GROUP = 5;
  static const jint PATH_GROUP = 6;
  static const jint QUERY_GROUP = 8;
  static const jint FRAGMENT_GROUP = 10;
  static const jint AUTHORITY_USERINFO_GROUP = 2;
  static const jint AUTHORITY_HOST_GROUP = 3;
  static const jint AUTHORITY_PORT_GROUP = 5;
  static ::java::util::regex::Pattern * URI_PATTERN;
  static ::java::util::regex::Pattern * AUTHORITY_PATTERN;
  static ::java::lang::String * HEX;
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) scheme;
  ::java::lang::String * rawSchemeSpecificPart;
  ::java::lang::String * schemeSpecificPart;
  ::java::lang::String * rawAuthority;
  ::java::lang::String * authority;
  ::java::lang::String * rawUserInfo;
  ::java::lang::String * userInfo;
  ::java::lang::String * rawHost;
  ::java::lang::String * host;
  jint port;
  ::java::lang::String * rawPath;
  ::java::lang::String * path;
  ::java::lang::String * rawQuery;
  ::java::lang::String * query;
  ::java::lang::String * rawFragment;
  ::java::lang::String * fragment;
  ::java::lang::String * string;
public:
  static ::java::lang::Class class$;
};

#endif // __java_net_URI__
