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
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.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 @@
 	 */
 	@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.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 @@
 	/** 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 @@
 			}
 		};
 		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 @@
 		if (classLoaderWriterServiceListener != null) {
 			componentContext.getBundleContext().removeServiceListener(classLoaderWriterServiceListener);
 		}
-		if (mbeanRegistration != null) {
-			mbeanRegistration.unregister();
-			mbeanRegistration = null;
-		}
 	}
 
 	private void destroyClassLoader() {