Return-Path: Delivered-To: apmail-sling-commits-archive@www.apache.org Received: (qmail 6838 invoked from network); 25 Jan 2010 13:31:21 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 25 Jan 2010 13:31:21 -0000 Received: (qmail 31906 invoked by uid 500); 25 Jan 2010 13:31:21 -0000 Delivered-To: apmail-sling-commits-archive@sling.apache.org Received: (qmail 31849 invoked by uid 500); 25 Jan 2010 13:31:21 -0000 Mailing-List: contact commits-help@sling.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@sling.apache.org Delivered-To: mailing list commits@sling.apache.org Received: (qmail 31840 invoked by uid 99); 25 Jan 2010 13:31:21 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 25 Jan 2010 13:31:21 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 25 Jan 2010 13:31:20 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 9DCD12388A1C; Mon, 25 Jan 2010 13:30:59 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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 Date: Mon, 25 Jan 2010 13:30:59 -0000 To: commits@sling.apache.org From: cziegeler@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100125133059.9DCD12388A1C@eris.apache.org> 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 usedBundles = Collections.synchronizedSet(new HashSet()); + /** All created managers. */ + private final List managers = new ArrayList(); + /** * 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 null