servicemix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jbono...@apache.org
Subject svn commit: r1383930 - in /servicemix/smx4/specs/trunk/jsr339-api-m10/src: ./ main/ main/java/ main/java/javax/ main/java/javax/ws/ main/java/javax/ws/rs/ main/java/javax/ws/rs/ext/ main/java/javax/ws/rs/ext/FactoryFinder.java
Date Wed, 12 Sep 2012 13:28:36 GMT
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);
+    }
+
+}



Mime
View raw message