stabilize with better handling of CDI.current()
Signed-off-by: Raymond Augé <rotty3000@apache.org>
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
index 02cd5c0..18aead8 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
@@ -24,11 +24,14 @@
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
+import javax.enterprise.inject.spi.BeanManager;
+
import org.apache.aries.cdi.container.internal.command.CDICommand;
import org.apache.aries.cdi.container.internal.container.CDIBundle;
import org.apache.aries.cdi.container.internal.container.ConfigurationListener;
@@ -284,6 +287,20 @@
return false;
}
+ public static void put(Bundle bundle, BeanManager beanManager) {
+ _cache.put(bundle, beanManager);
+ }
+
+ public static BeanManager get(Bundle bundle) {
+ return _cache.get(bundle);
+ }
+
+ public static void remove(Bundle bundle) {
+ _cache.remove(bundle);
+ }
+
+ private static final Map<Bundle, BeanManager> _cache = new ConcurrentHashMap<>();
+
private BundleContext _bundleContext;
private final ChangeCount _ccrChangeCount = new ChangeCount();
private ServiceRegistration<CDIComponentRuntime> _ccrRegistration;
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java
index 078d842..fa19ee6 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationExtension.java
@@ -10,11 +10,15 @@
import java.util.Set;
import java.util.TreeMap;
+import javax.annotation.Priority;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.BeforeShutdown;
import javax.enterprise.inject.spi.Extension;
+import javax.interceptor.Interceptor;
+import org.apache.aries.cdi.container.internal.Activator;
import org.apache.aries.cdi.spi.configuration.Configuration;
public class ConfigurationExtension extends AbstractMap<String, Object> implements Configuration, Extension {
@@ -45,10 +49,22 @@
return _configuration.entrySet();
}
- void fire(@Observes BeforeBeanDiscovery bbd, BeanManager beanManager) {
+ void init(
+ @Priority(Interceptor.Priority.PLATFORM_BEFORE)
+ @Observes BeforeBeanDiscovery bbd, BeanManager beanManager) {
+
+ Activator.put(_containerState.bundle(), beanManager);
+
beanManager.fireEvent(this);
}
+ void destroy(
+ @Priority(Integer.MAX_VALUE - 1000)
+ @Observes BeforeShutdown bs) {
+
+ Activator.remove(_containerState.bundle());
+ }
+
String getSelectedApplication(Map<String, Object> configuration) {
if (configuration.containsKey(JAX_RS_APPLICATION_SELECT)) {
return String.valueOf(_configuration.get(JAX_RS_APPLICATION_SELECT));
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
index dc3b430..53e686e 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/provider/CDIProvider.java
@@ -17,18 +17,19 @@
import static java.util.Optional.ofNullable;
import java.lang.annotation.Annotation;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
+import java.util.Set;
import javax.enterprise.inject.Instance;
+import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.CDI;
import javax.enterprise.util.TypeLiteral;
+import org.apache.aries.cdi.container.internal.Activator;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleReference;
-import org.osgi.framework.Constants;
public class CDIProvider implements javax.enterprise.inject.spi.CDIProvider {
@@ -53,16 +54,8 @@
"No Bundle found for Thread.ContextClassLoader " + Thread.currentThread())
);
- return Arrays.stream(bundle.getRegisteredServices()).filter(
- sr -> ofNullable(
- sr.getProperty(Constants.OBJECTCLASS)
- ).map(String[].class::cast).map(Arrays::asList).filter(
- list -> list.contains(BeanManager.class.getName())
- ).isPresent()
- ).findFirst().map(
- bundle.getBundleContext()::getService
- ).map(BeanManager.class::cast).orElseThrow(
- () -> new IllegalStateException("No BeanManager service for bundle " + bundle)
+ return ofNullable(Activator.get(bundle)).orElseThrow(
+ () -> new IllegalStateException("No BeanManager for bundle " + bundle)
);
}
@@ -83,17 +76,26 @@
@Override
public Instance<Object> select(Annotation... qualifiers) {
- return getBeanManager().createInstance().select(qualifiers);
+ return createInstance().select(qualifiers);
}
@Override
public <U> Instance<U> select(Class<U> subtype, Annotation... qualifiers) {
- return getBeanManager().createInstance().select(subtype, qualifiers);
+ return createInstance().select(subtype, qualifiers);
}
@Override
public <U> Instance<U> select(TypeLiteral<U> subtype, Annotation... qualifiers) {
- return getBeanManager().createInstance().select(subtype, qualifiers);
+ return createInstance().select(subtype, qualifiers);
+ }
+
+ private Instance<Object> createInstance() {
+ BeanManager beanManager = getBeanManager();
+ Set<Bean<?>> beans = beanManager.getBeans(Instance.class);
+ @SuppressWarnings("unchecked")
+ Bean<Instance<Object>> instanceBean = (Bean<Instance<Object>>)beanManager.resolve(beans);
+ Instance<Object> instance = instanceBean.create(beanManager.createCreationalContext(instanceBean));
+ return instance;
}
}