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:58 UTC

[sling-org-apache-sling-commons-classloader] 04/08: SLING-1191 : Dynamic class loader providers are not reloaded when bundles are updated/installed etc. Add new release method to the dynamic class loader provider. This allows a provider to react on bundle/class loader changes.

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

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

commit b005143ede2a47ac3d2203119ceb28b1c5949328
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Tue Nov 17 11:12:48 2009 +0000

    SLING-1191 : Dynamic class loader providers are not reloaded when bundles are updated/installed etc.
    Add new release method to the dynamic class loader provider. This allows a provider to react on bundle/class loader changes.
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/commons/classloader@881245 13f79535-47bb-0310-9956-ffa450edef68
---
 pom.xml                                            |  5 ++--
 .../classloader/DynamicClassLoaderProvider.java    | 14 +++++++++++
 .../impl/DynamicClassLoaderManagerImpl.java        | 27 ++++++++++++++++++++++
 3 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/pom.xml b/pom.xml
index e7a7bdb..b07ac06 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,12 +24,11 @@
         <groupId>org.apache.sling</groupId>
         <artifactId>sling</artifactId>
         <version>7</version>
-        <relativePath>../../../parent/pom.xml</relativePath>
     </parent>
 
     <artifactId>org.apache.sling.commons.classloader</artifactId>
     <packaging>bundle</packaging>
-    <version>1.0.1-SNAPSHOT</version>
+    <version>1.1.0-SNAPSHOT</version>
 
     <name>Apache Sling Dynamic Class Loader Support</name>
     <description>
@@ -58,7 +57,7 @@
                             org.apache.sling.commons.classloader.impl.Activator
                         </Bundle-Activator>
                         <Export-Package>
-                            org.apache.sling.commons.classloader;version=${pom.version}
+                            org.apache.sling.commons.classloader;version=1.1.0
                         </Export-Package>
                         <Private-Package>
                             org.apache.sling.commons.classloader.impl
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 cdac258..bf7985e 100644
--- a/src/main/java/org/apache/sling/commons/classloader/DynamicClassLoaderProvider.java
+++ b/src/main/java/org/apache/sling/commons/classloader/DynamicClassLoaderProvider.java
@@ -33,8 +33,22 @@ public interface DynamicClassLoaderProvider {
      * 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.
+     * When the class loader is not needed anymore, it is released by
+     * calling the {@link #release(ClassLoader)} method.
      * @param parent The parent class loader for this dynamic class loader.
      * @return The class loader.
+     * @see #release(ClassLoader)
      */
     ClassLoader getClassLoader(ClassLoader parent);
+
+    /**
+     * Release the provided class loader.
+     * When the class loader is not needed anymore, e.g. when the dynamic class
+     * loader is shutdown, it is released with this method.
+     * The implementation can use this hook to free any allocated resources etc.
+     * @param classLoader The class loader.
+     * @see #getClassLoader(ClassLoader)
+     * @since 2.0
+     */
+    void release(ClassLoader classLoader);
 }
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 6dabeb1..6c15c19 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
@@ -43,6 +43,9 @@ public class DynamicClassLoaderManagerImpl
     /** The cached chain of class loaders. */
     private ClassLoader[] cache;
 
+    /** The cached chain of dynamic class loader providers. */
+    private DynamicClassLoaderProvider[] providerCache;
+
     /** Is this still active? */
     private volatile boolean active = true;
 
@@ -62,6 +65,7 @@ public class DynamicClassLoaderManagerImpl
         super(ctx, DynamicClassLoaderProvider.class.getName(), null);
         this.pckAdminCL = new PackageAdminClassLoader(pckAdmin, parent, factory);
         this.cache = new ClassLoader[] {this.pckAdminCL};
+        this.providerCache = new DynamicClassLoaderProvider[0];
         this.open();
         this.facade = new ClassLoaderFacade(this);
     }
@@ -70,10 +74,13 @@ public class DynamicClassLoaderManagerImpl
         if ( this.trackingCount < this.getTrackingCount() ) {
             final ServiceReference[] refs = this.getServiceReferences();
             final ClassLoader[] loaders;
+            final DynamicClassLoaderProvider[] providers;
             if ( refs == null || refs.length == 0 ) {
                 loaders = new ClassLoader[] {this.pckAdminCL};
+                providers = new DynamicClassLoaderProvider[0];
             } else {
                 loaders = new ClassLoader[1 + refs.length];
+                providers = new DynamicClassLoaderProvider[refs.length];
                 Arrays.sort(refs, ServiceReferenceComparator.INSTANCE);
                 int index = 0;
                 for(final ServiceReference ref : refs) {
@@ -85,18 +92,38 @@ public class DynamicClassLoaderManagerImpl
                 }
                 loaders[index] = this.pckAdminCL;
             }
+            // release old class loaders
+            this.releaseProviders();
+
             // and now use new array
             this.cache = loaders;
+            this.providerCache = providers;
             this.trackingCount = this.getTrackingCount();
         }
     }
 
     /**
+     * Free used class loader providers
+     */
+    private void releaseProviders() {
+        if ( this.providerCache != null ) {
+            for(int i=0; i<this.providerCache.length; i++) {
+                if ( this.cache[i] != null ) {
+                    this.providerCache[i].release(this.cache[i]);
+                }
+            }
+        }
+    }
+
+    /**
      * Deactivate this service.
      */
     public void deactivate() {
+        this.releaseProviders();
         this.active = false;
         this.close();
+        this.providerCache = null;
+        this.cache = null;
     }
 
     /**

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