You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2010/01/25 14:30:59 UTC

svn commit: r902807 - in /sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl: Activator.java DynamicClassLoaderManagerFactory.java DynamicClassLoaderManagerImpl.java PackageAdminClassLoader.java

Author: cziegeler
Date: Mon Jan 25 13:30:59 2010
New Revision: 902807

URL: http://svn.apache.org/viewvc?rev=902807&view=rev
Log:
SLING-1302 : After a NoClassDefError classes are still not found even if they have been installed in the meantime

Modified:
    sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/Activator.java
    sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerFactory.java
    sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java
    sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java

Modified: sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/Activator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/Activator.java?rev=902807&r1=902806&r2=902807&view=diff
==============================================================================
--- sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/Activator.java (original)
+++ sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/Activator.java Mon Jan 25 13:30:59 2010
@@ -113,6 +113,12 @@
         if ( needsUpdate ) {
             this.unregisterManagerFactory();
             this.registerManagerFactory();
+        } else {
+            // if a new bundle has been added (=resolved), we should
+            // clear the negative cache (see SLING-1302)
+            if ( event.getType() == BundleEvent.RESOLVED ) {
+                this.service.clearNegativeCaches();
+            }
         }
     }
 }

Modified: sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerFactory.java?rev=902807&r1=902806&r2=902807&view=diff
==============================================================================
--- sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerFactory.java (original)
+++ sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerFactory.java Mon Jan 25 13:30:59 2010
@@ -16,8 +16,10 @@
  */
 package org.apache.sling.commons.classloader.impl;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.osgi.framework.Bundle;
@@ -40,6 +42,9 @@
 
     private final Set<Long> usedBundles = Collections.synchronizedSet(new HashSet<Long>());
 
+    /** All created managers. */
+    private final List<DynamicClassLoaderManagerImpl> managers = new ArrayList<DynamicClassLoaderManagerImpl>();
+
     /**
      * Create a new service instance
      * @param ctx The bundle context.
@@ -56,7 +61,12 @@
      */
     public Object getService(final Bundle bundle,
                              final ServiceRegistration registration) {
-        return new DynamicClassLoaderManagerImpl(this.context, this.pckAdmin, new BundleProxyClassLoader(bundle), this);
+        final DynamicClassLoaderManagerImpl manager =  new DynamicClassLoaderManagerImpl(this.context,
+                this.pckAdmin, new BundleProxyClassLoader(bundle), this);
+        synchronized ( managers ) {
+            managers.add(manager);
+        }
+        return manager;
     }
 
     /**
@@ -66,6 +76,9 @@
                              final ServiceRegistration registration,
                              final Object service) {
         if ( service != null ) {
+            synchronized ( managers ) {
+                managers.remove(service);
+            }
             ((DynamicClassLoaderManagerImpl)service).deactivate();
         }
     }
@@ -87,4 +100,15 @@
         final long id = bundle.getBundleId();
         this.usedBundles.add(id);
     }
+
+    /**
+     * Clear the negative caches of all registered managers.
+     */
+    public void clearNegativeCaches() {
+        synchronized ( this.managers ) {
+            for(final DynamicClassLoaderManagerImpl manager : this.managers) {
+                manager.clearNegativeCache();
+            }
+        }
+    }
 }

Modified: sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java?rev=902807&r1=902806&r2=902807&view=diff
==============================================================================
--- sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java (original)
+++ sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java Mon Jan 25 13:30:59 2010
@@ -70,6 +70,13 @@
         this.facade = new ClassLoaderFacade(this);
     }
 
+    /**
+     * Clear the negative cache
+     */
+    public void clearNegativeCache() {
+        this.pckAdminCL.clearNegativeCache();
+    }
+
     private synchronized void updateCache() {
         if ( this.trackingCount < this.getTrackingCount() ) {
             final ServiceReference[] refs = this.getServiceReferences();

Modified: sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java?rev=902807&r1=902806&r2=902807&view=diff
==============================================================================
--- sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java (original)
+++ sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/PackageAdminClassLoader.java Mon Jan 25 13:30:59 2010
@@ -61,6 +61,13 @@
     }
 
     /**
+     * Clear the negative cache.
+     */
+    public void clearNegativeCache() {
+        negativeClassCache.clear();
+    }
+
+    /**
      * Find the bundle for a given package.
      * @param pckName The package name.
      * @return The bundle or <code>null</code>