You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by ge...@apache.org on 2009/10/06 12:12:24 UTC
svn commit: r822188 - in /servicemix/smx4/specs/trunk/jsr311-api-1.1/src: ./
main/ main/java/ main/java/javax/ main/java/javax/rs/
main/java/javax/rs/ext/ main/java/javax/rs/ext/FactoryFinder.java
Author: gertv
Date: Tue Oct 6 10:12:24 2009
New Revision: 822188
URL: http://svn.apache.org/viewvc?rev=822188&view=rev
Log:
SMX4-390: Add FactoryFinder to jaxrs api 1.1 bundle
Added:
servicemix/smx4/specs/trunk/jsr311-api-1.1/src/
servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/
servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/
servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/javax/
servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/javax/rs/
servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/javax/rs/ext/
servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/javax/rs/ext/FactoryFinder.java
Added: servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/javax/rs/ext/FactoryFinder.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/javax/rs/ext/FactoryFinder.java?rev=822188&view=auto
==============================================================================
--- servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/javax/rs/ext/FactoryFinder.java (added)
+++ servicemix/smx4/specs/trunk/jsr311-api-1.1/src/main/java/javax/rs/ext/FactoryFinder.java Tue Oct 6 10:12:24 2009
@@ -0,0 +1,152 @@
+/*
+ * 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.
+ */
+
+/*
+ * FactoryFinder.java
+ *
+ * Created on November 16, 2007, 3:14 PM
+ *
+ */
+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;
+
+class FactoryFinder {
+
+ /**
+ * Creates an instance of the specified class using the specified
+ * <code>ClassLoader</code> object.
+ *
+ * @exception 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.
+ *
+ * @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 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 spiClass = org.apache.servicemix.specs.locator.OsgiLocator.locate(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);
+ }
+}