You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by js...@apache.org on 2008/04/03 09:35:19 UTC

svn commit: r644201 - in /incubator/tuscany/java/sca: modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/ modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/ modules/workspace-ad...

Author: jsdelfino
Date: Thu Apr  3 00:35:18 2008
New Revision: 644201

URL: http://svn.apache.org/viewvc?rev=644201&view=rev
Log:
Fixes for TUSCANY-2182. Revert back to a parent-last classloading scheme as a portable classloading scheme for Tomcat, Geronimo and WebSphere. Make sure that the node classloader is set on the thread context after a node is started, as sample clients like calculator-distributed don't set it. Minor fixes to calculator-distributed to fix issues found during testing and bringup.

Modified:
    incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationDaemonBootstrap.java
    incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationLauncherBootstrap.java
    incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeLauncherUtil.java
    incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeServletFilter.java
    incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/launcher/DomainManagerLauncherBootstrap.java
    incubator/tuscany/java/sca/samples/calculator-distributed/build.xml
    incubator/tuscany/java/sca/samples/calculator-distributed/src/main/java/node/LaunchCalculatorNodeA.java

Modified: incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationDaemonBootstrap.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationDaemonBootstrap.java?rev=644201&r1=644200&r2=644201&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationDaemonBootstrap.java (original)
+++ incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationDaemonBootstrap.java Thu Apr  3 00:35:18 2008
@@ -34,6 +34,7 @@
      * A node wrappering an instance of a node daemon.
      */
     public static class NodeFacade implements SCANode2 {
+        private ClassLoader threadContextClassLoader;
         private ClassLoader runtimeClassLoader;
         private SCADomain daemon;
         
@@ -42,22 +43,25 @@
         }
         
         public void start() {
-            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+            threadContextClassLoader = Thread.currentThread().getContextClassLoader();
+            boolean started = false;
             try {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
                 daemon = SCADomain.newInstance("NodeDaemon.composite");
+                started = true;
             } finally {
-                Thread.currentThread().setContextClassLoader(tccl);
+                if (!started) {
+                    Thread.currentThread().setContextClassLoader(threadContextClassLoader);
+                }
             }
         }
         
         public void stop() {
-            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
             try {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
                 daemon.close();
             } finally {
-                Thread.currentThread().setContextClassLoader(tccl);
+                Thread.currentThread().setContextClassLoader(threadContextClassLoader);
             }
         }
     }

Modified: incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationLauncherBootstrap.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationLauncherBootstrap.java?rev=644201&r1=644200&r2=644201&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationLauncherBootstrap.java (original)
+++ incubator/tuscany/java/sca/modules/implementation-node-runtime/src/main/java/org/apache/tuscany/sca/implementation/node/launcher/NodeImplementationLauncherBootstrap.java Thu Apr  3 00:35:18 2008
@@ -25,6 +25,7 @@
 import org.apache.tuscany.sca.node.SCANode2Factory.SCAContribution;
 import org.osoa.sca.CallableReference;
 import org.osoa.sca.ServiceReference;
+import org.osoa.sca.ServiceRuntimeException;
 
 /**
  * Bootstrap class for standalone SCA nodes.
@@ -39,6 +40,7 @@
      * A node facade.
      */
     public static class NodeFacade implements SCANode2, SCAClient {
+        private ClassLoader threadContextClassLoader;
         private ClassLoader runtimeClassLoader;
         private SCANode2 delegate;
         
@@ -48,22 +50,25 @@
         }
         
         public void start() {
-            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+            threadContextClassLoader = Thread.currentThread().getContextClassLoader();
+            boolean started = false;
             try {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
                 delegate.start();
+                started = true;
             } finally {
-                Thread.currentThread().setContextClassLoader(tccl);
+                if (!started) {
+                    Thread.currentThread().setContextClassLoader(threadContextClassLoader);
+                }
             }
         }
         
         public void stop() {
-            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
             try {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
                 delegate.stop();
             } finally {
-                Thread.currentThread().setContextClassLoader(tccl);
+                Thread.currentThread().setContextClassLoader(threadContextClassLoader);
             }
         }
 

Modified: incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeLauncherUtil.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeLauncherUtil.java?rev=644201&r1=644200&r2=644201&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeLauncherUtil.java (original)
+++ incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeLauncherUtil.java Thu Apr  3 00:35:18 2008
@@ -49,13 +49,38 @@
 
 
     /**
+     * Returns a ClassLoader for the Tuscany runtime JARs for use in a standalone
+     * J2SE environment.
+     * 
+     * @param parentClassLoader
+     * 
+     * @return
+     */
+    static ClassLoader standAloneRuntimeClassLoader(ClassLoader parentClassLoader) throws FileNotFoundException, URISyntaxException, MalformedURLException {
+        return runtimeClassLoader(parentClassLoader, new StandAloneJARFileNameFilter());
+    }
+    
+    /**
+     * Returns a ClassLoader for the Tuscany runtime JARs for use in a Webapp
+     * environment.
+     * 
+     * @param parentClassLoader
+     * 
+     * @return
+     */
+    static ClassLoader webAppRuntimeClassLoader(ClassLoader parentClassLoader) throws FileNotFoundException, URISyntaxException, MalformedURLException {
+        return runtimeClassLoader(parentClassLoader, new WebAppJARFileNameFilter());
+    }
+    
+    /**
      * Returns a ClassLoader for the Tuscany runtime JARs.
      * 
      * @param parentClassLoader
+     * @param filter
      * 
      * @return
      */
-    static ClassLoader runtimeClassLoader(ClassLoader parentClassLoader) throws FileNotFoundException, URISyntaxException, MalformedURLException {
+    static private ClassLoader runtimeClassLoader(ClassLoader parentClassLoader, FilenameFilter filter) throws FileNotFoundException, URISyntaxException, MalformedURLException {
         
         // Build list of runtime JARs
         List<URL> jarURLs = new ArrayList<URL>();
@@ -87,7 +112,7 @@
 
                     // Collect JAR files from the directory containing the input JAR
                     // (e.g. the Tuscany modules directory)
-                    collectJARFiles(jarDirectory, jarURLs);
+                    collectJARFiles(jarDirectory, jarURLs, filter);
                     
                     File homeDirectory = jarDirectory.getParentFile();
                     if (homeDirectory != null && homeDirectory.exists()) {
@@ -95,13 +120,13 @@
                         // Collect JARs from the ../modules directory
                         File modulesDirectory = new File(homeDirectory, "modules");
                         if (modulesDirectory.exists() && !modulesDirectory.getAbsolutePath().equals(jarDirectory.getAbsolutePath())) {
-                            collectJARFiles(modulesDirectory, jarURLs);
+                            collectJARFiles(modulesDirectory, jarURLs, filter);
                         }
 
                         // Collect JARs from the ../lib directory
                         File libDirectory = new File(homeDirectory, "lib");
                         if (libDirectory.exists() && !libDirectory.getAbsolutePath().equals(jarDirectory.getAbsolutePath())) {
-                            collectJARFiles(libDirectory, jarURLs);
+                            collectJARFiles(libDirectory, jarURLs, filter);
                         }
 
                     }
@@ -122,18 +147,18 @@
             if (homeDirectory.exists()) {
                 
                 // Collect files under $TUSCANY_HOME
-                collectJARFiles(homeDirectory, jarURLs);
+                collectJARFiles(homeDirectory, jarURLs, filter);
                 
                 // Collect files under $TUSCANY_HOME/modules
                 File modulesDirectory = new File(homeDirectory, "modules");
                 if (modulesDirectory.exists()) {
-                    collectJARFiles(modulesDirectory, jarURLs);
+                    collectJARFiles(modulesDirectory, jarURLs, filter);
                 }
     
                 // Collect files under $TUSCANY_HOME/lib
                 File libDirectory = new File(homeDirectory, "lib");
                 if (libDirectory.exists()) {
-                    collectJARFiles(libDirectory, jarURLs);
+                    collectJARFiles(libDirectory, jarURLs, filter);
                 }
             }
         }
@@ -154,10 +179,11 @@
      * Collect JAR files in the given directory
      * @param directory
      * @param urls
+     * @param filter
      * @throws MalformedURLException
      */
-    private static void collectJARFiles(File directory, List<URL> urls) throws MalformedURLException {
-        File[] files = directory.listFiles(new JARFileNameFilter());
+    private static void collectJARFiles(File directory, List<URL> urls, FilenameFilter filter) throws MalformedURLException {
+        File[] files = directory.listFiles(filter);
         if (files != null) {
             int count = 0;
             for (File file: files) {
@@ -179,7 +205,7 @@
     /**
      * A file name filter used to filter JAR files.
      */
-    private static class JARFileNameFilter implements FilenameFilter {
+    private static class StandAloneJARFileNameFilter implements FilenameFilter {
         
         public boolean accept(File dir, String name) {
             name = name.toLowerCase(); 
@@ -211,6 +237,32 @@
         }
     }
     
+    /**
+     * A file name filter used to filter JAR files.
+     */
+    private static class WebAppJARFileNameFilter extends StandAloneJARFileNameFilter {
+        
+        public boolean accept(File dir, String name) {
+            if (!super.accept(dir, name)) {
+                return false;
+            }
+            name = name.toLowerCase(); 
+            
+            // Exclude servlet-api JARs
+            if (name.startsWith("servlet-api")) {
+                return false;
+            }
+            
+            // Filter out the Tomcat host
+            if (name.startsWith("tuscany-host-tomcat")) {
+                //FIXME This is temporary
+                return false;
+            }
+            
+            return true;
+        }
+    }
+    
     
     /**
      * Creates a new node.
@@ -223,7 +275,8 @@
         ClassLoader tccl = Thread.currentThread().getContextClassLoader();
         try {
             // Set up runtime ClassLoader
-            ClassLoader runtimeClassLoader = runtimeClassLoader(Thread.currentThread().getContextClassLoader());
+            ClassLoader runtimeClassLoader = runtimeClassLoader(Thread.currentThread().getContextClassLoader(),
+                                                                new StandAloneJARFileNameFilter());
             if (runtimeClassLoader != null) {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
             }
@@ -277,7 +330,8 @@
         ClassLoader tccl = Thread.currentThread().getContextClassLoader();
         try {
             // Set up runtime ClassLoader
-            ClassLoader runtimeClassLoader = runtimeClassLoader(Thread.currentThread().getContextClassLoader());
+            ClassLoader runtimeClassLoader = runtimeClassLoader(Thread.currentThread().getContextClassLoader(),
+                                                                new StandAloneJARFileNameFilter());
             if (runtimeClassLoader != null) {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
             }
@@ -313,7 +367,8 @@
         ClassLoader tccl = Thread.currentThread().getContextClassLoader();
         try {
             // Set up runtime ClassLoader
-            ClassLoader runtimeClassLoader = runtimeClassLoader(Thread.currentThread().getContextClassLoader());
+            ClassLoader runtimeClassLoader = runtimeClassLoader(Thread.currentThread().getContextClassLoader(),
+                                                                new StandAloneJARFileNameFilter());
             if (runtimeClassLoader != null) {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
             }
@@ -344,6 +399,8 @@
      * Simple URL class loader for the runtime JARs
      */
     private static class RuntimeClassLoader extends URLClassLoader {
+        private final static ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
+        private ClassLoader parent;
         
         /**
          * Constructs a new class loader.
@@ -351,12 +408,65 @@
          * @param parent
          */
         private RuntimeClassLoader(URL[] urls, ClassLoader parent) {
-            super(urls, parent);
+            super(urls);
+            this.parent = parent;
         }
-        
+
         @Override
-        public Class<?> loadClass(String name) throws ClassNotFoundException {
-            return super.loadClass(name);
+        public URL findResource(String name) {
+            URL url = super.findResource(name);
+            if (url == null) {
+                url = parent.getResource(name);
+            }
+            return url;
+        }
+
+        @Override
+        public Enumeration<URL> findResources(String name) throws IOException {
+            Enumeration<URL> resources = super.findResources(name);
+            Enumeration<URL> parentResources = parent.getResources(name);
+            List<URL> allResources = new ArrayList<URL>(); 
+            for (; resources.hasMoreElements(); ) {
+                allResources.add(resources.nextElement());
+            }
+            for (; parentResources.hasMoreElements(); ) {
+                allResources.add(parentResources.nextElement());
+            }
+            return Collections.enumeration(allResources);
+        }
+
+        @Override
+        protected Class<?> findClass(String name) throws ClassNotFoundException {
+            Class<?> cl;
+
+            // First try to load the class using the parent classloader
+            try {
+                cl = parent.loadClass(name);
+                ClassLoader loadedBy = cl.getClassLoader();
+
+                // If the class was not loaded directly by the parent classloader
+                // or the system classloader try to load a local version of the class
+                // using our RuntimeClassloader instead
+                if (loadedBy != parent &&
+                    loadedBy != systemClassLoader &&
+                    loadedBy != null) {
+
+                    try {
+                        cl = super.findClass(name);
+                    } catch (ClassNotFoundException e) {
+                        // No class alternative was found in our RuntimeClassloader,
+                        // use the class found in the parent classloader hierarchy
+                    }
+                }
+            } catch (ClassNotFoundException e) {
+                
+                // The class was not found by the parent class loader, try
+                // to load it using our RuntimeClassloader
+                cl = super.findClass(name);
+            }
+
+            return cl;
         }
     }
+    
 }

Modified: incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeServletFilter.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeServletFilter.java?rev=644201&r1=644200&r2=644201&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeServletFilter.java (original)
+++ incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeServletFilter.java Thu Apr  3 00:35:18 2008
@@ -19,6 +19,8 @@
 
 package org.apache.tuscany.sca.node.launcher;
 
+import static org.apache.tuscany.sca.node.launcher.NodeLauncherUtil.webAppRuntimeClassLoader;
+
 import java.io.IOException;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -51,7 +53,7 @@
         try {
             // Get the Tuscany runtime ClassLoader
             ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-            runtimeClassLoader = NodeLauncherUtil.runtimeClassLoader(getClass().getClassLoader());
+            runtimeClassLoader = webAppRuntimeClassLoader(getClass().getClassLoader());
             
             try {
                 if (runtimeClassLoader != null) {

Modified: incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/launcher/DomainManagerLauncherBootstrap.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/launcher/DomainManagerLauncherBootstrap.java?rev=644201&r1=644200&r2=644201&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/launcher/DomainManagerLauncherBootstrap.java (original)
+++ incubator/tuscany/java/sca/modules/workspace-admin/src/main/java/org/apache/tuscany/sca/workspace/admin/launcher/DomainManagerLauncherBootstrap.java Thu Apr  3 00:35:18 2008
@@ -34,6 +34,7 @@
      * A node wrappering an instance of a domain manager.
      */
     public static class NodeFacade implements SCANode2 {
+        private ClassLoader threadContextClassLoader;
         private ClassLoader runtimeClassLoader;
         private SCADomain domainManager;
         
@@ -42,22 +43,25 @@
         }
         
         public void start() {
-            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+            threadContextClassLoader = Thread.currentThread().getContextClassLoader();
+            boolean started = false;
             try {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
                 domainManager = SCADomain.newInstance("DomainManager.composite");
+                started = true;
             } finally {
-                Thread.currentThread().setContextClassLoader(tccl);
+                if (!started) {
+                    Thread.currentThread().setContextClassLoader(threadContextClassLoader);
+                }
             }
         }
         
         public void stop() {
-            ClassLoader tccl = Thread.currentThread().getContextClassLoader();
             try {
                 Thread.currentThread().setContextClassLoader(runtimeClassLoader);
                 domainManager.close();
             } finally {
-                Thread.currentThread().setContextClassLoader(tccl);
+                Thread.currentThread().setContextClassLoader(threadContextClassLoader);
             }
         }
     }

Modified: incubator/tuscany/java/sca/samples/calculator-distributed/build.xml
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/calculator-distributed/build.xml?rev=644201&r1=644200&r2=644201&view=diff
==============================================================================
--- incubator/tuscany/java/sca/samples/calculator-distributed/build.xml (original)
+++ incubator/tuscany/java/sca/samples/calculator-distributed/build.xml Thu Apr  3 00:35:18 2008
@@ -30,7 +30,9 @@
                source="1.5"
                target="1.5">
             <classpath>
-            	<pathelement location="../../lib/tuscany-sca-manifest.jar"/>
+            	<pathelement location="../../modules/tuscany-sca-api-1.2-incubating-SNAPSHOT.jar"/>
+            	<pathelement location="../../modules/tuscany-node2-api-1.2-incubating-SNAPSHOT.jar"/>
+            	<pathelement location="../../modules/tuscany-node2-launcher-1.2-incubating-SNAPSHOT.jar"/>
             </classpath>
         </javac> 
         <copy todir="target/classes">
@@ -50,7 +52,7 @@
             	<pathelement path="src/main/resources"/>
                 <pathelement path="target/classes"/>
             	<pathelement path="target/${test.jar}"/>
-            	<pathelement location="../../lib/tuscany-sca-manifest.jar"/>
+            	<pathelement location="../../modules/tuscany-node2-launcher-1.2-incubating-SNAPSHOT.jar"/>
             </classpath>    	        	
         </java>
     </target>
@@ -62,7 +64,9 @@
             	<pathelement path="src/main/resources"/>
                 <pathelement path="target/classes"/>
             	<pathelement path="target/${test.jar}"/>
-            	<pathelement location="../../lib/tuscany-sca-manifest.jar"/>
+            	<pathelement location="../../modules/tuscany-sca-api-1.2-incubating-SNAPSHOT.jar"/>
+            	<pathelement location="../../modules/tuscany-node2-api-1.2-incubating-SNAPSHOT.jar"/>
+            	<pathelement location="../../modules/tuscany-node2-launcher-1.2-incubating-SNAPSHOT.jar"/>
             </classpath>     	        	
         </java>
     </target>
@@ -74,7 +78,7 @@
             	<pathelement path="src/main/resources"/>
                 <pathelement path="target/classes"/>
             	<pathelement path="target/${test.jar}"/>
-            	<pathelement location="../../lib/tuscany-sca-manifest.jar"/>
+            	<pathelement location="../../modules/tuscany-node2-launcher-1.2-incubating-SNAPSHOT.jar"/>
             </classpath>      	
         </java>
     </target>	
@@ -86,7 +90,7 @@
             	<pathelement path="src/main/resources"/>
                 <pathelement path="target/classes"/>
             	<pathelement path="target/${test.jar}"/>
-            	<pathelement location="../../lib/tuscany-sca-manifest.jar"/>
+            	<pathelement location="../../modules/tuscany-node2-launcher-1.2-incubating-SNAPSHOT.jar"/>
             </classpath>      	
         </java>
     </target>	

Modified: incubator/tuscany/java/sca/samples/calculator-distributed/src/main/java/node/LaunchCalculatorNodeA.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/samples/calculator-distributed/src/main/java/node/LaunchCalculatorNodeA.java?rev=644201&r1=644200&r2=644201&view=diff
==============================================================================
--- incubator/tuscany/java/sca/samples/calculator-distributed/src/main/java/node/LaunchCalculatorNodeA.java (original)
+++ incubator/tuscany/java/sca/samples/calculator-distributed/src/main/java/node/LaunchCalculatorNodeA.java Thu Apr  3 00:35:18 2008
@@ -21,7 +21,7 @@
 
 import org.apache.tuscany.sca.node.SCAClient;
 import org.apache.tuscany.sca.node.SCANode2;
-import org.apache.tuscany.sca.node.SCANode2Factory;
+import org.apache.tuscany.sca.node.launcher.NodeLauncher;
 import org.osoa.sca.ServiceRuntimeException;
 
 import calculator.CalculatorService;
@@ -32,8 +32,8 @@
         SCANode2 node = null;
         try {
             
-            SCANode2Factory nodeFactory = SCANode2Factory.newInstance();
-            node = nodeFactory.createSCANode("http://localhost:9990/node-image/NodeA");
+            NodeLauncher nodeLauncher = NodeLauncher.newInstance();
+            node = nodeLauncher.createNode("http://localhost:9990/node-image/NodeA");
 
             node.start();
             



---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org