/* Woodstox Lite ("wool") XML processor
*
* Copyright (c) 2006- Tatu Saloranta, tatu.saloranta@iki.fi
*
* Licensed under the License specified in the file LICENSE which is
* included with the source code.
* You may not use this file except in compliance with the License.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.fasterxml.aalto.sax;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXNotRecognizedException;
import org.xml.sax.SAXNotSupportedException;
import com.fasterxml.aalto.stax.InputFactoryImpl;
This is implementation of the main JAXP SAX factory, and as such
acts as the entry point from JAXP.
Note: most of the SAX features are not configurable as of yet.
However, effort is made to recognize all existing standard features
and properties, to allow using code to figure out existing
capabilities automatically.
/**
* This is implementation of the main JAXP SAX factory, and as such
* acts as the entry point from JAXP.
*<p>
* Note: most of the SAX features are not configurable as of yet.
* However, effort is made to recognize all existing standard features
* and properties, to allow using code to figure out existing
* capabilities automatically.
*/
public class SAXParserFactoryImpl
extends SAXParserFactory
{
final InputFactoryImpl mStaxFactory;
public SAXParserFactoryImpl()
{
// defaults should be fine...
mStaxFactory = new InputFactoryImpl();
}
// As per [Issue#4], let's re-define this method
Since: 0.9.8
/**
* @since 0.9.8
*/
public static SAXParserFactory newInstance() {
return new SAXParserFactoryImpl();
}
@Override
public boolean getFeature(String name)
throws SAXNotRecognizedException, SAXNotSupportedException
{
// Standard feature?
SAXFeature stdFeat = SAXUtil.findStdFeature(name);
if (stdFeat != null) {
// fixed?
Boolean b = SAXUtil.getFixedStdFeatureValue(stdFeat);
if (b != null) {
return b.booleanValue();
}
// ok, may change:
switch (stdFeat) {
case IS_STANDALONE: // read-only, but only during parsing
return true;
default:
}
} else {
// any non-standard one we may support?
}
// nope, not recognized:
SAXUtil.reportUnknownFeature(name);
return false; // never gets here
}
@Override
public SAXParser newSAXParser() {
return new SAXParserImpl(mStaxFactory);
}
@Override
public void setFeature(String name, boolean enabled)
throws SAXNotRecognizedException, SAXNotSupportedException
{
// Standard feature?
SAXFeature stdFeat = SAXUtil.findStdFeature(name);
if (stdFeat != null) {
boolean ok;
switch (stdFeat) {
case EXTERNAL_GENERAL_ENTITIES:
ok = !enabled;
break;
case EXTERNAL_PARAMETER_ENTITIES:
ok = !enabled;
break;
case IS_STANDALONE: // read-only...
ok = true;
break;
case LEXICAL_HANDLER_PARAMETER_ENTITIES:
ok = true; // won't be able to handle PEs, so this is n/a
break;
case NAMESPACES: // can't disable
ok = enabled;
break;
case NAMESPACE_PREFIXES: // can't enable:
ok = !enabled;
break;
case RESOLVE_DTD_URIS: // n/a for now
ok = true;
break;
case STRING_INTERNING:
/* Can not disable; however, doesn't harm if they try to
* do it, so let's not care
*/
ok = true;
break;
case UNICODE_NORMALIZATION_CHECKING:
// not implemented as of yet, maybe never
ok = false;
break;
case USE_ATTRIBUTES2: // read-only
case USE_LOCATOR2: // read-only
case USE_ENTITY_RESOLVER2: // read-only
// read-only, who cares:
ok = true;
break;
case VALIDATION:
// validation not yet implemented
ok = !enabled;
break;
case XMLNS_URIS:
// without disabling ns-processing, irrelevant:
ok = true;
break;
case XML_1_1:
// not yet implemented
ok = !enabled;
break;
default: // should never happen...
ok = false;
}
if (!ok) {
throw new SAXNotSupportedException("Setting std feature "+stdFeat+" to "+enabled+" not supported");
}
return;
}
// any non-standard one we may support?
// nope, not recognized:
SAXUtil.reportUnknownFeature(name);
}
@Override
public void setNamespaceAware(boolean awareness)
{
if (!awareness) {
throw new IllegalArgumentException("Non-namespace-aware mode not implemented");
}
super.setNamespaceAware(awareness);
}
@Override
public void setValidating(boolean value)
{
if (value) {
throw new IllegalArgumentException("Validating mode not implemented");
}
super.setValidating(value);
}
}