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

#ifndef __gnu_xml_dom_DomNode__
#define __gnu_xml_dom_DomNode__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace dom
      {
          class DomDocument;
          class DomEvent;
          class DomEvent$DomMutationEvent;
          class DomNode;
          class DomNode$ListenerRecord;
      }
    }
  }
  namespace org
  {
    namespace w3c
    {
      namespace dom
      {
          class Document;
          class NamedNodeMap;
          class Node;
          class NodeList;
          class UserDataHandler;
        namespace events
        {
            class Event;
            class EventListener;
        }
      }
    }
  }
}

class gnu::xml::dom::DomNode : public ::java::lang::Object
{

public:
  virtual void compact();
public: // actually protected
  DomNode(jshort, ::gnu::xml::dom::DomDocument *);
public:
  virtual ::org::w3c::dom::NamedNodeMap * getAttributes();
  virtual jboolean hasAttributes();
  virtual ::org::w3c::dom::NodeList * getChildNodes();
  virtual ::org::w3c::dom::Node * getFirstChild();
  virtual ::org::w3c::dom::Node * getLastChild();
  virtual jboolean hasChildNodes();
  virtual jboolean isReadonly();
  virtual void makeReadonly();
public: // actually package-private
  virtual void setOwner(::gnu::xml::dom::DomDocument *);
private:
  void checkMisc(::gnu::xml::dom::DomNode *);
  void insertionEvent(::gnu::xml::dom::DomEvent$DomMutationEvent *, ::gnu::xml::dom::DomNode *);
  void removalEvent(::gnu::xml::dom::DomEvent$DomMutationEvent *, ::gnu::xml::dom::DomNode *);
  static ::gnu::xml::dom::DomEvent$DomMutationEvent * getMutationEvent();
  static void freeMutationEvent();
public: // actually package-private
  virtual void setDepth(jint);
public:
  virtual ::org::w3c::dom::Node * appendChild(::org::w3c::dom::Node *);
  virtual ::org::w3c::dom::Node * insertBefore(::org::w3c::dom::Node *, ::org::w3c::dom::Node *);
  virtual ::org::w3c::dom::Node * replaceChild(::org::w3c::dom::Node *, ::org::w3c::dom::Node *);
  virtual ::org::w3c::dom::Node * removeChild(::org::w3c::dom::Node *);
  virtual ::org::w3c::dom::Node * item(jint);
  virtual jint getLength();
  virtual void trimToSize();
  virtual ::org::w3c::dom::Node * getNextSibling();
  virtual ::org::w3c::dom::Node * getPreviousSibling();
  virtual ::org::w3c::dom::Node * getParentNode();
  virtual jboolean isSupported(::java::lang::String *, ::java::lang::String *);
  virtual ::org::w3c::dom::Document * getOwnerDocument();
  virtual void setNodeValue(::java::lang::String *);
  virtual ::java::lang::String * getNodeValue();
  virtual jshort getNodeType();
  virtual ::java::lang::String * getNodeName() = 0;
  virtual void setPrefix(::java::lang::String *);
  virtual ::java::lang::String * getPrefix();
  virtual ::java::lang::String * getNamespaceURI();
  virtual ::java::lang::String * getLocalName();
  virtual ::org::w3c::dom::Node * cloneNode(jboolean);
private:
  ::gnu::xml::dom::DomNode * cloneNodeDeepInternal(jboolean, ::gnu::xml::dom::DomDocument *);
public: // actually package-private
  virtual void notifyUserDataHandlers(jshort, ::org::w3c::dom::Node *, ::org::w3c::dom::Node *);
public:
  virtual ::java::lang::Object * clone();
  virtual ::org::w3c::dom::NodeList * getElementsByTagName(::java::lang::String *);
  virtual ::org::w3c::dom::NodeList * getElementsByTagNameNS(::java::lang::String *, ::java::lang::String *);
  virtual ::org::w3c::dom::events::Event * createEvent(::java::lang::String *);
  virtual void addEventListener(::java::lang::String *, ::org::w3c::dom::events::EventListener *, jboolean);
  virtual jboolean dispatchEvent(::org::w3c::dom::events::Event *);
private:
  void notifyNode(::gnu::xml::dom::DomEvent *, ::gnu::xml::dom::DomNode *, jboolean, JArray< ::gnu::xml::dom::DomNode$ListenerRecord * > *);
public:
  virtual void removeEventListener(::java::lang::String *, ::org::w3c::dom::events::EventListener *, jboolean);
  virtual void normalize();
  virtual jboolean nameAndTypeEquals(::org::w3c::dom::Node *);
  virtual ::java::lang::String * getBaseURI();
  virtual jshort compareDocumentPosition(::org::w3c::dom::Node *);
  virtual jint compareTo(::java::lang::Object *);
public: // actually package-private
  virtual jint compareTo2(::gnu::xml::dom::DomNode *, ::gnu::xml::dom::DomNode *);
public:
  virtual ::java::lang::String * getTextContent();
public: // actually package-private
  virtual ::java::lang::String * getTextContent(jboolean);
public:
  virtual void setTextContent(::java::lang::String *);
  virtual jboolean isSameNode(::org::w3c::dom::Node *);
  virtual ::java::lang::String * lookupPrefix(::java::lang::String *);
  virtual jboolean isDefaultNamespace(::java::lang::String *);
  virtual ::java::lang::String * lookupNamespaceURI(::java::lang::String *);
  virtual jboolean isEqualNode(::org::w3c::dom::Node *);
public: // actually package-private
  virtual jboolean equal(::java::lang::String *, ::java::lang::String *);
public:
  virtual ::java::lang::Object * getFeature(::java::lang::String *, ::java::lang::String *);
  virtual ::java::lang::Object * setUserData(::java::lang::String *, ::java::lang::Object *, ::org::w3c::dom::UserDataHandler *);
  virtual ::java::lang::Object * getUserData(::java::lang::String *);
  virtual ::java::lang::String * toString();
public: // actually package-private
  virtual ::java::lang::String * encode(::java::lang::String *);
  virtual ::java::lang::String * nodeTypeToString(jshort);
public:
  virtual void list(::java::io::PrintStream *, jint);
private:
  static const jint NKIDS_DELTA = 8;
  static const jint ANCESTORS_INIT = 20;
  static const jint NOTIFICATIONS_INIT = 10;
public: // actually package-private
  static const jboolean reportMutations = 1;
private:
  static ::java::lang::Object * lockNode;
  static jboolean dispatchDataLock;
  static JArray< ::gnu::xml::dom::DomNode * > * ancestors;
  static JArray< ::gnu::xml::dom::DomNode$ListenerRecord * > * notificationSet;
  static jboolean eventDataLock;
  static ::gnu::xml::dom::DomEvent$DomMutationEvent * mutationEvent;
public: // actually package-private
  ::gnu::xml::dom::DomDocument * __attribute__((aligned(__alignof__( ::java::lang::Object)))) owner;
  ::gnu::xml::dom::DomNode * parent;
  ::gnu::xml::dom::DomNode * previous;
  ::gnu::xml::dom::DomNode * next;
  ::gnu::xml::dom::DomNode * first;
  ::gnu::xml::dom::DomNode * last;
  jint index;
  jint depth;
  jint length;
  jshort nodeType;
  jboolean readonly;
private:
  ::java::util::HashSet * listeners;
  jint nListeners;
  ::java::util::HashMap * userData;
  ::java::util::HashMap * userDataHandlers;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_dom_DomNode__
