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();
}