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 <[email protected]>

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);
                        }
 


Reply via email to