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

#ifndef __gnu_xml_validation_xmlschema_XMLSchemaValidatorHandler__
#define __gnu_xml_validation_xmlschema_XMLSchemaValidatorHandler__

#pragma interface

#include <javax/xml/validation/ValidatorHandler.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace validation
      {
        namespace datatype
        {
            class Type;
        }
        namespace xmlschema
        {
            class XMLSchema;
            class XMLSchemaValidatorHandler;
        }
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace validation
      {
          class TypeInfoProvider;
      }
    }
  }
  namespace org
  {
    namespace relaxng
    {
      namespace datatype
      {
          class DatatypeLibrary;
      }
    }
    namespace w3c
    {
      namespace dom
      {
          class TypeInfo;
        namespace ls
        {
            class LSResourceResolver;
        }
      }
    }
    namespace xml
    {
      namespace sax
      {
          class Attributes;
          class ContentHandler;
          class ErrorHandler;
          class Locator;
        namespace helpers
        {
            class NamespaceSupport;
        }
      }
    }
  }
}

class gnu::xml::validation::xmlschema::XMLSchemaValidatorHandler : public ::javax::xml::validation::ValidatorHandler
{

public: // actually package-private
  XMLSchemaValidatorHandler(::gnu::xml::validation::xmlschema::XMLSchema *);
public:
  ::org::xml::sax::ContentHandler * getContentHandler();
  void setContentHandler(::org::xml::sax::ContentHandler *);
  ::org::xml::sax::ErrorHandler * getErrorHandler();
  void setErrorHandler(::org::xml::sax::ErrorHandler *);
  ::org::w3c::dom::ls::LSResourceResolver * getResourceResolver();
  void setResourceResolver(::org::w3c::dom::ls::LSResourceResolver *);
  ::javax::xml::validation::TypeInfoProvider * getTypeInfoProvider();
public: // actually package-private
  ::org::w3c::dom::TypeInfo * getElementTypeInfo();
  ::org::w3c::dom::TypeInfo * getAttributeTypeInfo(jint);
  jboolean isIdAttribute(jint);
  jboolean isSpecified(jint);
public:
  void setDocumentLocator(::org::xml::sax::Locator *);
  void startDocument();
  void endDocument();
  void startPrefixMapping(::java::lang::String *, ::java::lang::String *);
  void endPrefixMapping(::java::lang::String *);
  void startElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::org::xml::sax::Attributes *);
  void endElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  void characters(JArray< jchar > *, jint, jint);
  void ignorableWhitespace(JArray< jchar > *, jint, jint);
  void processingInstruction(::java::lang::String *, ::java::lang::String *);
  void skippedEntity(::java::lang::String *);
public: // actually package-private
  ::gnu::xml::validation::datatype::Type * resolveType(::java::lang::String *);
  ::gnu::xml::validation::xmlschema::XMLSchema * __attribute__((aligned(__alignof__( ::javax::xml::validation::ValidatorHandler)))) schema;
  ::javax::xml::validation::TypeInfoProvider * typeInfoProvider;
  ::org::xml::sax::helpers::NamespaceSupport * namespaceSupport;
  ::org::relaxng::datatype::DatatypeLibrary * typeLibrary;
  ::org::xml::sax::Locator * loc;
  ::org::xml::sax::ContentHandler * contentHandler;
  ::org::xml::sax::ErrorHandler * errorHandler;
  ::org::w3c::dom::ls::LSResourceResolver * resourceResolver;
  ::java::util::LinkedList * context;
  ::java::util::ArrayList * attributes;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_validation_xmlschema_XMLSchemaValidatorHandler__
