Author: jbonofre
Date: Wed Sep 12 13:28:35 2012
New Revision: 1383930
URL: http://svn.apache.org/viewvc?rev=1383930&view=rev
Log:
[SMX4-1229] Add FactoryFinder in the jsr339-api-m10 spec
Added:
servicemix/smx4/specs/trunk/jsr339-api-m10/src/
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/ws/
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/FactoryFinder.java
Added:
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/FactoryFinder.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/FactoryFinder.java?rev=1383930&view=auto
==============================================================================
---
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/FactoryFinder.java
(added)
+++
servicemix/smx4/specs/trunk/jsr339-api-m10/src/main/java/javax/ws/rs/ext/FactoryFinder.java
Wed Sep 12 13:28:35 2012
@@ -0,0 +1,146 @@
+/*
+ * The contents of this file are subject to the terms
+ * of the Common Development and Distribution License
+ * (the "License"). You may not use this file except
+ * in compliance with the License.
+ *
+ * You can obtain a copy of the license at
+ * http://www.opensource.org/licenses/cddl1.php
+ * See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+package javax.ws.rs.ext;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Properties;
+
+public class FactoryFinder {
+
+ /**
+ * Creates an instance of the specified class using the specified
+ * <code>ClassLoader</code> object.
+ *
+ * @throws ClassNotFoundException if the given class could not be found
+ * or could not be instantiated
+ */
+ private static Object newInstance(String className,
+ ClassLoader classLoader) throws
ClassNotFoundException {
+ try {
+ Class spiClass;
+ if (classLoader == null) {
+ spiClass = Class.forName(className);
+ } else {
+ spiClass = classLoader.loadClass(className);
+ }
+ return spiClass.newInstance();
+ } catch (ClassNotFoundException x) {
+ throw x;
+ } catch (Exception x) {
+ throw new ClassNotFoundException(
+ "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.
+ *
+ * @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
+ * @return the <code>Class</code> object of the specified message factory;
+ * may not be <code>null</code>
+ * @throws WebServiceException if there is an error
+ */
+ static Object find(String factoryId, String fallbackClassName) throws
ClassNotFoundException {
+ try {
+ // If we are deployed into an OSGi environment, leverage it
+ Class factoryClass =
FactoryFinder.class.getClassLoader().loadClass(factoryId);
+ Class spiClass =
org.apache.servicemix.specs.locator.OsgiLocator.locate(factoryClass, factoryId);
+ if (spiClass != null) {
+ return spiClass.newInstance();
+ }
+ } catch (Throwable e) {
+ }
+
+ ClassLoader classLoader;
+ try {
+ classLoader = Thread.currentThread().getContextClassLoader();
+ } catch (Exception x) {
+ throw new ClassNotFoundException(x.toString(), x);
+ }
+
+ String serviceId = "META-INF/services/" + factoryId;
+ // try to find services in CLASSPATH
+ try {
+ InputStream is;
+ 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);
+ }
+ }
+ } catch (Exception ex) {
+ }
+
+
+ // try to read from $java.home/lib/jaxrs.properties
+ try {
+ String javah = System.getProperty("java.home");
+ String configFile = javah + File.separator +
+ "lib" + File.separator + "jaxrs.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);
+ }
+ } catch (Exception ex) {
+ }
+
+
+ // Use the system property
+ try {
+ String systemProp =
+ System.getProperty(factoryId);
+ if (systemProp != null) {
+ return newInstance(systemProp, classLoader);
+ }
+ } catch (SecurityException se) {
+ }
+
+ if (fallbackClassName == null) {
+ throw new ClassNotFoundException(
+ "Provider for " + factoryId + " cannot be found", null);
+ }
+
+ return newInstance(fallbackClassName, classLoader);
+ }
+
+}