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() {

Reply via email to