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