Return-Path: Delivered-To: apmail-ws-tuscany-commits-archive@locus.apache.org Received: (qmail 85119 invoked from network); 3 Apr 2008 07:35:55 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 3 Apr 2008 07:35:55 -0000 Received: (qmail 88761 invoked by uid 500); 3 Apr 2008 07:35:55 -0000 Delivered-To: apmail-ws-tuscany-commits-archive@ws.apache.org Received: (qmail 88739 invoked by uid 500); 3 Apr 2008 07:35:55 -0000 Mailing-List: contact tuscany-commits-help@ws.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: tuscany-dev@ws.apache.org Delivered-To: mailing list tuscany-commits@ws.apache.org Received: (qmail 88730 invoked by uid 99); 3 Apr 2008 07:35:55 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Apr 2008 00:35:55 -0700 X-ASF-Spam-Status: No, hits=-1998.5 required=10.0 tests=ALL_TRUSTED,WEIRD_PORT X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Apr 2008 07:35:11 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7C03D1A9832; Thu, 3 Apr 2008 00:35:30 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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... Date: Thu, 03 Apr 2008 07:35:19 -0000 To: tuscany-commits@ws.apache.org From: jsdelfino@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080403073530.7C03D1A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 jarURLs = new ArrayList(); @@ -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 urls) throws MalformedURLException { - File[] files = directory.listFiles(new JARFileNameFilter()); + private static void collectJARFiles(File directory, List 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 findResources(String name) throws IOException { + Enumeration resources = super.findResources(name); + Enumeration parentResources = parent.getResources(name); + List allResources = new ArrayList(); + 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"> - + + + @@ -50,7 +52,7 @@ - + @@ -62,7 +64,9 @@ - + + + @@ -74,7 +78,7 @@ - + @@ -86,7 +90,7 @@ - + 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