You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
7.6 KiB
200 lines
7.6 KiB
/* |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
|
* |
|
* Copyright (c) 1997-2010 Oracle and/or its affiliates. All rights reserved. |
|
* |
|
* The contents of this file are subject to the terms of either the GNU |
|
* General Public License Version 2 only ("GPL") or the Common Development |
|
* and Distribution License("CDDL") (collectively, the "License"). You |
|
* may not use this file except in compliance with the License. You can |
|
* obtain a copy of the License at |
|
* https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html |
|
* or packager/legal/LICENSE.txt. See the License for the specific |
|
* language governing permissions and limitations under the License. |
|
* |
|
* When distributing the software, include this License Header Notice in each |
|
* file and include the License file at packager/legal/LICENSE.txt. |
|
* |
|
* GPL Classpath Exception: |
|
* Oracle designates this particular file as subject to the "Classpath" |
|
* exception as provided by Oracle in the GPL Version 2 section of the License |
|
* file that accompanied this code. |
|
* |
|
* Modifications: |
|
* If applicable, add the following below the License Header, with the fields |
|
* enclosed by brackets [] replaced by your own identifying information: |
|
* "Portions Copyright [year] [name of copyright owner]" |
|
* |
|
* Contributor(s): |
|
* If you wish your version of this file to be governed by only the CDDL or |
|
* only the GPL Version 2, indicate your decision by adding "[Contributor] |
|
* elects to include this software in this distribution under the [CDDL or GPL |
|
* Version 2] license." If you don't indicate a single choice of license, a |
|
* recipient has the option to distribute your version of this file under |
|
* either the CDDL, the GPL Version 2 or to extend the choice of license to |
|
* its licensees as provided above. However, if you add GPL Version 2 code |
|
* and therefore, elected the GPL Version 2 license, then the option applies |
|
* only if the new code is made subject to such option by the copyright |
|
* holder. |
|
* |
|
* |
|
* This file incorporates work covered by the following copyright and |
|
* permission notice: |
|
* |
|
* Copyright 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. |
|
*/ |
|
|
|
package javax.el; |
|
|
|
import java.lang.reflect.Constructor; |
|
import java.io.InputStream; |
|
import java.io.File; |
|
import java.io.FileInputStream; |
|
import java.util.Properties; |
|
import java.io.BufferedReader; |
|
import java.io.InputStreamReader; |
|
|
|
class FactoryFinder { |
|
|
|
/** |
|
* Creates an instance of the specified class using the specified |
|
* <code>ClassLoader</code> object. |
|
* |
|
* @exception ELException if the given class could not be found |
|
* or could not be instantiated |
|
*/ |
|
private static Object newInstance(String className, |
|
ClassLoader classLoader, |
|
Properties properties) |
|
{ |
|
try { |
|
Class<?> spiClass; |
|
if (classLoader == null) { |
|
spiClass = Class.forName(className); |
|
} else { |
|
spiClass = classLoader.loadClass(className); |
|
} |
|
if (properties != null) { |
|
Constructor constr = null; |
|
try { |
|
constr = spiClass.getConstructor(Properties.class); |
|
} catch (Exception ex) { |
|
} |
|
if (constr != null) { |
|
return constr.newInstance(properties); |
|
} |
|
} |
|
return spiClass.newInstance(); |
|
} catch (ClassNotFoundException x) { |
|
throw new ELException( |
|
"Provider " + className + " not found", x); |
|
} catch (Exception x) { |
|
throw new ELException( |
|
"Provider " + className + " could not be instantiated: " + x, |
|
x); |
|
} |
|
} |
|
|
|
/** |
|
* Finds the implementation <code>Class</code> object for the given |
|
* factory name, or if that fails, finds the <code>Class</code> object |
|
* for the given fallback class name. The arguments supplied must be |
|
* used in order. If using the first argument is successful, the second |
|
* one will not be used. |
|
* <P> |
|
* This method is package private so that this code can be shared. |
|
* |
|
* @return the <code>Class</code> object of the specified message factory; |
|
* may not be <code>null</code> |
|
* |
|
* @param factoryId the name of the factory to find, which is |
|
* a system property |
|
* @param fallbackClassName the implementation class name, which is |
|
* to be used only if nothing else |
|
* is found; <code>null</code> to indicate that |
|
* there is no fallback class name |
|
* @exception ELException if there is an error |
|
*/ |
|
static Object find(String factoryId, String fallbackClassName, |
|
Properties properties) |
|
{ |
|
ClassLoader classLoader; |
|
try { |
|
classLoader = Thread.currentThread().getContextClassLoader(); |
|
} catch (Exception x) { |
|
throw new ELException(x.toString(), x); |
|
} |
|
|
|
String serviceId = "META-INF/services/" + factoryId; |
|
// try to find services in CLASSPATH |
|
try { |
|
InputStream is=null; |
|
if (classLoader == null) { |
|
is=ClassLoader.getSystemResourceAsStream(serviceId); |
|
} else { |
|
is=classLoader.getResourceAsStream(serviceId); |
|
} |
|
|
|
if( is!=null ) { |
|
BufferedReader rd = |
|
new BufferedReader(new InputStreamReader(is, "UTF-8")); |
|
|
|
String factoryClassName = rd.readLine(); |
|
rd.close(); |
|
|
|
if (factoryClassName != null && |
|
! "".equals(factoryClassName)) { |
|
return newInstance(factoryClassName, classLoader, properties); |
|
} |
|
} |
|
} catch( Exception ex ) { |
|
} |
|
|
|
|
|
// try to read from $java.home/lib/el.properties |
|
try { |
|
String javah=System.getProperty( "java.home" ); |
|
String configFile = javah + File.separator + |
|
"lib" + File.separator + "el.properties"; |
|
File f=new File( configFile ); |
|
if( f.exists()) { |
|
Properties props=new Properties(); |
|
props.load( new FileInputStream(f)); |
|
String factoryClassName = props.getProperty(factoryId); |
|
return newInstance(factoryClassName, classLoader, properties); |
|
} |
|
} catch(Exception ex ) { |
|
} |
|
|
|
|
|
// Use the system property |
|
try { |
|
String systemProp = |
|
System.getProperty( factoryId ); |
|
if( systemProp!=null) { |
|
return newInstance(systemProp, classLoader, properties); |
|
} |
|
} catch (SecurityException se) { |
|
} |
|
|
|
if (fallbackClassName == null) { |
|
throw new ELException( |
|
"Provider for " + factoryId + " cannot be found", null); |
|
} |
|
|
|
return newInstance(fallbackClassName, classLoader, properties); |
|
} |
|
} |
|
|
|
|