/* SAXParser.java -- 
   Copyright (C) 2005, 2006  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package gnu.xml.stream;

import java.io.InputStream;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.stream.Location;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLReporter;
import javax.xml.stream.XMLResolver;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

import org.xml.sax.ContentHandler;
import org.xml.sax.DTDHandler;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Parser;
import org.xml.sax.SAXException;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.ext.Attributes2;
import org.xml.sax.ext.DeclHandler;
import org.xml.sax.ext.EntityResolver2;
import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.ext.Locator2;

/**
 * JAXP SAX parser using an underlying StAX parser.
 * This parser supports the following additional SAX features and
 * properties:
 * <table>
 * <tr><th colspan='4'>Features</th></tr>
 * <tr><td>http://gnu.org/sax/features/xml-base</td>
 * <td colspan='2'>read/write</td>
 * <td>Indicates or sets whether XML Base processing is enabled</td></tr>
 * <tr><th colspan='4'>Properties</th></tr>
 * <tr><td>http://gnu.org/sax/properties/base-uri</td>
 * <td>read-only</td><td>String</td>
 * <td>Returns the base URI of the current event</td></tr>
 * <tr><td>http://gnu.org/sax/properties/document-xml-encoding</td>
 * <td>read-only</td><td>String</td>
 * <td>Returns the encoding specified in the XML declaration</td></tr>
 * </table>
 *
 * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a>
 */
public class SAXParser
  extends javax.xml.parsers.SAXParser
  implements XMLReader, Attributes2, Locator2, XMLReporter, XMLResolver
{

  ContentHandler contentHandler;
  DeclHandler declHandler;
  DTDHandler dtdHandler;
  EntityResolver entityResolver;
  ErrorHandler errorHandler;
  LexicalHandler lexicalHandler;

  boolean validating = false;
  boolean namespaceAware = true;
  boolean xIncludeAware = false;
  boolean stringInterning = true;
  boolean coalescing = true;
  boolean replaceERefs = true;
  boolean externalEntities = true;
  boolean supportDTD = true;
  boolean baseAware = true;

  XMLParser parser;
  XMLStreamReader reader;
  String encoding;
  String xmlVersion;
  boolean xmlStandalone;
  String xmlEncoding;
  String baseURI;

  public SAXParser()
  {
  }

  SAXParser(boolean validating, boolean namespaceAware, boolean xIncludeAware)
  {
    this.validating = validating;
    this.namespaceAware = namespaceAware;
    this.xIncludeAware = xIncludeAware;
  }

  // -- SAXParser --
  
  public Parser getParser()
    throws SAXException
  {
    return null;
  }
  
  public XMLReader getXMLReader()
    throws SAXException
  {
    return this;
  }

  public boolean isNamespaceAware()
  {
    return namespaceAware;
  }

  public boolean isValidating()
  {
    return validating;
  }

  public void setProperty(String name, Object value)
    throws SAXNotRecognizedException, SAXNotSupportedException
  {
    if (parser != null)
      throw new IllegalStateException("parsing in progress");
    final String FEATURES = "http://xml.org/sax/features/";
    final String PROPERTIES = "http://xml.org/sax/properties/";
    final String GNU_FEATURES = "http://gnu.org/sax/features/";
    if ((FEATURES + "namespaces").equals(name))
      namespaceAware = Boolean.TRUE.equals(value);
    else if ((FEATURES + "namespace-prefixes").equals(name))
      {
        // NOOP
      }
    else if ((FEATURES + "string-interning").equals(name))
      stringInterning = Boolean.TRUE.equals(value);
    else if ((FEATURES + "use-attributes2").equals(name))
      {
        // NOOP
      }
    else if ((FEATURES + "validation").equals(name))
      validating = Boolean.TRUE.equals(value);
    else if ((FEATURES + "external-general-entities").equals(name))
      externalEntities = Boolean.TRUE.equals(value);
    else if ((FEATURES + "external-parameter-entities").equals(name))
      externalEntities = Boolean.TRUE.equals(value);
    else if ((PROPERTIES + "declaration-handler").equals(name))
      declHandler = (DeclHandler) value;
    else if ((PROPERTIES + "lexical-handler").equals(name))
      lexicalHandler = (LexicalHandler) value;
    else if ((GNU_FEATURES + "xml-base").equals(name))
      baseAware = Boolean.TRUE.equals(value);
    else
      throw new SAXNotSupportedException(name);
  }

  public Object getProperty(String name)
    throws SAXNotRecognizedException, SAXNotSupportedException
  {
    final String FEATURES = "http://xml.org/sax/features/";
    final String PROPERTIES = "http://xml.org/sax/properties/";
    final String GNU_FEATURES = "http://gnu.org/sax/features/";
    final String GNU_PROPERTIES = "http://gnu.org/sax/properties/";
    if ((GNU_FEATURES + "base-uri").equals(name))
      return baseURI;
    if ((FEATURES + "is-standalone").equals(name))
      return xmlStandalone ? Boolean.TRUE : Boolean.FALSE;
    if ((FEATURES + "namespaces").equals(name))
      return namespaceAware ? Boolean.TRUE : Boolean.FALSE;
    if ((FEATURES + "namespace-prefixes").equals(name))
      return Boolean.TRUE;
    if ((FEATURES + "string-interning").equals(name))
      return stringInterning ? Boolean.TRUE : Boolean.FALSE;
    if ((FEATURES + "use-attributes2").equals(name))
      return Boolean.TRUE;
    if ((FEATURES + "use-locator2").equals(name))
      return Boolean.TRUE;
    if ((FEATURES + "use-entity-resolver2").equals(name))
      return Boolean.FALSE;
    if ((FEATURES + "validation").equals(name))
      return validating ? Boolean.TRUE : Boolean.FALSE;
    if ((FEATURES + "external-general-entities").equals(name))
      return externalEntities ? Boolean.TRUE : Boolean.FALSE;
    if ((FEATURES + "external-parameter-entities").equals(name))
      return externalEntities ? Boolean.TRUE : Boolean.FALSE;
    if ((FEATURES + "xml-1.1").equals(name))
      return Boolean.TRUE;
    if ((PROPERTIES + "declaration-handler").equals(name))
      return declHandler;
    if ((PROPERTIES + "document-xml-version").equals(name))
      return xmlVersion;
    if ((PROPERTIES + "lexical-handler").equals(name))
      return lexicalHandler;
    if ((GNU_FEATURES + "xml-base").equals(name))
      return baseAware ? Boolean.TRUE : Boolean.FALSE;
    if ((GNU_PROPERTIES + "document-xml-encoding").equals(name))
      return xmlEncoding;
    throw new SAXNotSupportedException(name);
  }

  public boolean isXIncludeAware()
  {
    return xIncludeAware;
  }

  public void reset()
  {
    parser = null;
    encoding = null;
    xmlVersion = null;
    xmlStandalone = false;
  }

  // -- XMLReader --

  public boolean getFeature(String name)
    throws SAXNotRecognizedException, SAXNotSupportedException
  {
    Object ret = getProperty(name);
    if (ret instanceof Boolean)
      return ((Boolean) ret).booleanValue();
    throw new SAXNotSupportedException(name);
  }

  public void setFeature(String name, boolean value)
    throws SAXNotRecognizedException, SAXNotSupportedException
  {
    setProperty(name, value ? Boolean.TRUE : Boolean.FALSE);
  }

  public void setEntityResolver(EntityResolver resolver)
  {
    entityResolver = resolver;
  }

  public EntityResolver getEntityResolver()
  {
    return entityResolver;
  }

  public void setDTDHandler(DTDHandler handler)
  {
    dtdHandler = handler;
  }

  public DTDHandler getDTDHandler()
  {
    return dtdHandler;
  }

  public void setContentHandler(ContentHandler handler)
  {
    contentHandler = handler;
  }

  public ContentHandler getContentHandler()
  {
    return contentHandler;
  }

  public void setErrorHandler(ErrorHandler handler)
  {
    errorHandler = handler;
  }

  public ErrorHandler getErrorHandler()
  {
    return errorHandler;
  }

  public synchronized void parse(InputSource input)
    throws IOException, SAXException
  {
    reset();
    String systemId = input.getSystemId();
    InputStream in = input.getByteStream();
    boolean opened = false;
    if (in != null)
      parser = new XMLParser(in, systemId,
                             validating,
                             namespaceAware,
                             coalescing,
                             replaceERefs,
                             externalEntities,
                             supportDTD,
                             baseAware,
                             stringInterning,
                             true,
                             this,
                             this);
    else
      {
        Reader r = input.getCharacterStream();
        if (r != null)
          parser = new XMLParser(r, systemId,
                                 validating,
                                 namespaceAware,
                                 coalescing,
                                 replaceERefs,
                                 externalEntities,
                                 supportDTD,
                                 baseAware,
                                 stringInterning,
                                 true,
                                 this,
                                 this);
      }
    if (parser == null)
      {
        if (systemId == null)
          throw new SAXException("No stream or system ID specified");
        systemId = XMLParser.absolutize(null, systemId);
        in = new URL(systemId).openStream();
        opened = true;
        parser = new XMLParser(in, systemId,
                               validating,
                               namespaceAware,
                               coalescing,
                               replaceERefs,
                               externalEntities,
                               supportDTD,
                               baseAware,
                               stringInterning,
                               true,
                               this,
                               this);
      }
    reader = parser;
    baseURI = systemId;
    
    if (xIncludeAware)
      reader = new XIncludeFilter(parser, systemId, namespaceAware,
                                  validating, true);
    
    if (contentHandler != null)
      contentHandler.setDocumentLocator(this);
    boolean startDocumentDone = false;
    try
      {
        while (parser.hasNext())
          {
            int event = parser.next();
            if (baseAware)
              baseURI = parser.getXMLBase();
            switch (event)
              {
              case XMLStreamConstants.CHARACTERS:
                if (contentHandler != null)
                  {
                    char[] b = reader.getTextCharacters();
                    contentHandler.characters(b, 0, b.length);
                  }
                break;
              case XMLStreamConstants.SPACE:
                if (contentHandler != null)
                  {
                    char[] b = reader.getTextCharacters();
                    if (isIgnorableWhitespace(parser, b, false))
                      contentHandler.ignorableWhitespace(b, 0, b.length);
                    else
                      contentHandler.characters(b, 0, b.length);
                  }
                break;
              case XMLStreamConstants.CDATA:
                if (lexicalHandler != null)
                  lexicalHandler.startCDATA();
                if (contentHandler != null)
                  {
                    char[] b = reader.getTextCharacters();
                    if (isIgnorableWhitespace(parser, b, true))
                      contentHandler.ignorableWhitespace(b, 0, b.length);
                    else
                      contentHandler.characters(b, 0, b.length);
                  }
                if (lexicalHandler != null)
                  lexicalHandler.endCDATA();
                break;
              case XMLStreamConstants.START_ELEMENT:
                if (contentHandler != null)
                  {
                    QName name = reader.getName();
                    String uri = name.getNamespaceURI();
                    String localName = name.getLocalPart();
                    String prefix = name.getPrefix();
                    String qName = localName;
                    if (!"".equals(prefix))
                      qName = prefix + ":" + localName;
                    if (!namespaceAware)
                      {
                        uri = "";
                        localName = "";
                      }
                    else
                      {
                        int nc = reader.getNamespaceCount();
                        for (int i = 0; i < nc; i++)
                          {
                            String nsuri = reader.getNamespaceURI(i);
                            String nsprefix = reader.getNamespacePrefix(i);
                            if ("xml".equals(nsprefix))
                              continue;
                            contentHandler.startPrefixMapping(nsprefix, nsuri);
                          }
                      }
                    contentHandler.startElement(uri, localName, qName, this);
                  }
                break;
              case XMLStreamConstants.END_ELEMENT:
                if (contentHandler != null)
                  {
                    QName name = reader.getName();
                    String uri = name.getNamespaceURI();
                    String localName = name.getLocalPart();
                    String prefix = name.getPrefix();
                    String qName = localName;
                    if (!"".equals(prefix))
                      qName = prefix + ":" + localName;
                    if (!namespaceAware)
                      {
                        uri = "";
                        localName = "";
                      }
                    contentHandler.endElement(uri, localName, qName);
                    if (namespaceAware)
                      {
                        int nc = reader.getNamespaceCount();
                        for (int i = 0; i < nc; i++)
                          {
                            String nsprefix = reader.getNamespacePrefix(i);
                            if ("xml".equals(nsprefix))
                              continue;
                            contentHandler.endPrefixMapping(nsprefix);
                          }
                      }
                  }
                break;
              case XMLStreamConstants.COMMENT:
                if (lexicalHandler != null)
                  {
                    char[] b = reader.getTextCharacters();
                    lexicalHandler.comment(b, 0, b.length);
                  }
                break;
              case XMLStreamConstants.PROCESSING_INSTRUCTION:
                if (contentHandler != null)
                  {
                    String target = reader.getPITarget();
                    String data = reader.getPIData();
                    if (data == null)
                      data = "";
                    contentHandler.processingInstruction(target, data);
                  }
                break;
              case XMLParser.START_ENTITY:
                if (lexicalHandler != null)
                  {
                    String name = reader.getText();
                    lexicalHandler.startEntity(name);
                  }
                break;
              case XMLParser.END_ENTITY:
                if (lexicalHandler != null)
                  {
                    String name = reader.getText();
                    lexicalHandler.endEntity(name);
                  }
                break;
              case XMLStreamConstants.START_DOCUMENT:
                encoding = reader.getEncoding();
                xmlVersion = reader.getVersion();
                xmlStandalone = reader.isStandalone();
                xmlEncoding = reader.getCharacterEncodingScheme();
                if (contentHandler != null)
                  contentHandler.startDocument();
                startDocumentDone = true;
                break;
              case XMLStreamConstants.END_DOCUMENT:
                if (contentHandler != null)
                  contentHandler.endDocument();
                break;
              case XMLStreamConstants.DTD:
                XMLParser.Doctype doctype = parser.doctype;
                if (lexicalHandler != null)
                  {
                    String rootName = doctype.rootName;
                    String publicId = doctype.publicId;
                    String systemId2 = doctype.systemId;
                    lexicalHandler.startDTD(rootName, publicId, systemId2);
                  }
                for (Iterator i = doctype.entryIterator(); i.hasNext(); )
                  {
                    String entry = (String) i.next();
                    char c = entry.charAt(0);
                    String name = entry.substring(1);
                    if ('E' == c)
                      {
                        // Element decl
                        if (declHandler != null)
                          {
                            XMLParser.ContentModel model =
                              doctype.getElementModel(name);
                            declHandler.elementDecl(name, model.text);
                          }
                      }
                    else if ('A' == c)
                      {
                        // Attlist decl
                        if (declHandler != null)
                          {
                            for (Iterator j = doctype.attlistIterator(name);
                                 j.hasNext(); )
                              {
                                Map.Entry att = (Map.Entry) j.next();
                                String aname = (String) att.getKey();
                                XMLParser.AttributeDecl decl =
                                  (XMLParser.AttributeDecl) att.getValue();
                                String type = decl.type;
                                String value = decl.value;
                                String mode = null;
                                switch (decl.valueType)
                                  {
                                  case XMLParser.ATTRIBUTE_DEFAULT_FIXED:
                                    mode = "#FIXED";
                                    break;
                                  case XMLParser.ATTRIBUTE_DEFAULT_REQUIRED:
                                    mode = "#REQUIRED";
                                    break;
                                  case XMLParser.ATTRIBUTE_DEFAULT_IMPLIED:
                                    mode = "#IMPLIED";
                                    break;
                                  }
                                declHandler.attributeDecl(name, aname,
                                                          type, mode, value);
                              }
                          }
                      }
                    else if ('e' == c)
                      {
                        // Entity decl
                        Object entity = doctype.getEntity(name);
                        if (entity instanceof String)
                          {
                            if (declHandler != null)
                              declHandler.internalEntityDecl(name,
                                                             (String) entity);
                          }
                        else
                          {
                            XMLParser.ExternalIds ids =
                              (XMLParser.ExternalIds) entity;
                            if (ids.notationName != null)
                              {
                                if (dtdHandler != null)
                                  {
                                    String pub = ids.publicId;
                                    String url = ids.systemId;
                                    String not = ids.notationName;
                                    dtdHandler.unparsedEntityDecl(name,
                                                                  pub,
                                                                  url,
                                                                  not);
                                  }
                              }
                            else
                              {
                                if (declHandler != null)
                                  {
                                    String pub = ids.publicId;
                                    String url = ids.systemId;
                                    declHandler.externalEntityDecl(name,
                                                                   pub,
                                                                   url);
                                  }
                              }
                          }
                      }
                    else if ('n' == c)
                      {
                        // Notation decl
                        if (dtdHandler != null)
                          {
                            XMLParser.ExternalIds ids =
                              doctype.getNotation(name);
                            String pub = ids.publicId;
                            String url = ids.systemId;
                            dtdHandler.notationDecl(name, pub, url);
                          }
                      }
                    else if ('c' == c)
                      {
                        // Comment
                        if (lexicalHandler != null)
                          {
                            String comment = doctype.getComment(name);
                            char[] b = comment.toCharArray();
                            lexicalHandler.comment(b, 0, b.length);
                          }
                      }
                    else if ('p' == c)
                      {
                        // Processing instruction
                        if (contentHandler != null)
                          {
                            String[] pi = doctype.getPI(name);
                            String target = pi[0];
                            String data = pi[1];
                            if (data == null)
                              data = "";
                            contentHandler.processingInstruction(target, data);
                          }
                      }
                  }
                if (lexicalHandler != null)
                  lexicalHandler.endDTD();
              }
          }
        reset();
        if (opened)
          in.close();
      }
    catch (Exception e)
      {
        SAXParseException e2 = new SAXParseException(e.getMessage(), this);
        e2.initCause(e);
        try
          {
            if (!startDocumentDone && contentHandler != null)
              contentHandler.startDocument();
            if (errorHandler != null)
              errorHandler.fatalError(e2);
            if (contentHandler != null)
              contentHandler.endDocument();
          }
        catch (SAXException sex)
          {
            // Ignored, we will rethrow the original exception.
          }
        reset();
        if (opened)
          in.close();
        if (e instanceof SAXException)
          throw (SAXException) e;
        if (e instanceof IOException)
          throw (IOException) e;
        else
          throw e2;
      }
  }

  /**
   * Indicates whether the specified characters are ignorable whitespace.
   */
  private boolean isIgnorableWhitespace(XMLParser reader, char[] b,
                                        boolean testCharacters)
    throws XMLStreamException
  {
    XMLParser.Doctype doctype = reader.doctype;
    if (doctype == null)
      return false;
    String currentElement = reader.getCurrentElement();
    // check for xml:space
    int ac = reader.getAttributeCount();
    for (int i = 0; i < ac; i++)
      {
        QName aname = reader.getAttributeName(i);
        if ("space".equals(aname.getLocalPart()) &&
            XMLConstants.XML_NS_URI.equals(aname.getNamespaceURI()))
          {
            if ("preserve".equals(reader.getAttributeValue(i)))
              return false;
          }
      }
    XMLParser.ContentModel model = doctype.getElementModel(currentElement);
    if (model == null || model.type != XMLParser.ContentModel.ELEMENT)
      return false;
    if (model.external && xmlStandalone)
      return false;
    boolean white = true;
    if (testCharacters)
      {
        for (int i = 0; i < b.length; i++)
          {
            if (b[i] != ' ' && b[i] != '\t' && b[i] != '\n' && b[i] != '\r')
              {
                white = false;
                break;
              }
          }
      }
    return white;
  }

  public void parse(String systemId)
    throws IOException, SAXException
  {
    parse(new InputSource(systemId));
  }

  // -- Attributes2 --

  public int getIndex(String qName)
  {
    int len = reader.getAttributeCount();
    for (int i = 0; i < len; i++)
      {
        QName q = reader.getAttributeName(i);
        String localName = q.getLocalPart();
        String prefix = q.getPrefix();
        String qn = ("".equals(prefix)) ? localName : prefix + ":" + localName;
        if (qName.equals(qn))
          return i;
      }
    return -1;
  }

  public int getIndex(String uri, String localName)
  {
    int len = reader.getAttributeCount();
    for (int i = 0; i < len; i++)
      {
        QName q = reader.getAttributeName(i);
        String ln = q.getLocalPart();
        String u = q.getNamespaceURI();
        if (u == null && uri != null)
          continue;
        if (u != null && !u.equals(uri))
          continue;
        if (ln.equals(localName))
          return i;
      }
    return -1;
  }

  public int getLength()
  {
    return reader.getAttributeCount();
  }

  public String getLocalName(int index)
  {
    return reader.getAttributeLocalName(index);
  }

  public String getQName(int index)
  {
    QName q = reader.getAttributeName(index);
    String localName = q.getLocalPart();
    String prefix = q.getPrefix();
    return ("".equals(prefix)) ? localName : prefix + ":" + localName;
  }

  public String getType(int index)
  {
    String ret = reader.getAttributeType(index);
    // SAX doesn't permit ENUMERATION?
    return ("ENUMERATION".equals(ret)) ? "NMTOKEN" : ret;
  }

  public String getType(String qName)
  {
    int index = getIndex(qName);
    return (index == -1) ? null : getType(index);
  }

  public String getType(String uri, String localName)
  {
    int index = getIndex(uri, localName);
    return (index == -1) ? null : getType(index);
  }

  public String getURI(int index)
  {
    String ret = reader.getAttributeNamespace(index);
    return (ret == null) ? "" : ret;
  }

  public String getValue(int index)
  {
    return reader.getAttributeValue(index);
  }

  public String getValue(String qName)
  {
    int index = getIndex(qName);
    return (index == -1) ? null : getValue(index);
  }

  public String getValue(String uri, String localName)
  {
    int index = getIndex(uri, localName);
    return (index == -1) ? null : getValue(index);
  }

  public boolean isDeclared(int index)
  {
    return parser.isAttributeDeclared(index);
  }

  public boolean isDeclared(String qName)
  {
    int index = getIndex(qName);
    return (index == -1) ? false : isDeclared(index);
  }

  public boolean isDeclared(String uri, String localName)
  {
    int index = getIndex(uri, localName);
    return (index == -1) ? false : isDeclared(index);
  }

  public boolean isSpecified(int index)
  {
    return reader.isAttributeSpecified(index);
  }

  public boolean isSpecified(String qName)
  {
    int index = getIndex(qName);
    return (index == -1) ? false : isSpecified(index);
  }

  public boolean isSpecified(String uri, String localName)
  {
    int index = getIndex(uri, localName);
    return (index == -1) ? false : isSpecified(index);
  }

  // -- Locator2 --
  
  public int getColumnNumber()
  {
    Location l = reader.getLocation();
    return l.getColumnNumber();
  }

  public int getLineNumber()
  {
    Location l = reader.getLocation();
    return l.getLineNumber();
  }

  public String getPublicId()
  {
    Location l = reader.getLocation();
    return l.getPublicId();
  }

  public String getSystemId()
  {
    Location l = reader.getLocation();
    return l.getSystemId();
  }
  
  public String getEncoding()
  {
    return encoding;
  }

  public String getXMLVersion()
  {
    return xmlVersion;
  }

  // -- XMLResolver --
  
  public Object resolveEntity(String publicId, String systemId,
                              String baseURI, String namespace)
    throws XMLStreamException
  {
    if (entityResolver != null)
      {
        try
          {
            InputSource input =
              entityResolver.resolveEntity(publicId, systemId);
            if (input != null)
              {
                InputStream in = input.getByteStream();
                if (in == null)
                  {
                    String newSystemId = input.getSystemId();
                    if (newSystemId != null && !newSystemId.equals(systemId))
                      in = XMLParser.resolve(newSystemId);
                  }
                return in;
              }
          }
        catch (SAXException e)
          {
            XMLStreamException e2 = new XMLStreamException(e.getMessage());
            e2.initCause(e);
            throw e2;
          }
        catch (IOException e)
          {
            XMLStreamException e2 = new XMLStreamException(e.getMessage());
            e2.initCause(e);
            throw e2;
          }
      }
    return null;
  }

  public XMLEventReader resolveAsXMLEventReader(String uri)
    throws XMLStreamException
  {
    // unused
    return null;
  }

  public XMLStreamReader resolveAsXMLStreamReader(String uri)
    throws XMLStreamException
  {
    // unused
    return null;
  }

  // -- XMLReporter --

  public void report(String message, String errorType,
                     Object relatedInformation, Location location)
    throws XMLStreamException
  {
    if (errorHandler != null)
      {
        try
          {
            errorHandler.warning(new SAXParseException(message, this));
          }
        catch (SAXException e)
          {
            XMLStreamException e2 = new XMLStreamException(e.getMessage());
            e2.initCause(e);
            throw e2;
          }
      }
  }

  public static void main(String[] args)
    throws Exception
  {
    boolean validating = false;
    boolean namespaceAware = false;
    boolean xIncludeAware = false;
    boolean expectCallbackClass = false;
    String callbackClass = null;
    int pos = 0;
    while (pos < args.length && (args[pos].startsWith("-") || expectCallbackClass))
      {
        if ("-x".equals(args[pos]))
          xIncludeAware = true;
        else if ("-v".equals(args[pos]))
          validating = true;
        else if ("-n".equals(args[pos]))
          namespaceAware = true;
        else if ("-c".equals(args[pos]))
          expectCallbackClass = true;
        else if (expectCallbackClass)
          {
            callbackClass = args[pos];
            expectCallbackClass = false;
          }
        pos++;
      }
    if (pos >= args.length || expectCallbackClass)
      {
        System.out.println("Syntax: SAXParser [-n] [-v] [-x] [-c <class>] <file> [<file2> [...]]");
        System.out.println("\t-n: use namespace aware mode");
        System.out.println("\t-v: use validating parser");
        System.out.println("\t-x: use XInclude aware mode");
        System.out.println("\t-c <class>: use specified class as callback handler (must have a no-arg public constructor)");
        System.exit(2);
      }
    while (pos < args.length)
      {
        ContentHandler handler = null;
        if (callbackClass != null)
          {
            Class t = Class.forName(callbackClass);
            handler = (ContentHandler) t.newInstance();
          }
        else
          handler = new org.xml.sax.helpers.DefaultHandler();
        SAXParser parser = new SAXParser(validating, namespaceAware,
                                         xIncludeAware);
        InputSource input = new InputSource(args[pos]);
        XMLReader reader = parser.getXMLReader();
        reader.setContentHandler(handler);
        reader.parse(input);
        pos++;
      }
  }
  
}
