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

#ifndef __gnu_xml_validation_xmlschema_XMLSchemaBuilder__
#define __gnu_xml_validation_xmlschema_XMLSchemaBuilder__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace validation
      {
        namespace datatype
        {
            class Annotation;
            class SimpleType;
            class Type;
        }
        namespace xmlschema
        {
            class AnyAttribute;
            class ComplexType;
            class ElementDeclaration;
            class XMLSchema;
            class XMLSchemaBuilder;
        }
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace namespace
      {
          class QName;
      }
    }
  }
  namespace org
  {
    namespace relaxng
    {
      namespace datatype
      {
          class DatatypeLibrary;
      }
    }
    namespace w3c
    {
      namespace dom
      {
          class NamedNodeMap;
          class Node;
      }
    }
  }
}

class gnu::xml::validation::xmlschema::XMLSchemaBuilder : public ::java::lang::Object
{

public: // actually package-private
  XMLSchemaBuilder();
  virtual void parseSchema(::org::w3c::dom::Node *);
  virtual void parseTopLevelElement(::org::w3c::dom::Node *);
  virtual ::java::lang::Object * parseAttribute(::org::w3c::dom::Node *, jboolean);
  virtual jint parseFullDerivationSet(::java::lang::String *);
  virtual jint parseSimpleTypeDerivationSet(::java::lang::String *);
  virtual jint parseComplexTypeDerivationSet(::java::lang::String *);
  virtual jint parseBlockSet(::java::lang::String *);
  virtual jint parseComplexTypeBlockSet(::java::lang::String *);
  virtual ::java::lang::Object * parseElement(::org::w3c::dom::Node *, ::gnu::xml::validation::xmlschema::ElementDeclaration *);
  virtual ::java::lang::Integer * getOccurrence(::java::lang::String *);
  virtual ::gnu::xml::validation::datatype::SimpleType * parseSimpleType(::javax::xml::namespace::QName *);
  virtual ::gnu::xml::validation::datatype::SimpleType * parseSimpleType(::org::w3c::dom::Node *);
  virtual ::gnu::xml::validation::datatype::Type * parseComplexType(::org::w3c::dom::Node *, ::gnu::xml::validation::xmlschema::ElementDeclaration *);
  virtual void parseSimpleContent(::org::w3c::dom::Node *, ::gnu::xml::validation::xmlschema::ComplexType *);
  virtual void parseRestriction(::org::w3c::dom::Node *, ::gnu::xml::validation::xmlschema::ComplexType *);
  virtual void parseExtension(::org::w3c::dom::Node *, ::gnu::xml::validation::xmlschema::ComplexType *);
  virtual ::gnu::xml::validation::xmlschema::AnyAttribute * parseAnyAttribute(::org::w3c::dom::Node *);
  virtual ::gnu::xml::validation::datatype::Annotation * parseAnnotation(::org::w3c::dom::Node *);
private:
  static ::java::lang::String * getAttribute(::org::w3c::dom::NamedNodeMap *, ::java::lang::String *);
  static ::javax::xml::namespace::QName * asQName(::java::lang::String *, ::org::w3c::dom::Node *);
public: // actually package-private
  ::gnu::xml::validation::xmlschema::XMLSchema * __attribute__((aligned(__alignof__( ::java::lang::Object)))) schema;
  ::org::relaxng::datatype::DatatypeLibrary * typeLibrary;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_validation_xmlschema_XMLSchemaBuilder__
