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

#ifndef __gnu_xml_util_SAXNullTransformerFactory$NullTransformer__
#define __gnu_xml_util_SAXNullTransformerFactory$NullTransformer__

#pragma interface

#include <javax/xml/transform/Transformer.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace util
      {
          class SAXNullTransformerFactory$NullHandler;
          class SAXNullTransformerFactory$NullTransformer;
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace transform
      {
          class ErrorListener;
          class Result;
          class Source;
          class TransformerException;
          class URIResolver;
      }
    }
  }
}

class gnu::xml::util::SAXNullTransformerFactory$NullTransformer : public ::javax::xml::transform::Transformer
{

public: // actually package-private
  SAXNullTransformerFactory$NullTransformer();
public:
  virtual ::javax::xml::transform::ErrorListener * getErrorListener();
  virtual void setErrorListener(::javax::xml::transform::ErrorListener *);
  virtual ::javax::xml::transform::URIResolver * getURIResolver();
  virtual void setURIResolver(::javax::xml::transform::URIResolver *);
  virtual void setOutputProperties(::java::util::Properties *);
  virtual ::java::util::Properties * getOutputProperties();
  virtual void setOutputProperty(::java::lang::String *, ::java::lang::String *);
  virtual ::java::lang::String * getOutputProperty(::java::lang::String *);
  virtual void clearParameters();
  virtual void setParameter(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::lang::Object * getParameter(::java::lang::String *);
  virtual void transform(::javax::xml::transform::Source *, ::javax::xml::transform::Result *);
private:
  ::javax::xml::transform::URIResolver * __attribute__((aligned(__alignof__( ::javax::xml::transform::Transformer)))) uriResolver;
  ::java::util::Properties * props;
  ::java::util::Hashtable * params;
public: // actually package-private
  ::javax::xml::transform::ErrorListener * errListener;
  ::javax::xml::transform::TransformerException * ex;
  ::gnu::xml::util::SAXNullTransformerFactory$NullHandler * handler;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_util_SAXNullTransformerFactory$NullTransformer__
