You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/11/07 09:19:38 UTC

[sling-org-apache-sling-commons-classloader] 11/21: Provide parent class loader to dynamic class loader providers; check for null reference.

This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to annotated tag org.apache.sling.commons.classloader-0.9.0
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-classloader.git

commit 8023ea15d1f7eab8a6291fe68bc9eb4cefd818cb
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Thu Jul 16 05:31:50 2009 +0000

    Provide parent class loader to dynamic class loader providers; check for null reference.
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/commons/classloader@794537 13f79535-47bb-0310-9956-ffa450edef68
---
 .../classloader/DynamicClassLoaderProvider.java    |  7 ++++-
 .../classloader/impl/ClassLoaderFacade.java        | 36 +++++++++++++---------
 .../impl/DynamicClassLoaderManagerImpl.java        |  4 ++-
 3 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/apache/sling/commons/classloader/DynamicClassLoaderProvider.java b/src/main/java/org/apache/sling/commons/classloader/DynamicClassLoaderProvider.java
index 04eaf8e..cdac258 100644
--- a/src/main/java/org/apache/sling/commons/classloader/DynamicClassLoaderProvider.java
+++ b/src/main/java/org/apache/sling/commons/classloader/DynamicClassLoaderProvider.java
@@ -29,7 +29,12 @@ public interface DynamicClassLoaderProvider {
 
     /**
      * Return the class loader used for dynamic class loading.
+     * The returned class loader should use the provided parent class loader
+     * as one of its parent class loaders. This ensures that the returned
+     * class loader has access to all dynamically loaded classes that
+     * are not part of this class loader.
+     * @param parent The parent class loader for this dynamic class loader.
      * @return The class loader.
      */
-    ClassLoader getClassLoader();
+    ClassLoader getClassLoader(ClassLoader parent);
 }
diff --git a/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java b/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java
index 1ef22a4..e852bd8 100644
--- a/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java
+++ b/src/main/java/org/apache/sling/commons/classloader/impl/ClassLoaderFacade.java
@@ -42,9 +42,11 @@ public class ClassLoaderFacade extends ClassLoader {
     public URL getResource(String name) {
         final ClassLoader[] loaders = manager.getDynamicClassLoaders();
         for(final ClassLoader cl : loaders) {
-            final URL u = cl.getResource(name);
-            if ( u != null ) {
-                return u;
+            if ( cl != null ) {
+                final URL u = cl.getResource(name);
+                if ( u != null ) {
+                    return u;
+                }
             }
         }
         return null;
@@ -56,9 +58,11 @@ public class ClassLoaderFacade extends ClassLoader {
     public InputStream getResourceAsStream(String name) {
         final ClassLoader[] loaders = manager.getDynamicClassLoaders();
         for(final ClassLoader cl : loaders) {
-            final InputStream i = cl.getResourceAsStream(name);
-            if ( i != null ) {
-                return i;
+            if ( cl != null ) {
+                final InputStream i = cl.getResourceAsStream(name);
+                if ( i != null ) {
+                    return i;
+                }
             }
         }
         return null;
@@ -70,9 +74,11 @@ public class ClassLoaderFacade extends ClassLoader {
     public Enumeration<URL> getResources(String name) throws IOException {
         final ClassLoader[] loaders = manager.getDynamicClassLoaders();
         for(final ClassLoader cl : loaders) {
-            final Enumeration<URL> e = cl.getResources(name);
-            if ( e != null && e.hasMoreElements() ) {
-                return e;
+            if ( cl != null ) {
+                final Enumeration<URL> e = cl.getResources(name);
+                if ( e != null && e.hasMoreElements() ) {
+                    return e;
+                }
             }
         }
         return null;
@@ -84,11 +90,13 @@ public class ClassLoaderFacade extends ClassLoader {
     public Class<?> loadClass(String name) throws ClassNotFoundException {
         final ClassLoader[] loaders = manager.getDynamicClassLoaders();
         for(final ClassLoader cl : loaders) {
-            try {
-                final Class<?> c = cl.loadClass(name);
-                return c;
-            } catch (Exception cnfe) {
-                // we just ignore this and try the next class loader
+            if ( cl != null ) {
+                try {
+                    final Class<?> c = cl.loadClass(name);
+                    return c;
+                } catch (Exception cnfe) {
+                    // we just ignore this and try the next class loader
+                }
             }
         }
         throw new ClassNotFoundException("Class not found: " + name);
diff --git a/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java b/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java
index 2d9cc1f..2e5c6e1 100644
--- a/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java
+++ b/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java
@@ -89,7 +89,9 @@ public class DynamicClassLoaderManagerImpl
             int index = 1;
             for(final ServiceReference ref : refs) {
                 final DynamicClassLoaderProvider provider = (DynamicClassLoaderProvider)this.getService(ref);
-                loaders[index] = provider.getClassLoader();
+                if ( provider != null ) {
+                    loaders[index] = provider.getClassLoader(this.pckAdminCL);
+                }
                 index++;
             }
             // and now use new array

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.