Author: antelder
Date: Wed Jul  8 04:46:37 2009
New Revision: 792032

URL: http://svn.apache.org/viewvc?rev=792032&view=rev
Log:
Update NodeFactory to support multiple domains and user defined domain URIs 

Modified:
    
tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java

Modified: 
tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java
URL: 
http://svn.apache.org/viewvc/tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java?rev=792032&r1=792031&r2=792032&view=diff
==============================================================================
--- 
tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java
 (original)
+++ 
tuscany/java/sca/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java
 Wed Jul  8 04:46:37 2009
@@ -31,7 +31,10 @@
 import java.net.URLConnection;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import 
org.apache.tuscany.sca.node.configuration.DefaultNodeConfigurationFactory;
 import org.apache.tuscany.sca.node.configuration.NodeConfiguration;
@@ -57,10 +60,13 @@
      */
     private static final String SCA_CONTRIBUTION_GENERATED_META = 
"META-INF/sca-contribution-generated.xml";
 
-    protected static NodeFactory nodeFactory;
+    protected static Map<String, NodeFactory> nodeFactories = new 
HashMap<String, NodeFactory>();
 
     protected static void setNodeFactory(NodeFactory factory) {
-        nodeFactory = factory;
+        if (nodeFactories.get(Node.DEFAULT_DOMAIN_URI) != null) {
+            throw new IllegalStateException();
+        }
+        nodeFactories.put(Node.DEFAULT_DOMAIN_URI, factory);
     }
 
     public static class NodeProxy implements Node, Client {
@@ -152,40 +158,47 @@
      *
      * @return a new SCA node factory
      */
-    public static NodeFactory newInstance() {
-        if (nodeFactory != null) {
-            return nodeFactory;
-        }
-
-        try {
-            // final ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
-            // Use reflection APIs to call ServiceDiscovery to avoid hard 
dependency to tuscany-extensibility
+    public static NodeFactory getInstance(String domainURI) {
+        NodeFactory nodeFactory = nodeFactories.get(domainURI);
+        if (nodeFactory == null) {
             try {
-                Class<?> discoveryClass = 
Class.forName("org.apache.tuscany.sca.extensibility.ServiceDiscovery");
-                Object instance = 
discoveryClass.getMethod("getInstance").invoke(null);
-                Object factoryDeclaration =
-                    discoveryClass.getMethod("getServiceDeclaration", 
String.class).invoke(instance,
-                                                                               
            NodeFactory.class.getName());
-                if (factoryDeclaration != null) {
-                    Class<?> factoryImplClass =
-                        
(Class<?>)factoryDeclaration.getClass().getMethod("loadClass").invoke(factoryDeclaration);
-                    nodeFactory = (NodeFactory)factoryImplClass.newInstance();
-                    return nodeFactory;
+                // Use reflection APIs to call ServiceDiscovery to avoid hard 
dependency to tuscany-extensibility
+                try {
+                    Class<?> discoveryClass = 
Class.forName("org.apache.tuscany.sca.extensibility.ServiceDiscovery");
+                    Object instance = 
discoveryClass.getMethod("getInstance").invoke(null);
+                    Object factoryDeclaration =
+                        discoveryClass.getMethod("getServiceDeclaration", 
String.class).invoke(instance,
+                                                                               
                NodeFactory.class.getName());
+                    if (factoryDeclaration != null) {
+                        Class<?> factoryImplClass =
+                            
(Class<?>)factoryDeclaration.getClass().getMethod("loadClass").invoke(factoryDeclaration);
+                        nodeFactory = 
(NodeFactory)factoryImplClass.newInstance();
+                    }
+                } catch (ClassNotFoundException e) {
+                    // Ignore
                 }
-            } catch (ClassNotFoundException e) {
-                // Ignore
-            }
 
-            // Fail back to default impl
-            String className = 
"org.apache.tuscany.sca.node.impl.NodeFactoryImpl";
+                // Fail back to default impl
+                String className = 
"org.apache.tuscany.sca.node.impl.NodeFactoryImpl";
 
-            Class<?> cls = Class.forName(className);
-            nodeFactory = (NodeFactory)cls.newInstance();
-            return nodeFactory;
+                Class<?> cls = Class.forName(className);
+                nodeFactory = (NodeFactory)cls.newInstance();
 
-        } catch (Exception e) {
-            throw new ServiceRuntimeException(e);
+            } catch (Exception e) {
+                throw new ServiceRuntimeException(e);
+            }
+            nodeFactories.put(domainURI, nodeFactory);
         }
+        return nodeFactory;
+    }
+
+    /**
+     * Returns a new SCA node factory instance.
+     *
+     * @return a new SCA node factory
+     */
+    public static NodeFactory newInstance() {
+        return getInstance(Node.DEFAULT_DOMAIN_URI);
     }
 
     /**
@@ -374,6 +387,7 @@
     private NodeConfiguration createConfiguration(Contribution... 
contributions) {
         NodeConfigurationFactory factory = this;
         NodeConfiguration configuration = factory.createNodeConfiguration();
+        configuration.setDomainURI(getDomainURI());
         // Make sure a unique node URI is created for the same node factory
         configuration.setURI(Node.DEFAULT_NODE_URI+(count++));
         if (contributions != null) {
@@ -405,8 +419,18 @@
     }
 
     public void destroy() {
+        nodeFactories.remove(getDomainURI());
     }
-
+    
+    public String getDomainURI() {
+        for (Entry<String, NodeFactory> es : nodeFactories.entrySet()) {
+            if (es.getValue().equals(this)) {
+                return es.getKey();
+            }
+        }
+        return Node.DEFAULT_DOMAIN_URI;
+    }
+    
     /**
      * Create a new SCA node based on the configuration
      * @param configuration The configuration of a node


Reply via email to