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

#ifndef __gnu_java_beans_decoder_AbstractElementHandler__
#define __gnu_java_beans_decoder_AbstractElementHandler__

#pragma interface

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

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

class gnu::java::beans::decoder::AbstractElementHandler : public ::java::lang::Object
{

public: // actually protected
  AbstractElementHandler(::gnu::java::beans::decoder::ElementHandler *, jboolean);
public:
  virtual void start(::org::xml::sax::Attributes *, ::java::beans::ExceptionListener *);
public: // actually protected
  virtual ::gnu::java::beans::decoder::Context * startElement(::org::xml::sax::Attributes *, ::java::beans::ExceptionListener *) = 0;
public:
  virtual void end(::java::beans::ExceptionListener *);
  virtual void notifyStatement(::java::beans::ExceptionListener *);
  virtual void notifyContextFailed();
  virtual jboolean hasFailed();
public: // actually protected
  virtual void endElement(::java::lang::String *);
public:
  virtual void characters(JArray< jchar > *, jint, jint);
  virtual void putObject(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::lang::Object * getObject(::java::lang::String *);
  virtual ::java::lang::Class * instantiateClass(::java::lang::String *);
  virtual jboolean isSubelementAllowed(::java::lang::String *);
  virtual ::gnu::java::beans::decoder::Context * getContext();
  virtual ::gnu::java::beans::decoder::ElementHandler * getParent();
private:
  ::gnu::java::beans::decoder::Context * __attribute__((aligned(__alignof__( ::java::lang::Object)))) context;
  ::gnu::java::beans::decoder::ElementHandler * parent;
  jboolean hasFailed__;
  ::java::lang::StringBuffer * buffer;
  jboolean allowsSubelements;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_beans_decoder_AbstractElementHandler__
