This is an automated email from the ASF dual-hosted git repository.

pauls pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-commons-fsclassloader.git


The following commit(s) were added to refs/heads/master by this push:
     new cdd3455  SLING-9588: Make the FSClassLoaderMBeanImpl a component to 
fix a race… (#2)
cdd3455 is described below

commit cdd3455e5ae6af95ecadf907728e131afde6acc7
Author: Karl Pauls <[email protected]>
AuthorDate: Wed Jul 15 12:05:09 2020 +0200

    SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race… (#2)
    
    * SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race 
condition
    
    * SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race 
condition
---
 .../fsclassloader/impl/FSClassLoaderMBeanImpl.java | 35 ++++++++++++++++++----
 .../fsclassloader/impl/FSClassLoaderProvider.java  | 31 +------------------
 2 files changed, 30 insertions(+), 36 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..50da643 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
@@ -29,24 +29,18 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
-import javax.management.MalformedObjectNameException;
-import javax.management.ObjectName;
-
 import org.apache.sling.commons.classloader.ClassLoaderWriter;
 import org.apache.sling.commons.classloader.ClassLoaderWriterListener;
 import org.apache.sling.commons.classloader.DynamicClassLoaderManager;
-import org.apache.sling.commons.fsclassloader.FSClassLoaderMBean;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
@@ -96,19 +90,16 @@ 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.
         *
         * @param componentContext
         * @throws MalformedURLException
         * @throws InvalidSyntaxException
-        * @throws MalformedObjectNameException
         */
        @Activate
        protected void activate(final ComponentContext componentContext, final 
FSClassLoaderComponentConfig config)
-                       throws MalformedURLException, InvalidSyntaxException, 
MalformedObjectNameException {
+                       throws MalformedURLException, InvalidSyntaxException {
                // get the file root
                this.root = 
CacheLocationUtils.getRootDir(componentContext.getBundleContext(), config);
                this.root.mkdirs();
@@ -137,22 +128,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 +141,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