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/25 18:43:29 UTC
[aries-cdi] 10/27: 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 a10177649bdf27a3cddb17bcf5a51d0e60d712cb
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;