You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2020/07/15 10:05:18 UTC

[sling-org-apache-sling-commons-fsclassloader] branch master updated: SLING-9588: Make the FSClassLoaderMBeanImpl a component to fix a race… (#2)

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 <pa...@apache.org>
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() {