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

#ifndef __gnu_java_beans_decoder_PersistenceParser__
#define __gnu_java_beans_decoder_PersistenceParser__

#pragma interface

#include <org/xml/sax/helpers/DefaultHandler.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace beans
      {
        namespace decoder
        {
            class Context;
            class ElementHandler;
            class JavaHandler;
            class PersistenceParser;
        }
      }
    }
  }
  namespace java
  {
    namespace beans
    {
        class ExceptionListener;
        class XMLDecoder;
    }
  }
  namespace org
  {
    namespace xml
    {
      namespace sax
      {
          class Attributes;
      }
    }
  }
}

class gnu::java::beans::decoder::PersistenceParser : public ::org::xml::sax::helpers::DefaultHandler
{

public:
  PersistenceParser(::java::io::InputStream *, ::java::beans::ExceptionListener *, ::java::lang::ClassLoader *, ::java::beans::XMLDecoder *);
  virtual void startElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *, ::org::xml::sax::Attributes *);
  virtual void endElement(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual void characters(JArray< jchar > *, jint, jint);
  virtual void addParameterObject(::java::lang::Object *);
  virtual void notifyStatement(::gnu::java::beans::decoder::Context *);
  virtual ::java::lang::Object * endContext(::gnu::java::beans::decoder::Context *);
  virtual jboolean subContextFailed();
  virtual void set(jint, ::java::lang::Object *);
  virtual ::java::lang::Object * get(jint);
  virtual ::java::lang::Object * getResult();
  virtual void setId(::java::lang::String *);
  virtual ::java::lang::String * getId();
  virtual jboolean isStatement();
  virtual void setStatement(jboolean);
  virtual ::java::util::Iterator * iterator();
private:
  ::java::beans::ExceptionListener * __attribute__((aligned(__alignof__( ::org::xml::sax::helpers::DefaultHandler)))) exceptionListener;
  jint skipElement;
  ::java::util::HashMap * handlerCreators;
  ::gnu::java::beans::decoder::ElementHandler * currentHandler;
public: // actually package-private
  ::gnu::java::beans::decoder::JavaHandler * javaHandler;
private:
  ::java::util::List * objects;
  ::java::beans::XMLDecoder * decoder;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_beans_decoder_PersistenceParser__
