// This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. // // TagSoup is licensed under the Apache License, // Version 2.0. You may obtain a copy of this license at // http://www.apache.org/licenses/LICENSE-2.0 . You may also have // additional legal rights not granted by this license. // // TagSoup is distributed in the hope that it will be useful, but // unless required by applicable law or agreed to in writing, TagSoup // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS // OF ANY KIND, either express or implied; not even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. package org.ccil.cowan.tagsoup.jaxp; import java.util.*; import javax.xml.parsers.*; import org.xml.sax.*; /** * This is a simple implementation of JAXP {@link SAXParserFactory}, * to allow easier integration of TagSoup with the default JDK * xml processing stack. * * @author Tatu Saloranta (cowtowncoder@yahoo.com) */ public class SAXFactoryImpl extends SAXParserFactory { /** * The easiest way to test validity of features to set is to use * a prototype object. Currently this is actually not a real prototype, * in the sense that the configuration is actually passed separately * (as opposed to instantiating new readers from this prototype), but * this could be changed in future, if TagSoup parser object allowed * cloning. */ private SAXParserImpl prototypeParser = null; /** * This Map contains explicitly set features that can be succesfully * set for XMLReader instances. Temporary storage is needed due to * JAXP design: multiple readers can be instantiated from a single * factory, and settings can be changed between instantiations. *
* Note that we wouldn't need this map if we could create instances
* directly using the prototype instance.
*/
private HashMap features = null;
public SAXFactoryImpl()
{
super();
}
// // // JAXP API implementation:
/**
* Creates a new instance of SAXParser
using the currently
* configured factory parameters.
*/
public SAXParser newSAXParser()
throws ParserConfigurationException
{
try {
return SAXParserImpl.newInstance(features);
} catch (SAXException se) {
// Translate to ParserConfigurationException
throw new ParserConfigurationException(se.getMessage());
}
}
/**
* Defines that the specified feature is to enabled/disabled (as
* per second argument) on reader instances created by this
* factory.
*/
public void setFeature(String name, boolean value)
throws ParserConfigurationException, SAXNotRecognizedException,
SAXNotSupportedException
{
// First, let's see if it's a valid call
getPrototype().setFeature(name, value);
// If not, exception was thrown: so we are good now:
if (features == null) {
// Let's retain the ordering as well
features = new LinkedHashMap();
}
features.put(name, value ? Boolean.TRUE : Boolean.FALSE);
}
/**
* Returns whether the specified property will be enabled or disabled
* on reader instances constructed by this factory.
*/
public boolean getFeature(String name)
throws ParserConfigurationException, SAXNotRecognizedException,
SAXNotSupportedException
{
return getPrototype().getFeature(name);
}
// // // Internal methods
private SAXParserImpl getPrototype()
{
if (prototypeParser == null) {
prototypeParser = new SAXParserImpl();
}
return prototypeParser;
}
}