/* |
|
* Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code 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 |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
// XMLFilterImpl.java - base SAX2 filter implementation. |
|
// http://www.saxproject.org |
|
// Written by David Megginson |
|
// NO WARRANTY! This class is in the Public Domain. |
|
// $Id: XMLFilterImpl.java,v 1.3 2004/11/03 22:53:09 jsuttor Exp $ |
|
package org.xml.sax.helpers; |
|
import java.io.IOException; |
|
import org.xml.sax.XMLReader; |
|
import org.xml.sax.XMLFilter; |
|
import org.xml.sax.InputSource; |
|
import org.xml.sax.Locator; |
|
import org.xml.sax.Attributes; |
|
import org.xml.sax.EntityResolver; |
|
import org.xml.sax.DTDHandler; |
|
import org.xml.sax.ContentHandler; |
|
import org.xml.sax.ErrorHandler; |
|
import org.xml.sax.SAXException; |
|
import org.xml.sax.SAXParseException; |
|
import org.xml.sax.SAXNotSupportedException; |
|
import org.xml.sax.SAXNotRecognizedException; |
|
/** |
|
* Base class for deriving an XML filter. |
|
* |
|
* <blockquote> |
|
* <em>This module, both source code and documentation, is in the |
|
* Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> |
|
* See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> |
|
* for further information. |
|
* </blockquote> |
|
* |
|
* <p>This class is designed to sit between an {@link org.xml.sax.XMLReader |
|
* XMLReader} and the client application's event handlers. By default, it |
|
* does nothing but pass requests up to the reader and events |
|
* on to the handlers unmodified, but subclasses can override |
|
* specific methods to modify the event stream or the configuration |
|
* requests as they pass through.</p> |
|
* |
|
* @since 1.4, SAX 2.0 |
|
* @author David Megginson |
|
* @see org.xml.sax.XMLFilter |
|
* @see org.xml.sax.XMLReader |
|
* @see org.xml.sax.EntityResolver |
|
* @see org.xml.sax.DTDHandler |
|
* @see org.xml.sax.ContentHandler |
|
* @see org.xml.sax.ErrorHandler |
|
*/ |
|
public class XMLFilterImpl |
|
implements XMLFilter, EntityResolver, DTDHandler, ContentHandler, ErrorHandler |
|
{ |
|
//////////////////////////////////////////////////////////////////// |
|
// Constructors. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Construct an empty XML filter, with no parent. |
|
* |
|
* <p>This filter will have no parent: you must assign a parent |
|
* before you start a parse or do any configuration with |
|
* setFeature or setProperty, unless you use this as a pure event |
|
* consumer rather than as an {@link XMLReader}.</p> |
|
* |
|
* @see org.xml.sax.XMLReader#setFeature |
|
* @see org.xml.sax.XMLReader#setProperty |
|
* @see #setParent |
|
*/ |
|
public XMLFilterImpl () |
|
{ |
|
super(); |
|
} |
|
/** |
|
* Construct an XML filter with the specified parent. |
|
* |
|
* @see #setParent |
|
* @see #getParent |
|
*/ |
|
public XMLFilterImpl (XMLReader parent) |
|
{ |
|
super(); |
|
setParent(parent); |
|
} |
|
//////////////////////////////////////////////////////////////////// |
|
// Implementation of org.xml.sax.XMLFilter. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Set the parent reader. |
|
* |
|
* <p>This is the {@link org.xml.sax.XMLReader XMLReader} from which |
|
* this filter will obtain its events and to which it will pass its |
|
* configuration requests. The parent may itself be another filter.</p> |
|
* |
|
* <p>If there is no parent reader set, any attempt to parse |
|
* or to set or get a feature or property will fail.</p> |
|
* |
|
* @param parent The parent XML reader. |
|
* @see #getParent |
|
*/ |
|
public void setParent (XMLReader parent) |
|
{ |
|
this.parent = parent; |
|
} |
|
/** |
|
* Get the parent reader. |
|
* |
|
* @return The parent XML reader, or null if none is set. |
|
* @see #setParent |
|
*/ |
|
public XMLReader getParent () |
|
{ |
|
return parent; |
|
} |
|
//////////////////////////////////////////////////////////////////// |
|
// Implementation of org.xml.sax.XMLReader. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Set the value of a feature. |
|
* |
|
* <p>This will always fail if the parent is null.</p> |
|
* |
|
* @param name The feature name. |
|
* @param value The requested feature value. |
|
* @exception org.xml.sax.SAXNotRecognizedException If the feature |
|
* value can't be assigned or retrieved from the parent. |
|
* @exception org.xml.sax.SAXNotSupportedException When the |
|
* parent recognizes the feature name but |
|
* cannot set the requested value. |
|
*/ |
|
public void setFeature (String name, boolean value) |
|
throws SAXNotRecognizedException, SAXNotSupportedException |
|
{ |
|
if (parent != null) { |
|
parent.setFeature(name, value); |
|
} else { |
|
throw new SAXNotRecognizedException("Feature: " + name); |
|
} |
|
} |
|
/** |
|
* Look up the value of a feature. |
|
* |
|
* <p>This will always fail if the parent is null.</p> |
|
* |
|
* @param name The feature name. |
|
* @return The current value of the feature. |
|
* @exception org.xml.sax.SAXNotRecognizedException If the feature |
|
* value can't be assigned or retrieved from the parent. |
|
* @exception org.xml.sax.SAXNotSupportedException When the |
|
* parent recognizes the feature name but |
|
* cannot determine its value at this time. |
|
*/ |
|
public boolean getFeature (String name) |
|
throws SAXNotRecognizedException, SAXNotSupportedException |
|
{ |
|
if (parent != null) { |
|
return parent.getFeature(name); |
|
} else { |
|
throw new SAXNotRecognizedException("Feature: " + name); |
|
} |
|
} |
|
/** |
|
* Set the value of a property. |
|
* |
|
* <p>This will always fail if the parent is null.</p> |
|
* |
|
* @param name The property name. |
|
* @param value The requested property value. |
|
* @exception org.xml.sax.SAXNotRecognizedException If the property |
|
* value can't be assigned or retrieved from the parent. |
|
* @exception org.xml.sax.SAXNotSupportedException When the |
|
* parent recognizes the property name but |
|
* cannot set the requested value. |
|
*/ |
|
public void setProperty (String name, Object value) |
|
throws SAXNotRecognizedException, SAXNotSupportedException |
|
{ |
|
if (parent != null) { |
|
parent.setProperty(name, value); |
|
} else { |
|
throw new SAXNotRecognizedException("Property: " + name); |
|
} |
|
} |
|
/** |
|
* Look up the value of a property. |
|
* |
|
* @param name The property name. |
|
* @return The current value of the property. |
|
* @exception org.xml.sax.SAXNotRecognizedException If the property |
|
* value can't be assigned or retrieved from the parent. |
|
* @exception org.xml.sax.SAXNotSupportedException When the |
|
* parent recognizes the property name but |
|
* cannot determine its value at this time. |
|
*/ |
|
public Object getProperty (String name) |
|
throws SAXNotRecognizedException, SAXNotSupportedException |
|
{ |
|
if (parent != null) { |
|
return parent.getProperty(name); |
|
} else { |
|
throw new SAXNotRecognizedException("Property: " + name); |
|
} |
|
} |
|
/** |
|
* Set the entity resolver. |
|
* |
|
* @param resolver The new entity resolver. |
|
*/ |
|
public void setEntityResolver (EntityResolver resolver) |
|
{ |
|
entityResolver = resolver; |
|
} |
|
/** |
|
* Get the current entity resolver. |
|
* |
|
* @return The current entity resolver, or null if none was set. |
|
*/ |
|
public EntityResolver getEntityResolver () |
|
{ |
|
return entityResolver; |
|
} |
|
/** |
|
* Set the DTD event handler. |
|
* |
|
* @param handler the new DTD handler |
|
*/ |
|
public void setDTDHandler (DTDHandler handler) |
|
{ |
|
dtdHandler = handler; |
|
} |
|
/** |
|
* Get the current DTD event handler. |
|
* |
|
* @return The current DTD handler, or null if none was set. |
|
*/ |
|
public DTDHandler getDTDHandler () |
|
{ |
|
return dtdHandler; |
|
} |
|
/** |
|
* Set the content event handler. |
|
* |
|
* @param handler the new content handler |
|
*/ |
|
public void setContentHandler (ContentHandler handler) |
|
{ |
|
contentHandler = handler; |
|
} |
|
/** |
|
* Get the content event handler. |
|
* |
|
* @return The current content handler, or null if none was set. |
|
*/ |
|
public ContentHandler getContentHandler () |
|
{ |
|
return contentHandler; |
|
} |
|
/** |
|
* Set the error event handler. |
|
* |
|
* @param handler the new error handler |
|
*/ |
|
public void setErrorHandler (ErrorHandler handler) |
|
{ |
|
errorHandler = handler; |
|
} |
|
/** |
|
* Get the current error event handler. |
|
* |
|
* @return The current error handler, or null if none was set. |
|
*/ |
|
public ErrorHandler getErrorHandler () |
|
{ |
|
return errorHandler; |
|
} |
|
/** |
|
* Parse a document. |
|
* |
|
* @param input The input source for the document entity. |
|
* @exception org.xml.sax.SAXException Any SAX exception, possibly |
|
* wrapping another exception. |
|
* @exception java.io.IOException An IO exception from the parser, |
|
* possibly from a byte stream or character stream |
|
* supplied by the application. |
|
*/ |
|
public void parse (InputSource input) |
|
throws SAXException, IOException |
|
{ |
|
setupParse(); |
|
parent.parse(input); |
|
} |
|
/** |
|
* Parse a document. |
|
* |
|
* @param systemId The system identifier as a fully-qualified URI. |
|
* @exception org.xml.sax.SAXException Any SAX exception, possibly |
|
* wrapping another exception. |
|
* @exception java.io.IOException An IO exception from the parser, |
|
* possibly from a byte stream or character stream |
|
* supplied by the application. |
|
*/ |
|
public void parse (String systemId) |
|
throws SAXException, IOException |
|
{ |
|
parse(new InputSource(systemId)); |
|
} |
|
//////////////////////////////////////////////////////////////////// |
|
// Implementation of org.xml.sax.EntityResolver. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Filter an external entity resolution. |
|
* |
|
* @param publicId The entity's public identifier, or null. |
|
* @param systemId The entity's system identifier. |
|
* @return A new InputSource or null for the default. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
* @exception java.io.IOException The client may throw an |
|
* I/O-related exception while obtaining the |
|
* new InputSource. |
|
*/ |
|
public InputSource resolveEntity (String publicId, String systemId) |
|
throws SAXException, IOException |
|
{ |
|
if (entityResolver != null) { |
|
return entityResolver.resolveEntity(publicId, systemId); |
|
} else { |
|
return null; |
|
} |
|
} |
|
//////////////////////////////////////////////////////////////////// |
|
// Implementation of org.xml.sax.DTDHandler. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Filter a notation declaration event. |
|
* |
|
* @param name The notation name. |
|
* @param publicId The notation's public identifier, or null. |
|
* @param systemId The notation's system identifier, or null. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void notationDecl (String name, String publicId, String systemId) |
|
throws SAXException |
|
{ |
|
if (dtdHandler != null) { |
|
dtdHandler.notationDecl(name, publicId, systemId); |
|
} |
|
} |
|
/** |
|
* Filter an unparsed entity declaration event. |
|
* |
|
* @param name The entity name. |
|
* @param publicId The entity's public identifier, or null. |
|
* @param systemId The entity's system identifier, or null. |
|
* @param notationName The name of the associated notation. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void unparsedEntityDecl (String name, String publicId, |
|
String systemId, String notationName) |
|
throws SAXException |
|
{ |
|
if (dtdHandler != null) { |
|
dtdHandler.unparsedEntityDecl(name, publicId, systemId, |
|
notationName); |
|
} |
|
} |
|
//////////////////////////////////////////////////////////////////// |
|
// Implementation of org.xml.sax.ContentHandler. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Filter a new document locator event. |
|
* |
|
* @param locator The document locator. |
|
*/ |
|
public void setDocumentLocator (Locator locator) |
|
{ |
|
this.locator = locator; |
|
if (contentHandler != null) { |
|
contentHandler.setDocumentLocator(locator); |
|
} |
|
} |
|
/** |
|
* Filter a start document event. |
|
* |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void startDocument () |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.startDocument(); |
|
} |
|
} |
|
/** |
|
* Filter an end document event. |
|
* |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void endDocument () |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.endDocument(); |
|
} |
|
} |
|
/** |
|
* Filter a start Namespace prefix mapping event. |
|
* |
|
* @param prefix The Namespace prefix. |
|
* @param uri The Namespace URI. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void startPrefixMapping (String prefix, String uri) |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.startPrefixMapping(prefix, uri); |
|
} |
|
} |
|
/** |
|
* Filter an end Namespace prefix mapping event. |
|
* |
|
* @param prefix The Namespace prefix. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void endPrefixMapping (String prefix) |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.endPrefixMapping(prefix); |
|
} |
|
} |
|
/** |
|
* Filter a start element event. |
|
* |
|
* @param uri The element's Namespace URI, or the empty string. |
|
* @param localName The element's local name, or the empty string. |
|
* @param qName The element's qualified (prefixed) name, or the empty |
|
* string. |
|
* @param atts The element's attributes. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void startElement (String uri, String localName, String qName, |
|
Attributes atts) |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.startElement(uri, localName, qName, atts); |
|
} |
|
} |
|
/** |
|
* Filter an end element event. |
|
* |
|
* @param uri The element's Namespace URI, or the empty string. |
|
* @param localName The element's local name, or the empty string. |
|
* @param qName The element's qualified (prefixed) name, or the empty |
|
* string. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void endElement (String uri, String localName, String qName) |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.endElement(uri, localName, qName); |
|
} |
|
} |
|
/** |
|
* Filter a character data event. |
|
* |
|
* @param ch An array of characters. |
|
* @param start The starting position in the array. |
|
* @param length The number of characters to use from the array. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void characters (char ch[], int start, int length) |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.characters(ch, start, length); |
|
} |
|
} |
|
/** |
|
* Filter an 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 from the array. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void ignorableWhitespace (char ch[], int start, int length) |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.ignorableWhitespace(ch, start, length); |
|
} |
|
} |
|
/** |
|
* Filter a processing instruction event. |
|
* |
|
* @param target The processing instruction target. |
|
* @param data The text following the target. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void processingInstruction (String target, String data) |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.processingInstruction(target, data); |
|
} |
|
} |
|
/** |
|
* Filter a skipped entity event. |
|
* |
|
* @param name The name of the skipped entity. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void skippedEntity (String name) |
|
throws SAXException |
|
{ |
|
if (contentHandler != null) { |
|
contentHandler.skippedEntity(name); |
|
} |
|
} |
|
//////////////////////////////////////////////////////////////////// |
|
// Implementation of org.xml.sax.ErrorHandler. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Filter a warning event. |
|
* |
|
* @param e The warning as an exception. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void warning (SAXParseException e) |
|
throws SAXException |
|
{ |
|
if (errorHandler != null) { |
|
errorHandler.warning(e); |
|
} |
|
} |
|
/** |
|
* Filter an error event. |
|
* |
|
* @param e The error as an exception. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void error (SAXParseException e) |
|
throws SAXException |
|
{ |
|
if (errorHandler != null) { |
|
errorHandler.error(e); |
|
} |
|
} |
|
/** |
|
* Filter a fatal error event. |
|
* |
|
* @param e The error as an exception. |
|
* @exception org.xml.sax.SAXException The client may throw |
|
* an exception during processing. |
|
*/ |
|
public void fatalError (SAXParseException e) |
|
throws SAXException |
|
{ |
|
if (errorHandler != null) { |
|
errorHandler.fatalError(e); |
|
} |
|
} |
|
//////////////////////////////////////////////////////////////////// |
|
// Internal methods. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Set up before a parse. |
|
* |
|
* <p>Before every parse, check whether the parent is |
|
* non-null, and re-register the filter for all of the |
|
* events.</p> |
|
*/ |
|
private void setupParse () |
|
{ |
|
if (parent == null) { |
|
throw new NullPointerException("No parent for filter"); |
|
} |
|
parent.setEntityResolver(this); |
|
parent.setDTDHandler(this); |
|
parent.setContentHandler(this); |
|
parent.setErrorHandler(this); |
|
} |
|
//////////////////////////////////////////////////////////////////// |
|
// Internal state. |
|
//////////////////////////////////////////////////////////////////// |
|
private XMLReader parent = null; |
|
private Locator locator = null; |
|
private EntityResolver entityResolver = null; |
|
private DTDHandler dtdHandler = null; |
|
private ContentHandler contentHandler = null; |
|
private ErrorHandler errorHandler = null; |
|
} |
|
// end of XMLFilterImpl.java |