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

#ifndef __gnu_xml_dom_ls_DomLSParser__
#define __gnu_xml_dom_ls_DomLSParser__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace dom
      {
        namespace ls
        {
            class DomLSParser;
            class SAXEventSink;
        }
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace parsers
      {
          class SAXParserFactory;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class DOMConfiguration;
          class DOMStringList;
          class Document;
          class Node;
        namespace ls
        {
            class LSInput;
            class LSParserFilter;
        }
      }
    }
    namespace xml
    {
      namespace sax
      {
          class EntityResolver;
          class ErrorHandler;
          class InputSource;
          class SAXParseException;
          class XMLReader;
      }
    }
  }
}

class gnu::xml::dom::ls::DomLSParser : public ::java::lang::Object
{

public:
  DomLSParser(jshort, ::java::lang::String *);
  virtual ::org::w3c::dom::DOMConfiguration * getDomConfig();
  virtual ::org::w3c::dom::ls::LSParserFilter * getFilter();
  virtual void setFilter(::org::w3c::dom::ls::LSParserFilter *);
  virtual jboolean getAsync();
  virtual jboolean getBusy();
  virtual ::org::w3c::dom::Document * parse(::org::w3c::dom::ls::LSInput *);
  virtual ::org::w3c::dom::Document * parseURI(::java::lang::String *);
  virtual ::org::w3c::dom::Node * parseWithContext(::org::w3c::dom::ls::LSInput *, ::org::w3c::dom::Node *, jshort);
  virtual void abort();
private:
  ::org::w3c::dom::Document * doParse(::org::w3c::dom::ls::LSInput *);
  ::org::xml::sax::XMLReader * getXMLReader();
  ::org::xml::sax::InputSource * getInputSource(::org::w3c::dom::ls::LSInput *);
public:
  virtual void setParameter(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::lang::Object * getParameter(::java::lang::String *);
  virtual jboolean canSetParameter(::java::lang::String *, ::java::lang::Object *);
  virtual ::org::w3c::dom::DOMStringList * getParameterNames();
  virtual ::java::lang::String * item(jint);
  virtual jint getLength();
  virtual jboolean contains(::java::lang::String *);
  virtual void warning(::org::xml::sax::SAXParseException *);
  virtual void error(::org::xml::sax::SAXParseException *);
  virtual void fatalError(::org::xml::sax::SAXParseException *);
private:
  static ::java::util::List * SUPPORTED_PARAMETERS;
  ::org::w3c::dom::ls::LSParserFilter * __attribute__((aligned(__alignof__( ::java::lang::Object)))) filter;
  jboolean async;
  ::java::lang::String * schemaType;
  ::gnu::xml::dom::ls::SAXEventSink * eventSink;
  ::javax::xml::parsers::SAXParserFactory * factory;
  ::org::xml::sax::XMLReader * reader;
  jboolean namespaceAware;
  jboolean ignoreWhitespace;
  jboolean expandEntityReferences;
  jboolean ignoreComments;
  jboolean coalescing;
  jboolean validating;
  jboolean xIncludeAware;
  ::org::xml::sax::EntityResolver * entityResolver;
  ::org::xml::sax::ErrorHandler * errorHandler;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_dom_ls_DomLSParser__
