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/25 13:57:07 UTC

svn commit: r1830079 - in /aries/trunk/cdi: cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/ cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/ cdi-extender/src/main/java/org/apache/aries/cdi/container/intern...

Author: rotty3000
Date: Wed Apr 25 13:57:06 2018
New Revision: 1830079

URL: http://svn.apache.org/viewvc?rev=1830079&view=rev
Log:
[CDI] much stabilization and bug fixes

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

Added:
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java
Modified:
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.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/ExtensionPhase.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.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/FactoryComponent.java
    aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java
    aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java
    aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
    aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java
    aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java Wed Apr 25 13:57:06 2018
@@ -48,7 +48,6 @@ import org.osgi.annotation.bundle.Header
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.framework.wiring.BundleRequirement;
@@ -75,19 +74,20 @@ public class Activator extends AbstractE
 
 	public Activator() {
 		setSynchronous(true);
-
-		_logs = new Logs.Builder(FrameworkUtil.getBundle(getClass()).getBundleContext()).build();
-		_log = _logs.getLogger(getClass());
-		_ccr = new CCR(_promiseFactory, _logs);
-		_command = new CDICommand(_ccr);
 	}
 
 	@Override
 	public void start(BundleContext bundleContext) throws Exception {
+		_logs = new Logs.Builder(bundleContext).build();
+		_log = _logs.getLogger(getClass());
+
 		if (_log.isDebugEnabled()) {
 			_log.debug("CCR starting {}", bundleContext.getBundle());
 		}
 
+		_ccr = new CCR(_promiseFactory, _logs);
+		_command = new CDICommand(_ccr);
+
 		_bundleContext = bundleContext;
 
 		registerCCR();
@@ -231,13 +231,13 @@ public class Activator extends AbstractE
 
 
 	private BundleContext _bundleContext;
-	private final CCR _ccr;
+	private volatile CCR _ccr;
 	private final ChangeCount _ccrChangeCount = new ChangeCount();
 	private ServiceRegistration<CDIComponentRuntime> _ccrRegistration;
-	private final CDICommand _command;
+	private volatile CDICommand _command;
 	private ServiceRegistration<?> _commandRegistration;
-	private final Logs _logs;
-	private final Logger _log;
+	private volatile Logs _logs;
+	private volatile Logger _log;
 	private final PromiseFactory _promiseFactory = new PromiseFactory(Executors.newFixedThreadPool(1));
 
 	private class ChangeObserverFactory implements Observer, ServiceFactory<CDIComponentRuntime> {

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java Wed Apr 25 13:57:06 2018
@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import org.apache.aries.cdi.container.internal.container.ContainerState;
-import org.apache.aries.cdi.container.internal.util.Conversions;
+import org.apache.aries.cdi.container.internal.util.DTOs;
 import org.apache.aries.cdi.container.internal.util.Logs;
 import org.apache.aries.cdi.container.internal.util.Throw;
 import org.osgi.framework.Bundle;
@@ -52,14 +52,14 @@ public class CCR implements CDIComponent
 				).map(
 					b -> _states.get(b)
 				).map(
-					cs -> Conversions.convert(cs.containerDTO()).to(ContainerDTO.class)
+					cs -> DTOs.copy(cs.containerDTO(), true)
 				).collect(Collectors.toList())
 			);
 		}
 
 		return call(
 			() -> _states.values().stream().map(
-				cs -> Conversions.convert(cs.containerDTO()).to(ContainerDTO.class)
+				cs -> DTOs.copy(cs.containerDTO(), true)
 			).collect(Collectors.toList())
 		);
 	}
@@ -68,7 +68,7 @@ public class CCR implements CDIComponent
 	public ContainerDTO getContainerDTO(Bundle bundle) {
 		return call(
 			() -> Optional.ofNullable(_states.get(bundle)).map(
-				cs -> Conversions.convert(cs.containerDTO()).to(ContainerDTO.class)
+				cs -> DTOs.copy(cs.containerDTO(), true)
 			).orElse(null)
 		);
 	}
@@ -86,7 +86,7 @@ public class CCR implements CDIComponent
 	public ContainerTemplateDTO getContainerTemplateDTO(Bundle bundle) {
 		return call(
 			() -> Optional.ofNullable(_states.get(bundle)).map(
-				cs -> Conversions.convert(cs.containerDTO().template).to(ContainerTemplateDTO.class)
+				cs -> DTOs.copy(cs.containerDTO().template, true)
 			).orElse(null)
 		);
 	}

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java Wed Apr 25 13:57:06 2018
@@ -14,11 +14,30 @@
 
 package org.apache.aries.cdi.container.internal.command;
 
+import static java.util.stream.Collectors.*;
+
 import java.util.Collection;
+import java.util.Formatter;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 import org.apache.aries.cdi.container.internal.CCR;
 import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.service.cdi.ComponentType;
+import org.osgi.service.cdi.MaximumCardinality;
+import org.osgi.service.cdi.runtime.dto.ActivationDTO;
+import org.osgi.service.cdi.runtime.dto.ComponentDTO;
+import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
+import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
 import org.osgi.service.cdi.runtime.dto.ContainerDTO;
+import org.osgi.service.cdi.runtime.dto.ReferenceDTO;
+import org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
 
 public class CDICommand {
 
@@ -26,105 +45,431 @@ public class CDICommand {
 		_ccr = ccr;
 	}
 
-	public Collection<ContainerDTO> list() {
-		return _ccr.getContainerDTOs();
+	public String info(Bundle bundle) {
+		try (Formatter f = new Formatter()) {
+			ContainerDTO containerDTO = _ccr.getContainerDTO(bundle);
+
+			if (containerDTO == null) {
+				f.format("No matching CDI bundles");
+				return f.toString();
+			}
+
+			list0(f, containerDTO, false, true);
+
+			return f.toString();
+		}
 	}
 
-	public ContainerDTO info(Bundle bundle) {
-		return _ccr.getContainerDTO(bundle);
-		/*
+	public String list(Bundle... bundles) {
 		try (Formatter f = new Formatter()) {
-			ContainerState containerState = _states.get(bundle);
-
-			if (containerState == null) {
-				f.format("No CDI Bundle found matching {}", bundle);
+			Collection<ContainerDTO> containerDTOs = _ccr.getContainerDTOs(bundles);
 
+			if (containerDTOs.isEmpty()) {
+				f.format("No matching CDI bundles");
 				return f.toString();
 			}
 
-			f.format("[%s]%n", containerState.id());
+			List<ContainerDTO> containerDTOList = containerDTOs.stream().sorted(
+				(a, b) -> Long.compare(a.bundle.id,b.bundle.id)
+			).collect(toList());
 
-			List<ExtensionDependency> extensionDependencies = containerState.extensionDependencies();
+			for (Iterator<ContainerDTO> itr = containerDTOList.iterator(); itr.hasNext();) {
+				ContainerDTO containerDTO = itr.next();
 
-			if (!extensionDependencies.isEmpty()) {
-				f.format("  [EXTENSIONS]");
+				list0(f, containerDTO, itr.hasNext(), false);
+			}
 
-				for (ExtensionDependency extensionDependency : extensionDependencies) {
-					f.format("    Extension: %s%s%n", extensionDependency.toString(), " ???is this resolved???");
-				}
+			return f.toString();
+		}
+	}
+
+	private void list0(Formatter f, ContainerDTO containerDTO, boolean hasNext, boolean verbose) {
+		String curb = hasNext ? "├── " : "└── ";
+		String prefix = hasNext ? "│       " : "        ";
+
+		f.format(
+			"%s%s[%s]%n",
+			curb,
+			containerDTO.bundle.symbolicName,
+			containerDTO.bundle.id);
+
+		f.format(
+			"%s%sCOMPONENTS%n",
+			(hasNext ? "│   " : "    "),
+			curb);
+
+		Map<Boolean, List<ComponentTemplateDTO>> componentTemplateDTOs = containerDTO.template.components.stream().collect(
+			partitioningBy(c -> c.type == ComponentType.CONTAINER)
+		);
+
+		ComponentTemplateDTO componentTemplateDTO = componentTemplateDTOs.get(Boolean.TRUE).get(0);
+
+		List<ComponentTemplateDTO> singleAndFactory = componentTemplateDTOs.get(Boolean.FALSE);
+
+		list0(
+			f,
+			containerDTO,
+			componentTemplateDTO,
+			prefix,
+			true,
+			!singleAndFactory.isEmpty(),
+			verbose);
+
+		for (Iterator<ComponentTemplateDTO> itr2 = singleAndFactory.iterator(); itr2.hasNext();) {
+			componentTemplateDTO = itr2.next();
+
+			list0(
+				f,
+				containerDTO,
+				componentTemplateDTO,
+				prefix,
+				itr2.hasNext(),
+				false, verbose);
+		}
+	}
+
+	private void list0(
+		Formatter f, ContainerDTO containerDTO, ComponentTemplateDTO componentTemplateDTO, String prefix,
+		boolean hasNext, boolean curb, boolean verbose) {
+		Map<Boolean, List<ConfigurationTemplateDTO>> configMap = configMap(componentTemplateDTO);
+
+		if (verbose) {
+			f.format(
+				"%s%sNAME: %s%n",
+				prefix,
+				(hasNext ? "├── " : "└── "),
+				componentTemplateDTO.name);
+			f.format(
+				"%s%s%sTYPE: %s%n",
+				prefix,
+				(hasNext ? "│   " : "    "),
+				"├── ",
+				componentTemplateDTO.type);
+		}
+		else {
+			f.format(
+				"%s%sNAME: %s (%s%s)%n",
+				prefix,
+				(hasNext ? "├── " : "└── "),
+				componentTemplateDTO.name,
+				componentTemplateDTO.type,
+				factoryPid(configMap));
+		}
+
+		ComponentDTO componentDTO = containerDTO.components.stream().filter(
+			c -> c.template.name.equals(componentTemplateDTO.name)
+		).findFirst().orElse(null);
+
+		if ((componentDTO != null) && !componentDTO.instances.isEmpty()) {
+			Iterator<ComponentInstanceDTO> itr3 = componentDTO.instances.iterator();
+
+			for (;itr3.hasNext();) {
+				ComponentInstanceDTO instanceDTO = itr3.next();
+
+				formatInstance(
+					f,
+					prefix,
+					componentDTO,
+					instanceDTO,
+					pids(instanceDTO, configMap),
+					hasNext,
+					itr3.hasNext(),
+					verbose);
 			}
+		}
+		else {
+			formatInstance(
+				f,
+				prefix,
+				componentDTO,
+				null,
+				configMap.get(Boolean.FALSE).stream().map(c -> c.pid).collect(toList()).toString(),
+				hasNext,
+				false,
+				verbose);
+		}
+	}
 
-			BeansModel beansModel = containerState.beansModel();
-			Collection<ComponentModel> componentModels = beansModel.getComponentModels();
+	private void formatInstance(
+		Formatter f, String prefix, ComponentDTO componentDTO,
+		ComponentInstanceDTO instanceDTO, String pids,
+		boolean hasNext, boolean hasNext2, boolean verbose) {
+
+		if (verbose) {
+			f.format(
+				"%s%s%sBEANS: %s%n",
+				prefix,
+				(hasNext ? "│   " : "    "),
+				"├── ",
+				componentDTO.template.beans.toString());
+
+			f.format(
+				"%s%s%sCONFIGURATIONS%n",
+				prefix,
+				(hasNext ? "│   " : "    "),
+				"├── ");
+
+			for (Iterator<ConfigurationTemplateDTO> itr = componentDTO.template.configurations.iterator();itr.hasNext();) {
+				ConfigurationTemplateDTO conf = itr.next();
+
+				ConfigurationDTO configurationDTO = null;
+
+				if (instanceDTO != null) {
+					configurationDTO = instanceDTO.configurations.stream().filter(
+						c -> c.template.componentConfiguration == conf.componentConfiguration &&
+							c.template.maximumCardinality == conf.maximumCardinality &&
+							c.template.pid == conf.pid &&
+							c.template.policy == conf.policy
+					).findFirst().orElse(null);
+				}
 
-			if (!componentModels.isEmpty()) {
-				for (ComponentModel componentModel : componentModels) {
-					ServiceDeclaration serviceDeclaration = containerState.serviceComponents().get(componentModel);
+				f.format(
+					"%s%s%sPID: %s%n",
+					prefix,
+					(hasNext ? "│   │   " : "    │   "),
+					(itr.hasNext() ? "├── " : "└── "),
+					(configurationDTO != null ? configurationDTO.properties.get(Constants.SERVICE_PID) + "*" : conf.pid));
+				f.format(
+					"%s%s%sPOLICY: %s%n",
+					prefix,
+					(hasNext ? "│   │   " : "    │   "),
+					(itr.hasNext() ? "│   ├── " : "    ├── "),
+					conf.policy);
 
-					f.format("[COMPONENT]%n");
+				if (conf.maximumCardinality == MaximumCardinality.MANY) {
 					f.format(
-						"  Name: %s%n    BeanClass: %s%n    ServiceScope: %s%n    Provides: %s%n",
-						componentModel.getName(),
-						componentModel.getBeanClass().getName(),
-						componentModel.getServiceScope(),
-						serviceDeclaration != null ? Arrays.toString(serviceDeclaration.getClassNames()): "not yet ready!");
+						"%s%s%sFACTORY PID: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "│   ├── " : "    ├── "),
+						conf.pid);
+				}
 
-					f.format("  [CONFIGURATIONS]%n");
+				f.format(
+					"%s%s%sCOMPONENT CONFIGURATION: %s%n",
+					prefix,
+					(hasNext ? "│   │   " : "    │   "),
+					(itr.hasNext() ? "│   └── " : "    └── "),
+					conf.componentConfiguration);
+			}
 
-					Map<String, ConfigurationCallback> configurationCallbacks = containerState.configurationCallbacks().get(componentModel);
+			if (instanceDTO != null) {
+				f.format(
+					"%s%s%sCOMPONENT PROPERTIES*%n",
+					prefix,
+					(hasNext ? "│   " : "    "),
+					"├── ");
 
-					for (Entry<String, ConfigurationCallback> entry : configurationCallbacks.entrySet()) {
-						f.format(
-							"    PID: %s%n      Policy: %s%n      Resolved: %s%n",
-							entry.getKey(),
-							entry.getValue().policy(),
-							entry.getValue().resolved() ? "YES" : "NO");
-					}
+				for (Iterator<String> itr = instanceDTO.properties.keySet().iterator(); itr.hasNext();) {
+					String key = itr.next();
 
-					if (serviceDeclaration != null) {
-						Dictionary<String, ?> configuration = serviceDeclaration.getServiceProperties();
+					f.format(
+						"%s%s%s%s=%s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "├── " : "└── "),
+						key,
+						instanceDTO.properties.get(key));
+				}
+			}
 
-						if (!configuration.isEmpty()) {
-							f.format("    Properties:%n");
+			if (!componentDTO.template.references.isEmpty()) {
+				f.format(
+					"%s%s%sREFERENCES%n",
+					prefix,
+					(hasNext ? "│   " : "    "),
+					"├── ");
+
+				for (Iterator<ReferenceTemplateDTO> itr = componentDTO.template.references.iterator(); itr.hasNext();) {
+					ReferenceTemplateDTO dto = itr.next();
+
+					ReferenceDTO referenceDTO = null;
+
+					if (instanceDTO != null) {
+						referenceDTO = instanceDTO.references.stream().filter(
+							r -> r.template.maximumCardinality == dto.maximumCardinality &&
+								r.template.minimumCardinality == dto.minimumCardinality &&
+								r.template.name == dto.name &&
+								r.template.policy == dto.policy &&
+								r.template.policyOption == dto.policyOption &&
+								r.template.serviceType == dto.serviceType &&
+								r.template.targetFilter == dto.targetFilter
+						).findFirst().orElse(null);
+					}
+
+					f.format(
+						"%s%s%sNAME: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "├── " : "└── "),
+						dto.name);
+					f.format(
+						"%s%s%sSERVICE TYPE: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "│   ├── " : "    ├── "),
+						dto.serviceType);
+					f.format(
+						"%s%s%sTARGET FILTER: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "│   ├── " : "    ├── "),
+						(referenceDTO != null ? referenceDTO.targetFilter + "*" : dto.targetFilter));
+					f.format(
+						"%s%s%sMAX CARDINALITY: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "│   ├── " : "    ├── "),
+						dto.maximumCardinality);
+					f.format(
+						"%s%s%sMIN CARDINALITY: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "│   ├── " : "    ├── "),
+						(referenceDTO != null ? referenceDTO.minimumCardinality + "*" : dto.minimumCardinality));
+					f.format(
+						"%s%s%sPOLICY: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "│   ├── " : "    ├── "),
+						dto.policy);
+					f.format(
+						"%s%s%s%sPOLICY OPTION: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "│   " : "    "),
+						(referenceDTO != null ? "├── " : "└── "),
+						dto.policyOption);
 
-							List<String> keys = Collections.list(configuration.keys());
+					if (referenceDTO != null) {
+						f.format(
+							"%s%s%sMATCHES: %s*%n",
+							prefix,
+							(hasNext ? "│   │   " : "    │   "),
+							(itr.hasNext() ? "│   └── " : "    └── "),
+							referenceDTO.matches);
+					}
+				}
+			}
 
-							Collections.sort(keys);
+			if (!componentDTO.template.activations.isEmpty()) {
+				f.format(
+					"%s%s%sACTIVATIONS%n",
+					prefix,
+					(hasNext ? "│   " : "    "),
+					"├── ");
+
+				for (Iterator<ActivationTemplateDTO> itr = componentDTO.template.activations.iterator(); itr.hasNext();) {
+					ActivationTemplateDTO dto = itr.next();
+
+					ActivationDTO activationDTO = null;
+
+					if (instanceDTO != null) {
+						activationDTO = instanceDTO.activations.stream().filter(
+							a -> a.template.properties.equals(dto.properties) &&
+								a.template.scope == dto.scope &&
+								a.template.serviceClasses.equals(dto.serviceClasses)
+						).findFirst().orElse(null);
+					}
 
-							for (String key : keys) {
-								String value = Conversions.toString(configuration.get(key));
+					f.format(
+						"%s%s%sSERVICE TYPES: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "├── " : "└── "),
+						dto.serviceClasses);
+					f.format(
+						"%s%s%s%sSERVICE SCOPE: %s%n",
+						prefix,
+						(hasNext ? "│   │   " : "    │   "),
+						(itr.hasNext() ? "│   " : "    "),
+						(activationDTO != null ? "├── " : "└── "),
+						dto.scope.toString().toLowerCase());
 
-								f.format("      %s = %s%n", key, value);
-							}
-						}
+					if (activationDTO != null) {
+						f.format(
+							"%s%s%sSERVICE REFERENCE: %s%n",
+							prefix,
+							(hasNext ? "│   │   " : "    │   "),
+							(itr.hasNext() ? "│   └── " : "    └── "),
+							activationDTO.service + "*");
 					}
+				}
+			}
+
+			f.format(
+				"%s%s%sSTATE: %s*%n",
+				prefix,
+				(hasNext ? "│   " : "    "),
+				(hasNext2 ? "├── " : "└── "),
+				state(componentDTO));
 
-					List<ReferenceModel> references = componentModel.getReferences();
+			return;
+		}
 
-					if (!references.isEmpty()) {
-						f.format("  [REFERENCES]%n");
+		f.format(
+			"%s%s%sSTATE: %s %s%n",
+			prefix,
+			(hasNext ? "│   " : "    "),
+			(hasNext2 ? "├── " : "└── "),
+			state(componentDTO),
+			pids);
+	}
 
-						Map<String, ReferenceCallback> referenceCallbacks = containerState.referenceCallbacks().get(componentModel);
+	private String pids(
+		ComponentInstanceDTO instanceDTO,
+		Map<Boolean, List<ConfigurationTemplateDTO>> configMap) {
+
+		List<String> resolvedPids = instanceDTO.configurations.stream().map(
+			c -> c.properties
+		).filter(Objects::nonNull).map(
+			p -> (String)p.get(Constants.SERVICE_PID)
+		).collect(toList());
+
+		return configMap.values().stream().flatMap(v -> v.stream()).map(c -> c.pid).map(
+			c -> {
+				String pid = resolvedPids.stream().filter(
+					rp -> rp.startsWith(c + "~") || rp.startsWith(c + ".")
+				).findFirst().orElse(null);
 
-						for (ReferenceModel referenceModel : references) {
-							f.format(
-								"    Name: %s%n      Service: %s%n      Target: %s%n      Cardinality: %s%n      Policy: %s%n      Policy Option: %s%n      Scope: %s%n      Resolved: %s%n",
-								referenceModel.getName(),
-								referenceModel.getServiceClass().getName(),
-								referenceModel.getTarget(),
-								referenceModel.getCardinality(),
-								referenceModel.getPolicy(),
-								referenceModel.getPolicyOption(),
-								referenceModel.getScope(),
-								referenceCallbacks.get(referenceModel.getName()).resolved() ? "YES" : "NO");
-						}
-					}
+				if (pid != null) {
+					return pid + "*";
+				}
+				else if (resolvedPids.stream().anyMatch(rp -> rp.equals(c))) {
+					return c + "*";
 				}
+				return c;
 			}
+		).collect(toList()).toString();
+	}
 
-			return f.toString();
+	private Map<Boolean, List<ConfigurationTemplateDTO>> configMap(ComponentTemplateDTO componentTemplateDTO) {
+		return componentTemplateDTO.configurations.stream().filter(
+			c -> c.pid != null
+		).collect(
+			partitioningBy(c -> c.maximumCardinality == MaximumCardinality.MANY)
+		);
+	}
+
+	private String factoryPid(Map<Boolean, List<ConfigurationTemplateDTO>> configMap) {
+		return configMap.get(Boolean.TRUE).stream().map(
+			c -> c.pid
+		).findFirst().map(
+			c -> "=" + c
+		).orElse("");
+	}
+
+	private Object state(ComponentDTO componentDTO) {
+		if (componentDTO == null) {
+			return "null";
+		}
+		else if (!componentDTO.enabled) {
+			return "disabled";
+		}
+		else if (componentDTO.instances.size() == 0) {
+			return "waiting";
 		}
-		 */
+		return "active";
 	}
 
 	private final CCR _ccr;

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java Wed Apr 25 13:57:06 2018
@@ -55,11 +55,7 @@ public class CDIBundle extends Phase imp
 
 	@Override
 	public void destroy() throws Exception {
-		submit(closeOp(), this::close).onFailure(
-			f -> {
-				_log.error(l -> l.error("CCR Error in closing cdi bundle {}", containerState.bundle(), f));
-			}
-		);
+		close();
 	}
 
 	@Override
@@ -68,14 +64,12 @@ public class CDIBundle extends Phase imp
 			next -> {
 				_ccr.add(containerState.bundle(), containerState);
 
-				submit(next.openOp(), next::open).then(
-					null,
+				submit(next.openOp(), next::open).onFailure(
 					f -> {
-						_log.error(l -> l.error("CCR Error in cdibundle OPEN on {}", bundle(), f.getFailure()));
+						_log.error(l -> l.error("CCR Error in cdibundle OPEN on {}", bundle(), f));
 
-						error(f.getFailure());
+						error(f);
 					}
-
 				);
 
 				return true;
@@ -90,14 +84,9 @@ public class CDIBundle extends Phase imp
 
 	@Override
 	public void start() throws Exception {
-		submit(openOp(), this::open).onFailure(
-			f -> {
-				_log.error(l -> l.error("CCR Error in starting cdi bundle {}", containerState.bundle(), f));
-			}
-		);
+		open();
 	}
 
-
 	private final CCR _ccr;
 	private final Logger _log;
 

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java Wed Apr 25 13:57:06 2018
@@ -17,10 +17,8 @@ package org.apache.aries.cdi.container.i
 import java.util.Arrays;
 import java.util.Dictionary;
 import java.util.Hashtable;
-import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.aries.cdi.container.internal.container.Op.Mode;
 import org.apache.aries.cdi.container.internal.container.Op.Type;
@@ -32,8 +30,8 @@ import org.apache.aries.cdi.container.in
 import org.apache.aries.cdi.container.internal.util.Throw;
 import org.jboss.weld.exceptions.IllegalArgumentException;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cdi.ConfigurationPolicy;
 import org.osgi.service.cdi.MaximumCardinality;
-import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
 import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
 import org.osgi.service.cm.ConfigurationEvent;
 import org.osgi.service.log.Logger;
@@ -136,43 +134,49 @@ public class ConfigurationListener exten
 
 		return next.map(next -> (Component)next).map(
 			component -> {
-				component.configurationTemplates().stream().filter(
-					ct -> Objects.nonNull(ct.pid)
-				).forEach(
-					template -> {
-						if (template.maximumCardinality == MaximumCardinality.ONE) {
-							containerState.findConfig(template.pid).ifPresent(
-								c -> processEvent(
-										component,
-										template,
-										new ConfigurationEvent(
-											containerState.caTracker().getServiceReference(),
-											ConfigurationEvent.CM_UPDATED,
-											null,
-											c.getPid()))
-							);
-						}
-						else {
-							containerState.findConfigs(template.pid, true).ifPresent(
-								arr -> Arrays.stream(arr).forEach(
-									c -> processEvent(
+				submit(component.openOp(), component::open).then(
+					s -> {
+						component.configurationTemplates().stream().filter(
+							ct -> Objects.nonNull(ct.pid)
+						).forEach(
+							template -> {
+								if (template.maximumCardinality == MaximumCardinality.ONE) {
+									containerState.findConfig(template.pid).ifPresent(
+										c -> processEvent(
 											component,
 											template,
 											new ConfigurationEvent(
 												containerState.caTracker().getServiceReference(),
 												ConfigurationEvent.CM_UPDATED,
-												c.getFactoryPid(),
-												c.getPid())))
-							);
-						}
-					}
-				);
+												null,
+												c.getPid())
+										)
+									);
+								}
+								else {
+									containerState.findConfigs(template.pid, true).ifPresent(
+										arr -> Arrays.stream(arr).forEach(
+											c -> processEvent(
+												component,
+												template,
+												new ConfigurationEvent(
+													containerState.caTracker().getServiceReference(),
+													ConfigurationEvent.CM_UPDATED,
+													c.getFactoryPid(),
+													c.getPid())
+											)
+										)
+									);
+								}
+							}
+						);
 
-				submit(component.openOp(), component::open).onFailure(
+						return s;
+					},
 					f -> {
-						_log.error(l -> l.error("CCR Failure during configuration start on {}", next, f));
+						_log.error(l -> l.error("CCR Failure during configuration start on {}", next, f.getFailure()));
 
-						error(f);
+						error(f.getFailure());
 					}
 				);
 
@@ -192,87 +196,88 @@ public class ConfigurationListener exten
 	}
 
 	private void processEvent(Component component, ConfigurationTemplateDTO t, ConfigurationEvent event) {
-		final AtomicBoolean needToRefresh = new AtomicBoolean(false);
-
-		List<ComponentInstanceDTO> instances = component.instances();
-
-		instances.stream().forEach(
-			instance -> instance.configurations.stream().filter(
-				c -> c.template.equals(t)
-			).map(ExtendedConfigurationDTO.class::cast).filter(
-				c -> c.pid.equals(event.getPid())
-			).forEach(
-				c -> {
-					instance.configurations.remove(c);
-					needToRefresh.set(true);
-				}
-			)
-		);
+		boolean required = t.policy == ConfigurationPolicy.REQUIRED;
+		boolean single = t.maximumCardinality == MaximumCardinality.ONE;
 
 		switch (event.getType()) {
 			case ConfigurationEvent.CM_DELETED:
-				if (t.maximumCardinality == MaximumCardinality.MANY) {
-					instances.stream().map(
-						instance -> (ExtendedComponentInstanceDTO)instance
-					).filter(
-						instance -> event.getPid().equals(instance.pid)
-					).forEach(
-						instance -> {
-							if (instances.remove(instance)) {
-								submit(instance.closeOp(), instance::close).onFailure(
-									f -> {
-										_log.error(l -> l.error("CCR Error closing {} on {}", instance.ident(), bundle()));
-									}
-								);
+				component.instances().stream().map(
+					ExtendedComponentInstanceDTO.class::cast
+				).filter(
+					instance -> (!single && event.getPid().equals(instance.pid)) || single
+				).forEach(
+					instance -> {
+						submit(instance.closeOp(), instance::close).then(
+							s -> {
+								if (!required) {
+									instance.configurations.removeIf(
+										c -> c.template == t
+									);
+
+									submit(instance.openOp(), instance::open);
+								}
+								else {
+									component.instances().remove(instance);
+								}
+
+								return s;
 							}
-						}
-					);
-				}
-				break;
+						);
+					}
+				);
+				return;
 			case ConfigurationEvent.CM_LOCATION_CHANGED:
+				break;
 			case ConfigurationEvent.CM_UPDATED:
-				if ((t.maximumCardinality == MaximumCardinality.MANY) &&
-					!instances.stream().map(
-						instance -> (ExtendedComponentInstanceDTO)instance
+				if (!single &&
+					!component.instances().stream().map(
+						ExtendedComponentInstanceDTO.class::cast
 					).filter(
 						instance -> event.getPid().equals(instance.pid)
 					).findFirst().isPresent()) {
 
-					ExtendedComponentInstanceDTO instanceDTO = new ExtendedComponentInstanceDTO(
+					ExtendedComponentInstanceDTO instance = new ExtendedComponentInstanceDTO(
 						containerState, _component.activatorBuilder());
-					instanceDTO.activations = new CopyOnWriteArrayList<>();
-					instanceDTO.configurations = new CopyOnWriteArrayList<>();
-					instanceDTO.pid = event.getPid();
-					instanceDTO.properties = null;
-					instanceDTO.references = new CopyOnWriteArrayList<>();
-					instanceDTO.template = component.template();
+					instance.activations = new CopyOnWriteArrayList<>();
+					instance.configurations = new CopyOnWriteArrayList<>();
+					instance.pid = event.getPid();
+					instance.references = new CopyOnWriteArrayList<>();
+					instance.template = component.template();
 
-					instances.add(instanceDTO);
+					component.instances().add(instance);
 				}
 
 				containerState.findConfig(event.getPid()).ifPresent(
 					configuration -> {
-						ExtendedConfigurationDTO configurationDTO2 = new ExtendedConfigurationDTO();
-
-						configurationDTO2.configuration = configuration;
-						configurationDTO2.pid = event.getPid();
-						configurationDTO2.properties = Maps.of(configuration.getProcessedProperties(event.getReference()));
-						configurationDTO2.template = t;
+						ExtendedConfigurationDTO configurationDTO = new ExtendedConfigurationDTO();
 
-						instances.stream().forEach(
+						configurationDTO.configuration = configuration;
+						configurationDTO.pid = configuration.getPid();
+						configurationDTO.properties = Maps.of(configuration.getProcessedProperties(event.getReference()));
+						configurationDTO.template = t;
+
+						component.instances().stream().map(
+							ExtendedComponentInstanceDTO.class::cast
+						).filter(
+							instance -> (!single && event.getPid().equals(instance.pid)) || single
+						).forEach(
 							instance -> {
-								instance.configurations.add(configurationDTO2);
-								needToRefresh.set(true);
+								submit(instance.closeOp(), instance::close).then(
+									s -> {
+										instance.configurations.removeIf(c -> c.template == t);
+										instance.configurations.add(configurationDTO);
+
+										submit(instance.openOp(), instance::open);
+
+										return s;
+									}
+								);
 							}
 						);
 					}
 				);
 				break;
 		}
-
-		if (needToRefresh.get()) {
-			startComponent(component);
-		}
 	}
 
 	private String type(ConfigurationEvent event) {
@@ -285,23 +290,6 @@ public class ConfigurationListener exten
 		throw new IllegalArgumentException("CM Event type " + event.getType());
 	}
 
-	private void startComponent(Component component) {
-		submit(component.closeOp(), component::close).then(
-			s -> submit(component.openOp(), component::open).onFailure(
-				f -> {
-					_log.error(l -> l.error("CCR Error in configuration listener start on {}", component, f));
-
-					error(f);
-				}
-			),
-			f -> {
-				_log.error(l -> l.error("CCR Error in configuration listener close on {}", component, f.getFailure()));
-
-				error(f.getFailure());
-			}
-		);
-	}
-
 	private volatile ServiceRegistration<org.osgi.service.cm.ConfigurationListener> _listenerService;
 
 	private final Component _component;

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=1830079&r1=1830078&r2=1830079&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 Wed Apr 25 13:57:06 2018
@@ -161,8 +161,10 @@ public class ContainerState {
 		configurationTemplate.maximumCardinality = MaximumCardinality.ONE;
 		configurationTemplate.pid = Optional.ofNullable(
 			(String)cdiAttributes.get(CDI_CONTAINER_ID)
+		).map(
+			s -> s.replaceAll("-", ".")
 		).orElse(
-			"osgi.cdi." + _bundle.getSymbolicName()
+			"osgi.cdi." + _bundle.getSymbolicName().replaceAll("-", ".")
 		);
 		configurationTemplate.policy = ConfigurationPolicy.OPTIONAL;
 

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java Wed Apr 25 13:57:06 2018
@@ -93,12 +93,11 @@ public class ExtensionPhase extends Phas
 		else {
 			return next.map(
 				next -> {
-					submit(next.openOp(), next::open).then(
-						null,
+					submit(next.openOp(), next::open).onFailure(
 						f -> {
-							_log.error(l -> l.error("CCR Error in extension OPEN on {}", bundle(), f.getFailure()));
+							_log.error(l -> l.error("CCR Error in extension OPEN on {}", bundle(), f));
 
-							error(f.getFailure());
+							error(f);
 						}
 					);
 
@@ -186,27 +185,28 @@ public class ExtensionPhase extends Phas
 			snapshots().add(extensionDTO);
 			containerState.incrementChangeCount();
 
-			if (snapshots().size() == extensionTemplates().size()) {
-				next.ifPresent(
-					next -> submit(next.closeOp(), next::close).then(
-						s -> {
-							return submit(next.openOp(), next::open).then(
-								null,
+			next.ifPresent(
+				next -> submit(next.closeOp(), next::close).then(
+					s -> {
+						if (snapshots().size() == extensionTemplates().size()) {
+							return submit(next.openOp(), next::open).onFailure(
 								f -> {
-									_log.error(l -> l.error("CCR Error in extension open TRACKING {} on {}", reference, bundle(), f.getFailure()));
+									_log.error(l -> l.error("CCR Error in extension open TRACKING {} on {}", reference, bundle(), f));
 
-									error(f.getFailure());
+									error(f);
 								}
 							);
-						},
-						f -> {
-							_log.error(l -> l.error("CCR Error extension close TRACKING {} on {}", reference, bundle(), f.getFailure()));
-
-							error(f.getFailure());
 						}
-					)
-				);
-			}
+
+						return s;
+					},
+					f -> {
+						_log.error(l -> l.error("CCR Error extension close TRACKING {} on {}", reference, bundle(), f.getFailure()));
+
+						error(f.getFailure());
+					}
+				)
+			);
 
 			return extensionDTO;
 		}
@@ -244,12 +244,11 @@ public class ExtensionPhase extends Phas
 					Promise<Boolean> result = submit(next.closeOp(), next::close).then(
 						s -> {
 							if (snapshots().size() == extensionTemplates().size()) {
-								return submit(next.openOp(), next::open).then(
-									null,
+								return submit(next.openOp(), next::open).onFailure(
 									f -> {
-										_log.error(l -> l.error("CCR Error in extension open {} on {}", reference, bundle()));
+										_log.error(l -> l.error("CCR Error in extension open {} on {}", reference, bundle(), f));
 
-										error(f.getFailure());
+										error(f);
 									}
 								);
 							}
@@ -257,7 +256,7 @@ public class ExtensionPhase extends Phas
 							return s;
 						},
 						f -> {
-							_log.error(l -> l.error("CCR Error in extension close {} on {}", reference, bundle()));
+							_log.error(l -> l.error("CCR Error in extension close {} on {}", reference, bundle(), f.getFailure()));
 
 							error(f.getFailure());
 						}

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java Wed Apr 25 13:57:06 2018
@@ -19,7 +19,6 @@ import java.util.Hashtable;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.stream.Collectors;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.spi.Context;
@@ -58,7 +57,6 @@ import org.apache.aries.cdi.container.in
 import org.apache.aries.cdi.container.internal.model.OSGiBean;
 import org.apache.aries.cdi.container.internal.model.ReferenceModel;
 import org.apache.aries.cdi.container.internal.model.SingleComponent;
-import org.apache.aries.cdi.container.internal.util.Conversions;
 import org.apache.aries.cdi.container.internal.util.SRs;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.PrototypeServiceFactory;
@@ -74,7 +72,6 @@ import org.osgi.service.cdi.reference.Bi
 import org.osgi.service.cdi.reference.BindServiceObjects;
 import org.osgi.service.cdi.reference.BindServiceReference;
 import org.osgi.service.cdi.runtime.dto.ComponentDTO;
-import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
 import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
 import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
 import org.osgi.service.log.Logger;
@@ -96,12 +93,6 @@ public class RuntimeExtension implements
 		_configurationBuilder = configurationBuilder;
 		_singleBuilder = singleBuilder;
 		_factoryBuilder = factoryBuilder;
-
-		_containerComponentDTO = _containerState.containerDTO().components.stream().filter(
-			c -> c.template.type == ComponentType.CONTAINER
-		).findFirst().get();
-
-		_containerInstanceDTO = (ExtendedComponentInstanceDTO)_containerComponentDTO.instances.get(0);
 	}
 
 	void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
@@ -137,9 +128,11 @@ public class RuntimeExtension implements
 			new String[] {BeanManager.class.getName()}, bm,
 			properties);
 
+		ComponentDTO componentDTO = _containerState.containerDTO().components.get(0);
+
 		_containerState.submit(
 			Op.of(Mode.OPEN, Type.CONTAINER_PUBLISH_SERVICES, _containerState.id()),
-			() -> registerServices(_containerComponentDTO, _containerInstanceDTO, bm)
+			() -> registerServices(componentDTO, bm)
 		).then(
 			s -> initComponents()
 		);
@@ -160,8 +153,6 @@ public class RuntimeExtension implements
 			}
 		);
 
-		_containerInstanceDTO.activations.clear();
-
 		_registrations.removeIf(
 			r -> {
 				try {
@@ -218,12 +209,14 @@ public class RuntimeExtension implements
 	}
 
 	private void addBeans(ComponentTemplateDTO componentTemplate, AfterBeanDiscovery abd, BeanManager bm) {
+		ComponentDTO componentDTO = _containerState.containerDTO().components.get(0);
+
 		componentTemplate.references.stream().map(ExtendedReferenceTemplateDTO.class::cast).forEach(
 			t -> {
 				ReferenceBean bean = t.bean;
 				bean.setBeanManager(bm);
 				if (componentTemplate.type == ComponentType.CONTAINER) {
-					_containerInstanceDTO.references.stream().filter(
+					componentDTO.instances.get(0).references.stream().filter(
 						r -> r.template == t
 					).findFirst().map(
 						ExtendedReferenceDTO.class::cast
@@ -248,7 +241,7 @@ public class RuntimeExtension implements
 						bean.setProperties(componentTemplate.properties);
 					}
 					else {
-						bean.setProperties(_containerInstanceDTO.properties);
+						bean.setProperties(componentDTO.instances.get(0).properties);
 					}
 				}
 
@@ -273,43 +266,23 @@ public class RuntimeExtension implements
 		return producerFactory.createProducer(bean);
 	}
 
-	private Promise<List<Boolean>> initComponents() {
+	private Promise<Boolean> initComponents() {
 		_containerState.containerDTO().template.components.stream().filter(
 			t -> t.type != ComponentType.CONTAINER
-		).map(ExtendedComponentTemplateDTO.class::cast).map(
+		).map(ExtendedComponentTemplateDTO.class::cast).forEach(
 			this::initComponent
-		).collect(Collectors.toList());
+		);
 
 		return null;
 	}
 
-	private Promise<Boolean> initComponent(ExtendedComponentTemplateDTO componentTemplateDTO) {
-		List<ConfigurationDTO> configurations = _containerInstanceDTO.configurations;
-
-		if (!configurations.isEmpty()) {
-			ConfigurationDTO defaultContainerConfiguration = configurations.get(0);
-
-			Boolean enabled = Conversions.convert(
-				defaultContainerConfiguration.properties.get(
-					componentTemplateDTO.name.concat(".enabled"))
-			).defaultValue(Boolean.TRUE).to(Boolean.class);
-
-			if (!enabled) {
-				_containerState.containerDTO().components.stream().filter(
-					c -> c.template == componentTemplateDTO
-				).findFirst().ifPresent(
-					c -> c.enabled = false
-				);
-
-				return _containerState.promiseFactory().resolved(Boolean.TRUE);
-			}
-		}
-
+	private void initComponent(ExtendedComponentTemplateDTO componentTemplateDTO) {
 		if (componentTemplateDTO.type == ComponentType.FACTORY) {
-			return initFactoryComponent(componentTemplateDTO);
+			initFactoryComponent(componentTemplateDTO);
+		}
+		else {
+			initSingleComponent(componentTemplateDTO);
 		}
-
-		return initSingleComponent(componentTemplateDTO);
 	}
 
 	private Promise<Boolean> initFactoryComponent(ExtendedComponentTemplateDTO componentTemplateDTO) {
@@ -486,22 +459,20 @@ public class RuntimeExtension implements
 		return serviceRegistration;
 	}
 
-	private boolean registerServices(ComponentDTO componentDTO, ExtendedComponentInstanceDTO instance, BeanManager bm) {
+	private boolean registerServices(ComponentDTO componentDTO, BeanManager bm) {
 		componentDTO.template.activations.stream().map(
 			ExtendedActivationTemplateDTO.class::cast
 		).forEach(
-			a -> registerService(instance, a, bm)
+			a -> registerService((ExtendedComponentInstanceDTO)componentDTO.instances.get(0), a, bm)
 		);
 
 		return true;
 	}
 
-	private final ComponentDTO _containerComponentDTO;
 	private final ConfigurationListener.Builder _configurationBuilder;
 	private final List<ConfigurationListener> _configurationListeners = new CopyOnWriteArrayList<>();
 	private final ContainerState _containerState;
 	private final FactoryComponent.Builder _factoryBuilder;
-	private final ExtendedComponentInstanceDTO _containerInstanceDTO;
 	private final Logger _log;
 	private final List<ServiceRegistration<?>> _registrations = new CopyOnWriteArrayList<>();
 	private final SingleComponent.Builder _singleBuilder;

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java Wed Apr 25 13:57:06 2018
@@ -14,7 +14,7 @@
 
 package org.apache.aries.cdi.container.internal.model;
 
-import java.util.Collections;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -22,13 +22,13 @@ import org.apache.aries.cdi.container.in
 import org.apache.aries.cdi.container.internal.container.Op;
 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.util.Conversions;
+import org.apache.aries.cdi.container.internal.util.Throw;
 import org.osgi.service.cdi.runtime.dto.ComponentDTO;
 import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
-import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
 import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
 import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
 import org.osgi.service.log.Logger;
+import org.osgi.util.promise.Promise;
 
 public class ContainerComponent extends Component {
 
@@ -52,32 +52,37 @@ public class ContainerComponent extends
 		_log = containerState.containerLogs().getLogger(getClass());
 
 		_template = builder._templateDTO;
-
-		_snapshot = new ComponentDTO();
-		_snapshot.instances = new CopyOnWriteArrayList<>();
-		_snapshot.template = _template;
-
-		_instanceDTO = new ExtendedComponentInstanceDTO(containerState, builder._activatorBuilder);
-		_instanceDTO.activations = new CopyOnWriteArrayList<>();
-		_instanceDTO.configurations = new CopyOnWriteArrayList<>();
-		_instanceDTO.pid = _template.configurations.get(0).pid;
-		_instanceDTO.properties = null;
-		_instanceDTO.references = new CopyOnWriteArrayList<>();
-		_instanceDTO.template = _template;
-
-		_snapshot.instances.add(_instanceDTO);
-
-		containerState.containerDTO().components.add(_snapshot);
+		_activatorBuilder = builder._activatorBuilder;
 	}
 
 	@Override
 	public boolean close() {
-		submit(_instanceDTO.closeOp(), _instanceDTO::close).onFailure(
-			f -> {
-				_log.error(l -> l.error("CCR Error in container component close for {} on {}", _template.name, containerState.bundle()));
+		if (_snapshot == null) {
+			return true;
+		}
+
+		_snapshot.instances.removeIf(
+			instance -> {
+				ExtendedComponentInstanceDTO einstance = (ExtendedComponentInstanceDTO)instance;
+
+				Promise<Boolean> result = submit(einstance.closeOp(), einstance::close).onFailure(
+					f -> {
+						_log.error(l -> l.error("CCR Error in container component close for {} on {}", einstance.ident(), bundle(), f));
+					}
+				);
+
+				try {
+					return result.getValue();
+				}
+				catch (InvocationTargetException | InterruptedException e) {
+					return Throw.exception(e);
+				}
 			}
 		);
 
+		containerState.containerDTO().components.remove(_snapshot);
+		_snapshot = null;
+
 		return true;
 	}
 
@@ -93,27 +98,28 @@ public class ContainerComponent extends
 
 	@Override
 	public List<ComponentInstanceDTO> instances() {
-		return Collections.singletonList(_instanceDTO);
+		return _snapshot.instances;
 	}
 
 	@Override
 	public boolean open() {
-		List<ConfigurationDTO> configurations = _instanceDTO.configurations;
+		_snapshot = new ComponentDTO();
+		_snapshot.instances = new CopyOnWriteArrayList<>();
+		_snapshot.template = _template;
 
-		if (!configurations.isEmpty()) {
-			ConfigurationDTO defaultContainerConfiguration = configurations.get(0);
+		containerState.containerDTO().components.add(_snapshot);
 
-			Boolean enabled = Conversions.convert(
-					defaultContainerConfiguration.properties.get(
-							_template.name.concat(".enabled"))
-					).defaultValue(Boolean.TRUE).to(Boolean.class);
+		ExtendedComponentInstanceDTO instanceDTO = new ExtendedComponentInstanceDTO(
+			containerState, _activatorBuilder);
 
-			if (!enabled) {
-				return _snapshot.enabled = false;
-			}
-		}
+		instanceDTO.activations = new CopyOnWriteArrayList<>();
+		instanceDTO.configurations = new CopyOnWriteArrayList<>();
+		instanceDTO.references = new CopyOnWriteArrayList<>();
+		instanceDTO.template = _template;
 
-		submit(_instanceDTO.openOp(), _instanceDTO::open).onFailure(
+		_snapshot.instances.add(instanceDTO);
+
+		submit(instanceDTO.openOp(), instanceDTO::open).onFailure(
 			f -> {
 				_log.error(l -> l.error("CCR Error in container component open for {} on {}", _template.name, containerState.bundle()));
 			}
@@ -137,10 +143,9 @@ public class ContainerComponent extends
 		return _template;
 	}
 
-
-	private final ExtendedComponentInstanceDTO _instanceDTO;
+	private final InstanceActivator.Builder<?> _activatorBuilder;
 	private final Logger _log;
-	private final ComponentDTO _snapshot;
+	private volatile ComponentDTO _snapshot;
 	private final ComponentTemplateDTO _template;
 
 }

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=1830079&r1=1830078&r2=1830079&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 Wed Apr 25 13:57:06 2018
@@ -30,8 +30,10 @@ import org.apache.aries.cdi.container.in
 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.container.ReferenceSync;
+import org.apache.aries.cdi.container.internal.util.Conversions;
 import org.osgi.framework.Constants;
 import org.osgi.service.cdi.ConfigurationPolicy;
+import org.osgi.service.cdi.runtime.dto.ComponentDTO;
 import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
 import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
 import org.osgi.service.cdi.runtime.dto.ReferenceDTO;
@@ -152,6 +154,28 @@ public class ExtendedComponentInstanceDT
 			return false;
 		}
 
+		ConfigurationDTO containerConfiguration = containerConfiguration();
+
+		if (containerConfiguration != null) {
+			Boolean enabled = Conversions.convert(
+				containerConfiguration.properties.get(
+					template.name.concat(".enabled"))
+			).defaultValue(Boolean.TRUE).to(Boolean.class);
+
+			if (!enabled) {
+				_containerState.containerDTO().components.stream().filter(
+					c -> c.template == template
+				).forEach(c -> c.enabled = false);
+
+				return false;
+			}
+			else {
+				_containerState.containerDTO().components.stream().filter(
+					c -> c.template == template
+				).forEach(c -> c.enabled = true);
+			}
+		}
+
 		properties = componentProperties(null);
 
 		template.references.stream().map(ExtendedReferenceTemplateDTO.class::cast).forEach(
@@ -215,6 +239,28 @@ public class ExtendedComponentInstanceDT
 		return true;
 	}
 
+	private ConfigurationDTO containerConfiguration() {
+		List<ComponentDTO> components = _containerState.containerDTO().components;
+
+		if (components.isEmpty()) {
+			return null;
+		}
+
+		List<ComponentInstanceDTO> instances = components.get(0).instances;
+
+		if (instances.isEmpty()) {
+			return null;
+		}
+
+		List<ConfigurationDTO> configurations = instances.get(0).configurations;
+
+		if (configurations.isEmpty()) {
+			return null;
+		}
+
+		return configurations.get(0);
+	}
+
 	public Op openOp() {
 		return Op.of(Mode.OPEN, getType(), ident());
 	}

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java Wed Apr 25 13:57:06 2018
@@ -14,7 +14,7 @@
 
 package org.apache.aries.cdi.container.internal.model;
 
-import java.util.Arrays;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -22,12 +22,13 @@ import org.apache.aries.cdi.container.in
 import org.apache.aries.cdi.container.internal.container.Op;
 import org.apache.aries.cdi.container.internal.container.Op.Mode;
 import org.apache.aries.cdi.container.internal.container.Op.Type;
-import org.osgi.service.cdi.MaximumCardinality;
+import org.apache.aries.cdi.container.internal.util.Throw;
 import org.osgi.service.cdi.runtime.dto.ComponentDTO;
 import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
 import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
 import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
 import org.osgi.service.log.Logger;
+import org.osgi.util.promise.Promise;
 
 public class FactoryComponent extends Component {
 
@@ -47,53 +48,39 @@ public class FactoryComponent extends Co
 	protected FactoryComponent(Builder builder) {
 		super(builder);
 
-		_log = containerState.containerLogs().getLogger(getClass());
-
 		_template = builder._templateDTO;
-
-		_snapshot = new ComponentDTO();
-		_snapshot.instances = new CopyOnWriteArrayList<>();
-		_snapshot.template = _template;
-
-		containerState.containerDTO().components.add(_snapshot);
-
-		configurationTemplates().stream().filter(
-			t -> t.maximumCardinality == MaximumCardinality.MANY
-		).forEach(
-			t -> {
-				containerState.findConfigs(t.pid, true).ifPresent(
-					arr -> Arrays.stream(arr).forEach(
-						c -> {
-							ExtendedComponentInstanceDTO instanceDTO = new ExtendedComponentInstanceDTO(containerState, builder._activatorBuilder);
-							instanceDTO.activations = new CopyOnWriteArrayList<>();
-							instanceDTO.configurations = new CopyOnWriteArrayList<>();
-							instanceDTO.pid = c.getPid();
-							instanceDTO.properties = null;
-							instanceDTO.references = new CopyOnWriteArrayList<>();
-							instanceDTO.template = builder._templateDTO;
-
-							_snapshot.instances.add(instanceDTO);
-						}
-					)
-				);
-			}
-		);
+		_log = containerState.containerLogs().getLogger(getClass());
 	}
 
 	@Override
 	public boolean close() {
-		_snapshot.instances.stream().map(
-			instance -> (ExtendedComponentInstanceDTO)instance
-		).forEach(
+		if (_snapshot == null) {
+			return true;
+		}
+
+		_snapshot.instances.removeIf(
 			instance -> {
-				submit(instance.closeOp(), instance::close).onFailure(
+				ExtendedComponentInstanceDTO einstance = (ExtendedComponentInstanceDTO)instance;
+
+				Promise<Boolean> result = submit(einstance.closeOp(), einstance::close).onFailure(
 					f -> {
-						_log.error(l -> l.error("CCR Error in factory component close for {} on {}", instance.ident(), containerState.bundle()));
+						_log.error(l -> l.error("CCR Error in factory component close for {} on {}", einstance.ident(), bundle(), f));
 					}
 				);
+
+				try {
+					return result.getValue();
+				}
+				catch (InvocationTargetException | InterruptedException e) {
+					return Throw.exception(e);
+				}
 			}
 		);
 
+		containerState.containerDTO().components.remove(_snapshot);
+
+		_snapshot = null;
+
 		return true;
 	}
 
@@ -119,21 +106,11 @@ public class FactoryComponent extends Co
 
 	@Override
 	public boolean open() {
-		if (!snapshot().enabled || !containerState.containerDTO().components.get(0).enabled) {
-			return false;
-		}
+		_snapshot = new ComponentDTO();
+		_snapshot.instances = new CopyOnWriteArrayList<>();
+		_snapshot.template = _template;
 
-		_snapshot.instances.stream().map(
-			instance -> (ExtendedComponentInstanceDTO)instance
-		).forEach(
-			instance -> {
-				submit(instance.openOp(), instance::open).onFailure(
-					f -> {
-						_log.error(l -> l.error("CCR Error in factory component open for {} on {}", instance.ident(), containerState.bundle()));
-					}
-				);
-			}
-		);
+		containerState.containerDTO().components.add(_snapshot);
 
 		return true;
 	}
@@ -149,7 +126,7 @@ public class FactoryComponent extends Co
 	}
 
 	private final Logger _log;
-	private final ComponentDTO _snapshot;
+	private volatile ComponentDTO _snapshot;
 	private final ComponentTemplateDTO _template;
 
 }

Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java Wed Apr 25 13:57:06 2018
@@ -14,18 +14,20 @@
 
 package org.apache.aries.cdi.container.internal.model;
 
-import java.util.Collections;
+import java.lang.reflect.InvocationTargetException;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 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.Op.Mode;
+import org.apache.aries.cdi.container.internal.util.Throw;
 import org.osgi.service.cdi.runtime.dto.ComponentDTO;
 import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
 import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
 import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
 import org.osgi.service.log.Logger;
+import org.osgi.util.promise.Promise;
 
 public class SingleComponent extends Component {
 
@@ -45,35 +47,40 @@ public class SingleComponent extends Com
 	protected SingleComponent(Builder builder) {
 		super(builder);
 
-		_log = containerState.containerLogs().getLogger(getClass());
-
 		_template = builder._templateDTO;
-
-		_snapshot = new ComponentDTO();
-		_snapshot.instances = new CopyOnWriteArrayList<>();
-		_snapshot.template = _template;
-
-		_instanceDTO = new ExtendedComponentInstanceDTO(containerState, builder._activatorBuilder);
-		_instanceDTO.activations = new CopyOnWriteArrayList<>();
-		_instanceDTO.configurations = new CopyOnWriteArrayList<>();
-		_instanceDTO.pid = _template.configurations.get(0).pid;
-		_instanceDTO.properties = null;
-		_instanceDTO.references = new CopyOnWriteArrayList<>();
-		_instanceDTO.template = builder._templateDTO;
-
-		_snapshot.instances.add(_instanceDTO);
-
-		containerState.containerDTO().components.add(_snapshot);
+		_activatorBuilder = builder._activatorBuilder;
+		_log = containerState.containerLogs().getLogger(getClass());
 	}
 
 	@Override
 	public boolean close() {
-		submit(_instanceDTO.closeOp(), _instanceDTO::close).onFailure(
-			f -> {
-				_log.error(l -> l.error("CCR Error in single component close for {} on {}", _instanceDTO.ident(), containerState.bundle()));
+		if (_snapshot == null) {
+			return true;
+		}
+
+		_snapshot.instances.removeIf(
+			instance -> {
+				ExtendedComponentInstanceDTO einstance = (ExtendedComponentInstanceDTO)instance;
+
+				Promise<Boolean> result = submit(einstance.closeOp(), einstance::close).onFailure(
+					f -> {
+						_log.error(l -> l.error("CCR Error in single component close for {} on {}", einstance.ident(), bundle(), f));
+					}
+				);
+
+				try {
+					return result.getValue();
+				}
+				catch (InvocationTargetException | InterruptedException e) {
+					return Throw.exception(e);
+				}
 			}
 		);
 
+		containerState.containerDTO().components.remove(_snapshot);
+
+		_snapshot = null;
+
 		return true;
 	}
 
@@ -89,7 +96,7 @@ public class SingleComponent extends Com
 
 	@Override
 	public List<ComponentInstanceDTO> instances() {
-		return Collections.singletonList(_instanceDTO);
+		return _snapshot.instances;
 	}
 
 	@Override
@@ -99,13 +106,24 @@ public class SingleComponent extends Com
 
 	@Override
 	public boolean open() {
-		if (!snapshot().enabled || !containerState.containerDTO().components.get(0).enabled) {
-			return false;
-		}
+		_snapshot = new ComponentDTO();
+		_snapshot.instances = new CopyOnWriteArrayList<>();
+		_snapshot.template = _template;
+
+		containerState.containerDTO().components.add(_snapshot);
+
+		ExtendedComponentInstanceDTO instanceDTO = new ExtendedComponentInstanceDTO(
+			containerState, _activatorBuilder);
+		instanceDTO.activations = new CopyOnWriteArrayList<>();
+		instanceDTO.configurations = new CopyOnWriteArrayList<>();
+		instanceDTO.references = new CopyOnWriteArrayList<>();
+		instanceDTO.template = _template;
+
+		_snapshot.instances.add(instanceDTO);
 
-		submit(_instanceDTO.openOp(), _instanceDTO::open).onFailure(
+		submit(instanceDTO.openOp(), instanceDTO::open).onFailure(
 			f -> {
-				_log.error(l -> l.error("CCR Error in single component open for {} on {}", _instanceDTO.ident(), containerState.bundle()));
+				_log.error(l -> l.error("CCR Error in single component open for {} on {}", instanceDTO.ident(), containerState.bundle()));
 			}
 		);
 
@@ -122,9 +140,9 @@ public class SingleComponent extends Com
 		return _template;
 	}
 
-	private final ExtendedComponentInstanceDTO _instanceDTO;
+	private final InstanceActivator.Builder<?> _activatorBuilder;
 	private final Logger _log;
-	private final ComponentDTO _snapshot;
+	private volatile ComponentDTO _snapshot;
 	private final ComponentTemplateDTO _template;
 
 }

Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java?rev=1830079&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java Wed Apr 25 13:57:06 2018
@@ -0,0 +1,285 @@
+package org.apache.aries.cdi.container.internal.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.osgi.service.cdi.runtime.dto.ActivationDTO;
+import org.osgi.service.cdi.runtime.dto.ComponentDTO;
+import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
+import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
+import org.osgi.service.cdi.runtime.dto.ContainerDTO;
+import org.osgi.service.cdi.runtime.dto.ExtensionDTO;
+import org.osgi.service.cdi.runtime.dto.ReferenceDTO;
+import org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ContainerTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ExtensionTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
+
+public class DTOs {
+
+	private DTOs() {
+		// no instances
+	}
+
+	public static ContainerDTO copy(ContainerDTO original, boolean clear) {
+		try {
+			return (ContainerDTO)cache.get().computeIfAbsent(original, o -> {
+				return copy0(original);
+			});
+		}
+		finally {
+			if (clear)
+				cache.remove();
+		}
+	}
+
+	static ContainerDTO copy0(ContainerDTO original) {
+		ContainerDTO copy = new ContainerDTO();
+		copy.bundle = original.bundle;
+		copy.changeCount = original.changeCount;
+		copy.errors = new ArrayList<>(original.errors);
+		copy.template = copy(original.template, false);
+		copy.extensions = copy(original.extensions);
+		copy.components = copy(original.components);
+		return copy;
+	}
+
+	static ExtensionDTO copy(ExtensionDTO original) {
+		return (ExtensionDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ExtensionDTO copy0(ExtensionDTO original) {
+		ExtensionDTO copy = new ExtensionDTO();
+		copy.service = original.service;
+		copy.template = copy(original.template);
+		return copy;
+	}
+
+	static ComponentDTO copy(ComponentDTO original) {
+		return (ComponentDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ComponentDTO copy0(ComponentDTO original) {
+		ComponentDTO copy = new ComponentDTO();
+		copy.enabled = original.enabled;
+		copy.instances = copy(original.instances);
+		copy.template = copy(original.template);
+		return copy;
+	}
+
+	static ComponentInstanceDTO copy(ComponentInstanceDTO original) {
+		return (ComponentInstanceDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ComponentInstanceDTO copy0(ComponentInstanceDTO original) {
+		ComponentInstanceDTO copy = new ComponentInstanceDTO();
+		copy.activations = copy(original.activations);
+		copy.configurations = copy(original.configurations);
+		copy.properties = original.properties == null ? null : new HashMap<>(original.properties);
+		copy.references = copy(original.references);
+		return copy;
+	}
+
+	static ActivationDTO copy(ActivationDTO original) {
+		return (ActivationDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ActivationDTO copy0(ActivationDTO original) {
+		ActivationDTO copy = new ActivationDTO();
+		copy.errors = new ArrayList<>(original.errors);
+		copy.service = original.service;
+		copy.template = copy(original.template);
+		return copy;
+	}
+
+	static ConfigurationDTO copy(ConfigurationDTO original) {
+		return (ConfigurationDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ConfigurationDTO copy0(ConfigurationDTO original) {
+		ConfigurationDTO copy = new ConfigurationDTO();
+		copy.properties = original.properties == null ? null : new HashMap<>(original.properties);
+		copy.template = copy(original.template);
+		return copy;
+	}
+
+	static ReferenceDTO copy(ReferenceDTO original) {
+		return (ReferenceDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ReferenceDTO copy0(ReferenceDTO original) {
+		ReferenceDTO copy = new ReferenceDTO();
+		copy.matches = new ArrayList<>(original.matches);
+		copy.minimumCardinality = original.minimumCardinality;
+		copy.targetFilter = original.targetFilter;
+		copy.template = copy(original.template);
+		return copy;
+	}
+
+	public static ContainerTemplateDTO copy(ContainerTemplateDTO original, boolean clear) {
+		try {
+			return (ContainerTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+				return copy0(original);
+			});
+		}
+		finally {
+			if (clear)
+				cache.remove();
+		}
+	}
+
+	static ContainerTemplateDTO copy0(ContainerTemplateDTO original) {
+		ContainerTemplateDTO copy = new ContainerTemplateDTO();
+		copy.components = copy(original.components);
+		copy.extensions = copy(original.extensions);
+		copy.id = original.id;
+		return copy;
+	}
+
+	static ComponentTemplateDTO copy(ComponentTemplateDTO original) {
+		return (ComponentTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ComponentTemplateDTO copy0(ComponentTemplateDTO original) {
+		ComponentTemplateDTO copy = new ComponentTemplateDTO();
+		copy.activations = copy(original.activations);
+		copy.beans = new ArrayList<>(original.beans);
+		copy.configurations = copy(original.configurations);
+		copy.name = original.name;
+		copy.properties = original.properties == null ? null : new HashMap<>(original.properties);
+		copy.references = copy(original.references);
+		copy.type = original.type;
+		return copy;
+	}
+
+	static ExtensionTemplateDTO copy(ExtensionTemplateDTO original) {
+		return (ExtensionTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ExtensionTemplateDTO copy0(ExtensionTemplateDTO original) {
+		ExtensionTemplateDTO copy = new ExtensionTemplateDTO();
+		copy.serviceFilter = original.serviceFilter;
+		return copy;
+	}
+
+	static ActivationTemplateDTO copy(ActivationTemplateDTO original) {
+		return (ActivationTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ActivationTemplateDTO copy0(ActivationTemplateDTO original) {
+		ActivationTemplateDTO copy = new ActivationTemplateDTO();
+		copy.properties = original.properties == null ? null : new HashMap<>(original.properties);
+		copy.scope = original.scope;
+		copy.serviceClasses = new ArrayList<>(original.serviceClasses);
+		return copy;
+	}
+
+	static ConfigurationTemplateDTO copy(ConfigurationTemplateDTO original) {
+		return (ConfigurationTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ConfigurationTemplateDTO copy0(ConfigurationTemplateDTO original) {
+		ConfigurationTemplateDTO copy = new ConfigurationTemplateDTO();
+		copy.componentConfiguration = original.componentConfiguration;
+		copy.maximumCardinality = original.maximumCardinality;
+		copy.pid = original.pid;
+		copy.policy = original.policy;
+		return copy;
+	}
+
+	static ReferenceTemplateDTO copy(ReferenceTemplateDTO original) {
+		return (ReferenceTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+			return copy0(original);
+		});
+	}
+
+	static ReferenceTemplateDTO copy0(ReferenceTemplateDTO original) {
+		ReferenceTemplateDTO copy = new ReferenceTemplateDTO();
+		copy.maximumCardinality = original.maximumCardinality;
+		copy.minimumCardinality = original.minimumCardinality;
+		copy.name = original.name;
+		copy.policy = original.policy;
+		copy.policyOption = original.policyOption;
+		copy.serviceType = original.serviceType;
+		copy.targetFilter = original.targetFilter;
+		return copy;
+	}
+
+	@SuppressWarnings("unchecked")
+	static <T> T copy(T original) {
+		if (original instanceof ActivationDTO) {
+			return (T)copy((ActivationDTO)original);
+		}
+		else if (original instanceof ActivationTemplateDTO) {
+			return (T)copy((ActivationTemplateDTO)original);
+		}
+		else if (original instanceof ComponentDTO) {
+			return (T)copy((ComponentDTO)original);
+		}
+		else if (original instanceof ComponentInstanceDTO) {
+			return (T)copy((ComponentInstanceDTO)original);
+		}
+		else if (original instanceof ComponentTemplateDTO) {
+			return (T)copy((ComponentTemplateDTO)original);
+		}
+		else if (original instanceof ConfigurationDTO) {
+			return (T)copy((ConfigurationDTO)original);
+		}
+		else if (original instanceof ConfigurationTemplateDTO) {
+			return (T)copy((ConfigurationTemplateDTO)original);
+		}
+		else if (original instanceof ContainerDTO) {
+			return (T)copy((ContainerDTO)original);
+		}
+		else if (original instanceof ContainerTemplateDTO) {
+			return (T)copy((ContainerTemplateDTO)original);
+		}
+		else if (original instanceof ExtensionDTO) {
+			return (T)copy((ExtensionDTO)original);
+		}
+		else if (original instanceof ExtensionTemplateDTO) {
+			return (T)copy((ExtensionTemplateDTO)original);
+		}
+		else if (original instanceof ReferenceDTO) {
+			return (T)copy((ReferenceDTO)original);
+		}
+		else if (original instanceof ReferenceTemplateDTO) {
+			return (T)copy((ReferenceTemplateDTO)original);
+		}
+
+		return null;
+	}
+
+	static <T> List<T> copy(List<T> original) {
+		return original.stream().map(t -> copy(t)).collect(Collectors.toList());
+	}
+
+	private static final ThreadLocal<Map<Object, Object>> cache =
+		ThreadLocal.withInitial(() -> new HashMap<>());
+
+}

Modified: aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java (original)
+++ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java Wed Apr 25 13:57:06 2018
@@ -67,7 +67,7 @@ public class ConfigurationListenerTest e
 
 		Promise<Boolean> p0 = containerState.addCallback(
 			(CheckedCallback<Boolean, Boolean>) op -> {
-				return op.mode == Op.Mode.OPEN && op.type == Op.Type.CONTAINER_COMPONENT;
+				return op.mode == Op.Mode.OPEN && op.type == Op.Type.CONTAINER_INSTANCE;
 			}
 		);
 
@@ -125,7 +125,7 @@ public class ConfigurationListenerTest e
 		listener.get().configurationEvent(
 			new ConfigurationEvent(caTracker.getServiceReference(), ConfigurationEvent.CM_UPDATED, null, pid));
 
-		p2.timeout(200).getValue();
+		p2.timeout(200).getFailure();
 
 		assertNotNull(containerState.containerDTO().components.get(0).instances.get(0).properties);
 		assertEquals("bar", containerState.containerDTO().components.get(0).instances.get(0).properties.get("foo"));
@@ -139,7 +139,7 @@ public class ConfigurationListenerTest e
 		listener.get().configurationEvent(
 			new ConfigurationEvent(caTracker.getServiceReference(), ConfigurationEvent.CM_UPDATED, null, "foo.config"));
 
-		p3.timeout(200).getValue();
+		p3.timeout(200).getFailure();
 
 		Map<String, Object> properties = containerState.containerDTO().components.get(0).instances.get(0).properties;
 		assertNotNull(properties);

Modified: aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java (original)
+++ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java Wed Apr 25 13:57:06 2018
@@ -82,7 +82,7 @@ public class ContainerBootstrapTest exte
 		ExtendedComponentInstanceDTO componentInstanceDTO = new ExtendedComponentInstanceDTO(containerState, new ContainerActivator.Builder(containerState, containerBootstrap));
 		componentInstanceDTO.activations = new CopyOnWriteArrayList<>();
 		componentInstanceDTO.configurations = new CopyOnWriteArrayList<>();
-		componentInstanceDTO.pid = componentDTO.template.configurations.get(0).pid;
+		//componentInstanceDTO.pid = componentDTO.template.configurations.get(0).pid;
 		componentInstanceDTO.properties = null;
 		componentInstanceDTO.references = new CopyOnWriteArrayList<>();
 		componentInstanceDTO.template = componentDTO.template;

Modified: aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java (original)
+++ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java Wed Apr 25 13:57:06 2018
@@ -90,7 +90,7 @@ public class ContainerReferencesTest ext
 
 		Promise<Boolean> p0 = containerState.addCallback(
 			(CheckedCallback<Boolean, Boolean>) op -> {
-				return op.mode == Op.Mode.OPEN && op.type == Op.Type.CONTAINER_COMPONENT;
+				return op.mode == Op.Mode.OPEN && op.type == Op.Type.REFERENCES;
 			}
 		);
 
@@ -102,7 +102,7 @@ public class ContainerReferencesTest ext
 		assertTrue(containerDTO.errors + "", containerDTO.errors.isEmpty());
 		assertNotNull(containerDTO.template);
 
-		p0.getValue();
+		p0.timeout(500).getValue();
 
 		ComponentDTO componentDTO = containerDTO.components.stream().filter(
 			c -> c.template.type == ComponentType.CONTAINER

Modified: aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java (original)
+++ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java Wed Apr 25 13:57:06 2018
@@ -63,7 +63,7 @@ public class DisableComponentTests exten
 		Configuration configurationA = null;
 
 		try {
-			configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi-itests.tb8", "?");
+			configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi.itests.tb8", "?");
 
 			Dictionary<String, Object> p1 = new Hashtable<>();
 			p1.put("cdi-itests.tb8.enabled", false);
@@ -71,7 +71,7 @@ public class DisableComponentTests exten
 			configurationA.update(p1);
 
 			for (int i = 20; (i > 0) && (!tracker.isEmpty()); i--) {
-				Thread.sleep(200);
+				Thread.sleep(20);
 			}
 
 			pojo = tracker.getService();
@@ -121,7 +121,7 @@ public class DisableComponentTests exten
 		Configuration configurationA = null;
 
 		try {
-			configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi-itests.tb8", "?");
+			configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi.itests.tb8", "?");
 
 			Dictionary<String, Object> p1 = new Hashtable<>();
 			p1.put("singleComponentBean.enabled", false);
@@ -141,7 +141,7 @@ public class DisableComponentTests exten
 
 			configurationA.update(p1);
 
-			for (int i = 10; (i > 0) && (tracker.isEmpty()); i--) {
+			for (int i = 20; (i > 0) && (tracker.isEmpty()); i--) {
 				Thread.sleep(20);
 			}