This is an automated email from the ASF dual-hosted git repository. pauls pushed a commit to branch issues/SLING-9588 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-fsclassloader.git
commit b89019a40b93c4926eec3e624bb004e5cfa0ce91 Author: Karl Pauls <[email protected]> AuthorDate: Wed Jul 15 11:51:26 2020 +0200 SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race condition --- .../fsclassloader/impl/FSClassLoaderMBeanImpl.java | 35 ++++++++++++++++++---- .../fsclassloader/impl/FSClassLoaderProvider.java | 22 -------------- 2 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java index 2db387d..2f56e75 100644 --- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java +++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderMBeanImpl.java @@ -29,21 +29,44 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.apache.sling.commons.classloader.ClassLoaderWriter; import org.apache.sling.commons.fsclassloader.FSClassLoaderMBean; +import org.osgi.framework.Constants; +import org.osgi.service.component.ComponentContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Implementation of the FSClassLoaderMBean interface */ +@Component( + configurationPid = FSClassLoaderProvider.SHARED_CONFIGURATION_PID, + property = { + Constants.SERVICE_DESCRIPTION + "=Apache Sling FSClassLoader Controller Service", + Constants.SERVICE_VENDOR + "=The Apache Software Foundation", + "jmx.objectname=org.apache.sling.classloader:name=FSClassLoader,type=ClassLoader" + } +) public class FSClassLoaderMBeanImpl implements FSClassLoaderMBean { - private final File root; - private final FSClassLoaderProvider fsClassLoaderProvider; + private volatile File root; private static final Logger log = LoggerFactory.getLogger(FSClassLoaderMBeanImpl.class); - public FSClassLoaderMBeanImpl(final FSClassLoaderProvider fsClassLoaderProvider, final File root) { - this.fsClassLoaderProvider = fsClassLoaderProvider; - this.root = root; + @Reference(target = "(component.name=org.apache.sling.commons.fsclassloader.impl.FSClassLoaderProvider)") + private ClassLoaderWriter classLoaderWriter; + + /** + * Activate this component. Create the root directory. + * + * @param componentContext + * the component context + */ + @Activate + protected void activate(final ComponentContext componentContext, final FSClassLoaderComponentConfig config) { + // get the file root + this.root = CacheLocationUtils.getRootDir(componentContext.getBundleContext(), config); } /* @@ -93,7 +116,7 @@ public class FSClassLoaderMBeanImpl implements FSClassLoaderMBean { */ @Override public void clearCache() { - fsClassLoaderProvider.delete(""); + classLoaderWriter.delete(""); } /* diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java index 83e2270..845a52a 100644 --- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java +++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderProvider.java @@ -96,8 +96,6 @@ public class FSClassLoaderProvider implements ClassLoaderWriter { /** The bundle asking for this service instance */ private Bundle callerBundle; - private static ServiceRegistration<?> mbeanRegistration; - /** * Activate this component. Create the root directory. * @@ -137,22 +135,6 @@ public class FSClassLoaderProvider implements ClassLoaderWriter { } }; componentContext.getBundleContext().addServiceListener(classLoaderWriterServiceListener, LISTENER_FILTER); - - // handle the MBean Installation - if (mbeanRegistration != null) { - mbeanRegistration.unregister(); - mbeanRegistration = null; - } - Hashtable<String, String> jmxProps = new Hashtable<String, String>(); - jmxProps.put("type", "ClassLoader"); - jmxProps.put("name", "FSClassLoader"); - - final Hashtable<String, Object> mbeanProps = new Hashtable<String, Object>(); - mbeanProps.put(Constants.SERVICE_DESCRIPTION, "Apache Sling FSClassLoader Controller Service"); - mbeanProps.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation"); - mbeanProps.put("jmx.objectname", new ObjectName("org.apache.sling.classloader", jmxProps)); - mbeanRegistration = componentContext.getBundleContext().registerService(FSClassLoaderMBean.class.getName(), - new FSClassLoaderMBeanImpl(this, this.root), mbeanProps); } /** @@ -166,10 +148,6 @@ public class FSClassLoaderProvider implements ClassLoaderWriter { if (classLoaderWriterServiceListener != null) { componentContext.getBundleContext().removeServiceListener(classLoaderWriterServiceListener); } - if (mbeanRegistration != null) { - mbeanRegistration.unregister(); - mbeanRegistration = null; - } } private void destroyClassLoader() {
