From d93f0ae0212dc48000fbe6145b07e497d7062a6c Mon Sep 17 00:00:00 2001 From: antelder Date: Wed, 20 Jan 2010 11:02:48 +0000 Subject: Update the client api classes to be the very latest from the oasis svn git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@901126 13f79535-47bb-0310-9956-ffa450edef68 --- .../sca/client/impl/SCAClientFactoryFinder.java | 246 ------------------ .../client/impl/SCAClientFactoryFinderImpl.java | 289 +++++++++++++++++++++ 2 files changed, 289 insertions(+), 246 deletions(-) delete mode 100644 sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinder.java create mode 100644 sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java (limited to 'sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl') diff --git a/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinder.java b/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinder.java deleted file mode 100644 index 4bbb769142..0000000000 --- a/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinder.java +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. - * OASIS trademark, IPR and other policies apply. - */ -package org.oasisopen.sca.client.impl; - -import java.io.BufferedReader; -import java.io.Closeable; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.URI; -import java.net.URL; -import java.util.Properties; - -import org.oasisopen.sca.SCARuntimeException; -import org.oasisopen.sca.client.SCAClientFactory; - -/** - * This is a default class that returns an SCAClientFactory implementation - - * this class can be replaced by a vendor implementation. - * - * @see SCAClientFactory - * @author OASIS Open - */ -public class SCAClientFactoryFinder { - - /** - * The name of the System Property used to determine the SPI implementation - * to use for the SCAClientFactory. - */ - private static final String SCA_CLIENT_FACTORY_PROVIDER_KEY = SCAClientFactory.class.getName(); - - /** - * The name of the file loaded from the ClassPath to determine the SPI - * implementation to use for the SCAClientFactory. - */ - private static final String SCA_CLIENT_FACTORY_PROVIDER_META_INF_SERVICE = "META-INF/services/" + SCA_CLIENT_FACTORY_PROVIDER_KEY; - - /** - * Private Constructor. - */ - private SCAClientFactoryFinder() { - } - - /** - * Creates an instance of the SCAClientFactory implementation. This - * discovers the SCAClientFactory implementation and instantiates the - * provider's implementation. - * - * @param properties Properties that may be used when creating a new - * instance of the SCAClient - * @param classLoader ClassLoader that may be used when creating a new - * instance of the SCAClient - * @return new instance of the SCAClientFactory - * @throws SCARuntimeException Failed to create SCAClientFactory - * implementation. - */ - public static SCAClientFactory find(Properties properties, ClassLoader classLoader, URI domainURI) { - // TODO - TUSCANY-3424 - swap the order here temporarily to help with the - // fixes to the client factory lookup processing - // will revert when TUSCANY-3424 is done - if (classLoader == null) { - // classLoader = getThreadContextClassLoader(); - classLoader = SCAClientFactoryFinder.class.getClassLoader(); - if (classLoader == null) { - //classLoader = SCAClientFactoryFinder.class.getClassLoader(); - classLoader = getThreadContextClassLoader(); - } - } - final String factoryImplClassName = discoverProviderFactoryImplClass(properties, classLoader); - final Class factoryImplClass = loadProviderFactoryClass(factoryImplClassName, classLoader); - final SCAClientFactory factory = instantiateSCAClientFactoryClass(factoryImplClass, domainURI); - return factory; - } - - /** - * Gets the Context ClassLoader for the current Thread. - * - * @return The Context ClassLoader for the current Thread. - */ - private static ClassLoader getThreadContextClassLoader() { - final ClassLoader threadClassLoader = Thread.currentThread().getContextClassLoader(); - return threadClassLoader; - } - - /** - * Attempts to discover the class name for the SCAClientFactory - * implementation from the specified Properties, the System Properties or - * the specified ClassLoader. - * - * @return The class name of the SCAClientFactory implementation - * @throw SCARuntimeException Failed to find implementation for - * SCAClientFactory. - */ - private static String discoverProviderFactoryImplClass(Properties properties, ClassLoader classLoader) throws SCARuntimeException { - String providerClassName = checkPropertiesForSPIClassName(properties); - if (providerClassName != null) { - return providerClassName; - } - - providerClassName = checkPropertiesForSPIClassName(System.getProperties()); - if (providerClassName != null) { - return providerClassName; - } - - return checkMETAINFServicesForClassName(classLoader); - } - - /** - * Attempts to find the class name for the SCAClientFactory implementation - * from the specified Properties. - * - * @return The class name for the SCAClientFactory implementation or - * null if not found. - */ - private static String checkPropertiesForSPIClassName(Properties properties) { - if (properties == null) { - return null; - } - - final String providerClassName = properties.getProperty(SCA_CLIENT_FACTORY_PROVIDER_KEY); - if (providerClassName != null && providerClassName.length() > 0) { - return providerClassName; - } - - return null; - } - - /** - * Attempts to find the class name for the SCAClientFactory implementation - * from the META-INF/services directory - * - * @return The class name for the SCAClientFactory implementation or - * null if not found. - */ - private static String checkMETAINFServicesForClassName(ClassLoader cl) { - final URL url = cl.getResource(SCA_CLIENT_FACTORY_PROVIDER_META_INF_SERVICE); - if (url == null) { - return null; - } - - InputStream in = null; - try { - in = url.openStream(); - BufferedReader reader = null; - try { - reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); - - String line; - while ((line = readNextLine(reader)) != null) { - if (!line.startsWith("#") && line.length() > 0) { - return line; - } - } - return null; - } finally { - closeStream(reader); - } - } catch (IOException ex) { - throw new SCARuntimeException("Failed to discover SCAClientFactory provider", ex); - } finally { - closeStream(in); - } - } - - /** - * Reads the next line from the reader and returns the trimmed version of - * that line - * - * @param reader The reader from which to read the next line - * @return The trimmed next line or null if the end of the - * stream has been reached - * @throws IOException I/O error occurred while reading from Reader - */ - private static String readNextLine(BufferedReader reader) throws IOException { - - String line = reader.readLine(); - if (line != null) { - line = line.trim(); - } - return line; - } - - /** - * Loads the specified SCAClientFactory implementation class. - * - * @param factoryImplClassName The name of the SCAClientFactory - * Implementation class to load - * @return The specified SCAClientFactory Implementation class - * @throws SCARuntimeException Failed to load the SCAClientFactory - * implementation class - */ - private static Class loadProviderFactoryClass(String factoryImplClassName, ClassLoader classLoader) - throws SCARuntimeException { - - try { - final Class providerClass = classLoader.loadClass(factoryImplClassName); - final Class providerFactoryClass = providerClass.asSubclass(SCAClientFactory.class); - return providerFactoryClass; - } catch (ClassNotFoundException ex) { - throw new SCARuntimeException("Failed to load SCAClientFactory implementation class " + factoryImplClassName, ex); - } catch (ClassCastException ex) { - throw new SCARuntimeException("Loaded SCAClientFactory implementation class " + factoryImplClassName - + " is not a subclass of " - + SCAClientFactory.class.getName(), ex); - } - } - - /** - * Instantiate an instance of the specified SCAClientFactory implementation - * class. - * - * @param factoryImplClass The SCAClientFactory implementation class to - * instantiate. - * @param domainURI - * @return An instance of the SCAClientFactory implementation class - * @throws SCARuntimeException Failed to instantiate the specified specified - * SCAClientFactory implementation class - */ - private static SCAClientFactory instantiateSCAClientFactoryClass(Class factoryImplClass, URI domainURI) throws SCARuntimeException { - - try { - final SCAClientFactory provider = factoryImplClass.getConstructor(URI.class).newInstance(domainURI); - return provider; - } catch (Throwable ex) { - ex.printStackTrace(); - throw new SCARuntimeException("Failed to instantiate SCAClientFactory implementation class " + factoryImplClass, ex); - } - } - - /** - * Utility method for closing Closeable Object. - * - * @param closeable The Object to close. - */ - private static void closeStream(Closeable closeable) { - if (closeable != null) { - try { - closeable.close(); - } catch (IOException ex) { - throw new SCARuntimeException("Failed to close stream", ex); - } - } - } -} diff --git a/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java b/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java new file mode 100644 index 0000000000..9c5eea601b --- /dev/null +++ b/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java @@ -0,0 +1,289 @@ +/* + * Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. + * OASIS trademark, IPR and other policies apply. + */ +package org.oasisopen.sca.client.impl; + +import org.oasisopen.sca.client.SCAClientFactoryFinder; + +import java.io.BufferedReader; +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Constructor; +import java.net.URI; +import java.net.URL; +import java.util.Properties; + +import org.oasisopen.sca.NoSuchDomainException; +import org.oasisopen.sca.ServiceRuntimeException; +import org.oasisopen.sca.client.SCAClientFactory; + +/** + * This is a default implementation of an SCAClientFactoryFinder which is + * used to find an implementation of the SCAClientFactory interface. + * + * @see SCAClientFactoryFinder + * @see SCAClientFactory + * + * @author OASIS Open + */ +public class SCAClientFactoryFinderImpl implements SCAClientFactoryFinder { + + /** + * The name of the System Property used to determine the SPI + * implementation to use for the SCAClientFactory. + */ + private static final String SCA_CLIENT_FACTORY_PROVIDER_KEY = + SCAClientFactory.class.getName(); + + /** + * The name of the file loaded from the ClassPath to determine + * the SPI implementation to use for the SCAClientFactory. + */ + private static final String SCA_CLIENT_FACTORY_PROVIDER_META_INF_SERVICE + = "META-INF/services/" + SCA_CLIENT_FACTORY_PROVIDER_KEY; + + /** + * Public Constructor + */ + public SCAClientFactoryFinderImpl() { + } + + /** + * Creates an instance of the SCAClientFactorySPI implementation. + * This discovers the SCAClientFactorySPI Implementation and instantiates + * the provider's implementation. + * + * @param properties Properties that may be used when creating a new + * instance of the SCAClient + * @param classLoader ClassLoader that may be used when creating a new + * instance of the SCAClient + * @return new instance of the SCAClientFactory + * @throws ServiceRuntimeException Failed to create SCAClientFactory + * Implementation. + */ + public SCAClientFactory find(Properties properties, + ClassLoader classLoader, + URI domainURI ) + throws NoSuchDomainException, ServiceRuntimeException { + if (classLoader == null) { + classLoader = getThreadContextClassLoader (); + } + final String factoryImplClassName = + discoverProviderFactoryImplClass(properties, classLoader); + final Class factoryImplClass + = loadProviderFactoryClass(factoryImplClassName, + classLoader); + final SCAClientFactory factory = + instantiateSCAClientFactoryClass(factoryImplClass, + domainURI ); + return factory; + } + + /** + * Gets the Context ClassLoader for the current Thread. + * + * @return The Context ClassLoader for the current Thread. + */ + private static ClassLoader getThreadContextClassLoader () { + final ClassLoader threadClassLoader = + Thread.currentThread().getContextClassLoader(); + return threadClassLoader; + } + + /** + * Attempts to discover the class name for the SCAClientFactorySPI + * implementation from the specified Properties, the System Properties + * or the specified ClassLoader. + * + * @return The class name of the SCAClientFactorySPI implementation + * @throw ServiceRuntimeException Failed to find implementation for + * SCAClientFactorySPI. + */ + private static String + discoverProviderFactoryImplClass(Properties properties, + ClassLoader classLoader) + throws ServiceRuntimeException { + String providerClassName = + checkPropertiesForSPIClassName(properties); + if (providerClassName != null) { + return providerClassName; + } + + providerClassName = + checkPropertiesForSPIClassName(System.getProperties()); + if (providerClassName != null) { + return providerClassName; + } + + providerClassName = checkMETAINFServicesForSIPClassName(classLoader); + if (providerClassName == null) { + throw new ServiceRuntimeException( + "Failed to find implementation for SCAClientFactory"); + } + + return providerClassName; + } + + /** + * Attempts to find the class name for the SCAClientFactorySPI + * implementation from the specified Properties. + * + * @return The class name for the SCAClientFactorySPI implementation + * or null if not found. + */ + private static String + checkPropertiesForSPIClassName(Properties properties) { + if (properties == null) { + return null; + } + + final String providerClassName = + properties.getProperty(SCA_CLIENT_FACTORY_PROVIDER_KEY); + if (providerClassName != null && providerClassName.length() > 0) { + return providerClassName; + } + + return null; + } + + /** + * Attempts to find the class name for the SCAClientFactorySPI + * implementation from the META-INF/services directory + * + * @return The class name for the SCAClientFactorySPI implementation or + * null if not found. + */ + private static String checkMETAINFServicesForSIPClassName(ClassLoader cl) + { + final URL url = + cl.getResource(SCA_CLIENT_FACTORY_PROVIDER_META_INF_SERVICE); + if (url == null) { + return null; + } + + InputStream in = null; + try { + in = url.openStream(); + BufferedReader reader = null; + try { + reader = + new BufferedReader(new InputStreamReader(in, "UTF-8")); + + String line; + while ((line = readNextLine(reader)) != null) { + if (!line.startsWith("#") && line.length() > 0) { + return line; + } + } + + return null; + } finally { + closeStream(reader); + } + } catch (IOException ex) { + throw new ServiceRuntimeException( + "Failed to discover SCAClientFactory provider", ex); + } finally { + closeStream(in); + } + } + + /** + * Reads the next line from the reader and returns the trimmed version + * of that line + * + * @param reader The reader from which to read the next line + * @return The trimmed next line or null if the end of the + * stream has been reached + * @throws IOException I/O error occurred while reading from Reader + */ + private static String readNextLine(BufferedReader reader) + throws IOException { + + String line = reader.readLine(); + if (line != null) { + line = line.trim(); + } + return line; + } + + /** + * Loads the specified SCAClientFactory Implementation class. + * + * @param factoryImplClassName The name of the SCAClientFactory + * Implementation class to load + * @return The specified SCAClientFactory Implementation class + * @throws ServiceRuntimeException Failed to load the SCAClientFactory + * Implementation class + */ + private static Class + loadProviderFactoryClass(String factoryImplClassName, + ClassLoader classLoader) + throws ServiceRuntimeException { + + try { + final Class providerClass = + classLoader.loadClass(factoryImplClassName); + final Class providerFactoryClass = + providerClass.asSubclass(SCAClientFactory.class); + return providerFactoryClass; + } catch (ClassNotFoundException ex) { + throw new ServiceRuntimeException( + "Failed to load SCAClientFactory implementation class " + + factoryImplClassName, ex); + } catch (ClassCastException ex) { + throw new ServiceRuntimeException( + "Loaded SCAClientFactory implementation class " + + factoryImplClassName + + " is not a subclass of " + + SCAClientFactory.class.getName() , ex); + } + } + + /** + * Instantiate an instance of the specified SCAClientFactorySPI + * Implementation class. + * + * @param factoryImplClass The SCAClientFactorySPI Implementation + * class to instantiate. + * @return An instance of the SCAClientFactorySPI Implementation class + * @throws ServiceRuntimeException Failed to instantiate the specified + * specified SCAClientFactorySPI Implementation class + */ + private static SCAClientFactory instantiateSCAClientFactoryClass( + Class factoryImplClass, + URI domainURI) + throws NoSuchDomainException, ServiceRuntimeException { + + try { + Constructor URIConstructor = + factoryImplClass.getConstructor(domainURI.getClass()); + SCAClientFactory provider = + URIConstructor.newInstance( domainURI ); + return provider; + } catch (Throwable ex) { + throw new ServiceRuntimeException( + "Failed to instantiate SCAClientFactory implementation class " + + factoryImplClass, ex); + } + } + + /** + * Utility method for closing Closeable Object. + * + * @param closeable The Object to close. + */ + private static void closeStream(Closeable closeable) { + if (closeable != null) { + try{ + closeable.close(); + } catch (IOException ex) { + throw new ServiceRuntimeException("Failed to close stream", + ex); + } + } + } +} -- cgit v1.2.3