You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by jb...@apache.org on 2007/03/07 06:46:38 UTC
svn commit: r515464 - in /incubator/tuscany/java/sca/kernel:
core/src/main/java/org/apache/tuscany/core/services/classloading/MultiParentClassLoader.java
spi/src/main/java/org/apache/tuscany/spi/deployer/CompositeClassLoader.java
Author: jboynes
Date: Tue Mar 6 21:46:38 2007
New Revision: 515464
URL: http://svn.apache.org/viewvc?view=rev&rev=515464
Log:
merge multi-parent function into composite classloader
Removed:
incubator/tuscany/java/sca/kernel/core/src/main/java/org/apache/tuscany/core/services/classloading/MultiParentClassLoader.java
Modified:
incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/deployer/CompositeClassLoader.java
Modified: incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/deployer/CompositeClassLoader.java
URL: http://svn.apache.org/viewvc/incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/deployer/CompositeClassLoader.java?view=diff&rev=515464&r1=515463&r2=515464
==============================================================================
--- incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/deployer/CompositeClassLoader.java (original)
+++ incubator/tuscany/java/sca/kernel/spi/src/main/java/org/apache/tuscany/spi/deployer/CompositeClassLoader.java Tue Mar 6 21:46:38 2007
@@ -18,9 +18,16 @@
*/
package org.apache.tuscany.spi.deployer;
-import java.net.URLClassLoader;
+import java.io.IOException;
import java.net.URL;
+import java.net.URLClassLoader;
import java.net.URLStreamHandlerFactory;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* ClassLoader associated with a composite.
@@ -29,24 +36,107 @@
*/
public class CompositeClassLoader extends URLClassLoader {
private static final URL[] NOURLS = {};
-
- public CompositeClassLoader(ClassLoader classLoader) {
- super(NOURLS, classLoader);
+ private final List<ClassLoader> parents = new CopyOnWriteArrayList<ClassLoader>();
+
+ public CompositeClassLoader(ClassLoader parent) {
+ super(NOURLS);
+ parents.add(parent);
}
- public CompositeClassLoader(URL[] urls, ClassLoader classLoader) {
- super(urls, classLoader);
+ public CompositeClassLoader(URL[] urls, ClassLoader parent) {
+ super(urls);
+ parents.add(parent);
}
public CompositeClassLoader(URL[] urls) {
super(urls);
}
- public CompositeClassLoader(URL[] urls, ClassLoader classLoader, URLStreamHandlerFactory urlStreamHandlerFactory) {
- super(urls, classLoader, urlStreamHandlerFactory);
+ public CompositeClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory urlStreamHandlerFactory) {
+ super(urls, null, urlStreamHandlerFactory);
+ parents.add(parent);
}
public void addURL(URL url) {
+ // Require RuntimePermission("createClassLoader")
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ sm.checkCreateClassLoader();
+ }
super.addURL(url);
+ }
+
+ public void addParent(ClassLoader parent) {
+ // Require RuntimePermission("createClassLoader")
+ SecurityManager sm = System.getSecurityManager();
+ if (sm != null) {
+ sm.checkCreateClassLoader();
+ }
+ parents.add(parent);
+ }
+
+
+ protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+ // look for already loaded classes
+ Class clazz = findLoadedClass(name);
+ if (clazz != null) {
+ if (resolve) {
+ resolveClass(clazz);
+ }
+ return clazz;
+ }
+
+ // look in our parents
+ for (ClassLoader parent : parents) {
+ try {
+ clazz = parent.loadClass(name);
+ if (resolve) {
+ resolveClass(clazz);
+ }
+ return clazz;
+ } catch (ClassNotFoundException e) {
+ continue;
+ }
+ }
+
+ // look in our classpath
+ clazz = findClass(name);
+ if (resolve) {
+ resolveClass(clazz);
+ }
+ return clazz;
+ }
+
+
+ protected Class<?> findClass(String string) throws ClassNotFoundException {
+ return super.findClass(string);
+ }
+
+ public URL findResource(String name) {
+ // look in our parents
+ for (ClassLoader parent : parents) {
+ URL resource = parent.getResource(name);
+ if (resource != null) {
+ return resource;
+ }
+ }
+ // look in our classpath
+ return super.findResource(name);
+ }
+
+ public Enumeration<URL> findResources(String name) throws IOException {
+ // LinkedHashSet because we want all resources in the order found but no duplicates
+ Set<URL> resources = new LinkedHashSet<URL>();
+ for (ClassLoader parent : parents) {
+ Enumeration<URL> parentResources = parent.getResources(name);
+ while (parentResources.hasMoreElements()) {
+ resources.add(parentResources.nextElement());
+ }
+ }
+ Enumeration<URL> myResources = super.findResources(name);
+ while (myResources.hasMoreElements()) {
+ resources.add(myResources.nextElement());
+ }
+ return Collections.enumeration(resources);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org