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/02 11:31:29 UTC
svn commit: r643814 - in /incubator/tuscany/java/sca/modules:
node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeLauncherUtil.java
Author: jsdelfino
Date: Wed Apr 2 02:31:25 2008
New Revision: 643814
URL: http://svn.apache.org/viewvc?rev=643814&view=rev
Log:
Partial fix for TUSCANY-2182. Check for null when calling URLClassLoader.getURLs(). Allow Node2 to load runtime classes using a parent-last classloading scheme.
Modified:
incubator/tuscany/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
incubator/tuscany/java/sca/modules/node2-launcher/src/main/java/org/apache/tuscany/sca/node/launcher/NodeLauncherUtil.java
Modified: incubator/tuscany/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java?rev=643814&r1=643813&r2=643814&view=diff
==============================================================================
--- incubator/tuscany/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java (original)
+++ incubator/tuscany/java/sca/modules/node2-impl/src/main/java/org/apache/tuscany/sca/node/impl/NodeImpl.java Wed Apr 2 02:31:25 2008
@@ -378,12 +378,15 @@
// Collect JARs from the URLClassLoader's classpath
if (cl instanceof URLClassLoader) {
- for (URL jarURL: ((URLClassLoader)cl).getURLs()) {
- String file =jarURL.getPath();
- int i = file.lastIndexOf('/');
- if (i != -1 && i < file.length() -1 ) {
- file = file.substring(i +1);
- urls.put(file, jarURL);
+ URL[] jarURLs = ((URLClassLoader)cl).getURLs();
+ if (jarURLs != null) {
+ for (URL jarURL: jarURLs) {
+ String file =jarURL.getPath();
+ int i = file.lastIndexOf('/');
+ if (i != -1 && i < file.length() -1 ) {
+ file = file.substring(i +1);
+ urls.put(file, jarURL);
+ }
}
}
}
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=643814&r1=643813&r2=643814&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 Wed Apr 2 02:31:25 2008
@@ -22,6 +22,7 @@
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
+import java.io.IOException;
import java.lang.reflect.Constructor;
import java.net.MalformedURLException;
import java.net.URI;
@@ -29,6 +30,8 @@
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -139,7 +142,7 @@
if (!jarURLs.isEmpty()) {
// Return a ClassLoader configured with the runtime JARs
- ClassLoader classLoader = new URLClassLoader(jarURLs.toArray(new URL[0]), parentClassLoader);
+ ClassLoader classLoader = new RuntimeClassLoader(jarURLs.toArray(new URL[0]), parentClassLoader);
return classLoader;
} else {
@@ -154,38 +157,7 @@
* @throws MalformedURLException
*/
private static void collectJARFiles(File directory, List<URL> urls) throws MalformedURLException {
- File[] files = directory.listFiles(new FilenameFilter() {
-
- public boolean accept(File dir, String name) {
- name = name.toLowerCase();
-
- // Exclude tuscany-sca-all and tuscany-sca-manifest as they duplicate
- // code in the individual runtime module JARs
- if (name.startsWith("tuscany-sca-all")) {
- return false;
- }
- if (name.startsWith("tuscany-sca-manifest")) {
- return false;
- }
-
- // Filter out the Jetty and Webapp hosts
- if (name.startsWith("tuscany-host-jetty") ||
- name.startsWith("tuscany-host-webapp")) {
- //FIXME This is temporary
- return false;
- }
-
- // Include JAR and MAR files
- if (name.endsWith(".jar")) {
- return true;
- }
- if (name.endsWith(".mar")) {
- return true;
- }
- return false;
- }
- });
-
+ File[] files = directory.listFiles(new JARFileNameFilter());
if (files != null) {
int count = 0;
for (File file: files) {
@@ -205,6 +177,42 @@
}
/**
+ * A file name filter used to filter JAR files.
+ */
+ private static class JARFileNameFilter implements FilenameFilter {
+
+ public boolean accept(File dir, String name) {
+ name = name.toLowerCase();
+
+ // Exclude tuscany-sca-all and tuscany-sca-manifest as they duplicate
+ // code in the individual runtime module JARs
+ if (name.startsWith("tuscany-sca-all")) {
+ return false;
+ }
+ if (name.startsWith("tuscany-sca-manifest")) {
+ return false;
+ }
+
+ // Filter out the Jetty and Webapp hosts
+ if (name.startsWith("tuscany-host-jetty") ||
+ name.startsWith("tuscany-host-webapp")) {
+ //FIXME This is temporary
+ return false;
+ }
+
+ // Include JAR and MAR files
+ if (name.endsWith(".jar")) {
+ return true;
+ }
+ if (name.endsWith(".mar")) {
+ return true;
+ }
+ return false;
+ }
+ }
+
+
+ /**
* Creates a new node.
*
* @param compositeURI
@@ -332,4 +340,73 @@
}
}
+ /**
+ * Simple URL class loader that hides the parent class loader and implements a
+ * parent-last loading scheme.
+ */
+ private static class RuntimeClassLoader extends URLClassLoader {
+ private ClassLoader parent;
+
+ /**
+ * Constructs a new class loader.
+ * @param urls
+ * @param parent
+ */
+ private RuntimeClassLoader(URL[] urls, ClassLoader parent) {
+ super(urls);
+ this.parent = parent;
+ }
+
+ @Override
+ 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);
+ if (cl.getClassLoader() != parent) {
+
+ // If the class was not loaded directly by the parent classloader
+ // try to load it using our URL classloader instead
+ try {
+ cl = super.findClass(name);
+ } catch (ClassNotFoundException e) {
+ // No class alternative was found in our URL classloader,
+ // 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 URL classloader
+ cl = super.findClass(name);
+ }
+
+ return cl;
+ }
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org