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

#ifndef __gnu_xml_util_SAXNullTransformerFactory__
#define __gnu_xml_util_SAXNullTransformerFactory__

#pragma interface

#include <javax/xml/transform/sax/SAXTransformerFactory.h>
extern "Java"
{
  namespace gnu
  {
    namespace xml
    {
      namespace util
      {
          class SAXNullTransformerFactory;
      }
    }
  }
  namespace javax
  {
    namespace xml
    {
      namespace transform
      {
          class ErrorListener;
          class Source;
          class Templates;
          class Transformer;
          class URIResolver;
        namespace sax
        {
            class TemplatesHandler;
            class TransformerHandler;
        }
      }
    }
  }
  namespace org
  {
    namespace xml
    {
      namespace sax
      {
          class XMLFilter;
      }
    }
  }
}

class gnu::xml::util::SAXNullTransformerFactory : public ::javax::xml::transform::sax::SAXTransformerFactory
{

public:
  SAXNullTransformerFactory();
  virtual jboolean getFeature(::java::lang::String *);
  virtual void setFeature(::java::lang::String *, jboolean);
  virtual void setAttribute(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::lang::Object * getAttribute(::java::lang::String *);
  virtual ::javax::xml::transform::Source * getAssociatedStylesheet(::javax::xml::transform::Source *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  virtual ::javax::xml::transform::Transformer * newTransformer();
  virtual ::javax::xml::transform::sax::TransformerHandler * newTransformerHandler();
  virtual ::javax::xml::transform::Transformer * newTransformer(::javax::xml::transform::Source *);
  virtual ::javax::xml::transform::Templates * newTemplates(::javax::xml::transform::Source *);
  virtual ::javax::xml::transform::sax::TemplatesHandler * newTemplatesHandler();
  virtual ::javax::xml::transform::sax::TransformerHandler * newTransformerHandler(::javax::xml::transform::Source *);
  virtual ::javax::xml::transform::sax::TransformerHandler * newTransformerHandler(::javax::xml::transform::Templates *);
  virtual ::org::xml::sax::XMLFilter * newXMLFilter(::javax::xml::transform::Source *);
  virtual ::org::xml::sax::XMLFilter * newXMLFilter(::javax::xml::transform::Templates *);
  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 *);
private:
  static ::java::io::OutputStream * getOutputStream(::java::lang::String *);
public: // actually package-private
  static ::java::io::OutputStream * access$0(::java::lang::String *);
private:
  ::javax::xml::transform::ErrorListener * __attribute__((aligned(__alignof__( ::javax::xml::transform::sax::SAXTransformerFactory)))) errListener;
  ::javax::xml::transform::URIResolver * uriResolver;
  static ::java::lang::String * noXSLT;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_xml_util_SAXNullTransformerFactory__
