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 2018/04/14 18:27:55 UTC

svn commit: r1829162 - in /aries/trunk/cdi: cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ cdi-extender/src/main/java/org/apache/aries/cdi/container...

Author: rotty3000
Date: Sat Apr 14 18:27:55 2018
New Revision: 1829162

URL: http://svn.apache.org/viewvc?rev=1829162&view=rev
Log:
[CDI] further stabilizations and bug fixes

Signed-off-by: Raymond Augé <ro...@apache.org>

Added:
    aries/trunk/cdi/cdi-itests/bnd/tb11.bnd
    aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/OptionalReluctantReferenceTests.java
    aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/interfaces/BeanId.java
    aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/
    aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_AS.java
    aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_FC.java
    aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_SC.java
Modified:
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/InstanceActivator.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java
    aries/trunk/cdi/cdi-itests/bnd.bnd
    aries/trunk/cdi/cdi-itests/logback.xml
    aries/trunk/cdi/cdi-itests/pom.xml

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/bean/ReferenceBean.java Sat Apr 14 18:27:55 2018
@@ -26,6 +26,7 @@ import java.util.SortedMap;
 import java.util.stream.Collectors;
 
 import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.Dependent;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.Default;
 import javax.enterprise.inject.spi.Bean;
@@ -217,6 +218,11 @@ public class ReferenceBean implements Be
 	@Override
 	public Class<? extends Annotation> getScope() {
 		if (_component.type == ComponentType.CONTAINER) {
+			// is it optional?
+			if ((_template.maximumCardinality == MaximumCardinality.ONE) &&
+				(_template.minimumCardinality == 0)) {
+				return Dependent.class;
+			}
 			return ApplicationScoped.class;
 		}
 		return ComponentScoped.class;

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java Sat Apr 14 18:27:55 2018
@@ -270,7 +270,7 @@ public class ContainerState {
 			String query = "(service.pid=".concat(pid).concat(")");
 
 			if (factory) {
-				query = "(factory.pid=".concat(pid).concat(")");
+				query = "(service.factoryPid=".concat(pid).concat(")");
 			}
 
 			return Optional.ofNullable(

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java Sat Apr 14 18:27:55 2018
@@ -103,10 +103,6 @@ public class ReferenceSync implements Se
 			if (requiresUpdate) {
 				InstanceActivator activator = _builder.setInstance(
 					_componentInstanceDTO
-				).setReferenceDTO(
-					_referenceDTO
-				).setReference(
-					reference
 				).build();
 
 				updateStatically(activator);
@@ -172,10 +168,6 @@ public class ReferenceSync implements Se
 			if (requiresUpdate) {
 				InstanceActivator activator = _builder.setInstance(
 					_componentInstanceDTO
-				).setReferenceDTO(
-					_referenceDTO
-				).setReference(
-					reference
 				).build();
 
 				updateStatically(activator);

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java Sat Apr 14 18:27:55 2018
@@ -64,7 +64,7 @@ public class ExtendedComponentInstanceDT
 	}
 
 	public boolean close() {
-		_containerState.submit(Op.of(Mode.CLOSE, Type.REFERENCES, template.name),
+		_containerState.submit(Op.of(Mode.CLOSE, Type.REFERENCES, ident()),
 			() -> {
 				references.removeIf(
 					r -> {
@@ -186,7 +186,7 @@ public class ExtendedComponentInstanceDT
 		);
 
 		_containerState.submit(
-			Op.of(Mode.OPEN, Type.REFERENCES, template.name),
+			Op.of(Mode.OPEN, Type.REFERENCES, ident()),
 			() -> {
 				references.stream().map(ExtendedReferenceDTO.class::cast).forEach(
 					r -> r.serviceTracker.open()
@@ -249,7 +249,9 @@ public class ExtendedComponentInstanceDT
 			);
 		}
 
-		props.put(Constants.SERVICE_PID, servicePids);
+		if (!servicePids.isEmpty()) {
+			props.put(Constants.SERVICE_PID, servicePids);
+		}
 		props.put("component.id", _componentId);
 		props.put("component.name", template.name);
 

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryActivator.java Sat Apr 14 18:27:55 2018
@@ -60,9 +60,11 @@ public class FactoryActivator extends In
 
 		@Override
 		public FactoryActivator build() {
-			return new FactoryActivator(this);
+			return _cache.computeIfAbsent(_instance, i -> new FactoryActivator(this));
 		}
 
+		private final Map<ExtendedComponentInstanceDTO, FactoryActivator> _cache = new ConcurrentHashMap<>();
+
 	}
 
 	private FactoryActivator(Builder builder) {
@@ -94,7 +96,7 @@ public class FactoryActivator extends In
 
 	@Override
 	public Op closeOp() {
-		return Op.of(Mode.CLOSE, Type.FACTORY_ACTIVATOR, instance.template.name);
+		return Op.of(Mode.CLOSE, Type.FACTORY_ACTIVATOR, instance.ident());
 	}
 
 	@Override
@@ -227,7 +229,7 @@ public class FactoryActivator extends In
 
 	@Override
 	public Op openOp() {
-		return Op.of(Mode.OPEN, Type.FACTORY_ACTIVATOR, instance.template.name);
+		return Op.of(Mode.OPEN, Type.FACTORY_ACTIVATOR, instance.ident());
 	}
 
 	@Override

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/InstanceActivator.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/InstanceActivator.java?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/InstanceActivator.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/InstanceActivator.java Sat Apr 14 18:27:55 2018
@@ -17,7 +17,6 @@ package org.apache.aries.cdi.container.i
 import org.apache.aries.cdi.container.internal.container.ContainerState;
 import org.apache.aries.cdi.container.internal.container.Op;
 import org.apache.aries.cdi.container.internal.container.Phase;
-import org.osgi.framework.ServiceReference;
 
 public abstract class InstanceActivator extends Phase {
 
@@ -36,31 +35,15 @@ public abstract class InstanceActivator
 			return (T)this;
 		}
 
-		@SuppressWarnings("unchecked")
-		public T setReference(ServiceReference<Object> reference) {
-			_reference = reference;
-			return (T)this;
-		}
-
-		@SuppressWarnings("unchecked")
-		public T setReferenceDTO(ExtendedReferenceDTO referenceDTO) {
-			_referenceDTO = referenceDTO;
-			return (T)this;
-		}
-
 		private ContainerState _containerState;
-		private ExtendedComponentInstanceDTO _instance;
+		protected ExtendedComponentInstanceDTO _instance;
 		private Phase _next;
-		private ServiceReference<Object> _reference;
-		private ExtendedReferenceDTO _referenceDTO;
 	}
 
 	protected InstanceActivator(Builder<?> builder) {
 		super(builder._containerState, builder._next);
 
 		this.instance = builder._instance;
-		this.referenceDTO = builder._referenceDTO;
-		this.reference = builder._reference;
 	}
 
 	@Override
@@ -70,7 +53,5 @@ public abstract class InstanceActivator
 	public abstract Op openOp();
 
 	protected final ExtendedComponentInstanceDTO instance;
-	protected final ExtendedReferenceDTO referenceDTO;
-	protected final ServiceReference<Object> reference;
 
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleActivator.java Sat Apr 14 18:27:55 2018
@@ -59,9 +59,11 @@ public class SingleActivator extends Ins
 
 		@Override
 		public SingleActivator build() {
-			return new SingleActivator(this);
+			return _cache.computeIfAbsent(_instance, i -> new SingleActivator(this));
 		}
 
+		private final Map<ExtendedComponentInstanceDTO, SingleActivator> _cache = new ConcurrentHashMap<>();
+
 	}
 
 	private SingleActivator(Builder builder) {
@@ -93,7 +95,7 @@ public class SingleActivator extends Ins
 
 	@Override
 	public Op closeOp() {
-		return Op.of(Mode.CLOSE, Op.Type.SINGLE_ACTIVATOR, instance.template.name);
+		return Op.of(Mode.CLOSE, Op.Type.SINGLE_ACTIVATOR, instance.ident());
 	}
 
 	@Override
@@ -226,7 +228,7 @@ public class SingleActivator extends Ins
 
 	@Override
 	public Op openOp() {
-		return Op.of(Mode.OPEN, Op.Type.SINGLE_ACTIVATOR, instance.template.name);
+		return Op.of(Mode.OPEN, Op.Type.SINGLE_ACTIVATOR, instance.ident());
 	}
 
 	@Override

Modified: aries/trunk/cdi/cdi-itests/bnd.bnd
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/bnd.bnd?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-itests/bnd.bnd (original)
+++ aries/trunk/cdi/cdi-itests/bnd.bnd Sat Apr 14 18:27:55 2018
@@ -29,7 +29,8 @@ p = org.apache.aries.cdi.test
 	tb7.jar,\
 	tb8.jar,\
 	tb9.jar,\
-	tb10.jar
+	tb10.jar,\
+	tb11.jar
 
 # Don't forget that we had to coax the `maven-jar-plugin` NOT to include the `sub-bundle` packages in
 # the root bundle:

Added: aries/trunk/cdi/cdi-itests/bnd/tb11.bnd
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/bnd/tb11.bnd?rev=1829162&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-itests/bnd/tb11.bnd (added)
+++ aries/trunk/cdi/cdi-itests/bnd/tb11.bnd Sat Apr 14 18:27:55 2018
@@ -0,0 +1,5 @@
+Export-Package: ${p}.tb11.*;-split-package:=first
+Require-Capability:\
+	osgi.extender;\
+		filter:='(&(osgi.extender=osgi.cdi)(version>=1.0.0)(!(version>=2.0.0)))';\
+		osgi.beans:List<String>='${classes;PUBLIC;CONCRETE;NAMED;${p}.tb11.*}'

Modified: aries/trunk/cdi/cdi-itests/logback.xml
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/logback.xml?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-itests/logback.xml (original)
+++ aries/trunk/cdi/cdi-itests/logback.xml Sat Apr 14 18:27:55 2018
@@ -6,16 +6,17 @@
 
 	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
 		<encoder>
-			<pattern>%d{HH:mm:ss.SSS} [%.15thread] %-5level %logger{36}:%line - %msg%n</pattern>
+			<!-- <pattern>%d{HH:mm:ss.SSS} [%.15thread] %-5level %logger{36}:%line - %msg%n</pattern> -->
+			<pattern>[%.15thread] %-5level %logger{36}:%line - %msg%n</pattern>
 		</encoder>
 	</appender>
 
 	<logger name="Events.Bundle" level="ERROR"/>
 	<logger name="Events.Framework" level="ERROR"/>
-	<logger name="Events.Service" level="ERROR"/>
+	<logger name="Events.Service" level="INFO"/>
 	<logger name="LogService" level="ERROR"/>
 
-	<logger name="Events.Service.org" level="WARN"/>
+	<logger name="Events.Service.org" level="ERROR"/>
 	<logger name="Events.Service.cdi-itests" level="INFO"/>
 	<logger name="Events.Service.org.apache.aries" level="INFO"/>
 

Modified: aries/trunk/cdi/cdi-itests/pom.xml
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/pom.xml?rev=1829162&r1=1829161&r2=1829162&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-itests/pom.xml (original)
+++ aries/trunk/cdi/cdi-itests/pom.xml Sat Apr 14 18:27:55 2018
@@ -252,6 +252,12 @@
 		</dependency>
 		<dependency>
 			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.service.cm</artifactId>
+			<version>1.6.0-SNAPSHOT</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
 			<artifactId>org.osgi.service.component.annotations</artifactId>
 			<version>1.3.0</version>
 			<scope>provided</scope>

Added: aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/OptionalReluctantReferenceTests.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/OptionalReluctantReferenceTests.java?rev=1829162&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/OptionalReluctantReferenceTests.java (added)
+++ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/OptionalReluctantReferenceTests.java Sat Apr 14 18:27:55 2018
@@ -0,0 +1,225 @@
+package org.apache.aries.cdi.test.cases;
+
+import static org.junit.Assert.*;
+
+import java.util.Collections;
+import java.util.Hashtable;
+
+import org.apache.aries.cdi.test.interfaces.Pojo;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cdi.runtime.dto.ContainerDTO;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class OptionalReluctantReferenceTests extends AbstractTestCase {
+
+	@Override
+	@Before
+	public void setUp() throws Exception {
+		testHeader();
+
+		cdiRuntime = runtimeTracker.waitForService(timeout);
+	}
+
+	@Override
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	@Test
+	public void applicationScoped() throws Exception {
+		Bundle tb = installBundle("tb11.jar");
+
+		try {
+			ServiceTracker<Pojo, Pojo> tracker = track("(&(objectClass=%s)(bean.id=as))", Pojo.class.getName());
+
+			Pojo pojo = tracker.waitForService(timeout);
+
+			assertEquals(-1, pojo.getCount());
+			assertEquals("-1", pojo.foo(""));
+
+			ContainerDTO containerDTO = cdiRuntime.getContainerDTO(tb);
+
+			long changeCount = containerDTO.changeCount;
+
+			ServiceRegistration<Integer> int1 = bundleContext.registerService(
+				Integer.class, new Integer(12),
+				new Hashtable<>(Collections.singletonMap("bean.id", "as")));
+
+			try {
+				for (long i = 10; i > 0 && (cdiRuntime.getContainerDTO(tb).changeCount == changeCount); i--) {
+					Thread.sleep(20);
+				}
+
+				assertEquals(-1, pojo.getCount());
+				assertEquals("-1", pojo.foo(""));
+
+				tb.stop();
+				tb.start();
+
+				pojo = tracker.waitForService(timeout);
+
+				assertEquals(12, pojo.getCount());
+				assertEquals("12", pojo.foo(""));
+			}
+			finally {
+				changeCount = cdiRuntime.getContainerDTO(tb).changeCount;
+
+				int1.unregister();
+
+				for (long i = 10; i > 0 && (cdiRuntime.getContainerDTO(tb).changeCount == changeCount); i--) {
+					Thread.sleep(20);
+				}
+
+				pojo = tracker.waitForService(timeout);
+
+				assertEquals(-1, pojo.getCount());
+				assertEquals("-1", pojo.foo(""));
+			}
+		}
+		finally {
+			tb.uninstall();
+		}
+	}
+
+	@Test
+	public void singleComponent() throws Exception {
+		Bundle tb = installBundle("tb11.jar");
+
+		try {
+			ServiceTracker<Pojo, Pojo> tracker = track("(&(objectClass=%s)(bean.id=sc))", Pojo.class.getName());
+
+			Pojo pojo = tracker.waitForService(timeout);
+
+			assertEquals(-1, pojo.getCount());
+			assertEquals("-1", pojo.foo(""));
+
+			ContainerDTO containerDTO = cdiRuntime.getContainerDTO(tb);
+
+			long changeCount = containerDTO.changeCount;
+
+			ServiceRegistration<Integer> int1 = bundleContext.registerService(
+				Integer.class, new Integer(12),
+				new Hashtable<>(Collections.singletonMap("bean.id", "sc")));
+
+			try {
+				for (long i = 10; i > 0 && (cdiRuntime.getContainerDTO(tb).changeCount == changeCount); i--) {
+					Thread.sleep(20);
+				}
+
+				assertEquals(-1, pojo.getCount());
+				assertEquals("-1", pojo.foo(""));
+
+				tb.stop();
+				tb.start();
+
+				pojo = tracker.waitForService(timeout);
+
+				assertEquals(12, pojo.getCount());
+				assertEquals("12", pojo.foo(""));
+			}
+			finally {
+				changeCount = cdiRuntime.getContainerDTO(tb).changeCount;
+
+				int1.unregister();
+
+				for (long i = 10; i > 0 && (cdiRuntime.getContainerDTO(tb).changeCount == changeCount); i--) {
+					Thread.sleep(20);
+				}
+
+				pojo = tracker.waitForService(timeout);
+
+				assertEquals(-1, pojo.getCount());
+				assertEquals("-1", pojo.foo(""));
+			}
+		}
+		finally {
+			tb.uninstall();
+		}
+	}
+
+	@Test
+	public void factoryComponent() throws Exception {
+		adminTracker = new ServiceTracker<>(bundleContext, ConfigurationAdmin.class, null);
+		adminTracker.open();
+		configurationAdmin = adminTracker.getService();
+
+		Bundle tb = installBundle("tb11.jar");
+
+		try {
+			ServiceTracker<Pojo, Pojo> tracker = track("(&(objectClass=%s)(bean.id=fc))", Pojo.class.getName());
+
+			Pojo pojo = tracker.waitForService(timeout);
+
+			assertNull(pojo);
+
+			int trackingCount = tracker.getTrackingCount();
+
+			Configuration configuration = configurationAdmin.createFactoryConfiguration("optionalReference_FC");
+			configuration.update(new Hashtable<>(Collections.singletonMap("foo", "bar")));
+
+			for (long i = 10; i > 0 && (tracker.getTrackingCount() == trackingCount); i--) {
+				Thread.sleep(20);
+			}
+
+			pojo = tracker.waitForService(timeout);
+
+			assertEquals(-1, pojo.getCount());
+			assertEquals("-1", pojo.foo(""));
+
+			ContainerDTO containerDTO = cdiRuntime.getContainerDTO(tb);
+
+			long changeCount = containerDTO.changeCount;
+
+			ServiceRegistration<Integer> int1 = bundleContext.registerService(
+				Integer.class, new Integer(12),
+				new Hashtable<>(Collections.singletonMap("bean.id", "fc")));
+
+			try {
+				for (long i = 10; i > 0 && (cdiRuntime.getContainerDTO(tb).changeCount == changeCount); i--) {
+					Thread.sleep(20);
+				}
+
+				assertEquals(-1, pojo.getCount());
+				assertEquals("-1", pojo.foo(""));
+
+				tb.stop();
+				tb.start();
+
+				pojo = tracker.waitForService(timeout);
+
+				assertEquals(12, pojo.getCount());
+				assertEquals("12", pojo.foo(""));
+			}
+			finally {
+				changeCount = cdiRuntime.getContainerDTO(tb).changeCount;
+
+				int1.unregister();
+
+				for (long i = 10; i > 0 && (cdiRuntime.getContainerDTO(tb).changeCount == changeCount); i--) {
+					Thread.sleep(20);
+				}
+
+				pojo = tracker.waitForService(timeout);
+
+				assertEquals(-1, pojo.getCount());
+				assertEquals("-1", pojo.foo(""));
+
+				configuration.delete();
+			}
+		}
+		finally {
+			tb.uninstall();
+			adminTracker.close();
+		}
+	}
+
+	private ServiceTracker<ConfigurationAdmin, ConfigurationAdmin> adminTracker;
+	private ConfigurationAdmin configurationAdmin;
+
+}

Added: aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/interfaces/BeanId.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/interfaces/BeanId.java?rev=1829162&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/interfaces/BeanId.java (added)
+++ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/interfaces/BeanId.java Sat Apr 14 18:27:55 2018
@@ -0,0 +1,30 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.cdi.test.interfaces;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import org.osgi.service.cdi.annotations.ComponentPropertyType;
+
+@ComponentPropertyType
+@Retention(RUNTIME)
+@Target({FIELD, METHOD, TYPE})
+public @interface BeanId {
+	String value();
+}

Added: aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_AS.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_AS.java?rev=1829162&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_AS.java (added)
+++ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_AS.java Sat Apr 14 18:27:55 2018
@@ -0,0 +1,47 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.cdi.test.tb11;
+
+import java.util.Optional;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.inject.Inject;
+
+import org.apache.aries.cdi.test.interfaces.BeanId;
+import org.apache.aries.cdi.test.interfaces.Pojo;
+import org.osgi.service.cdi.annotations.Reference;
+import org.osgi.service.cdi.annotations.Service;
+
+@BeanId("as")
+@ApplicationScoped
+@Service
+public class OptionalReference_AS implements Pojo {
+
+	@Inject
+	@Reference
+	@BeanId("as")
+	Optional<Integer> service;
+
+	@Override
+	public String foo(String fooInput) {
+		return fooInput + service.orElse(-1);
+	}
+
+	@Override
+	public int getCount() {
+		return service.orElse(-1);
+	}
+
+}

Added: aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_FC.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_FC.java?rev=1829162&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_FC.java (added)
+++ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_FC.java Sat Apr 14 18:27:55 2018
@@ -0,0 +1,47 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.cdi.test.tb11;
+
+import java.util.Optional;
+
+import javax.inject.Inject;
+
+import org.apache.aries.cdi.test.interfaces.BeanId;
+import org.apache.aries.cdi.test.interfaces.Pojo;
+import org.osgi.service.cdi.annotations.FactoryComponent;
+import org.osgi.service.cdi.annotations.Reference;
+import org.osgi.service.cdi.annotations.Service;
+
+@BeanId("fc")
+@FactoryComponent
+@Service
+public class OptionalReference_FC implements Pojo {
+
+	@BeanId("fc")
+	@Inject
+	@Reference
+	Optional<Integer> service;
+
+	@Override
+	public String foo(String fooInput) {
+		return fooInput + service.orElse(-1);
+	}
+
+	@Override
+	public int getCount() {
+		return service.orElse(-1);
+	}
+
+}

Added: aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_SC.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_SC.java?rev=1829162&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_SC.java (added)
+++ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb11/OptionalReference_SC.java Sat Apr 14 18:27:55 2018
@@ -0,0 +1,47 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.cdi.test.tb11;
+
+import java.util.Optional;
+
+import javax.inject.Inject;
+
+import org.apache.aries.cdi.test.interfaces.BeanId;
+import org.apache.aries.cdi.test.interfaces.Pojo;
+import org.osgi.service.cdi.annotations.Reference;
+import org.osgi.service.cdi.annotations.Service;
+import org.osgi.service.cdi.annotations.SingleComponent;
+
+@BeanId("sc")
+@SingleComponent
+@Service
+public class OptionalReference_SC implements Pojo {
+
+	@BeanId("sc")
+	@Inject
+	@Reference
+	Optional<Integer> service;
+
+	@Override
+	public String foo(String fooInput) {
+		return fooInput + service.orElse(-1);
+	}
+
+	@Override
+	public int getCount() {
+		return service.orElse(-1);
+	}
+
+}