You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ro...@apache.org on 2019/11/22 22:03:57 UTC

[aries-cdi] 11/19: always use a new classloader with each cdi container instance

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

rotty3000 pushed a commit to branch rotty3000/cdi-spi
in repository https://gitbox.apache.org/repos/asf/aries-cdi.git

commit 4115bd78d4343e6bdba0208099a16df2514155b8
Author: Raymond Augé <ro...@apache.org>
AuthorDate: Fri Nov 22 15:20:42 2019 -0500

    always use a new classloader with each cdi container instance
    
    Signed-off-by: Raymond Augé <ro...@apache.org>
---
 .../internal/container/ContainerBootstrap.java         |  4 +++-
 .../container/internal/container/ContainerState.java   | 11 +----------
 .../container/internal/loader/BundleClassLoader.java   | 18 +++++++++---------
 3 files changed, 13 insertions(+), 20 deletions(-)

diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
index 4d573da..5b63569 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerBootstrap.java
@@ -27,6 +27,7 @@ import javax.enterprise.inject.spi.Extension;
 
 import org.apache.aries.cdi.container.internal.container.Op.Mode;
 import org.apache.aries.cdi.container.internal.container.Op.Type;
+import org.apache.aries.cdi.container.internal.loader.BundleClassLoader;
 import org.apache.aries.cdi.container.internal.model.ExtendedExtensionDTO;
 import org.apache.aries.cdi.container.internal.model.FactoryComponent;
 import org.apache.aries.cdi.container.internal.model.OSGiBean;
@@ -105,7 +106,8 @@ public class ContainerBootstrap extends Phase {
 			_log.debug(log -> log.debug("CCR container startup for {}", bundle()));
 
 			_seContainer = _seContainerInitializerInstance
-				.setClassLoader(containerState.classLoader())
+				// always use a new class loader
+				.setClassLoader(new BundleClassLoader(containerState.bundle(), containerState.extenderBundle()))
 				.addBeanClasses(containerState.beansModel().getOSGiBeans().stream().map(OSGiBean::getBeanClass).toArray(Class<?>[]::new))
 				.setProperties(containerState.containerComponentTemplateDTO().properties)
 				.addProperty(BEANS_XML_PROPERTY, containerState.beansModel().getBeansXml())
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
index bd3a8a2..2a9d130 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
@@ -183,7 +183,7 @@ public class ContainerState {
 
 		_containerDTO.template.components.add(_containerComponentTemplateDTO);
 
-		_aggregateClassLoader = new BundleClassLoader(getBundles(_bundle, _extenderBundle));
+		_aggregateClassLoader = new BundleClassLoader(_bundle, _extenderBundle);
 
 		_beansModel = new BeansModelBuilder(this, _aggregateClassLoader, bundleWiring, cdiAttributes).build();
 
@@ -359,15 +359,6 @@ public class ContainerState {
 		return promise;
 	}
 
-	private static List<Bundle> getBundles(Bundle bundle, Bundle extenderBundle) {
-		List<Bundle> bundles = new ArrayList<>();
-
-		bundles.add(bundle);
-		bundles.add(extenderBundle);
-
-		return bundles;
-	}
-
 	private final BundleClassLoader _aggregateClassLoader;
 	private volatile Deferred<BeanManager> _beanManagerDeferred;
 	private final BeansModel _beansModel;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
index bf8f863..404681a 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/loader/BundleClassLoader.java
@@ -24,26 +24,26 @@ import java.util.Enumeration;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Function;
 import java.util.function.Predicate;
 
 import org.apache.aries.cdi.spi.loader.SpiLoader;
 import org.osgi.framework.Bundle;
 
-public class BundleClassLoader extends SpiLoader {
+public final class BundleClassLoader extends SpiLoader {
 
-	public BundleClassLoader(List<Bundle> bundles) {
-		if (bundles.isEmpty()) {
-			throw new IllegalArgumentException(
-				"At least one bundle is required");
-		}
-
-		_bundles = bundles;
+	public BundleClassLoader(Bundle cdiBundle, Bundle extenderBundle) {
+		_bundles.add(requireNonNull(cdiBundle));
+		_bundles.add(requireNonNull(extenderBundle));
 	}
 
 	@Override
 	public URL findResource(String name) {
 		for (Bundle bundle : _bundles) {
+			if ((bundle.getState() & Bundle.UNINSTALLED) == Bundle.UNINSTALLED) {
+				continue;
+			}
 			URL url = bundle.getResource(name);
 
 			if (url != null) {
@@ -212,7 +212,7 @@ public class BundleClassLoader extends SpiLoader {
 		}
 	}
 
-	private final List<Bundle> _bundles;
+	private final List<Bundle> _bundles = new CopyOnWriteArrayList<>();
 	private final ConcurrentMap<String, Class<?>> _cache = new ConcurrentHashMap<>();
 	private volatile Predicate<String> classPredicate;
 	private volatile Function<String, Class<?>> classFunction;