1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042 |
- /* SAXParser.java --
- Copyright (C) 2005, 2006, 2007 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.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 if ((GNU_FEATURES + "coalescing").equals(name))
- coalescing = 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 SAXNotRecognizedException(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]);
- java.io.FileReader fr = new java.io.FileReader(args[pos]);
- input.setCharacterStream(fr);
- try
- {
- XMLReader reader = parser.getXMLReader();
- reader.setContentHandler(handler);
- reader.parse(input);
- }
- finally
- {
- fr.close();
- }
- pos++;
- }
- }
- }
|