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