objectfactory.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 551 行 · 第 1/2 页

JAVA
551
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001-2004 The Apache Software Foundation.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, *    if any, must include the following acknowledgment: *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The name "Apache Software Foundation" must not be used to endorse or *    promote products derived from this software without prior written *    permission. For written permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 1999-2001, Sun Microsystems, * Inc., http://www.sun.com.  For more information on the Apache Software * Foundation, please see <http://www.apache.org/>. */package com.sun.org.apache.xerces.internal.impl.dv;import java.io.InputStream;import java.io.IOException;import java.io.File;import java.io.FileInputStream;import java.util.Properties;import java.io.BufferedReader;import java.io.InputStreamReader;/** * This class is duplicated for each JAXP subpackage so keep it in sync. * It is package private and therefore is not exposed as part of the JAXP * API. * <p> * This code is designed to implement the JAXP 1.1 spec pluggability * feature and is designed to run on JDK version 1.1 and * later, and to compile on JDK 1.2 and onward. * The code also runs both as part of an unbundled jar file and * when bundled as part of the JDK. * <p> * * @version $Id: ObjectFactory.java,v 1.3 2004/05/08 11:07:43 vk112360 Exp $ */class ObjectFactory {    //    // Constants    //    // name of default properties file to look for in JDK's jre/lib directory    private static final String DEFAULT_PROPERTIES_FILENAME = "xerces.properties";    /** Set to true for debugging */    private static final boolean DEBUG = false;    /**     * Default columns per line.     */    private static final int DEFAULT_LINE_LENGTH = 80;    /** cache the contents of the xerces.properties file.     *  Until an attempt has been made to read this file, this will     * be null; if the file does not exist or we encounter some other error     * during the read, this will be empty.     */    private static Properties fXercesProperties = null;    /***     * Cache the time stamp of the xerces.properties file so     * that we know if it's been modified and can invalidate     * the cache when necessary.     */    private static long fLastModified = -1;    //    // static methods    //    /**     * Finds the implementation Class object in the specified order.  The     * specified order is the following:     * <ol>     *  <li>query the system property using <code>System.getProperty</code>     *  <li>read <code>META-INF/services/<i>factoryId</i></code> file     *  <li>use fallback classname     * </ol>     *     * @return Class object of factory, never null     *     * @param factoryId             Name of the factory to find, same as     *                              a property name     * @param fallbackClassName     Implementation class name, if nothing else     *                              is found.  Use null to mean no fallback.     *     * @exception ObjectFactory.ConfigurationError     */    static Object createObject(String factoryId, String fallbackClassName)        throws ConfigurationError {        return createObject(factoryId, null, fallbackClassName);    } // createObject(String,String):Object    /**     * Finds the implementation Class object in the specified order.  The     * specified order is the following:     * <ol>     *  <li>query the system property using <code>System.getProperty</code>     *  <li>read <code>$java.home/lib/<i>propertiesFilename</i></code> file     *  <li>read <code>META-INF/services/<i>factoryId</i></code> file     *  <li>use fallback classname     * </ol>     *     * @return Class object of factory, never null     *     * @param factoryId             Name of the factory to find, same as     *                              a property name     * @param propertiesFilename The filename in the $java.home/lib directory     *                           of the properties file.  If none specified,     *                           ${java.home}/lib/xerces.properties will be used.     * @param fallbackClassName     Implementation class name, if nothing else     *                              is found.  Use null to mean no fallback.     *     * @exception ObjectFactory.ConfigurationError     */    static Object createObject(String factoryId,                                      String propertiesFilename,                                      String fallbackClassName)        throws ConfigurationError    {        if (DEBUG) debugPrintln("debug is on");        SecuritySupport ss = SecuritySupport.getInstance();        ClassLoader cl = findClassLoader();        // Use the system property first        try {            String systemProp = ss.getSystemProperty(factoryId);            if (systemProp != null) {                if (DEBUG) debugPrintln("found system property, value=" + systemProp);                return newInstance(systemProp, cl, true);            }        } catch (SecurityException se) {            // Ignore and continue w/ next location        }        // Try to read from propertiesFilename, or $java.home/lib/xerces.properties        String factoryClassName = null;        // no properties file name specified; use $JAVA_HOME/lib/xerces.properties:        if (propertiesFilename == null) {            File propertiesFile = null;            boolean propertiesFileExists = false;            try {                String javah = ss.getSystemProperty("java.home");                propertiesFilename = javah + File.separator +                    "lib" + File.separator + DEFAULT_PROPERTIES_FILENAME;                propertiesFile = new File(propertiesFilename);                propertiesFileExists = ss.getFileExists(propertiesFile);            } catch (SecurityException e) {                // try again...                fLastModified = -1;                fXercesProperties = null;            }            synchronized (ObjectFactory.class) {                boolean loadProperties = false;                try {                    // file existed last time                    if(fLastModified >= 0) {                        if(propertiesFileExists &&                                (fLastModified < (fLastModified = ss.getLastModified(propertiesFile)))) {                            loadProperties = true;                        } else {                            // file has stopped existing...                            if(!propertiesFileExists) {                                fLastModified = -1;                                fXercesProperties = null;                            } // else, file wasn't modified!                        }                    } else {                        // file has started to exist:                        if(propertiesFileExists) {                            loadProperties = true;                            fLastModified = ss.getLastModified(propertiesFile);                        } // else, nothing's changed                    }                    if(loadProperties) {                        // must never have attempted to read xerces.properties before (or it's outdeated)                        fXercesProperties = new Properties();                        FileInputStream fis = ss.getFileInputStream(propertiesFile);                        fXercesProperties.load(fis);                        fis.close();                    }	            } catch (Exception x) {	                fXercesProperties = null;	                fLastModified = -1;                    // assert(x instanceof FileNotFoundException	                //        || x instanceof SecurityException)	                // In both cases, ignore and continue w/ next location	            }            }            if(fXercesProperties != null) {                factoryClassName = fXercesProperties.getProperty(factoryId);            }        } else {            try {                FileInputStream fis = ss.getFileInputStream(new File(propertiesFilename));                Properties props = new Properties();                props.load(fis);                fis.close();                factoryClassName = props.getProperty(factoryId);            } catch (Exception x) {                // assert(x instanceof FileNotFoundException                //        || x instanceof SecurityException)                // In both cases, ignore and continue w/ next location            }        }        if (factoryClassName != null) {            if (DEBUG) debugPrintln("found in " + propertiesFilename + ", value=" + factoryClassName);            return newInstance(factoryClassName, cl, true);        }        // Try Jar Service Provider Mechanism        Object provider = findJarServiceProvider(factoryId);        if (provider != null) {            return provider;        }        if (fallbackClassName == null) {            throw new ConfigurationError(                "Provider for " + factoryId + " cannot be found", null);        }        if (DEBUG) debugPrintln("using fallback, value=" + fallbackClassName);        return newInstance(fallbackClassName, cl, true);    } // createObject(String,String,String):Object    //    // Private static methods    //

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?