Merge pull request #26 from rotty3000/ARIES-1958

Aries 1958
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/container/ConfigurationListener.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
index 494de1c..bb54353 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
@@ -73,7 +73,10 @@
 	@Override
 	public boolean close() {
 		try (Syncro open = syncro.open()) {
-			if (_listenerService != null) {
+			if (_listenerService == null) {
+				return true;
+			}
+			else {
 				_listenerService.unregister();
 				_listenerService = null;
 			}
@@ -131,6 +134,10 @@
 	@Override
 	public boolean open() {
 		try (Syncro open = syncro.open()) {
+			if (_listenerService != null) {
+				return true;
+			}
+
 			if (containerState.bundleContext() == null) {
 				// this bundle was already removed
 				return false;
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;
 		}
 
 	}
diff --git a/cdi-itests/owb-itest.bndrun b/cdi-itests/owb-itest.bndrun
index d219c54..20c12d2 100644
--- a/cdi-itests/owb-itest.bndrun
+++ b/cdi-itests/owb-itest.bndrun
@@ -65,5 +65,7 @@
 	org.apache.xbean.finder-shaded;version='[4.13.0,4.13.1)',\
 	org.osgi.service.cdi;version='[1.0.0,1.0.1)',\
 	org.osgi.service.jaxrs;version='[1.0.0,1.0.1)',\
+	org.osgi.test.common;version='[1.0.0,1.0.1)',\
+	org.osgi.test.junit4;version='[1.0.0,1.0.1)',\
 	org.osgi.util.function;version='[1.1.0,1.1.1)',\
 	org.osgi.util.promise;version='[1.1.0,1.1.1)'
diff --git a/cdi-itests/pom.xml b/cdi-itests/pom.xml
index c59681a..d186a37 100644
--- a/cdi-itests/pom.xml
+++ b/cdi-itests/pom.xml
@@ -141,6 +141,11 @@
 			<groupId>org.osgi</groupId>
 			<artifactId>osgi.core</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.test.junit4</artifactId>
+			<version>1.0.0-SNAPSHOT</version>
+		</dependency>
 
 		<!-- RUNTIME dependencies not found in BOMs -->
 		<dependency>
@@ -291,4 +296,15 @@
 			</plugin>
 		</plugins>
 	</build>
+
+	<repositories>
+		<repository>
+			<id>Sonatype OSSR</id>
+			<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
+			<layout>default</layout>
+			<releases>
+				<enabled>false</enabled>
+			</releases>
+		</repository>
+	</repositories>
 </project>
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java
index e260dd9..0f019c2 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java
@@ -14,7 +14,8 @@
 
 package org.apache.aries.cdi.test.cases;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 
 import java.util.Dictionary;
 import java.util.Hashtable;
@@ -22,26 +23,26 @@
 import org.apache.aries.cdi.test.interfaces.Pojo;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.test.junit4.service.ServiceUseRule;
 
-public class DisableComponentTests extends AbstractTestCase {
+public class DisableComponentTests	 extends AbstractTestCase {
+
+	@Rule
+	public ServiceUseRule<ConfigurationAdmin> car = new ServiceUseRule.Builder<ConfigurationAdmin>(ConfigurationAdmin.class).build();
 
 	@Before
 	@Override
 	public void setUp() throws Exception {
-		adminTracker = new ServiceTracker<>(bundleContext, ConfigurationAdmin.class, null);
-		adminTracker.open();
-		configurationAdmin = adminTracker.getService();
 	}
 
 	@After
 	@Override
 	public void tearDown() throws Exception {
-		adminTracker.close();
 	}
 
 	@Test
@@ -61,7 +62,7 @@
 			Configuration configurationA = null;
 
 			try {
-				configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi.itests.tb8", "?");
+				configurationA = car.getService().getConfiguration("osgi.cdi.cdi.itests.tb8", "?");
 
 				Dictionary<String, Object> p1 = new Hashtable<>();
 				p1.put("cdi-itests.tb8.enabled", false);
@@ -120,7 +121,7 @@
 			Configuration configurationA = null;
 
 			try {
-				configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi.itests.tb8", "?");
+				configurationA = car.getService().getConfiguration("osgi.cdi.cdi.itests.tb8", "?");
 
 				Dictionary<String, Object> p1 = new Hashtable<>();
 				p1.put("singleComponentBean.enabled", false);
@@ -162,7 +163,4 @@
 		}
 	}
 
-	private ServiceTracker<ConfigurationAdmin, ConfigurationAdmin> adminTracker;
-	private ConfigurationAdmin configurationAdmin;
-
 }
diff --git a/cdi-itests/weld-itest.bndrun b/cdi-itests/weld-itest.bndrun
index 2f42ebe..136b9c0 100644
--- a/cdi-itests/weld-itest.bndrun
+++ b/cdi-itests/weld-itest.bndrun
@@ -73,5 +73,7 @@
 	org.jboss.weld.osgi-bundle;version='[3.0.5,3.0.6)',\
 	org.osgi.service.cdi;version='[1.0.0,1.0.1)',\
 	org.osgi.service.jaxrs;version='[1.0.0,1.0.1)',\
+	org.osgi.test.common;version='[1.0.0,1.0.1)',\
+	org.osgi.test.junit4;version='[1.0.0,1.0.1)',\
 	org.osgi.util.function;version='[1.1.0,1.1.1)',\
 	org.osgi.util.promise;version='[1.1.0,1.1.1)'