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 2017/09/06 07:40:47 UTC

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

Author: cziegeler
Date: Wed Sep  6 07:40:47 2017
New Revision: 1807444

URL: http://svn.apache.org/viewvc?rev=1807444&view=rev
Log:
SLING-7109 : Classloader not updated when bundle is updating

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

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=1807444&r1=1807443&r2=1807444&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 Wed Sep  6 07:40:47 2017
@@ -39,17 +39,14 @@ import org.slf4j.LoggerFactory;
  */
 public class Activator implements SynchronousBundleListener, BundleActivator {
 
-    /** Package admin service name */
-    private static String PACKAGE_ADMIN_NAME = PackageAdmin.class.getName();
-    
     /** The logger. */
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
 
     /** A service tracker for the package admin. */
-    private ServiceTracker packageAdminTracker;
+    private ServiceTracker<PackageAdmin, PackageAdmin> packageAdminTracker;
 
     /** The service registration for the dynamic class loader manager. */
-    private ServiceRegistration serviceReg;
+    private ServiceRegistration<DynamicClassLoaderManager> serviceReg;
 
     /** The dynamic class loader service factory. */
     private DynamicClassLoaderManagerFactory service;
@@ -60,10 +57,11 @@ public class Activator implements Synchr
     /**
      * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
      */
+    @Override
     public void start(BundleContext context) {
         this.bundleContext = context;
 
-        this.packageAdminTracker = new ServiceTracker(this.bundleContext, PACKAGE_ADMIN_NAME, null);
+        this.packageAdminTracker = new ServiceTracker(this.bundleContext, PackageAdmin.class, null);
         this.packageAdminTracker.open();
 
         // register service
@@ -75,12 +73,12 @@ public class Activator implements Synchr
      * Register the dynamic class loader manager factory.
      */
     protected void registerManagerFactory() {
-        final Hashtable<String, String> props = new Hashtable<String, String>();
+        final Hashtable<String, String> props = new Hashtable<>();
         props.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Dynamic Class Loader Service");
         props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
         this.service = new DynamicClassLoaderManagerFactory(this.bundleContext,
-                (PackageAdmin)this.packageAdminTracker.getService());
-        this.serviceReg = this.bundleContext.registerService(new String[] {DynamicClassLoaderManager.class.getName()}, service, props);
+                this.packageAdminTracker.getService());
+        this.serviceReg = this.bundleContext.registerService(DynamicClassLoaderManager.class, service, props);
     }
 
     /**
@@ -99,6 +97,7 @@ public class Activator implements Synchr
     /**
      * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
      */
+    @Override
     public void stop(final BundleContext context) {
         context.removeBundleListener(this);
         this.unregisterManagerFactory();
@@ -112,6 +111,7 @@ public class Activator implements Synchr
     /**
      * @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent)
      */
+    @Override
     public void bundleChanged(final BundleEvent event) {
         synchronized ( this ) {
             final boolean lazyBundle = event.getBundle().getHeaders().get( Constants.BUNDLE_ACTIVATIONPOLICY ) != null;
@@ -119,9 +119,14 @@ public class Activator implements Synchr
             final boolean reload;
             if ( ( event.getType() == BundleEvent.STARTED && !lazyBundle)
                  || (event.getType() == BundleEvent.STARTING && lazyBundle) ) {
-                reload = this.service.hasUnresolvedPackages(event.getBundle());
-                if (reload) {
+                if ( this.service.hasUnresolvedPackages(event.getBundle()) ) {
+                    reload = true;
                     logger.debug("Dynamic Class Loader is reloaded because the new bundle '{}' provides previously unresolved packages", event.getBundle());
+                } else if ( this.service.isBundleUsed(event.getBundle().getBundleId()) ) {
+                    reload = true;
+                    logger.debug("Dynamic Class Loader is reloaded because the bundle '{}' has been updated", event.getBundle());
+                } else {
+                    reload = false;
                 }
             } else if ( event.getType() == BundleEvent.UNRESOLVED || event.getType() == BundleEvent.RESOLVED ) {
                 reload = this.service.isBundleUsed(event.getBundle().getBundleId());

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=1807444&r1=1807443&r2=1807444&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 Wed Sep  6 07:40:47 2017
@@ -20,6 +20,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
+import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceFactory;
@@ -33,7 +34,7 @@ import org.slf4j.LoggerFactory;
  * This is the service factory for the dynamic class loader manager.
  */
 public class DynamicClassLoaderManagerFactory
-    implements ServiceFactory {
+    implements ServiceFactory<DynamicClassLoaderManager> {
 
     /** The logger. */
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -62,8 +63,9 @@ public class DynamicClassLoaderManagerFa
     /**
      * @see org.osgi.framework.ServiceFactory#getService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration)
      */
-    public Object getService(final Bundle bundle,
-                             final ServiceRegistration registration) {
+    @Override
+    public DynamicClassLoaderManager getService(final Bundle bundle,
+                             final ServiceRegistration<DynamicClassLoaderManager> registration) {
         final DynamicClassLoaderManagerImpl manager =  new DynamicClassLoaderManagerImpl(this.context,
                 this.pckAdmin, new BundleProxyClassLoader(bundle), this);
         return manager;
@@ -72,9 +74,10 @@ public class DynamicClassLoaderManagerFa
     /**
      * @see org.osgi.framework.ServiceFactory#ungetService(org.osgi.framework.Bundle, org.osgi.framework.ServiceRegistration, java.lang.Object)
      */
+    @Override
     public void ungetService(final Bundle bundle,
-                             final ServiceRegistration registration,
-                             final Object service) {
+                             final ServiceRegistration<DynamicClassLoaderManager> registration,
+                             final DynamicClassLoaderManager service) {
         if ( service != null ) {
             ((DynamicClassLoaderManagerImpl)service).deactivate();
         }