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