You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by an...@apache.org on 2010/01/20 12:02:49 UTC

svn commit: r901126 - in /tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client: SCAClientFactory.java SCAClientFactoryFinder.java impl/SCAClientFactoryFinder.java impl/SCAClientFactoryFinderImpl.java

Author: antelder
Date: Wed Jan 20 11:02:48 2010
New Revision: 901126

URL: http://svn.apache.org/viewvc?rev=901126&view=rev
Log:
Update the client api classes to be the very latest from the oasis svn

Added:
    tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactoryFinder.java
    tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java
Removed:
    tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinder.java
Modified:
    tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactory.java

Modified: tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactory.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactory.java?rev=901126&r1=901125&r2=901126&view=diff
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactory.java (original)
+++ tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactory.java Wed Jan 20 11:02:48 2010
@@ -1,6 +1,6 @@
-/* 
- * Copyright(C) OASIS(R) 2005,2009. All Rights Reserved. 
- * OASIS trademark, IPR and other policies apply. 
+/*
+ * Copyright(C) OASIS(R) 2005,2009. All Rights Reserved.
+ * OASIS trademark, IPR and other policies apply.
  */
 package org.oasisopen.sca.client;
 
@@ -9,28 +9,49 @@
 
 import org.oasisopen.sca.NoSuchDomainException;
 import org.oasisopen.sca.NoSuchServiceException;
-import org.oasisopen.sca.client.impl.SCAClientFactoryFinder;
+import org.oasisopen.sca.client.SCAClientFactoryFinder;
+import org.oasisopen.sca.client.impl.SCAClientFactoryFinderImpl;
 
 /**
- * The SCAClientFactory can be used by non-SCA managed code to lookup services
- * that exist in a SCADomain.
+ * The SCAClientFactory can be used by non-SCA managed code to 
+ * lookup services that exist in a SCADomain.
+ * 
+ * @see SCAClientFactoryFinderImpl
  * 
- * @see SCAClientFactoryFinder
- * @see SCAClient
  * @author OASIS Open
  */
+
 public abstract class SCAClientFactory {
-    
+
+    /**
+     * The SCAClientFactoryFinder. 
+     * Provides a means by which a provider of an SCAClientFactory
+     * implementation can inject a factory finder implementation into
+     * the abstract SCAClientFactory class - once this is done, future
+     * invocations of the SCAClientFactory use the injected factory
+     * finder to locate and return an instance of a subclass of
+     * SCAClientFactory.
+     */
+    protected static SCAClientFactoryFinder factoryFinder;
+    /**
+     * The Domain URI of the SCA Domain which is accessed by this 
+     * SCAClientFactory
+     */
     private URI domainURI;
 
+    /**
+     * Prevent concrete subclasses from using the no-arg constructor
+     */
     private SCAClientFactory() {
     }
 
     /**
      * Constructor used by concrete subclasses
-     * @param domainURI - The Domain URI of the Domain accessed via this SCAClientFactory
+     * @param domainURI - The Domain URI of the Domain accessed via this
+     * SCAClientFactory
      */
-    protected SCAClientFactory(URI domainURI) {
+    protected SCAClientFactory(URI domainURI)
+        throws NoSuchDomainException {
         this.domainURI = domainURI;
     }
 
@@ -41,69 +62,73 @@
     protected URI getDomainURI() {
         return domainURI;
     }
-    
-    /**
-     * The default implementation of the SCAClientFactory. A Vendor may use
-     * reflection to inject a default SCAClientFactory instance that will be
-     * used in the newInstance() methods rather than using the
-     * SCAClientFactoryFinder.
-     */
-    protected static SCAClientFactory defaultFactory;
-
+   
+      
     /**
-     * Creates a new instance of the SCAClient that can be used to lookup SCA
-     * Services.
+     * Creates a new instance of the SCAClientFactory that can be 
+     * used to lookup SCA Services.
      * 
-     * @return A new SCAClient
+     * @param domainURI         URI of the target domain for the SCAClientFactory
+     * @return A new SCAClientFactory 
      */
-    public static SCAClientFactory newInstance(URI domainURI) throws NoSuchDomainException {
+    public static SCAClientFactory newInstance( URI domainURI ) 
+        throws NoSuchDomainException {
         return newInstance(null, null, domainURI);
     }
-
+    
     /**
-     * Creates a new instance of the SCAClient that can be used to lookup SCA
-     * Services.
-     * 
-     * @param properties Properties that may be used when creating a new
-     *                instance of the SCAClient
-     * @return A new SCAClient instance
-     */
-    public static SCAClientFactory newInstance(Properties properties, URI domainURI) {
+     * Creates a new instance of the SCAClientFactory that can be 
+     * used to lookup SCA Services.
+     *
+     * @param properties   Properties that may be used when 
+     * creating a new instance of the SCAClientFactory
+     * @param domainURI         URI of the target domain for the SCAClientFactory
+     * @return A new SCAClientFactory instance
+     */
+    public static SCAClientFactory newInstance(Properties properties,
+                                                                        URI domainURI) 
+        throws NoSuchDomainException {
         return newInstance(properties, null, domainURI);
     }
 
     /**
-     * Creates a new instance of the SCAClient that can be used to lookup SCA
-     * Services.
-     * 
-     * @param classLoader ClassLoader that may be used when creating a new
-     *                instance of the SCAClient
-     * @return A new SCAClient instance
-     */
-    public static SCAClientFactory newInstance(ClassLoader classLoader, URI domainURI) {
+     * Creates a new instance of the SCAClientFactory that can be 
+     * used to lookup SCA Services.
+     *
+     * @param classLoader   ClassLoader that may be used when 
+     * creating a new instance of the SCAClientFactory
+     * @param domainURI         URI of the target domain for the SCAClientFactory
+     * @return A new SCAClientFactory instance
+     */
+    public static SCAClientFactory newInstance(ClassLoader classLoader, 
+                                                                        URI domainURI) 
+        throws NoSuchDomainException {
         return newInstance(null, classLoader, domainURI);
     }
 
     /**
-     * Creates a new instance of the SCAClient that can be used to lookup SCA
-     * Services.
-     * 
-     * @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 A new SCAClient instance
-     */
-    public static SCAClientFactory newInstance(Properties properties, ClassLoader classLoader, URI domainURI) {
-        final SCAClientFactory factory;
-        if (defaultFactory == null) {
-            factory = SCAClientFactoryFinder.find(properties, classLoader, domainURI);
-        } else {
-            factory = defaultFactory;
-        }
+     * Creates a new instance of the SCAClientFactory that can be 
+     * used to lookup SCA Services.
+     *
+     * @param properties    Properties that may be used when 
+     * creating a new instance of the SCAClientFactory
+     * @param classLoader   ClassLoader that may be used when 
+     * creating a new instance of the SCAClientFactory
+     * @param domainURI         URI of the target domain for the SCAClientFactory
+     * @return A new SCAClientFactory instance
+     */
+    public static SCAClientFactory newInstance(Properties properties, 
+                                            ClassLoader classLoader,
+                                            URI domainURI) 
+        throws NoSuchDomainException {
+        final SCAClientFactoryFinder finder =
+            factoryFinder != null ? factoryFinder :
+                new SCAClientFactoryFinderImpl();
+        final SCAClientFactory factory
+            = finder.find(properties, classLoader, domainURI);
         return factory;
     }
-
+  
     /**
      * Returns a reference proxy that implements the business interface <T>
      * of a service in the SCA Domain handled by this SCAClientFactory
@@ -112,15 +137,16 @@
      * form componentName/serviceName.
      * Can also take the extended form componentName/serviceName/bindingName
      * to use a specific binding of the target service
-     *
-     * @param interfaze The business interface class of the service in the
+     * 
+     * @param interfaze The business interface class of the service in the 
      * domain
      * @param <T> The business interface class of the service in the domain
      *
-     * @return a proxy to the target service, in the specified SCA Domain
+     * @return a proxy to the target service, in the specified SCA Domain 
      * that implements the business interface <B>.
      * @throws NoSuchServiceException Service requested was not found
      * @throws NoSuchDomainException Domain requested was not found
      */
-     public abstract <T> T getService(Class<T> interfaze, String serviceURI) throws NoSuchServiceException, NoSuchDomainException;
+    public abstract <T> T getService(Class<T> interfaze, String serviceURI) 
+        throws NoSuchServiceException, NoSuchDomainException;    
 }

Added: tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactoryFinder.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactoryFinder.java?rev=901126&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactoryFinder.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/SCAClientFactoryFinder.java Wed Jan 20 11:02:48 2010
@@ -0,0 +1,35 @@
+/*
+ * Copyright(C) OASIS(R) 2005,2009. All Rights Reserved.
+ * OASIS trademark, IPR and other policies apply.
+ */
+
+package org.oasisopen.sca.client;
+
+import java.net.URI;
+import java.util.Properties;
+
+import org.oasisopen.sca.NoSuchDomainException;
+
+/* A Service Provider Interface representing a SCAClientFactory finder.  
+ * SCA provides a default reference implementation of this interface.
+ * SCA runtime vendors can create alternative implementations of this 
+ * interface that use different class loading or lookup mechanisms.
+ */
+public interface SCAClientFactoryFinder {
+
+        /**
+         * Method for finding the SCAClientFactory for a given Domain URI using
+         * a specified set of properties and a a specified ClassLoader
+         * @param properties - properties to use - may be null
+         * @param classLoader - ClassLoader to use - may be null
+         * @param domainURI - the Domain URI - must be a valid SCA Domain URI
+         * @return - the SCAClientFactory or null if the factory could not be
+         * @throws - NoSuchDomainException if the domainURI does not reference 
+         * a valid SCA Domain 
+         * found
+         */
+    SCAClientFactory find(Properties properties,
+                          ClassLoader classLoader,
+                          URI domainURI ) 
+        throws NoSuchDomainException ;
+}

Added: tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java
URL: http://svn.apache.org/viewvc/tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java?rev=901126&view=auto
==============================================================================
--- tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java (added)
+++ tuscany/sca-java-2.x/trunk/modules/sca-api/src/main/java/org/oasisopen/sca/client/impl/SCAClientFactoryFinderImpl.java Wed Jan 20 11:02:48 2010
@@ -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<? extends SCAClientFactory> 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 <code>null</code> 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
+     * <code>null</code> 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 <code>null</code> 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<? extends SCAClientFactory> 
+        loadProviderFactoryClass(String factoryImplClassName, 
+                                         ClassLoader classLoader) 
+        throws ServiceRuntimeException {
+
+        try {
+            final Class<?> providerClass = 
+                classLoader.loadClass(factoryImplClassName);
+            final Class<? extends SCAClientFactory> 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<? extends SCAClientFactory> factoryImplClass,
+                        URI domainURI)
+        throws NoSuchDomainException, ServiceRuntimeException {
+        
+        try {
+            Constructor<? extends SCAClientFactory> 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);
+            }
+        }
+    }
+}