You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by an...@locus.apache.org on 2000/12/27 09:42:24 UTC

cvs commit: xml-xerces/java/samples/xni DocumentTracer.java

andyc       00/12/27 00:42:24

  Modified:    java/samples Tag: xerces_j_2 Makefile
               java/samples/sax Tag: xerces_j_2 DocumentTracer.java
                        Writer.java
               java/samples/xni Tag: xerces_j_2 DocumentTracer.java
  Log:
  Updated samples. Fixed various little bugs; finished updating
  sax.DocumentTracer; updated xni.DocumentTracer; and added more
  explicit reporting of callback information in document tracers
  which revealed various bugs in our SAX2 callbacks. Now on to
  fix *those* bugs.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.3.4.4   +1 -2      xml-xerces/java/samples/Makefile
  
  Index: Makefile
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/samples/Makefile,v
  retrieving revision 1.3.4.3
  retrieving revision 1.3.4.4
  diff -u -r1.3.4.3 -r1.3.4.4
  --- Makefile	2000/12/04 04:17:59	1.3.4.3
  +++ Makefile	2000/12/27 08:42:21	1.3.4.4
  @@ -2,8 +2,7 @@
   
   TARGETS=
   
  -#DIRS = dom sax ui
  -DIRS = util dom sax socket util xni
  +DIRS = dom sax socket xni
   
   TOP = ..
   include $(TOP)/src/Makefile.incl
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.3   +186 -89   xml-xerces/java/samples/sax/DocumentTracer.java
  
  Index: DocumentTracer.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/samples/sax/DocumentTracer.java,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- DocumentTracer.java	2000/12/22 10:59:27	1.1.2.2
  +++ DocumentTracer.java	2000/12/27 08:42:22	1.1.2.3
  @@ -63,8 +63,6 @@
   import java.io.UnsupportedEncodingException;
   import java.io.Writer;
   
  -import org.apache.xerces.parsers.SAXParser;
  -
   import org.xml.sax.AttributeList;
   import org.xml.sax.Attributes;
   import org.xml.sax.ContentHandler;
  @@ -93,7 +91,7 @@
    * @author Andy Clark, IBM
    * @author Arnaud Le Hors, IBM
    *
  - * @version $Id: DocumentTracer.java,v 1.1.2.2 2000/12/22 10:59:27 andyc Exp $
  + * @version $Id: DocumentTracer.java,v 1.1.2.3 2000/12/27 08:42:22 andyc Exp $
    */
   public class DocumentTracer 
       extends DefaultHandler
  @@ -136,9 +134,6 @@
       /** Default Schema validation support (true). */
       protected static final boolean DEFAULT_SCHEMA_VALIDATION = true;
   
  -    /** Default canonical output (false). */
  -    protected static final boolean DEFAULT_CANONICAL = false;
  -
       //
       // Data
       //
  @@ -284,7 +279,7 @@
       } // startPrefixMapping(String,String)
   
       /** Start element. */
  -    public void startElement(String uri, String localpart, String rawname, 
  +    public void startElement(String uri, String localName, String qname, 
                                Attributes attributes) throws SAXException {
   
           printIndent();
  @@ -292,11 +287,11 @@
           fOut.print("uri=");
           printQuotedString(uri);
           fOut.print(',');
  -        fOut.print("localpart=");
  -        printQuotedString(localpart);
  +        fOut.print("localName=");
  +        printQuotedString(localName);
           fOut.print(',');
  -        fOut.print("rawname=");
  -        printQuotedString(rawname);
  +        fOut.print("qname=");
  +        printQuotedString(qname);
           fOut.print(',');
           fOut.print("attributes=");
           if (attributes == null) {
  @@ -310,19 +305,26 @@
                       System.out.print(',');
                   }
                   String attrURI = attributes.getURI(i);
  -                String attrLocalpart = attributes.getLocalName(i);
  -                String attrRawname = attributes.getQName(i);
  +                String attrLocalName = attributes.getLocalName(i);
  +                String attrQName = attributes.getQName(i);
  +                String attrType = attributes.getType(i);
  +                String attrValue = attributes.getValue(i);
                   fOut.print('{');
                   fOut.print("uri=");
                   printQuotedString(attrURI);
  +                fOut.print(',');
  +                fOut.print("localName=");
  +                printQuotedString(attrLocalName);
                   fOut.print(',');
  -                fOut.print("localpart=");
  -                printQuotedString(attrLocalpart);
  +                fOut.print("qname=");
  +                printQuotedString(attrQName);
                   fOut.print(',');
  -                fOut.print("rawname=");
  -                printQuotedString(attrRawname);
  -                fOut.print("}=");
  -                printQuotedString(attributes.getValue(i));
  +                fOut.print("type=");
  +                printQuotedString(attrType);
  +                fOut.print(',');
  +                fOut.print("value=");
  +                printQuotedString(attrValue);
  +                fOut.print('}');
               }
               fOut.print('}');
           }
  @@ -333,7 +335,7 @@
       } // startElement(String,String,String,Attributes)
   
       /** End element. */
  -    public void endElement(String uri, String localpart, String rawname) 
  +    public void endElement(String uri, String localName, String qname) 
           throws SAXException {
   
           fIndent--;
  @@ -342,11 +344,11 @@
           fOut.print("uri=");
           printQuotedString(uri);
           fOut.print(',');
  -        fOut.print("localpart=");
  -        printQuotedString(localpart);
  +        fOut.print("localName=");
  +        printQuotedString(localName);
           fOut.print(',');
  -        fOut.print("rawname=");
  -        printQuotedString(rawname);
  +        fOut.print("qname=");
  +        printQuotedString(qname);
           fOut.println(')');
           fOut.flush();
   
  @@ -401,9 +403,19 @@
                   if (i > 0) {
                       System.out.print(',');
                   }
  -                printQuotedString(attributes.getName(i));
  -                fOut.print('=');
  -                printQuotedString(attributes.getValue(i));
  +                String attrName = attributes.getName(i);
  +                String attrType = attributes.getType(i);
  +                String attrValue = attributes.getValue(i);
  +                fOut.print('{');
  +                fOut.print("name=");
  +                printQuotedString(attrName);
  +                fOut.print(',');
  +                fOut.print("type=");
  +                printQuotedString(attrType);
  +                fOut.print(',');
  +                fOut.print("value=");
  +                printQuotedString(attrValue);
  +                fOut.print('}');
               }
               fOut.print('}');
           }
  @@ -753,37 +765,13 @@
   
       } // printError(String,SAXParseException)
   
  -    //
  -    // Private methods
  -    //
  -
       /** Prints the indent. */
  -    private void printIndent() {
  +    protected void printIndent() {
           for (int i = 0; i < fIndent; i++) {
               fOut.print(' ');
           }
       }
   
  -    /** Returns a string of the location. */
  -    private String getLocationString(SAXParseException ex) {
  -        StringBuffer str = new StringBuffer();
  -
  -        String systemId = ex.getSystemId();
  -        if (systemId != null) {
  -            int index = systemId.lastIndexOf('/');
  -            if (index != -1) 
  -                systemId = systemId.substring(index + 1);
  -            str.append(systemId);
  -        }
  -        str.append(':');
  -        str.append(ex.getLineNumber());
  -        str.append(':');
  -        str.append(ex.getColumnNumber());
  -
  -        return str.toString();
  -
  -    } // getLocationString(SAXParseException):String
  -
       //
       // MAIN
       //
  @@ -791,58 +779,167 @@
       /** Main. */
       public static void main(String[] argv) throws Exception {
           
  -        // construct handler
  +        // is there anything to do?
  +        if (argv.length == 0) {
  +            printUsage();
  +            System.exit(1);
  +        }
  +
  +        // variables
           DocumentTracer tracer = new DocumentTracer();
  +        PrintWriter out = new PrintWriter(System.out);
  +        XMLReader parser = null;
  +        boolean namespaces = DEFAULT_NAMESPACES;
  +        boolean validation = DEFAULT_VALIDATION;
  +        boolean schemaValidation = DEFAULT_SCHEMA_VALIDATION;
  +        
  +        // process arguments
  +        for (int i = 0; i < argv.length; i++) {
  +            String arg = argv[i];
  +            if (arg.startsWith("-")) {
  +                String option = arg.substring(1);
  +                if (option.equals("p")) {
  +                    // get parser name
  +                    if (++i == argv.length) {
  +                        System.err.println("error: Missing argument to -p option.");
  +                    }
  +                    String parserName = argv[i];
  +
  +                    // create parser
  +                    try {
  +                        parser = XMLReaderFactory.createXMLReader(parserName);
  +                    }
  +                    catch (Exception e) {
  +                        try {
  +                            Parser sax1Parser = ParserFactory.makeParser(parserName);
  +                            parser = new ParserAdapter(sax1Parser);
  +                            System.err.println("warning: Features and properties not supported on SAX1 parsers.");
  +                        }
  +                        catch (Exception ex) {
  +                            parser = null;
  +                            System.err.println("error: Unable to instantiate parser ("+DEFAULT_PARSER_NAME+")");
  +                        }
  +                    }
  +                    continue;
  +                }
  +                if (option.equalsIgnoreCase("n")) {
  +                    namespaces = option.equals("n");
  +                    continue;
  +                }
  +                if (option.equalsIgnoreCase("v")) {
  +                    validation = option.equals("v");
  +                    continue;
  +                }
  +                if (option.equalsIgnoreCase("s")) {
  +                    schemaValidation = option.equals("s");
  +                    continue;
  +                }
  +                if (option.equals("h")) {
  +                    printUsage();
  +                    continue;
  +                }
  +            }
   
  -        // construct parser; set features
  -        XMLReader parser = new SAXParser();
  -        try {
  -            parser.setFeature("http://xml.org/sax/features/namespaces", true);
  -        }
  -        catch (SAXException e) {
  -            e.printStackTrace(System.err);
  -        }
  -        try {
  -            parser.setFeature("http://xml.org/sax/features/validation", true);
  -        }
  -        catch (SAXException e) {
  -            e.printStackTrace(System.err);
  -        }
  -
  -        // set handlers
  -        parser.setDTDHandler(tracer);
  -        parser.setErrorHandler(tracer);
  -        if (parser instanceof Parser) {
  -            ((Parser)parser).setDocumentHandler(tracer);
  -        }
  -        else {
  -            parser.setContentHandler(tracer);
  +            // use default parser?
  +            if (parser == null) {
  +
  +                // create parser
  +                try {
  +                    parser = XMLReaderFactory.createXMLReader(DEFAULT_PARSER_NAME);
  +                }
  +                catch (Exception e) {
  +                    System.err.println("error: Unable to instantiate parser ("+DEFAULT_PARSER_NAME+")");
  +                    continue;
  +                }
  +            }
  +
  +            // set parser features
               try {
  -                parser.setProperty("http://xml.org/sax/properties/declaration-handler", tracer);
  +                parser.setFeature(NAMESPACES_FEATURE_ID, namespaces);
               }
               catch (SAXException e) {
  -                e.printStackTrace(System.err);
  +                System.err.println("warning: Parser does not support feature ("+NAMESPACES_FEATURE_ID+")");
               }
               try {
  -                parser.setProperty("http://xml.org/sax/properties/lexical-handler", tracer);
  +                parser.setFeature(VALIDATION_FEATURE_ID, validation);
               }
               catch (SAXException e) {
  -                e.printStackTrace(System.err);
  +                System.err.println("warning: Parser does not support feature ("+VALIDATION_FEATURE_ID+")");
               }
  -        }
  -
  -        // parser files
  -        for (int i = 0; i < argv.length; i++) {
  -            String arg = argv[i];
  -            System.err.println("# argv["+i+"]: "+arg);
               try {
  +                parser.setFeature(SCHEMA_VALIDATION_FEATURE_ID, schemaValidation);
  +            }
  +            catch (SAXNotRecognizedException e) {
  +                // ignore
  +            }
  +            catch (SAXNotSupportedException e) {
  +                System.err.println("warning: Parser does not support feature ("+SCHEMA_VALIDATION_FEATURE_ID+")");
  +            }
  +    
  +            // set handlers
  +            parser.setDTDHandler(tracer);
  +            parser.setErrorHandler(tracer);
  +            if (parser instanceof XMLReader) {
  +                parser.setContentHandler(tracer);
  +                try {
  +                    parser.setProperty("http://xml.org/sax/properties/declaration-handler", tracer);
  +                }
  +                catch (SAXException e) {
  +                    e.printStackTrace(System.err);
  +                }
  +                try {
  +                    parser.setProperty("http://xml.org/sax/properties/lexical-handler", tracer);
  +                }
  +                catch (SAXException e) {
  +                    e.printStackTrace(System.err);
  +                }
  +            }
  +            else {
  +                ((Parser)parser).setDocumentHandler(tracer);
  +            }
  +    
  +            // parse file
  +            try {
                   parser.parse(arg);
               }
  -            catch (SAXException e) {
  -                Exception ex = e.getException();
  -                throw ex != null ? ex : e;
  +            catch (SAXParseException e) {
  +                // ignore
               }
  +            catch (Exception e) {
  +                System.err.println("error: Parse error occurred - "+e.getMessage());
  +            }
           }
  +
       } // main(String[])
  +
  +    //
  +    // Private static methods
  +    //
  +
  +    /** Prints the usage. */
  +    private static void printUsage() {
  +
  +        System.err.println("usage: java sax.DocumentTracer (options) uri ...");
  +        System.err.println();
  +        
  +        System.err.println("options:");
  +        System.err.println("  -p name  Select parser by name.");
  +        System.err.println("  -n | -N  Turn on/off namespace processing.");
  +        System.err.println("  -v | -V  Turn on/off validation.");
  +        System.err.println("  -s | -S  Turn on/off Schema validation support.");
  +        System.err.println("           NOTE: Not supported by all parsers.");
  +        System.err.println("  -h       This help screen.");
  +        System.err.println();
  +
  +        System.err.println("defaults:");
  +        System.err.println("  Parser:     "+DEFAULT_PARSER_NAME);
  +        System.out.print("  Namespaces: ");
  +        System.err.println(DEFAULT_NAMESPACES ? "on" : "off");
  +        System.out.print("  Validation: ");
  +        System.err.println(DEFAULT_VALIDATION ? "on" : "off");
  +        System.out.print("  Schema:     ");
  +        System.err.println(DEFAULT_SCHEMA_VALIDATION ? "on" : "off");
  +
  +    } // printUsage()
   
   } // class DocumentTracer
  
  
  
  1.1.2.2   +13 -3     xml-xerces/java/samples/sax/Attic/Writer.java
  
  Index: Writer.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/samples/sax/Attic/Writer.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- Writer.java	2000/12/22 10:59:28	1.1.2.1
  +++ Writer.java	2000/12/27 08:42:22	1.1.2.2
  @@ -65,6 +65,7 @@
   import sax.helpers.AttributesImpl;
   
   import org.xml.sax.Attributes;
  +import org.xml.sax.Parser;
   import org.xml.sax.SAXException;
   import org.xml.sax.SAXNotRecognizedException;
   import org.xml.sax.SAXNotSupportedException;
  @@ -72,6 +73,8 @@
   import org.xml.sax.XMLReader;
   import org.xml.sax.ext.LexicalHandler;
   import org.xml.sax.helpers.DefaultHandler;
  +import org.xml.sax.helpers.ParserAdapter;
  +import org.xml.sax.helpers.ParserFactory;
   import org.xml.sax.helpers.XMLReaderFactory;
   
   /**
  @@ -81,7 +84,7 @@
    *
    * @author Andy Clark, IBM
    *
  - * @version $Id: Writer.java,v 1.1.2.1 2000/12/22 10:59:28 andyc Exp $
  + * @version $Id: Writer.java,v 1.1.2.2 2000/12/27 08:42:22 andyc Exp $
    */
   public class Writer 
       extends DefaultHandler
  @@ -465,8 +468,15 @@
                           parser = XMLReaderFactory.createXMLReader(parserName);
                       }
                       catch (Exception e) {
  -                        parser = null;
  -                        System.err.println("error: Unable to instantiate parser ("+DEFAULT_PARSER_NAME+")");
  +                        try {
  +                            Parser sax1Parser = ParserFactory.makeParser(parserName);
  +                            parser = new ParserAdapter(sax1Parser);
  +                            System.err.println("warning: Features and properties not supported on SAX1 parsers.");
  +                        }
  +                        catch (Exception ex) {
  +                            parser = null;
  +                            System.err.println("error: Unable to instantiate parser ("+DEFAULT_PARSER_NAME+")");
  +                        }
                       }
                       continue;
                   }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.8   +706 -320  xml-xerces/java/samples/xni/Attic/DocumentTracer.java
  
  Index: DocumentTracer.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/samples/xni/Attic/DocumentTracer.java,v
  retrieving revision 1.1.2.7
  retrieving revision 1.1.2.8
  diff -u -r1.1.2.7 -r1.1.2.8
  --- DocumentTracer.java	2000/11/29 05:26:12	1.1.2.7
  +++ DocumentTracer.java	2000/12/27 08:42:23	1.1.2.8
  @@ -57,9 +57,11 @@
   
   package xni;
   
  -import java.io.FileInputStream;
  -import java.io.InputStream;
  -import java.io.IOException;
  +import java.io.OutputStream;
  +import java.io.OutputStreamWriter;
  +import java.io.PrintWriter;
  +import java.io.UnsupportedEncodingException;
  +import java.io.Writer;
   
   import org.apache.xerces.parsers.XMLDocumentParser;
   import org.apache.xerces.xni.QName;
  @@ -70,6 +72,8 @@
   
   import org.xml.sax.ErrorHandler;
   import org.xml.sax.SAXException;
  +import org.xml.sax.SAXNotRecognizedException;
  +import org.xml.sax.SAXNotSupportedException;
   import org.xml.sax.SAXParseException;
   
   /**
  @@ -79,21 +83,50 @@
    * @author Andy Clark, IBM
    * @author Arnaud Le Hors, IBM
    *
  - * @version $Id: DocumentTracer.java,v 1.1.2.7 2000/11/29 05:26:12 andyc Exp $
  + * @version $Id: DocumentTracer.java,v 1.1.2.8 2000/12/27 08:42:23 andyc Exp $
    */
   public class DocumentTracer 
       extends XMLDocumentParser
       implements ErrorHandler {
   
       //
  +    // Constants
  +    //
  +
  +    // feature ids
  +
  +    /** Namespaces feature id (http://xml.org/sax/features/namespaces). */
  +    protected static final String NAMESPACES_FEATURE_ID = "http://xml.org/sax/features/namespaces";
  +    
  +    /** Validation feature id (http://xml.org/sax/features/validation). */
  +    protected static final String VALIDATION_FEATURE_ID = "http://xml.org/sax/features/validation";
  +
  +    /** Schema validation feature id (http://apache.org/xml/features/validation/schema). */
  +    protected static final String SCHEMA_VALIDATION_FEATURE_ID = "http://apache.org/xml/features/validation/schema";
  +
  +    // default settings
  +
  +    /** Default namespaces support (true). */
  +    protected static final boolean DEFAULT_NAMESPACES = true;
  +
  +    /** Default validation support (false). */
  +    protected static final boolean DEFAULT_VALIDATION = false;
  +    
  +    /** Default Schema validation support (true). */
  +    protected static final boolean DEFAULT_SCHEMA_VALIDATION = true;
  +
  +    //
       // Data
       //
   
       /** Temporary QName. */
       private QName fQName = new QName();
   
  +    /** Print writer. */
  +    protected PrintWriter fOut;
  +
       /** Indent level. */
  -    private int fIndent;
  +    protected int fIndent;
   
       //
       // Constructors
  @@ -101,6 +134,7 @@
   
       /** Default constructor. */
       public DocumentTracer() {
  +        setOutput(new PrintWriter(System.out));
           setErrorHandler(this);
       } // <init>()
   
  @@ -108,564 +142,842 @@
       // Public methods
       //
   
  -    /** Resets the test parser. */
  -    public void reset() throws SAXException {
  -        super.reset();
  -        fIndent = 0;
  -    } // reset()
  +    /** Sets the output stream for printing. */
  +    public void setOutput(OutputStream stream, String encoding)
  +        throws UnsupportedEncodingException {
  +
  +        if (encoding == null) {
  +            encoding = "UTF8";
  +        }
  +
  +        Writer writer = new OutputStreamWriter(stream, encoding);
  +        fOut = new PrintWriter(writer);
  +
  +    } // setOutput(OutputStream,String)
   
  +    /** Sets the output writer. */
  +    public void setOutput(Writer writer) {
  +            
  +        fOut = writer instanceof PrintWriter
  +             ? (PrintWriter)writer : new PrintWriter(writer);
  +
  +    } // setOutput(Writer)
  +
       //
       // XMLDocumentHandler methods
       //
   
  +    /** Start document. */
       public void startDocument() throws SAXException {
  +
  +        fIndent = 0;
           printIndent();
  -        System.out.println("startDocument()");
  +        fOut.println("startDocument()");
  +        fOut.flush();
           fIndent++;
  -    }
   
  -    public void xmlDecl(String version, String encoding, String actualEncoding, String standalone)
  -        throws SAXException {
  -        printIndent();
  -        System.out.print("xmlDecl(");
  -        System.out.print("version="+quoteString(version));
  -        System.out.print(',');
  -        System.out.print("encoding="+quoteString(encoding));
  -        System.out.print(',');
  -        System.out.print("actualEncoding="+quoteString(actualEncoding));
  -        System.out.print(',');
  -        System.out.print("standalone="+quoteString(standalone));
  -        System.out.println(')');
  -    }
  +    } // startDocument()
   
  -    public void doctypeDecl(String rootElement, String publicId, String systemId)
  -        throws SAXException {
  -        printIndent();
  -        System.out.print("doctypeDecl(");
  -        System.out.print("rootElement="+quoteString(rootElement));
  -        System.out.print(',');
  -        System.out.print("publicId="+quoteString(publicId));
  -        System.out.print(',');
  -        System.out.print("systemId="+quoteString(systemId));
  -        System.out.println(')');
  -    }
  +    /** XML Declaration. */
  +    public void xmlDecl(String version, String encoding, String actualEncoding,
  +                        String standalone) throws SAXException {
  +
  +        printIndent();
  +        fOut.print("xmlDecl(");
  +        fOut.print("version=");
  +        printQuotedString(version);
  +        fOut.print(',');
  +        fOut.print("encoding=");
  +        printQuotedString(encoding);
  +        fOut.print(',');
  +        fOut.print("actualEncoding=");
  +        printQuotedString(actualEncoding);
  +        fOut.print(',');
  +        fOut.print("standalone=");
  +        printQuotedString(standalone);
  +        fOut.println(')');
  +
  +    } // xmlDecl(String,String,String,String)
  +
  +    /** Doctype declaration. */
  +    public void doctypeDecl(String rootElement, String publicId, 
  +                            String systemId) throws SAXException {
  +
  +        printIndent();
  +        fOut.print("doctypeDecl(");
  +        fOut.print("rootElement=");
  +        printQuotedString(rootElement);
  +        fOut.print(',');
  +        fOut.print("publicId=");
  +        printQuotedString(publicId);
  +        fOut.print(',');
  +        fOut.print("systemId=");
  +        printQuotedString(systemId);
  +        fOut.println(')');
  +        fOut.flush();
   
  +    } // doctypeDecl(String,String,String)
  +
  +    /** Start prefix mapping. */
       public void startPrefixMapping(String prefix, String uri)
           throws SAXException {
  +
           printIndent();
  -        System.out.print("startPrefixMapping(");
  -        System.out.print("prefix="+quoteString(prefix));
  -        System.out.print(',');
  -        System.out.print("uri="+quoteString(uri));
  -        System.out.println(')');
  +        fOut.print("startPrefixMapping(");
  +        fOut.print("prefix=");
  +        printQuotedString(prefix);
  +        fOut.print(',');
  +        fOut.print("uri=");
  +        printQuotedString(uri);
  +        fOut.println(')');
  +        fOut.flush();
           fIndent++;
  -    }
   
  +    } // startPrefixMapping(String,String)
  +
  +    /** Start element. */
       public void startElement(QName element, XMLAttributes attributes)
           throws SAXException {
  +
           printIndent();
  -        System.out.print("startElement(");
  -        System.out.print("element={"+element+'}');
  -        System.out.print(',');
  -        System.out.print("attributes=");
  +        fOut.print("startElement(");
  +        fOut.print("element=");
  +        fOut.print('{');
  +        fOut.print("prefix=");
  +        printQuotedString(element.prefix);
  +        fOut.print(',');
  +        fOut.print("localpart=");
  +        printQuotedString(element.localpart);
  +        fOut.print(',');
  +        fOut.print("rawname=");
  +        printQuotedString(element.rawname);
  +        fOut.print(',');
  +        fOut.print("uri=");
  +        printQuotedString(element.uri);
  +        fOut.print('}');
  +        fOut.print(',');
  +        fOut.print("attributes=");
           if (attributes == null) {
  -            System.out.println("null");
  +            fOut.println("null");
           }
           else {
  -            System.out.print('{');
  +            fOut.print('{');
               int length = attributes.getLength();
               for (int i = 0; i < length; i++) {
  -                attributes.getName(i, fQName);
                   if (i > 0) {
  -                    System.out.print(',');
  +                    fOut.print(',');
                   }
  -                System.out.print('{');
  -                System.out.print(fQName);
  -                System.out.print("}=");
  -                System.out.print(quoteString(attributes.getValue(i)));
  +                attributes.getName(i, fQName);
  +                String attrType = attributes.getType(i);
  +                String attrValue = attributes.getValue(i);
  +                fOut.print("name=");
  +                fOut.print('{');
  +                fOut.print("prefix=");
  +                printQuotedString(fQName.prefix);
  +                fOut.print(',');
  +                fOut.print("localpart=");
  +                printQuotedString(fQName.localpart);
  +                fOut.print(',');
  +                fOut.print("rawname=");
  +                printQuotedString(fQName.rawname);
  +                fOut.print(',');
  +                fOut.print("uri=");
  +                printQuotedString(fQName.uri);
  +                fOut.print('}');
  +                fOut.print(',');
  +                fOut.print("type=");
  +                printQuotedString(attrType);
  +                fOut.print(',');
  +                fOut.print("value=");
  +                printQuotedString(attrValue);
                   int entityCount = attributes.getEntityCount(i);
                   for (int j = 0; j < entityCount; j++) {
  -                    System.out.print(",[");
  -                    System.out.print(quoteString(attributes.getEntityName(i, j)));
  -                    System.out.print(',');
  -                    System.out.print(attributes.getEntityOffset(i, j));
  -                    System.out.print(',');
  -                    System.out.print(attributes.getEntityLength(i, j));
  -                    System.out.print(']');
  +                    String entityName = attributes.getEntityName(i, j);
  +                    int entityOffset = attributes.getEntityOffset(i, j);
  +                    int entityLength = attributes.getEntityLength(i, j);
  +                    fOut.print(',');
  +                    fOut.print('[');
  +                    fOut.print("name=");
  +                    printQuotedString(entityName);
  +                    fOut.print(',');
  +                    fOut.print("offset=");
  +                    fOut.print(entityOffset);
  +                    fOut.print(',');
  +                    fOut.print("length=");
  +                    fOut.print(entityLength);
  +                    fOut.print(']');
                   }
  +                fOut.print('}');
               }
  -            System.out.print('}');
  +            fOut.print('}');
           }
  -        System.out.println(')');
  +        fOut.println(')');
  +        fOut.flush();
           fIndent++;
  -    }
   
  +    } // startElement(QName,XMLAttributes)
  +
  +    /** Characters. */
       public void characters(XMLString text) throws SAXException {
  +
           printIndent();
  -        System.out.print("characters(");
  -        System.out.print("text="+quoteString(text.toString()));
  -        System.out.println(')');
  -    }
  +        fOut.print("characters(");
  +        fOut.print("text=");
  +        printQuotedString(text.ch, text.offset, text.length);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // characters(XMLString)
   
  +    /** Ignorable whitespace. */
       public void ignorableWhitespace(XMLString text) throws SAXException {
  +
           printIndent();
  -        System.out.print("ignorableWhitespace(");
  -        System.out.print("text="+quoteString(text.toString()));
  -        System.out.println(')');
  -    }
  +        fOut.print("ignorableWhitespace(");
  +        fOut.print("text=");
  +        printQuotedString(text.ch, text.offset, text.length);
  +        fOut.println(')');
  +        fOut.flush();
   
  +    } // ignorableWhitespace(XMLString)
  +
  +    /** End element. */
       public void endElement(QName element) throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.print("endElement(");
  -        System.out.print("element={"+element);
  -        System.out.println("})");
  -    }
  +        fOut.print("endElement(");
  +        fOut.print("element=");
  +        fOut.print('{');
  +        fOut.print("prefix=");
  +        printQuotedString(element.prefix);
  +        fOut.print(',');
  +        fOut.print("localpart=");
  +        printQuotedString(element.localpart);
  +        fOut.print(',');
  +        fOut.print("rawname=");
  +        printQuotedString(element.rawname);
  +        fOut.print(',');
  +        fOut.print("uri=");
  +        printQuotedString(element.uri);
  +        fOut.print('}');
  +        fOut.println(')');
  +        fOut.flush();
   
  +    } // endElement(QName)
  +
  +    /** End prefix mapping. */
       public void endPrefixMapping(String prefix) throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.print("endPrefixMapping(");
  -        System.out.print("prefix="+quoteString(prefix));
  -        System.out.println(')');
  -    }
  +        fOut.print("endPrefixMapping(");
  +        fOut.print("prefix=");
  +        printQuotedString(prefix);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // endPrefixMapping(String)
   
  +    /** Start CDATA section. */
       public void startCDATA() throws SAXException {
  +
           printIndent();
  -        System.out.println("startCDATA()");
  +        fOut.println("startCDATA()");
  +        fOut.flush();
           fIndent++;
  -    }
   
  +    } // startCDATA()
  +
  +    /** End CDATA section. */
       public void endCDATA() throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.println("endCDATA()");
  -    }
  +        fOut.println("endCDATA()");
  +        fOut.flush();
  +
  +    } //  endCDATA()
   
  +    /** End document. */
       public void endDocument() throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.println("endDocument()");
  -    }
  +        fOut.println("endDocument()");
  +        fOut.flush();
   
  +    } // endDocument();
  +
       //
       // XMLDocumentHandler and XMLDTDHandler methods
       //
   
  +    /** Start entity. */
       public void startEntity(String name, String publicId, String systemId, 
                               String encoding) throws SAXException {
  +
           printIndent();
  -        System.out.print("startEntity(");
  -        System.out.print("name="+quoteString(name));
  -        System.out.print(',');
  -        System.out.print("publicId="+quoteString(publicId));
  -        System.out.print(',');
  -        System.out.print("systemId="+quoteString(systemId));
  -        System.out.print(',');
  -        System.out.print("encoding="+quoteString(encoding));
  -        System.out.println(')');
  +        fOut.print("startEntity(");
  +        fOut.print("name=");
  +        printQuotedString(name);
  +        fOut.print(',');
  +        fOut.print("publicId=");
  +        printQuotedString(publicId);
  +        fOut.print(',');
  +        fOut.print("systemId=");
  +        printQuotedString(systemId);
  +        fOut.print(',');
  +        fOut.print("encoding=");
  +        printQuotedString(encoding);
  +        fOut.println(')');
  +        fOut.flush();
           fIndent++;
  -    }
   
  +    } // startEntity(String,String,String,String)
  +
  +    /** Text declaration. */
       public void textDecl(String version, String encoding) throws SAXException {
  +
           printIndent();
  -        System.out.print("textDecl(");
  -        System.out.print("version="+quoteString(version));
  -        System.out.print(',');
  -        System.out.print("encoding="+quoteString(encoding));
  -        System.out.println(')');
  -    }
  +        fOut.print("textDecl(");
  +        fOut.print("version=");
  +        printQuotedString(version);
  +        fOut.print(',');
  +        fOut.print("encoding=");
  +        printQuotedString(encoding);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // textDecl(String,String)
   
  +    /** Comment. */
       public void comment(XMLString text) throws SAXException {
  +
           printIndent();
  -        System.out.print("comment(");
  -        System.out.print("text="+quoteString(text.toString()));
  -        System.out.println(')');
  -    }
  +        fOut.print("comment(");
  +        fOut.print("text=");
  +        printQuotedString(text.ch, text.offset, text.length);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // comment(XMLText)
   
  +    /** Processing instruction. */
       public void processingInstruction(String target, XMLString data)
           throws SAXException {
  +
           printIndent();
  -        System.out.print("processingInstruction(");
  -        System.out.print("target="+quoteString(target));
  -        System.out.print(',');
  -        System.out.print("data="+quoteString(data.toString()));
  -        System.out.println(')');
  -    }
  +        fOut.print("processingInstruction(");
  +        fOut.print("target=");
  +        printQuotedString(target);
  +        fOut.print(',');
  +        fOut.print("data=");
  +        printQuotedString(data.ch, data.offset, data.length);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // processingInstruction(String,XMLString)
   
  +    /** End entity. */
       public void endEntity(String name) throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.print("endEntity(");
  -        System.out.print("name="+quoteString(name));
  -        System.out.println(')');
  -    }
  +        fOut.print("endEntity(");
  +        fOut.print("name=");
  +        printQuotedString(name);
  +        fOut.println(')');
  +        fOut.flush();
   
  +    } // endEntity(String)
  +
       //
       // XMLDTDHandler methods
       //
   
  +    /** Start DTD. */
       public void startDTD() throws SAXException {
  +
           printIndent();
  -        System.out.println("startDTD()");
  +        fOut.println("startDTD()");
  +        fOut.flush();
           fIndent++;
  -    } // startDTD
   
  +    } // startDTD()
  +
  +    /** Element declaration. */
       public void elementDecl(String name, String contentModel)
           throws SAXException {
  +
           printIndent();
  -        System.out.print("elementDecl(");
  -        System.out.print("name="+quoteString(name));
  -        System.out.print(',');
  -        System.out.print("contentModel="+quoteString(contentModel));
  -        System.out.println(')');
  -    } // elementDecl
  +        fOut.print("elementDecl(");
  +        fOut.print("name=");
  +        printQuotedString(name);
  +        fOut.print(',');
  +        fOut.print("contentModel=");
  +        printQuotedString(contentModel);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // elementDecl(String,String)
   
  +    /** Start attribute list. */
       public void startAttlist(String elementName) throws SAXException {
  +
           printIndent();
  -        System.out.print("startAttlist(");
  -        System.out.print("elementName="+quoteString(elementName));
  -        System.out.println(')');
  +        fOut.print("startAttlist(");
  +        fOut.print("elementName=");
  +        printQuotedString(elementName);
  +        fOut.println(')');
  +        fOut.flush();
           fIndent++;
  -    } // startAttlist
   
  +    } // startAttlist(String)
  +
  +    /** Attribute declaration. */
       public void attributeDecl(String elementName, String attributeName, 
                                 String type, String[] enumeration, 
                                 String defaultType, XMLString defaultValue)
           throws SAXException {
  +
           printIndent();
  -        System.out.print("attributeDecl(");
  -        System.out.print("elementName="+quoteString(elementName));
  -        System.out.print(',');
  -        System.out.print("attributeName="+quoteString(attributeName));
  -        System.out.print(',');
  -        System.out.print("type="+quoteString(type));
  -        System.out.print(',');
  -        System.out.print("enumeration=");
  +        fOut.print("attributeDecl(");
  +        fOut.print("elementName=");
  +        printQuotedString(elementName);
  +        fOut.print(',');
  +        fOut.print("attributeName=");
  +        printQuotedString(attributeName);
  +        fOut.print(',');
  +        fOut.print("type=");
  +        printQuotedString(type);
  +        fOut.print(',');
  +        fOut.print("enumeration=");
           if (enumeration == null) {
  -            System.out.print("null");
  +            fOut.print("null");
           }
           else {
  -            System.out.print('{');
  +            fOut.print('{');
               for (int i = 0; i < enumeration.length; i++) {
  -                System.out.print(quoteString(enumeration[i]));
  +                printQuotedString(enumeration[i]);
                   if (i < enumeration.length - 1) {
  -                    System.out.print(',');
  +                    fOut.print(',');
                   }
               }
  -            System.out.print('}');
  +            fOut.print('}');
           }
  -        System.out.print(',');
  -        System.out.print("defaultType="+quoteString(defaultType));
  -        System.out.print(',');
  -        System.out.print("defaultValue=");
  +        fOut.print(',');
  +        fOut.print("defaultType=");
  +        printQuotedString(defaultType);
  +        fOut.print(',');
  +        fOut.print("defaultValue=");
           if (defaultValue == null) {
  -            System.out.print("null");
  +            fOut.print("null");
           }
           else {
  -            System.out.print(quoteString(defaultValue.toString()));
  +            printQuotedString(defaultValue.ch, defaultValue.offset,
  +                              defaultValue.length);
           }
  -        System.out.println(')');
  -    } // attributeDecl
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // attributeDecl(String,String,String,String[],String,XMLString)
   
  +    /** End attribute list. */
       public void endAttlist() throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.println("endAttlist()");
  -    } // endAttlist
  +        fOut.println("endAttlist()");
  +        fOut.flush();
   
  +    } // endAttlist()
  +
  +    /** Internal entity declaration. */
       public void internalEntityDecl(String name, XMLString text)
           throws SAXException {
  -        printIndent();
  -        System.out.print("internalEntityDecl(");
  -        System.out.print("name="+quoteString(name));
  -        System.out.print(',');
  -        System.out.print("text="+quoteString(text.toString()));
  -        System.out.println(')');
  -    } // internalEntityDecl
   
  -    public void externalEntityDecl(String name, String publicId, String systemId)
  -        throws SAXException {
           printIndent();
  -        System.out.print("externalEntityDecl(");
  -        System.out.print("name="+quoteString(name));
  -        System.out.print(',');
  -        System.out.print("publicId="+quoteString(publicId));
  -        System.out.print(',');
  -        System.out.print("systemId="+quoteString(systemId));
  -        System.out.println(')');
  -    } // externalEntityDecl
  -
  -    public void unparsedEntityDecl(String name, String publicId, String systemId, String notation)
  +        fOut.print("internalEntityDecl(");
  +        fOut.print("name=");
  +        printQuotedString(name);
  +        fOut.print(',');
  +        fOut.print("text=");
  +        printQuotedString(text.ch, text.offset, text.length);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // internalEntityDecl(String,XMLString)
  +
  +    /** External entity declaration. */
  +    public void externalEntityDecl(String name, String publicId, 
  +                                   String systemId) throws SAXException {
  +
  +        printIndent();
  +        fOut.print("externalEntityDecl(");
  +        fOut.print("name=");
  +        printQuotedString(name);
  +        fOut.print(',');
  +        fOut.print("publicId=");
  +        printQuotedString(publicId);
  +        fOut.print(',');
  +        fOut.print("systemId=");
  +        printQuotedString(systemId);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // externalEntityDecl(String,String,String)
  +
  +    /** Unparsed entity declaration. */
  +    public void unparsedEntityDecl(String name, String publicId, 
  +                                   String systemId, String notation)
           throws SAXException {
  +
           printIndent();
  -        System.out.print("externalEntityDecl(");
  -        System.out.print("name="+quoteString(name));
  -        System.out.print(',');
  -        System.out.print("publicId="+quoteString(publicId));
  -        System.out.print(',');
  -        System.out.print("systemId="+quoteString(systemId));
  -        System.out.print(',');
  -        System.out.print("notation="+quoteString(notation));
  -        System.out.println(')');
  -    } // unparsedEntityDecl
  +        fOut.print("externalEntityDecl(");
  +        fOut.print("name=");
  +        printQuotedString(name);
  +        fOut.print(',');
  +        fOut.print("publicId=");
  +        printQuotedString(publicId);
  +        fOut.print(',');
  +        fOut.print("systemId=");
  +        printQuotedString(systemId);
  +        fOut.print(',');
  +        fOut.print("notation=");
  +        printQuotedString(notation);
  +        fOut.println(')');
  +        fOut.flush();
   
  +    } // unparsedEntityDecl(String,String,String,String)
  +
  +    /** Notation declaration. */
       public void notationDecl(String name, String publicId, String systemId)
           throws SAXException {
  +
           printIndent();
  -        System.out.print("notationDecl(");
  -        System.out.print("name="+quoteString(name));
  -        System.out.print(',');
  -        System.out.print("publicId="+quoteString(publicId));
  -        System.out.print(',');
  -        System.out.print("systemId="+quoteString(systemId));
  -        System.out.println(')');
  -    } // notationDecl
  +        fOut.print("notationDecl(");
  +        fOut.print("name=");
  +        printQuotedString(name);
  +        fOut.print(',');
  +        fOut.print("publicId=");
  +        printQuotedString(publicId);
  +        fOut.print(',');
  +        fOut.print("systemId=");
  +        printQuotedString(systemId);
  +        fOut.println(')');
  +        fOut.flush();
   
  +    } // notationDecl(String,String,String)
  +
  +    /** Start conditional section. */
       public void startConditional(short type) throws SAXException {
  +
           printIndent();
  -        System.out.print("startConditional(");
  -        System.out.print("type=");
  +        fOut.print("startConditional(");
  +        fOut.print("type=");
           switch (type) {
               case XMLDTDHandler.CONDITIONAL_IGNORE: {
  -                System.out.print("CONDITIONAL_IGNORE");
  +                fOut.print("CONDITIONAL_IGNORE");
                   break;
               }
               case XMLDTDHandler.CONDITIONAL_INCLUDE: {
  -                System.out.print("CONDITIONAL_INCLUDE");
  +                fOut.print("CONDITIONAL_INCLUDE");
                   break;
               }
               default: {
  -                System.out.print("??? ("+type+')');
  +                fOut.print("??? ("+type+')');
               }
           }
  -        System.out.println(')');
  +        fOut.println(')');
  +        fOut.flush();
           fIndent++;
  -    } // startConditional
   
  +    } // startConditional(short)
  +
  +    /** End conditional section. */
       public void endConditional() throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.println("endConditional()");
  -    } // endConditional
  +        fOut.println("endConditional()");
  +        fOut.flush();
  +
  +    } // endConditional()
   
  +    /** End DTD. */
       public void endDTD() throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.println("endDTD()");
  -    } // endDTD
  +        fOut.println("endDTD()");
  +        fOut.flush();
  +
  +    } // endDTD()
   
       //
       // XMLDTDContentModelHandler methods
       //
   
  +    /** Start content model. */
       public void startContentModel(String elementName, short type)
           throws SAXException {
  +
           printIndent();
  -        System.out.print("startContentModel(");
  -        System.out.print("elementName="+quoteString(elementName));
  -        System.out.print(',');
  -        System.out.print("type=");
  +        fOut.print("startContentModel(");
  +        fOut.print("elementName=");
  +        printQuotedString(elementName);
  +        fOut.print(',');
  +        fOut.print("type=");
           switch (type) {
               case XMLDTDContentModelHandler.TYPE_ANY: {
  -                System.out.print("TYPE_ANY");
  +                fOut.print("TYPE_ANY");
                   break;
               }
               case XMLDTDContentModelHandler.TYPE_EMPTY: {
  -                System.out.print("TYPE_EMPTY");
  +                fOut.print("TYPE_EMPTY");
                   break;
               }
               case XMLDTDContentModelHandler.TYPE_MIXED: {
  -                System.out.print("TYPE_MIXED");
  +                fOut.print("TYPE_MIXED");
                   break;
               }
               case XMLDTDContentModelHandler.TYPE_CHILDREN: {
  -                System.out.print("TYPE_CHILDREN");
  +                fOut.print("TYPE_CHILDREN");
                   break;
               }
               default: {
  -                System.out.print("??? ("+type+')');
  +                fOut.print("??? ("+type+')');
               }
           }
  -        System.out.println(')');
  +        fOut.println(')');
  +        fOut.flush();
           fIndent++;
  -    } // startContentModel
   
  +    } // startContentModel(String,short)
  +
  +    /** Mixed element. */
       public void mixedElement(String elementName) throws SAXException {
  +
           printIndent();
  -        System.out.print("mixedElement(");
  -        System.out.print("elementName="+quoteString(elementName));
  -        System.out.println(')');
  -    } // mixedElement
  +        fOut.print("mixedElement(");
  +        fOut.print("elementName=");
  +        printQuotedString(elementName);
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // mixedElement(String)
   
  +    /** Children start group. */
       public void childrenStartGroup() throws SAXException {
  +
           printIndent();
  -        System.out.println("childrenStartGroup()");
  +        fOut.println("childrenStartGroup()");
  +        fOut.flush();
           fIndent++;
  -    } // childrenStartGroup
   
  +    } // childrenStartGroup()
  +
  +    /** Children element. */
       public void childrenElement(String elementName) throws SAXException {
  +
           printIndent();
  -        System.out.print("childrenElement(");
  -        System.out.print("elementName="+quoteString(elementName));
  -        System.out.println(')');
  -    } // childrenElement
  +        fOut.print("childrenElement(");
  +        fOut.print("elementName=");
  +        printQuotedString(elementName);
  +        fOut.println(')');
  +        fOut.flush();
   
  +    } // childrenElement(String)
  +
  +    /** Children separator. */
       public void childrenSeparator(short separator) throws SAXException {
  +
           printIndent();
  -        System.out.print("childrenSeparator(");
  -        System.out.print("separator=");
  +        fOut.print("childrenSeparator(");
  +        fOut.print("separator=");
           switch (separator) {
               case XMLDTDContentModelHandler.SEPARATOR_CHOICE: {
  -                System.out.print("SEPARATOR_CHOICE");
  +                fOut.print("SEPARATOR_CHOICE");
                   break;
               }
               case XMLDTDContentModelHandler.SEPARATOR_SEQUENCE: {
  -                System.out.print("SEPARATOR_SEQUENCE");
  +                fOut.print("SEPARATOR_SEQUENCE");
                   break;
               }
               default: {
  -                System.out.print("??? ("+separator+')');
  +                fOut.print("??? ("+separator+')');
               }
           }
  -        System.out.println(')');
  -    } // childrenSeparator
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // childrenSeparator(short)
   
  +    /** Children occurrence. */
       public void childrenOccurrence(short occurrence) throws SAXException {
  +
           printIndent();
  -        System.out.print("childrenOccurrence(");
  -        System.out.print("occurrence=");
  +        fOut.print("childrenOccurrence(");
  +        fOut.print("occurrence=");
           switch (occurrence) {
               case XMLDTDContentModelHandler.OCCURS_ONE_OR_MORE: {
  -                System.out.print("OCCURS_ONE_OR_MORE");
  +                fOut.print("OCCURS_ONE_OR_MORE");
                   break;
               }
               case XMLDTDContentModelHandler.OCCURS_ZERO_OR_MORE: {
  -                System.out.print("OCCURS_ZERO_OR_MORE");
  +                fOut.print("OCCURS_ZERO_OR_MORE");
                   break;
               }
               case XMLDTDContentModelHandler.OCCURS_ZERO_OR_ONE: {
  -                System.out.print("OCCURS_ZERO_OR_ONE");
  +                fOut.print("OCCURS_ZERO_OR_ONE");
                   break;
               }
               default: {
  -                System.out.print("??? ("+occurrence+')');
  +                fOut.print("??? ("+occurrence+')');
               }
           }
  -        System.out.println(')');
  -    } // childrenOccurrence
  +        fOut.println(')');
  +        fOut.flush();
  +
  +    } // childrenOccurrence(short)
   
  +    /** Children end group. */
       public void childrenEndGroup() throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.println("childrenEndGroup()");
  -    } // childrenEndGroup
  +        fOut.println("childrenEndGroup()");
  +        fOut.flush();
  +
  +    } // childrenEndGroup()
   
  +    /** End content model. */
       public void endContentModel() throws SAXException {
  +
           fIndent--;
           printIndent();
  -        System.out.println("endContentModel()");
  -    } // endContentModel
  +        fOut.println("endContentModel()");
  +        fOut.flush();
   
  +    } // endContentModel()
  +
       //
       // ErrorHandler methods
       //
   
       /** Warning. */
  -    public void warning(SAXParseException ex) {
  -        System.err.println("[Warning] "+
  -                           getLocationString(ex)+": "+
  -                           ex.getMessage());
  -    }
  +    public void warning(SAXParseException ex) throws SAXException {
  +        printError("Warning", ex);
  +    } // warning(SAXParseException)
   
       /** Error. */
  -    public void error(SAXParseException ex) {
  -        System.err.println("[Error] "+
  -                           getLocationString(ex)+": "+
  -                           ex.getMessage());
  -    }
  +    public void error(SAXParseException ex) throws SAXException {
  +        printError("Error", ex);
  +    } // error(SAXParseException)
   
       /** Fatal error. */
       public void fatalError(SAXParseException ex) throws SAXException {
  -        System.err.println("[Fatal Error] "+
  -                           getLocationString(ex)+": "+
  -                           ex.getMessage());
  +        printError("Fatal Error", ex);
           throw ex;
  -    }
  +    } // fatalError(SAXParseException)
   
       //
  -    // Static methods
  +    // Protected methods
       //
  +
  +    /** Print quoted string. */
  +    protected void printQuotedString(String s) {
   
  -    public static String quoteString(String s) {
           if (s == null) {
  -            return "null";
  +            fOut.print("null");
  +            return;
           }
  -        StringBuffer str = new StringBuffer();
  -        str.append('"');
  +
  +        fOut.print('"');
           int length = s.length();
           for (int i = 0; i < length; i++) {
               char c = s.charAt(i);
  -            switch (c) {
  -                case '\n': {
  -                    str.append("\\n");
  -                    break;
  -                }
  -                case '\r': {
  -                    str.append("\\r");
  -                    break;
  -                }
  -                case '\t': {
  -                    str.append("\\t");
  -                    break;
  -                }
  -                case '\\': {
  -                    str.append("\\\\");
  -                    break;
  -                }
  -                case '"': {
  -                    str.append("\\\"");
  -                    break;
  -                }
  -                default: {
  -                    str.append(c);
  -                }
  -            }
  +            normalizeAndPrint(c);
           }
  -        str.append('"');
  -        return str.toString();
  -    }
  +        fOut.print('"');
   
  -    //
  -    // Private methods
  -    //
  +    } // printQuotedString(String)
   
  -    /** Prints the indent. */
  -    private void printIndent() {
  -        for (int i = 0; i < fIndent; i++) {
  -            System.out.print(' ');
  +    /** Print quoted string. */
  +    protected void printQuotedString(char[] ch, int offset, int length) {
  +
  +        fOut.print('"');
  +        for (int i = 0; i < length; i++) {
  +            normalizeAndPrint(ch[offset + i]);
           }
  -    }
  +        fOut.print('"');
  +
  +    } // printQuotedString(char[],int,int)
   
  -    /** Returns a string of the location. */
  -    private String getLocationString(SAXParseException ex) {
  -        StringBuffer str = new StringBuffer();
  +    /** Normalize and print. */
  +    protected void normalizeAndPrint(char c) {
   
  +        switch (c) {
  +            case '\n': {
  +                fOut.print("\\n");
  +                break;
  +            }
  +            case '\r': {
  +                fOut.print("\\r");
  +                break;
  +            }
  +            case '\t': {
  +                fOut.print("\\t");
  +                break;
  +            }
  +            case '\\': {
  +                fOut.print("\\\\");
  +                break;
  +            }
  +            case '"': {
  +                fOut.print("\\\"");
  +                break;
  +            }
  +            default: {
  +                fOut.print(c);
  +            }
  +        }
  +
  +    } // normalizeAndPrint(char)
  +
  +    /** Prints the error message. */
  +    protected void printError(String type, SAXParseException ex) {
  +
  +        System.err.print("[");
  +        System.err.print(type);
  +        System.err.print("] ");
           String systemId = ex.getSystemId();
           if (systemId != null) {
               int index = systemId.lastIndexOf('/');
  -            if (index != -1) 
  +            if (index != -1)
                   systemId = systemId.substring(index + 1);
  -            str.append(systemId);
  +            System.err.print(systemId);
           }
  -        str.append(':');
  -        str.append(ex.getLineNumber());
  -        str.append(':');
  -        str.append(ex.getColumnNumber());
  +        System.err.print(':');
  +        System.err.print(ex.getLineNumber());
  +        System.err.print(':');
  +        System.err.print(ex.getColumnNumber());
  +        System.err.print(": ");
  +        System.err.print(ex.getMessage());
  +        System.err.println();
  +        System.err.flush();
  +
  +    } // printError(String,SAXParseException)
   
  -        return str.toString();
  +    /** Prints the indent. */
  +    protected void printIndent() {
  +
  +        for (int i = 0; i < fIndent; i++) {
  +            fOut.print(' ');
  +        }
   
  -    } // getLocationString(SAXParseException):String
  +    } // printIndent()
   
       //
       // MAIN
  @@ -673,30 +985,104 @@
   
       /** Main. */
       public static void main(String[] argv) throws Exception {
  +        
  +        // is there anything to do?
  +        if (argv.length == 0) {
  +            printUsage();
  +            System.exit(1);
  +        }
  +
  +        // variables
           XMLDocumentParser parser = new DocumentTracer();
  +        boolean namespaces = DEFAULT_NAMESPACES;
  +        boolean validation = DEFAULT_VALIDATION;
  +        boolean schemaValidation = DEFAULT_SCHEMA_VALIDATION;
  +        
  +        // process arguments
           for (int i = 0; i < argv.length; i++) {
               String arg = argv[i];
  -            System.err.println("# argv["+i+"]: "+arg);
  -            //print(arg);
  +            if (arg.startsWith("-")) {
  +                String option = arg.substring(1);
  +                if (option.equalsIgnoreCase("n")) {
  +                    namespaces = option.equals("n");
  +                    continue;
  +                }
  +                if (option.equalsIgnoreCase("v")) {
  +                    validation = option.equals("v");
  +                    continue;
  +                }
  +                if (option.equalsIgnoreCase("s")) {
  +                    schemaValidation = option.equals("s");
  +                    continue;
  +                }
  +                if (option.equals("h")) {
  +                    printUsage();
  +                    continue;
  +                }
  +            }
  +
  +            // set parser features
               try {
  -                parser.parse(arg);
  +                parser.setFeature(NAMESPACES_FEATURE_ID, namespaces);
               }
               catch (SAXException e) {
  -                Exception ex = e.getException();
  -                throw ex != null ? ex : e;
  +                System.err.println("warning: Parser does not support feature ("+NAMESPACES_FEATURE_ID+")");
               }
  +            try {
  +                parser.setFeature(VALIDATION_FEATURE_ID, validation);
  +            }
  +            catch (SAXException e) {
  +                System.err.println("warning: Parser does not support feature ("+VALIDATION_FEATURE_ID+")");
  +            }
  +            try {
  +                parser.setFeature(SCHEMA_VALIDATION_FEATURE_ID, schemaValidation);
  +            }
  +            catch (SAXNotRecognizedException e) {
  +                // ignore
  +            }
  +            catch (SAXNotSupportedException e) {
  +                System.err.println("warning: Parser does not support feature ("+SCHEMA_VALIDATION_FEATURE_ID+")");
  +            }
  +    
  +            // parse file
  +            try {
  +                parser.parse(arg);
  +            }
  +            catch (SAXParseException e) {
  +                // ignore
  +            }
  +            catch (Exception e) {
  +                System.err.println("error: Parse error occurred - "+e.getMessage());
  +            }
           }
  +
       } // main(String[])
  +
  +    //
  +    // Private static methods
  +    //
  +
  +    /** Prints the usage. */
  +    private static void printUsage() {
  +
  +        System.err.println("usage: java xni.DocumentTracer (options) uri ...");
  +        System.err.println();
  +        
  +        System.err.println("options:");
  +        System.err.println("  -n | -N  Turn on/off namespace processing.");
  +        System.err.println("  -v | -V  Turn on/off validation.");
  +        System.err.println("  -s | -S  Turn on/off Schema validation support.");
  +        System.err.println("  -h       This help screen.");
  +        System.err.println();
  +
  +        System.err.println("defaults:");
  +        System.out.print("  Namespaces: ");
  +        System.err.println(DEFAULT_NAMESPACES ? "on" : "off");
  +        System.out.print("  Validation: ");
  +        System.err.println(DEFAULT_VALIDATION ? "on" : "off");
  +        System.out.print("  Schema:     ");
  +        System.err.println(DEFAULT_SCHEMA_VALIDATION ? "on" : "off");
   
  -    /** Prints the file. */
  -    private static void print(String filename) throws IOException {
  -        InputStream in = new FileInputStream(filename);
  -        int c = -1;
  -        while ((c = in.read()) != -1) {
  -            System.out.print((char)c);
  -        }
  -        System.out.println();
  -        in.close();
  -    } // print(String)
  +    } // printUsage()
   
   } // class DocumentTracer