| // XMLReaderAdapter.java - adapt an SAX2 XMLReader to a SAX1 Parser | |
| // Written by David Megginson, sax@megginson.com | |
| // NO WARRANTY! This class is in the public domain. | |
| // $Id: XMLReaderAdapter.java,v 1.1 2000/10/02 02:43:20 sboag Exp $ | |
| package org.xml.sax.helpers; | |
| import java.io.IOException; | |
| import java.util.Locale; | |
| import org.xml.sax.Parser; // deprecated | |
| import org.xml.sax.Locator; | |
| import org.xml.sax.InputSource; | |
| import org.xml.sax.AttributeList; // deprecated | |
| import org.xml.sax.EntityResolver; | |
| import org.xml.sax.DTDHandler; | |
| import org.xml.sax.DocumentHandler; // deprecated | |
| import org.xml.sax.ErrorHandler; | |
| import org.xml.sax.SAXException; | |
| import org.xml.sax.XMLReader; | |
| import org.xml.sax.Attributes; | |
| import org.xml.sax.ContentHandler; | |
| import org.xml.sax.SAXNotSupportedException; | |
| /** | |
| * Adapt a SAX2 XMLReader as a SAX1 Parser. | |
| * | |
| * <blockquote> | |
| * <em>This module, both source code and documentation, is in the | |
| * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> | |
| * </blockquote> | |
| * | |
| * <p>This class wraps a SAX2 {@link org.xml.sax.XMLReader XMLReader} | |
| * and makes it act as a SAX1 {@link org.xml.sax.Parser Parser}. The XMLReader | |
| * must support a true value for the | |
| * http://xml.org/sax/features/namespace-prefixes property or parsing will fail | |
| * with a {@link org.xml.sax.SAXException SAXException}; if the XMLReader | |
| * supports a false value for the http://xml.org/sax/features/namespaces | |
| * property, that will also be used to improve efficiency.</p> | |
| * | |
| * @since SAX 2.0 | |
| * @author David Megginson, | |
| * <a href="mailto:sax@megginson.com">sax@megginson.com</a> | |
| * @version 2.0 | |
| * @see org.xml.sax.Parser | |
| * @see org.xml.sax.XMLReader | |
| */ | |
| public class XMLReaderAdapter implements Parser, ContentHandler | |
| { | |
| //////////////////////////////////////////////////////////////////// | |
| // Constructor. | |
| //////////////////////////////////////////////////////////////////// | |
| /** | |
| * Create a new adapter. | |
| * | |
| * <p>Use the "org.xml.sax.driver" property to locate the SAX2 | |
| * driver to embed.</p> | |
| * | |
| * @exception org.xml.sax.SAXException If the embedded driver | |
| * cannot be instantiated or if the | |
| * org.xml.sax.driver property is not specified. | |
| */ | |
| public XMLReaderAdapter () | |
| throws SAXException | |
| { | |
| setup(XMLReaderFactory.createXMLReader()); | |
| } | |
| /** | |
| * Create a new adapter. | |
| * | |
| * <p>Create a new adapter, wrapped around a SAX2 XMLReader. | |
| * The adapter will make the XMLReader act like a SAX1 | |
| * Parser.</p> | |
| * | |
| * @param xmlReader The SAX2 XMLReader to wrap. | |
| * @exception java.lang.NullPointerException If the argument is null. | |
| */ | |
| public XMLReaderAdapter (XMLReader xmlReader) | |
| { | |
| setup(xmlReader); | |
| } | |
| /** | |
| * Internal setup. | |
| * | |
| * @param xmlReader The embedded XMLReader. | |
| */ | |
| private void setup (XMLReader xmlReader) | |
| { | |
| if (xmlReader == null) { | |
| throw new NullPointerException("XMLReader must not be null"); | |
| } | |
| this.xmlReader = xmlReader; | |
| qAtts = new AttributesAdapter(); | |
| } | |
| //////////////////////////////////////////////////////////////////// | |
| // Implementation of org.xml.sax.Parser. | |
| //////////////////////////////////////////////////////////////////// | |
| /** | |
| * Set the locale for error reporting. | |
| * | |
| * <p>This is not supported in SAX2, and will always throw | |
| * an exception.</p> | |
| * | |
| * @param The locale for error reporting. | |
| * @see org.xml.sax.Parser#setLocale | |
| */ | |
| public void setLocale (Locale locale) | |
| throws SAXException | |
| { | |
| throw new SAXNotSupportedException("setLocale not supported"); | |
| } | |
| /** | |
| * Register the entity resolver. | |
| * | |
| * @param resolver The new resolver. | |
| * @see org.xml.sax.Parser#setEntityResolver | |
| */ | |
| public void setEntityResolver (EntityResolver resolver) | |
| { | |
| xmlReader.setEntityResolver(resolver); | |
| } | |
| /** | |
| * Register the DTD event handler. | |
| * | |
| * @param handler The new DTD event handler. | |
| * @see org.xml.sax.Parser#setDTDHandler | |
| */ | |
| public void setDTDHandler (DTDHandler handler) | |
| { | |
| xmlReader.setDTDHandler(handler); | |
| } | |
| /** | |
| * Register the SAX1 document event handler. | |
| * | |
| * <p>Note that the SAX1 document handler has no Namespace | |
| * support.</p> | |
| * | |
| * @param handler The new SAX1 document event handler. | |
| * @see org.xml.sax.Parser#setDocumentHandler | |
| */ | |
| public void setDocumentHandler (DocumentHandler handler) | |
| { | |
| documentHandler = handler; | |
| } | |
| /** | |
| * Register the error event handler. | |
| * | |
| * @param handler The new error event handler. | |
| * @see org.xml.sax.Parser#setErrorHandler | |
| */ | |
| public void setErrorHandler (ErrorHandler handler) | |
| { | |
| xmlReader.setErrorHandler(handler); | |
| } | |
| /** | |
| * Parse the document. | |
| * | |
| * <p>This method will throw an exception if the embedded | |
| * XMLReader does not support the | |
| * http://xml.org/sax/features/namespace-prefixes property.</p> | |
| * | |
| * @param systemId The absolute URL of the document. | |
| * @exception java.io.IOException If there is a problem reading | |
| * the raw content of the document. | |
| * @exception org.xml.sax.SAXException If there is a problem | |
| * processing the document. | |
| * @see #parse(org.xml.sax.InputSource) | |
| * @see org.xml.sax.Parser#parse(java.lang.String) | |
| */ | |
| public void parse (String systemId) | |
| throws IOException, SAXException | |
| { | |
| parse(new InputSource(systemId)); | |
| } | |
| /** | |
| * Parse the document. | |
| * | |
| * <p>This method will throw an exception if the embedded | |
| * XMLReader does not support the | |
| * http://xml.org/sax/features/namespace-prefixes property.</p> | |
| * | |
| * @param input An input source for the document. | |
| * @exception java.io.IOException If there is a problem reading | |
| * the raw content of the document. | |
| * @exception org.xml.sax.SAXException If there is a problem | |
| * processing the document. | |
| * @see #parse(java.lang.String) | |
| * @see org.xml.sax.Parser#parse(org.xml.sax.InputSource) | |
| */ | |
| public void parse (InputSource input) | |
| throws IOException, SAXException | |
| { | |
| setupXMLReader(); | |
| xmlReader.parse(input); | |
| } | |
| /** | |
| * Set up the XML reader. | |
| */ | |
| private void setupXMLReader () | |
| throws SAXException | |
| { | |
| xmlReader.setFeature("http://xml.org/sax/features/namespace-prefixes", true); | |
| try { | |
| xmlReader.setFeature("http://xml.org/sax/features/namespaces", | |
| false); | |
| } catch (SAXException e) { | |
| // NO OP: it's just extra information, and we can ignore it | |
| } | |
| xmlReader.setContentHandler(this); | |
| } | |
| //////////////////////////////////////////////////////////////////// | |
| // Implementation of org.xml.sax.ContentHandler. | |
| //////////////////////////////////////////////////////////////////// | |
| /** | |
| * Set a document locator. | |
| * | |
| * @param locator The document locator. | |
| * @see org.xml.sax.ContentHandler#setDocumentLocator | |
| */ | |
| public void setDocumentLocator (Locator locator) | |
| { | |
| documentHandler.setDocumentLocator(locator); | |
| } | |
| /** | |
| * Start document event. | |
| * | |
| * @exception org.xml.sax.SAXException The client may raise a | |
| * processing exception. | |
| * @see org.xml.sax.ContentHandler#startDocument | |
| */ | |
| public void startDocument () | |
| throws SAXException | |
| { | |
| documentHandler.startDocument(); | |
| } | |
| /** | |
| * End document event. | |
| * | |
| * @exception org.xml.sax.SAXException The client may raise a | |
| * processing exception. | |
| * @see org.xml.sax.ContentHandler#endDocument | |
| */ | |
| public void endDocument () | |
| throws SAXException | |
| { | |
| documentHandler.endDocument(); | |
| } | |
| /** | |
| * Adapt a SAX2 start prefix mapping event. | |
| * | |
| * @param prefix The prefix being mapped. | |
| * @param uri The Namespace URI being mapped to. | |
| * @see org.xml.sax.ContentHandler#startPrefixMapping | |
| */ | |
| public void startPrefixMapping (String prefix, String uri) | |
| { | |
| } | |
| /** | |
| * Adapt a SAX2 end prefix mapping event. | |
| * | |
| * @param prefix The prefix being mapped. | |
| * @see org.xml.sax.ContentHandler#endPrefixMapping | |
| */ | |
| public void endPrefixMapping (String prefix) | |
| { | |
| } | |
| /** | |
| * Adapt a SAX2 start element event. | |
| * | |
| * @param uri The Namespace URI. | |
| * @param localName The Namespace local name. | |
| * @param qName The qualified (prefixed) name. | |
| * @param atts The SAX2 attributes. | |
| * @exception org.xml.sax.SAXException The client may raise a | |
| * processing exception. | |
| * @see org.xml.sax.ContentHandler#endDocument | |
| */ | |
| public void startElement (String uri, String localName, | |
| String qName, Attributes atts) | |
| throws SAXException | |
| { | |
| qAtts.setAttributes(atts); | |
| documentHandler.startElement(qName, qAtts); | |
| } | |
| /** | |
| * Adapt a SAX2 end element event. | |
| * | |
| * @param uri The Namespace URI. | |
| * @param localName The Namespace local name. | |
| * @param qName The qualified (prefixed) name. | |
| * @exception org.xml.sax.SAXException The client may raise a | |
| * processing exception. | |
| * @see org.xml.sax.ContentHandler#endElement | |
| */ | |
| public void endElement (String uri, String localName, | |
| String qName) | |
| throws SAXException | |
| { | |
| documentHandler.endElement(qName); | |
| } | |
| /** | |
| * Adapt a SAX2 characters event. | |
| * | |
| * @param ch An array of characters. | |
| * @param start The starting position in the array. | |
| * @param length The number of characters to use. | |
| * @exception org.xml.sax.SAXException The client may raise a | |
| * processing exception. | |
| * @see org.xml.sax.ContentHandler#characters | |
| */ | |
| public void characters (char ch[], int start, int length) | |
| throws SAXException | |
| { | |
| documentHandler.characters(ch, start, length); | |
| } | |
| /** | |
| * Adapt a SAX2 ignorable whitespace event. | |
| * | |
| * @param ch An array of characters. | |
| * @param start The starting position in the array. | |
| * @param length The number of characters to use. | |
| * @exception org.xml.sax.SAXException The client may raise a | |
| * processing exception. | |
| * @see org.xml.sax.ContentHandler#ignorableWhitespace | |
| */ | |
| public void ignorableWhitespace (char ch[], int start, int length) | |
| throws SAXException | |
| { | |
| documentHandler.ignorableWhitespace(ch, start, length); | |
| } | |
| /** | |
| * Adapt a SAX2 processing instruction event. | |
| * | |
| * @param target The processing instruction target. | |
| * @param data The remainder of the processing instruction | |
| * @exception org.xml.sax.SAXException The client may raise a | |
| * processing exception. | |
| * @see org.xml.sax.ContentHandler#processingInstruction | |
| */ | |
| public void processingInstruction (String target, String data) | |
| throws SAXException | |
| { | |
| documentHandler.processingInstruction(target, data); | |
| } | |
| /** | |
| * Adapt a SAX2 skipped entity event. | |
| * | |
| * @param name The name of the skipped entity. | |
| * @see org.xml.sax.ContentHandler#skippedEntity | |
| */ | |
| public void skippedEntity (String name) | |
| throws SAXException | |
| { | |
| } | |
| //////////////////////////////////////////////////////////////////// | |
| // Internal state. | |
| //////////////////////////////////////////////////////////////////// | |
| XMLReader xmlReader; | |
| DocumentHandler documentHandler; | |
| AttributesAdapter qAtts; | |
| //////////////////////////////////////////////////////////////////// | |
| // Internal class. | |
| //////////////////////////////////////////////////////////////////// | |
| /** | |
| * Internal class to wrap a SAX2 Attributes object for SAX1. | |
| */ | |
| final class AttributesAdapter implements AttributeList | |
| { | |
| AttributesAdapter () | |
| { | |
| } | |
| /** | |
| * Set the embedded Attributes object. | |
| * | |
| * @param The embedded SAX2 Attributes. | |
| */ | |
| void setAttributes (Attributes attributes) | |
| { | |
| this.attributes = attributes; | |
| } | |
| /** | |
| * Return the number of attributes. | |
| * | |
| * @return The length of the attribute list. | |
| * @see org.xml.sax.AttributeList#getLength | |
| */ | |
| public int getLength () | |
| { | |
| return attributes.getLength(); | |
| } | |
| /** | |
| * Return the qualified (prefixed) name of an attribute by position. | |
| * | |
| * @return The qualified name. | |
| * @see org.xml.sax.AttributeList#getName | |
| */ | |
| public String getName (int i) | |
| { | |
| return attributes.getQName(i); | |
| } | |
| /** | |
| * Return the type of an attribute by position. | |
| * | |
| * @return The type. | |
| * @see org.xml.sax.AttributeList#getType(int) | |
| */ | |
| public String getType (int i) | |
| { | |
| return attributes.getType(i); | |
| } | |
| /** | |
| * Return the value of an attribute by position. | |
| * | |
| * @return The value. | |
| * @see org.xml.sax.AttributeList#getValue(int) | |
| */ | |
| public String getValue (int i) | |
| { | |
| return attributes.getValue(i); | |
| } | |
| /** | |
| * Return the type of an attribute by qualified (prefixed) name. | |
| * | |
| * @return The type. | |
| * @see org.xml.sax.AttributeList#getType(java.lang.String) | |
| */ | |
| public String getType (String qName) | |
| { | |
| return attributes.getType(qName); | |
| } | |
| /** | |
| * Return the value of an attribute by qualified (prefixed) name. | |
| * | |
| * @return The value. | |
| * @see org.xml.sax.AttributeList#getValue(java.lang.String) | |
| */ | |
| public String getValue (String qName) | |
| { | |
| return attributes.getValue(qName); | |
| } | |
| private Attributes attributes; | |
| } | |
| } | |
| // end of XMLReaderAdapter.java |