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