diff options
Diffstat (limited to 'src/javax/xml/transform/FactoryFinder.java')
-rw-r--r-- | src/javax/xml/transform/FactoryFinder.java | 349 |
1 files changed, 0 insertions, 349 deletions
diff --git a/src/javax/xml/transform/FactoryFinder.java b/src/javax/xml/transform/FactoryFinder.java deleted file mode 100644 index 4ae6568..0000000 --- a/src/javax/xml/transform/FactoryFinder.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright (c) 2003, 2013, 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. - */ - -package javax.xml.transform; - -import java.io.File; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.Iterator; -import java.util.Properties; -import java.util.ServiceConfigurationError; -import java.util.ServiceLoader; - -/** - * <p>Implements pluggable Datatypes.</p> - * - * <p>This class is duplicated for each JAXP subpackage so keep it in - * sync. It is package private for secure class loading.</p> - * - * @author Santiago.PericasGeertsen@sun.com - * @author Huizhe.Wang@oracle.com - */ -class FactoryFinder { - private static final String DEFAULT_PACKAGE = "com.sun.org.apache.xalan.internal."; - - /** - * Internal debug flag. - */ - private static boolean debug = false; - - /** - * Cache for properties in java.home/lib/jaxp.properties - */ - private final static Properties cacheProps = new Properties(); - - /** - * Flag indicating if properties from java.home/lib/jaxp.properties - * have been cached. - */ - static volatile boolean firstTime = true; - - /** - * Security support class use to check access control before - * getting certain system resources. - */ - private final static SecuritySupport ss = new SecuritySupport(); - - // Define system property "jaxp.debug" to get output - static { - // Use try/catch block to support applets, which throws - // SecurityException out of this code. - try { - String val = ss.getSystemProperty("jaxp.debug"); - // Allow simply setting the prop to turn on debug - debug = val != null && !"false".equals(val); - } - catch (SecurityException se) { - debug = false; - } - } - - private static void dPrint(String msg) { - if (debug) { - System.err.println("JAXP: " + msg); - } - } - - /** - * Attempt to load a class using the class loader supplied. If that fails - * and fall back is enabled, the current (i.e. bootstrap) class loader is - * tried. - * - * If the class loader supplied is <code>null</code>, first try using the - * context class loader followed by the current (i.e. bootstrap) class - * loader. - * - * Use bootstrap classLoader if cl = null and useBSClsLoader is true - */ - static private Class<?> getProviderClass(String className, ClassLoader cl, - boolean doFallback, boolean useBSClsLoader) throws ClassNotFoundException - { - try { - if (cl == null) { - if (useBSClsLoader) { - return Class.forName(className, false, FactoryFinder.class.getClassLoader()); - } else { - cl = ss.getContextClassLoader(); - if (cl == null) { - throw new ClassNotFoundException(); - } - else { - return Class.forName(className, false, cl); - } - } - } - else { - return Class.forName(className, false, cl); - } - } - catch (ClassNotFoundException e1) { - if (doFallback) { - // Use current class loader - should always be bootstrap CL - return Class.forName(className, false, FactoryFinder.class.getClassLoader()); - } - else { - throw e1; - } - } - } - - /** - * Create an instance of a class. Delegates to method - * <code>getProviderClass()</code> in order to load the class. - * - * @param type Base class / Service interface of the factory to - * instantiate. - * - * @param className Name of the concrete class corresponding to the - * service provider - * - * @param cl <code>ClassLoader</code> used to load the factory class. If <code>null</code> - * current <code>Thread</code>'s context classLoader is used to load the factory class. - * - * @param doFallback True if the current ClassLoader should be tried as - * a fallback if the class is not found using cl - * - * @param useServicesMechanism True use services mechanism - */ - static <T> T newInstance(Class<T> type, String className, ClassLoader cl, - boolean doFallback, boolean useServicesMechanism) - throws TransformerFactoryConfigurationError - { - assert type != null; - - boolean useBSClsLoader = false; - // make sure we have access to restricted packages - if (System.getSecurityManager() != null) { - if (className != null && className.startsWith(DEFAULT_PACKAGE)) { - cl = null; - useBSClsLoader = true; - } - } - - try { - Class<?> providerClass = getProviderClass(className, cl, doFallback, useBSClsLoader); - if (!type.isAssignableFrom(providerClass)) { - throw new ClassCastException(className + " cannot be cast to " + type.getName()); - } - Object instance = null; - if (!useServicesMechanism) { - instance = newInstanceNoServiceLoader(type, providerClass); - } - if (instance == null) { - instance = providerClass.newInstance(); - } - if (debug) { // Extra check to avoid computing cl strings - dPrint("created new instance of " + providerClass + - " using ClassLoader: " + cl); - } - return type.cast(instance); - } - catch (ClassNotFoundException x) { - throw new TransformerFactoryConfigurationError(x, - "Provider " + className + " not found"); - } - catch (Exception x) { - throw new TransformerFactoryConfigurationError(x, - "Provider " + className + " could not be instantiated: " + x); - } - } - - /** - * Try to construct using newTransformerFactoryNoServiceLoader - * method if available. - */ - private static <T> T newInstanceNoServiceLoader(Class<T> type, Class<?> providerClass) { - // Retain maximum compatibility if no security manager. - if (System.getSecurityManager() == null) { - return null; - } - try { - final Method creationMethod = - providerClass.getDeclaredMethod( - "newTransformerFactoryNoServiceLoader" - ); - final int modifiers = creationMethod.getModifiers(); - - // Do not call the method if it's not public static. - if (!Modifier.isPublic(modifiers) || !Modifier.isStatic(modifiers)) { - return null; - } - - // Only call the method if it's declared to return an instance of - // TransformerFactory - final Class<?> returnType = creationMethod.getReturnType(); - if (type.isAssignableFrom(returnType)) { - final Object result = creationMethod.invoke(null, (Object[])null); - return type.cast(result); - } else { - // This should not happen, as - // TransformerFactoryImpl.newTransformerFactoryNoServiceLoader is - // declared to return TransformerFactory. - throw new ClassCastException(returnType + " cannot be cast to " + type); - } - } catch (ClassCastException e) { - throw new TransformerFactoryConfigurationError(e, e.getMessage()); - } catch (NoSuchMethodException exc) { - return null; - } catch (Exception exc) { - return null; - } - } - - /** - * Finds the implementation Class object in the specified order. Main - * entry point. - * @return Class object of factory, never null - * - * @param type Base class / Service interface of the - * factory to find. - * - * @param fallbackClassName Implementation class name, if nothing else - * is found. Use null to mean no fallback. - * - * Package private so this code can be shared. - */ - static <T> T find(Class<T> type, String fallbackClassName) - throws TransformerFactoryConfigurationError - { - assert type != null; - - final String factoryId = type.getName(); - - dPrint("find factoryId =" + factoryId); - // Use the system property first - try { - String systemProp = ss.getSystemProperty(factoryId); - if (systemProp != null) { - dPrint("found system property, value=" + systemProp); - return newInstance(type, systemProp, null, true, true); - } - } - catch (SecurityException se) { - if (debug) se.printStackTrace(); - } - - // try to read from $java.home/lib/jaxp.properties - try { - if (firstTime) { - synchronized (cacheProps) { - if (firstTime) { - String configFile = ss.getSystemProperty("java.home") + File.separator + - "lib" + File.separator + "jaxp.properties"; - File f = new File(configFile); - firstTime = false; - if (ss.doesFileExist(f)) { - dPrint("Read properties file "+f); - cacheProps.load(ss.getFileInputStream(f)); - } - } - } - } - final String factoryClassName = cacheProps.getProperty(factoryId); - - if (factoryClassName != null) { - dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName); - return newInstance(type, factoryClassName, null, true, true); - } - } - catch (Exception ex) { - if (debug) ex.printStackTrace(); - } - - // Try Jar Service Provider Mechanism - T provider = findServiceProvider(type); - if (provider != null) { - return provider; - } - if (fallbackClassName == null) { - throw new TransformerFactoryConfigurationError(null, - "Provider for " + factoryId + " cannot be found"); - } - - dPrint("loaded from fallback value: " + fallbackClassName); - return newInstance(type, fallbackClassName, null, true, true); - } - - /* - * Try to find provider using the ServiceLoader. - * - * @param type Base class / Service interface of the factory to find. - * - * @return instance of provider class if found or null - */ - private static <T> T findServiceProvider(final Class<T> type) - throws TransformerFactoryConfigurationError - { - try { - return AccessController.doPrivileged(new PrivilegedAction<T>() { - public T run() { - final ServiceLoader<T> serviceLoader = ServiceLoader.load(type); - final Iterator<T> iterator = serviceLoader.iterator(); - if (iterator.hasNext()) { - return iterator.next(); - } else { - return null; - } - } - }); - } catch(ServiceConfigurationError e) { - // It is not possible to wrap an error directly in - // FactoryConfigurationError - so we need to wrap the - // ServiceConfigurationError in a RuntimeException. - // The alternative would be to modify the logic in - // FactoryConfigurationError to allow setting a - // Throwable as the cause, but that could cause - // compatibility issues down the road. - final RuntimeException x = new RuntimeException( - "Provider for " + type + " cannot be created", e); - final TransformerFactoryConfigurationError error = - new TransformerFactoryConfigurationError(x, x.getMessage()); - throw error; - } - } -} |