/* * reserved comment block * DO NOT REMOVE OR ALTER! */ /* * Copyright 1999-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * 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. */ // $Id: XPathFactoryImpl.java,v 1.2 2005/08/16 22:41:13 jeffsuttor Exp $ package com.sun.org.apache.xpath.internal.jaxp; import com.sun.org.apache.xalan.internal.XalanConstants; import com.sun.org.apache.xalan.internal.res.XSLMessages; import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; import javax.xml.XMLConstants; import javax.xml.xpath.XPathFactory; import javax.xml.xpath.XPathFactoryConfigurationException; import javax.xml.xpath.XPathFunctionResolver; import javax.xml.xpath.XPathVariableResolver; import jdk.xml.internal.JdkXmlFeatures; /** * The XPathFactory builds XPaths. * * @author Ramesh Mandava */ public class XPathFactoryImpl extends XPathFactory { /** *

Name of class as a constant to use for debugging.

*/ private static final String CLASS_NAME = "XPathFactoryImpl"; /** *

XPathFunctionResolver for this XPathFactory and created XPaths.

*/ private XPathFunctionResolver xPathFunctionResolver = null; /** *

XPathVariableResolver for this XPathFactory and created XPaths

*/ private XPathVariableResolver xPathVariableResolver = null; /** *

State of secure processing feature.

*/ private boolean _isNotSecureProcessing = true; /** *

State of secure mode.

*/ private boolean _isSecureMode = false; /** * javax.xml.xpath.XPathFactory implementation. */ private boolean _useServicesMechanism = true; private final JdkXmlFeatures _featureManager; public XPathFactoryImpl() { this(true); } public static XPathFactory newXPathFactoryNoServiceLoader() { return new XPathFactoryImpl(false); } public XPathFactoryImpl(boolean useServicesMechanism) { if (System.getSecurityManager() != null) { _isSecureMode = true; _isNotSecureProcessing = false; } _featureManager = new JdkXmlFeatures(!_isNotSecureProcessing); this._useServicesMechanism = useServicesMechanism; } /** *

Is specified object model supported by this * XPathFactory?

* * @param objectModel Specifies the object model which the returned * XPathFactory will understand. * * @return true if XPathFactory supports * objectModel, else false. * * @throws NullPointerException If objectModel is null. * @throws IllegalArgumentException If objectModel.length() == 0. */ public boolean isObjectModelSupported(String objectModel) { if (objectModel == null) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_OBJECT_MODEL_NULL, new Object[] { this.getClass().getName() } ); throw new NullPointerException( fmsg ); } if (objectModel.length() == 0) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_OBJECT_MODEL_EMPTY, new Object[] { this.getClass().getName() } ); throw new IllegalArgumentException( fmsg ); } // know how to support default object model, W3C DOM if (objectModel.equals(XPathFactory.DEFAULT_OBJECT_MODEL_URI)) { return true; } // don't know how to support anything else return false; } /** *

Returns a new XPath object using the underlying * object model determined when the factory was instantiated.

* * @return New XPath */ public javax.xml.xpath.XPath newXPath() { return new com.sun.org.apache.xpath.internal.jaxp.XPathImpl( xPathVariableResolver, xPathFunctionResolver, !_isNotSecureProcessing, _useServicesMechanism, _featureManager ); } /** *

Set a feature for this XPathFactory and * XPaths created by this factory.

* *

* Feature names are fully qualified {@link java.net.URI}s. * Implementations may define their own features. * An {@link XPathFactoryConfigurationException} is thrown if this * XPathFactory or the XPaths * it creates cannot support the feature. * It is possible for an XPathFactory to expose a feature * value but be unable to change its state. *

* *

See {@link javax.xml.xpath.XPathFactory} for full documentation * of specific features.

* * @param name Feature name. * @param value Is feature state true or false. * * @throws XPathFactoryConfigurationException if this * XPathFactory or the XPaths * it creates cannot support this feature. * @throws NullPointerException if name is * null. */ public void setFeature(String name, boolean value) throws XPathFactoryConfigurationException { // feature name cannot be null if (name == null) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_FEATURE_NAME_NULL, new Object[] { CLASS_NAME, new Boolean( value) } ); throw new NullPointerException( fmsg ); } // secure processing? if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) { if ((_isSecureMode) && (!value)) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_SECUREPROCESSING_FEATURE, new Object[] { name, CLASS_NAME, new Boolean(value) } ); throw new XPathFactoryConfigurationException( fmsg ); } _isNotSecureProcessing = !value; if (value && _featureManager != null) { _featureManager.setFeature(JdkXmlFeatures.XmlFeature.ENABLE_EXTENSION_FUNCTION, JdkXmlFeatures.State.FSP, false); } // all done processing feature return; } if (name.equals(XalanConstants.ORACLE_FEATURE_SERVICE_MECHANISM)) { //in secure mode, let _useServicesMechanism be determined by the constructor if (!_isSecureMode) _useServicesMechanism = value; return; } if (_featureManager != null && _featureManager.setFeature(name, JdkXmlFeatures.State.APIPROPERTY, value)) { return; } // unknown feature String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_FEATURE_UNKNOWN, new Object[] { name, CLASS_NAME, new Boolean(value) } ); throw new XPathFactoryConfigurationException( fmsg ); } /** *

Get the state of the named feature.

* *

* Feature names are fully qualified {@link java.net.URI}s. * Implementations may define their own features. * An {@link XPathFactoryConfigurationException} is thrown if this * XPathFactory or the XPaths * it creates cannot support the feature. * It is possible for an XPathFactory to expose a feature * value but be unable to change its state. *

* * @param name Feature name. * * @return State of the named feature. * * @throws XPathFactoryConfigurationException if this * XPathFactory or the XPaths * it creates cannot support this feature. * @throws NullPointerException if name is * null. */ public boolean getFeature(String name) throws XPathFactoryConfigurationException { // feature name cannot be null if (name == null) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_GETTING_NULL_FEATURE, new Object[] { CLASS_NAME } ); throw new NullPointerException( fmsg ); } // secure processing? if (name.equals(XMLConstants.FEATURE_SECURE_PROCESSING)) { return !_isNotSecureProcessing; } if (name.equals(XalanConstants.ORACLE_FEATURE_SERVICE_MECHANISM)) { return _useServicesMechanism; } /** Check to see if the property is managed by the feature manager **/ int index = _featureManager.getIndex(name); if (index > -1) { return _featureManager.getFeature(index); } // unknown feature String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_GETTING_UNKNOWN_FEATURE, new Object[] { name, CLASS_NAME } ); throw new XPathFactoryConfigurationException( fmsg ); } /** *

Establish a default function resolver.

* *

Any XPath objects constructed from this factory will use * the specified resolver by default.

* *

A NullPointerException is thrown if * resolver is null.

* * @param resolver XPath function resolver. * * @throws NullPointerException If resolver is * null. */ public void setXPathFunctionResolver(XPathFunctionResolver resolver) { // resolver cannot be null if (resolver == null) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_NULL_XPATH_FUNCTION_RESOLVER, new Object[] { CLASS_NAME } ); throw new NullPointerException( fmsg ); } xPathFunctionResolver = resolver; } /** *

Establish a default variable resolver.

* *

Any XPath objects constructed from this factory will use * the specified resolver by default.

* *

A NullPointerException is thrown if resolver is null.

* * @param resolver Variable resolver. * * @throws NullPointerException If resolver is * null. */ public void setXPathVariableResolver(XPathVariableResolver resolver) { // resolver cannot be null if (resolver == null) { String fmsg = XSLMessages.createXPATHMessage( XPATHErrorResources.ER_NULL_XPATH_VARIABLE_RESOLVER, new Object[] { CLASS_NAME } ); throw new NullPointerException( fmsg ); } xPathVariableResolver = resolver; } }