You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ro...@apache.org on 2018/04/25 13:57:07 UTC
svn commit: r1830079 - in /aries/trunk/cdi:
cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/
cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/
cdi-extender/src/main/java/org/apache/aries/cdi/container/intern...
Author: rotty3000
Date: Wed Apr 25 13:57:06 2018
New Revision: 1830079
URL: http://svn.apache.org/viewvc?rev=1830079&view=rev
Log:
[CDI] much stabilization and bug fixes
Signed-off-by: Raymond Auge <ro...@apache.org>
Added:
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java
Modified:
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java
aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java
aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java
aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java
aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/Activator.java Wed Apr 25 13:57:06 2018
@@ -48,7 +48,6 @@ import org.osgi.annotation.bundle.Header
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
-import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceRegistration;
import org.osgi.framework.wiring.BundleRequirement;
@@ -75,19 +74,20 @@ public class Activator extends AbstractE
public Activator() {
setSynchronous(true);
-
- _logs = new Logs.Builder(FrameworkUtil.getBundle(getClass()).getBundleContext()).build();
- _log = _logs.getLogger(getClass());
- _ccr = new CCR(_promiseFactory, _logs);
- _command = new CDICommand(_ccr);
}
@Override
public void start(BundleContext bundleContext) throws Exception {
+ _logs = new Logs.Builder(bundleContext).build();
+ _log = _logs.getLogger(getClass());
+
if (_log.isDebugEnabled()) {
_log.debug("CCR starting {}", bundleContext.getBundle());
}
+ _ccr = new CCR(_promiseFactory, _logs);
+ _command = new CDICommand(_ccr);
+
_bundleContext = bundleContext;
registerCCR();
@@ -231,13 +231,13 @@ public class Activator extends AbstractE
private BundleContext _bundleContext;
- private final CCR _ccr;
+ private volatile CCR _ccr;
private final ChangeCount _ccrChangeCount = new ChangeCount();
private ServiceRegistration<CDIComponentRuntime> _ccrRegistration;
- private final CDICommand _command;
+ private volatile CDICommand _command;
private ServiceRegistration<?> _commandRegistration;
- private final Logs _logs;
- private final Logger _log;
+ private volatile Logs _logs;
+ private volatile Logger _log;
private final PromiseFactory _promiseFactory = new PromiseFactory(Executors.newFixedThreadPool(1));
private class ChangeObserverFactory implements Observer, ServiceFactory<CDIComponentRuntime> {
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/CCR.java Wed Apr 25 13:57:06 2018
@@ -24,7 +24,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.aries.cdi.container.internal.container.ContainerState;
-import org.apache.aries.cdi.container.internal.util.Conversions;
+import org.apache.aries.cdi.container.internal.util.DTOs;
import org.apache.aries.cdi.container.internal.util.Logs;
import org.apache.aries.cdi.container.internal.util.Throw;
import org.osgi.framework.Bundle;
@@ -52,14 +52,14 @@ public class CCR implements CDIComponent
).map(
b -> _states.get(b)
).map(
- cs -> Conversions.convert(cs.containerDTO()).to(ContainerDTO.class)
+ cs -> DTOs.copy(cs.containerDTO(), true)
).collect(Collectors.toList())
);
}
return call(
() -> _states.values().stream().map(
- cs -> Conversions.convert(cs.containerDTO()).to(ContainerDTO.class)
+ cs -> DTOs.copy(cs.containerDTO(), true)
).collect(Collectors.toList())
);
}
@@ -68,7 +68,7 @@ public class CCR implements CDIComponent
public ContainerDTO getContainerDTO(Bundle bundle) {
return call(
() -> Optional.ofNullable(_states.get(bundle)).map(
- cs -> Conversions.convert(cs.containerDTO()).to(ContainerDTO.class)
+ cs -> DTOs.copy(cs.containerDTO(), true)
).orElse(null)
);
}
@@ -86,7 +86,7 @@ public class CCR implements CDIComponent
public ContainerTemplateDTO getContainerTemplateDTO(Bundle bundle) {
return call(
() -> Optional.ofNullable(_states.get(bundle)).map(
- cs -> Conversions.convert(cs.containerDTO().template).to(ContainerTemplateDTO.class)
+ cs -> DTOs.copy(cs.containerDTO().template, true)
).orElse(null)
);
}
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/command/CDICommand.java Wed Apr 25 13:57:06 2018
@@ -14,11 +14,30 @@
package org.apache.aries.cdi.container.internal.command;
+import static java.util.stream.Collectors.*;
+
import java.util.Collection;
+import java.util.Formatter;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
import org.apache.aries.cdi.container.internal.CCR;
import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+import org.osgi.service.cdi.ComponentType;
+import org.osgi.service.cdi.MaximumCardinality;
+import org.osgi.service.cdi.runtime.dto.ActivationDTO;
+import org.osgi.service.cdi.runtime.dto.ComponentDTO;
+import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
+import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
import org.osgi.service.cdi.runtime.dto.ContainerDTO;
+import org.osgi.service.cdi.runtime.dto.ReferenceDTO;
+import org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
public class CDICommand {
@@ -26,105 +45,431 @@ public class CDICommand {
_ccr = ccr;
}
- public Collection<ContainerDTO> list() {
- return _ccr.getContainerDTOs();
+ public String info(Bundle bundle) {
+ try (Formatter f = new Formatter()) {
+ ContainerDTO containerDTO = _ccr.getContainerDTO(bundle);
+
+ if (containerDTO == null) {
+ f.format("No matching CDI bundles");
+ return f.toString();
+ }
+
+ list0(f, containerDTO, false, true);
+
+ return f.toString();
+ }
}
- public ContainerDTO info(Bundle bundle) {
- return _ccr.getContainerDTO(bundle);
- /*
+ public String list(Bundle... bundles) {
try (Formatter f = new Formatter()) {
- ContainerState containerState = _states.get(bundle);
-
- if (containerState == null) {
- f.format("No CDI Bundle found matching {}", bundle);
+ Collection<ContainerDTO> containerDTOs = _ccr.getContainerDTOs(bundles);
+ if (containerDTOs.isEmpty()) {
+ f.format("No matching CDI bundles");
return f.toString();
}
- f.format("[%s]%n", containerState.id());
+ List<ContainerDTO> containerDTOList = containerDTOs.stream().sorted(
+ (a, b) -> Long.compare(a.bundle.id,b.bundle.id)
+ ).collect(toList());
- List<ExtensionDependency> extensionDependencies = containerState.extensionDependencies();
+ for (Iterator<ContainerDTO> itr = containerDTOList.iterator(); itr.hasNext();) {
+ ContainerDTO containerDTO = itr.next();
- if (!extensionDependencies.isEmpty()) {
- f.format(" [EXTENSIONS]");
+ list0(f, containerDTO, itr.hasNext(), false);
+ }
- for (ExtensionDependency extensionDependency : extensionDependencies) {
- f.format(" Extension: %s%s%n", extensionDependency.toString(), " ???is this resolved???");
- }
+ return f.toString();
+ }
+ }
+
+ private void list0(Formatter f, ContainerDTO containerDTO, boolean hasNext, boolean verbose) {
+ String curb = hasNext ? "âââ " : "âââ ";
+ String prefix = hasNext ? "â       " : "        ";
+
+ f.format(
+ "%s%s[%s]%n",
+ curb,
+ containerDTO.bundle.symbolicName,
+ containerDTO.bundle.id);
+
+ f.format(
+ "%s%sCOMPONENTS%n",
+ (hasNext ? "â   " : "    "),
+ curb);
+
+ Map<Boolean, List<ComponentTemplateDTO>> componentTemplateDTOs = containerDTO.template.components.stream().collect(
+ partitioningBy(c -> c.type == ComponentType.CONTAINER)
+ );
+
+ ComponentTemplateDTO componentTemplateDTO = componentTemplateDTOs.get(Boolean.TRUE).get(0);
+
+ List<ComponentTemplateDTO> singleAndFactory = componentTemplateDTOs.get(Boolean.FALSE);
+
+ list0(
+ f,
+ containerDTO,
+ componentTemplateDTO,
+ prefix,
+ true,
+ !singleAndFactory.isEmpty(),
+ verbose);
+
+ for (Iterator<ComponentTemplateDTO> itr2 = singleAndFactory.iterator(); itr2.hasNext();) {
+ componentTemplateDTO = itr2.next();
+
+ list0(
+ f,
+ containerDTO,
+ componentTemplateDTO,
+ prefix,
+ itr2.hasNext(),
+ false, verbose);
+ }
+ }
+
+ private void list0(
+ Formatter f, ContainerDTO containerDTO, ComponentTemplateDTO componentTemplateDTO, String prefix,
+ boolean hasNext, boolean curb, boolean verbose) {
+ Map<Boolean, List<ConfigurationTemplateDTO>> configMap = configMap(componentTemplateDTO);
+
+ if (verbose) {
+ f.format(
+ "%s%sNAME: %s%n",
+ prefix,
+ (hasNext ? "âââ " : "âââ "),
+ componentTemplateDTO.name);
+ f.format(
+ "%s%s%sTYPE: %s%n",
+ prefix,
+ (hasNext ? "â   " : "    "),
+ "âââ ",
+ componentTemplateDTO.type);
+ }
+ else {
+ f.format(
+ "%s%sNAME: %s (%s%s)%n",
+ prefix,
+ (hasNext ? "âââ " : "âââ "),
+ componentTemplateDTO.name,
+ componentTemplateDTO.type,
+ factoryPid(configMap));
+ }
+
+ ComponentDTO componentDTO = containerDTO.components.stream().filter(
+ c -> c.template.name.equals(componentTemplateDTO.name)
+ ).findFirst().orElse(null);
+
+ if ((componentDTO != null) && !componentDTO.instances.isEmpty()) {
+ Iterator<ComponentInstanceDTO> itr3 = componentDTO.instances.iterator();
+
+ for (;itr3.hasNext();) {
+ ComponentInstanceDTO instanceDTO = itr3.next();
+
+ formatInstance(
+ f,
+ prefix,
+ componentDTO,
+ instanceDTO,
+ pids(instanceDTO, configMap),
+ hasNext,
+ itr3.hasNext(),
+ verbose);
}
+ }
+ else {
+ formatInstance(
+ f,
+ prefix,
+ componentDTO,
+ null,
+ configMap.get(Boolean.FALSE).stream().map(c -> c.pid).collect(toList()).toString(),
+ hasNext,
+ false,
+ verbose);
+ }
+ }
- BeansModel beansModel = containerState.beansModel();
- Collection<ComponentModel> componentModels = beansModel.getComponentModels();
+ private void formatInstance(
+ Formatter f, String prefix, ComponentDTO componentDTO,
+ ComponentInstanceDTO instanceDTO, String pids,
+ boolean hasNext, boolean hasNext2, boolean verbose) {
+
+ if (verbose) {
+ f.format(
+ "%s%s%sBEANS: %s%n",
+ prefix,
+ (hasNext ? "â   " : "    "),
+ "âââ ",
+ componentDTO.template.beans.toString());
+
+ f.format(
+ "%s%s%sCONFIGURATIONS%n",
+ prefix,
+ (hasNext ? "â   " : "    "),
+ "âââ ");
+
+ for (Iterator<ConfigurationTemplateDTO> itr = componentDTO.template.configurations.iterator();itr.hasNext();) {
+ ConfigurationTemplateDTO conf = itr.next();
+
+ ConfigurationDTO configurationDTO = null;
+
+ if (instanceDTO != null) {
+ configurationDTO = instanceDTO.configurations.stream().filter(
+ c -> c.template.componentConfiguration == conf.componentConfiguration &&
+ c.template.maximumCardinality == conf.maximumCardinality &&
+ c.template.pid == conf.pid &&
+ c.template.policy == conf.policy
+ ).findFirst().orElse(null);
+ }
- if (!componentModels.isEmpty()) {
- for (ComponentModel componentModel : componentModels) {
- ServiceDeclaration serviceDeclaration = containerState.serviceComponents().get(componentModel);
+ f.format(
+ "%s%s%sPID: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "âââ " : "âââ "),
+ (configurationDTO != null ? configurationDTO.properties.get(Constants.SERVICE_PID) + "*" : conf.pid));
+ f.format(
+ "%s%s%sPOLICY: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ conf.policy);
- f.format("[COMPONENT]%n");
+ if (conf.maximumCardinality == MaximumCardinality.MANY) {
f.format(
- " Name: %s%n BeanClass: %s%n ServiceScope: %s%n Provides: %s%n",
- componentModel.getName(),
- componentModel.getBeanClass().getName(),
- componentModel.getServiceScope(),
- serviceDeclaration != null ? Arrays.toString(serviceDeclaration.getClassNames()): "not yet ready!");
+ "%s%s%sFACTORY PID: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ conf.pid);
+ }
- f.format(" [CONFIGURATIONS]%n");
+ f.format(
+ "%s%s%sCOMPONENT CONFIGURATION: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ conf.componentConfiguration);
+ }
- Map<String, ConfigurationCallback> configurationCallbacks = containerState.configurationCallbacks().get(componentModel);
+ if (instanceDTO != null) {
+ f.format(
+ "%s%s%sCOMPONENT PROPERTIES*%n",
+ prefix,
+ (hasNext ? "â   " : "    "),
+ "âââ ");
- for (Entry<String, ConfigurationCallback> entry : configurationCallbacks.entrySet()) {
- f.format(
- " PID: %s%n Policy: %s%n Resolved: %s%n",
- entry.getKey(),
- entry.getValue().policy(),
- entry.getValue().resolved() ? "YES" : "NO");
- }
+ for (Iterator<String> itr = instanceDTO.properties.keySet().iterator(); itr.hasNext();) {
+ String key = itr.next();
- if (serviceDeclaration != null) {
- Dictionary<String, ?> configuration = serviceDeclaration.getServiceProperties();
+ f.format(
+ "%s%s%s%s=%s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "âââ " : "âââ "),
+ key,
+ instanceDTO.properties.get(key));
+ }
+ }
- if (!configuration.isEmpty()) {
- f.format(" Properties:%n");
+ if (!componentDTO.template.references.isEmpty()) {
+ f.format(
+ "%s%s%sREFERENCES%n",
+ prefix,
+ (hasNext ? "â   " : "    "),
+ "âââ ");
+
+ for (Iterator<ReferenceTemplateDTO> itr = componentDTO.template.references.iterator(); itr.hasNext();) {
+ ReferenceTemplateDTO dto = itr.next();
+
+ ReferenceDTO referenceDTO = null;
+
+ if (instanceDTO != null) {
+ referenceDTO = instanceDTO.references.stream().filter(
+ r -> r.template.maximumCardinality == dto.maximumCardinality &&
+ r.template.minimumCardinality == dto.minimumCardinality &&
+ r.template.name == dto.name &&
+ r.template.policy == dto.policy &&
+ r.template.policyOption == dto.policyOption &&
+ r.template.serviceType == dto.serviceType &&
+ r.template.targetFilter == dto.targetFilter
+ ).findFirst().orElse(null);
+ }
+
+ f.format(
+ "%s%s%sNAME: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "âââ " : "âââ "),
+ dto.name);
+ f.format(
+ "%s%s%sSERVICE TYPE: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ dto.serviceType);
+ f.format(
+ "%s%s%sTARGET FILTER: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ (referenceDTO != null ? referenceDTO.targetFilter + "*" : dto.targetFilter));
+ f.format(
+ "%s%s%sMAX CARDINALITY: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ dto.maximumCardinality);
+ f.format(
+ "%s%s%sMIN CARDINALITY: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ (referenceDTO != null ? referenceDTO.minimumCardinality + "*" : dto.minimumCardinality));
+ f.format(
+ "%s%s%sPOLICY: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ dto.policy);
+ f.format(
+ "%s%s%s%sPOLICY OPTION: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   " : "    "),
+ (referenceDTO != null ? "âââ " : "âââ "),
+ dto.policyOption);
- List<String> keys = Collections.list(configuration.keys());
+ if (referenceDTO != null) {
+ f.format(
+ "%s%s%sMATCHES: %s*%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ referenceDTO.matches);
+ }
+ }
+ }
- Collections.sort(keys);
+ if (!componentDTO.template.activations.isEmpty()) {
+ f.format(
+ "%s%s%sACTIVATIONS%n",
+ prefix,
+ (hasNext ? "â   " : "    "),
+ "âââ ");
+
+ for (Iterator<ActivationTemplateDTO> itr = componentDTO.template.activations.iterator(); itr.hasNext();) {
+ ActivationTemplateDTO dto = itr.next();
+
+ ActivationDTO activationDTO = null;
+
+ if (instanceDTO != null) {
+ activationDTO = instanceDTO.activations.stream().filter(
+ a -> a.template.properties.equals(dto.properties) &&
+ a.template.scope == dto.scope &&
+ a.template.serviceClasses.equals(dto.serviceClasses)
+ ).findFirst().orElse(null);
+ }
- for (String key : keys) {
- String value = Conversions.toString(configuration.get(key));
+ f.format(
+ "%s%s%sSERVICE TYPES: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "âââ " : "âââ "),
+ dto.serviceClasses);
+ f.format(
+ "%s%s%s%sSERVICE SCOPE: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   " : "    "),
+ (activationDTO != null ? "âââ " : "âââ "),
+ dto.scope.toString().toLowerCase());
- f.format(" %s = %s%n", key, value);
- }
- }
+ if (activationDTO != null) {
+ f.format(
+ "%s%s%sSERVICE REFERENCE: %s%n",
+ prefix,
+ (hasNext ? "â   â   " : "    â   "),
+ (itr.hasNext() ? "â   âââ " : "    âââ "),
+ activationDTO.service + "*");
}
+ }
+ }
+
+ f.format(
+ "%s%s%sSTATE: %s*%n",
+ prefix,
+ (hasNext ? "â   " : "    "),
+ (hasNext2 ? "âââ " : "âââ "),
+ state(componentDTO));
- List<ReferenceModel> references = componentModel.getReferences();
+ return;
+ }
- if (!references.isEmpty()) {
- f.format(" [REFERENCES]%n");
+ f.format(
+ "%s%s%sSTATE: %s %s%n",
+ prefix,
+ (hasNext ? "â   " : "    "),
+ (hasNext2 ? "âââ " : "âââ "),
+ state(componentDTO),
+ pids);
+ }
- Map<String, ReferenceCallback> referenceCallbacks = containerState.referenceCallbacks().get(componentModel);
+ private String pids(
+ ComponentInstanceDTO instanceDTO,
+ Map<Boolean, List<ConfigurationTemplateDTO>> configMap) {
+
+ List<String> resolvedPids = instanceDTO.configurations.stream().map(
+ c -> c.properties
+ ).filter(Objects::nonNull).map(
+ p -> (String)p.get(Constants.SERVICE_PID)
+ ).collect(toList());
+
+ return configMap.values().stream().flatMap(v -> v.stream()).map(c -> c.pid).map(
+ c -> {
+ String pid = resolvedPids.stream().filter(
+ rp -> rp.startsWith(c + "~") || rp.startsWith(c + ".")
+ ).findFirst().orElse(null);
- for (ReferenceModel referenceModel : references) {
- f.format(
- " Name: %s%n Service: %s%n Target: %s%n Cardinality: %s%n Policy: %s%n Policy Option: %s%n Scope: %s%n Resolved: %s%n",
- referenceModel.getName(),
- referenceModel.getServiceClass().getName(),
- referenceModel.getTarget(),
- referenceModel.getCardinality(),
- referenceModel.getPolicy(),
- referenceModel.getPolicyOption(),
- referenceModel.getScope(),
- referenceCallbacks.get(referenceModel.getName()).resolved() ? "YES" : "NO");
- }
- }
+ if (pid != null) {
+ return pid + "*";
+ }
+ else if (resolvedPids.stream().anyMatch(rp -> rp.equals(c))) {
+ return c + "*";
}
+ return c;
}
+ ).collect(toList()).toString();
+ }
- return f.toString();
+ private Map<Boolean, List<ConfigurationTemplateDTO>> configMap(ComponentTemplateDTO componentTemplateDTO) {
+ return componentTemplateDTO.configurations.stream().filter(
+ c -> c.pid != null
+ ).collect(
+ partitioningBy(c -> c.maximumCardinality == MaximumCardinality.MANY)
+ );
+ }
+
+ private String factoryPid(Map<Boolean, List<ConfigurationTemplateDTO>> configMap) {
+ return configMap.get(Boolean.TRUE).stream().map(
+ c -> c.pid
+ ).findFirst().map(
+ c -> "=" + c
+ ).orElse("");
+ }
+
+ private Object state(ComponentDTO componentDTO) {
+ if (componentDTO == null) {
+ return "null";
+ }
+ else if (!componentDTO.enabled) {
+ return "disabled";
+ }
+ else if (componentDTO.instances.size() == 0) {
+ return "waiting";
}
- */
+ return "active";
}
private final CCR _ccr;
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/CDIBundle.java Wed Apr 25 13:57:06 2018
@@ -55,11 +55,7 @@ public class CDIBundle extends Phase imp
@Override
public void destroy() throws Exception {
- submit(closeOp(), this::close).onFailure(
- f -> {
- _log.error(l -> l.error("CCR Error in closing cdi bundle {}", containerState.bundle(), f));
- }
- );
+ close();
}
@Override
@@ -68,14 +64,12 @@ public class CDIBundle extends Phase imp
next -> {
_ccr.add(containerState.bundle(), containerState);
- submit(next.openOp(), next::open).then(
- null,
+ submit(next.openOp(), next::open).onFailure(
f -> {
- _log.error(l -> l.error("CCR Error in cdibundle OPEN on {}", bundle(), f.getFailure()));
+ _log.error(l -> l.error("CCR Error in cdibundle OPEN on {}", bundle(), f));
- error(f.getFailure());
+ error(f);
}
-
);
return true;
@@ -90,14 +84,9 @@ public class CDIBundle extends Phase imp
@Override
public void start() throws Exception {
- submit(openOp(), this::open).onFailure(
- f -> {
- _log.error(l -> l.error("CCR Error in starting cdi bundle {}", containerState.bundle(), f));
- }
- );
+ open();
}
-
private final CCR _ccr;
private final Logger _log;
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java Wed Apr 25 13:57:06 2018
@@ -17,10 +17,8 @@ package org.apache.aries.cdi.container.i
import java.util.Arrays;
import java.util.Dictionary;
import java.util.Hashtable;
-import java.util.List;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.aries.cdi.container.internal.container.Op.Mode;
import org.apache.aries.cdi.container.internal.container.Op.Type;
@@ -32,8 +30,8 @@ import org.apache.aries.cdi.container.in
import org.apache.aries.cdi.container.internal.util.Throw;
import org.jboss.weld.exceptions.IllegalArgumentException;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cdi.ConfigurationPolicy;
import org.osgi.service.cdi.MaximumCardinality;
-import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
import org.osgi.service.cm.ConfigurationEvent;
import org.osgi.service.log.Logger;
@@ -136,43 +134,49 @@ public class ConfigurationListener exten
return next.map(next -> (Component)next).map(
component -> {
- component.configurationTemplates().stream().filter(
- ct -> Objects.nonNull(ct.pid)
- ).forEach(
- template -> {
- if (template.maximumCardinality == MaximumCardinality.ONE) {
- containerState.findConfig(template.pid).ifPresent(
- c -> processEvent(
- component,
- template,
- new ConfigurationEvent(
- containerState.caTracker().getServiceReference(),
- ConfigurationEvent.CM_UPDATED,
- null,
- c.getPid()))
- );
- }
- else {
- containerState.findConfigs(template.pid, true).ifPresent(
- arr -> Arrays.stream(arr).forEach(
- c -> processEvent(
+ submit(component.openOp(), component::open).then(
+ s -> {
+ component.configurationTemplates().stream().filter(
+ ct -> Objects.nonNull(ct.pid)
+ ).forEach(
+ template -> {
+ if (template.maximumCardinality == MaximumCardinality.ONE) {
+ containerState.findConfig(template.pid).ifPresent(
+ c -> processEvent(
component,
template,
new ConfigurationEvent(
containerState.caTracker().getServiceReference(),
ConfigurationEvent.CM_UPDATED,
- c.getFactoryPid(),
- c.getPid())))
- );
- }
- }
- );
+ null,
+ c.getPid())
+ )
+ );
+ }
+ else {
+ containerState.findConfigs(template.pid, true).ifPresent(
+ arr -> Arrays.stream(arr).forEach(
+ c -> processEvent(
+ component,
+ template,
+ new ConfigurationEvent(
+ containerState.caTracker().getServiceReference(),
+ ConfigurationEvent.CM_UPDATED,
+ c.getFactoryPid(),
+ c.getPid())
+ )
+ )
+ );
+ }
+ }
+ );
- submit(component.openOp(), component::open).onFailure(
+ return s;
+ },
f -> {
- _log.error(l -> l.error("CCR Failure during configuration start on {}", next, f));
+ _log.error(l -> l.error("CCR Failure during configuration start on {}", next, f.getFailure()));
- error(f);
+ error(f.getFailure());
}
);
@@ -192,87 +196,88 @@ public class ConfigurationListener exten
}
private void processEvent(Component component, ConfigurationTemplateDTO t, ConfigurationEvent event) {
- final AtomicBoolean needToRefresh = new AtomicBoolean(false);
-
- List<ComponentInstanceDTO> instances = component.instances();
-
- instances.stream().forEach(
- instance -> instance.configurations.stream().filter(
- c -> c.template.equals(t)
- ).map(ExtendedConfigurationDTO.class::cast).filter(
- c -> c.pid.equals(event.getPid())
- ).forEach(
- c -> {
- instance.configurations.remove(c);
- needToRefresh.set(true);
- }
- )
- );
+ boolean required = t.policy == ConfigurationPolicy.REQUIRED;
+ boolean single = t.maximumCardinality == MaximumCardinality.ONE;
switch (event.getType()) {
case ConfigurationEvent.CM_DELETED:
- if (t.maximumCardinality == MaximumCardinality.MANY) {
- instances.stream().map(
- instance -> (ExtendedComponentInstanceDTO)instance
- ).filter(
- instance -> event.getPid().equals(instance.pid)
- ).forEach(
- instance -> {
- if (instances.remove(instance)) {
- submit(instance.closeOp(), instance::close).onFailure(
- f -> {
- _log.error(l -> l.error("CCR Error closing {} on {}", instance.ident(), bundle()));
- }
- );
+ component.instances().stream().map(
+ ExtendedComponentInstanceDTO.class::cast
+ ).filter(
+ instance -> (!single && event.getPid().equals(instance.pid)) || single
+ ).forEach(
+ instance -> {
+ submit(instance.closeOp(), instance::close).then(
+ s -> {
+ if (!required) {
+ instance.configurations.removeIf(
+ c -> c.template == t
+ );
+
+ submit(instance.openOp(), instance::open);
+ }
+ else {
+ component.instances().remove(instance);
+ }
+
+ return s;
}
- }
- );
- }
- break;
+ );
+ }
+ );
+ return;
case ConfigurationEvent.CM_LOCATION_CHANGED:
+ break;
case ConfigurationEvent.CM_UPDATED:
- if ((t.maximumCardinality == MaximumCardinality.MANY) &&
- !instances.stream().map(
- instance -> (ExtendedComponentInstanceDTO)instance
+ if (!single &&
+ !component.instances().stream().map(
+ ExtendedComponentInstanceDTO.class::cast
).filter(
instance -> event.getPid().equals(instance.pid)
).findFirst().isPresent()) {
- ExtendedComponentInstanceDTO instanceDTO = new ExtendedComponentInstanceDTO(
+ ExtendedComponentInstanceDTO instance = new ExtendedComponentInstanceDTO(
containerState, _component.activatorBuilder());
- instanceDTO.activations = new CopyOnWriteArrayList<>();
- instanceDTO.configurations = new CopyOnWriteArrayList<>();
- instanceDTO.pid = event.getPid();
- instanceDTO.properties = null;
- instanceDTO.references = new CopyOnWriteArrayList<>();
- instanceDTO.template = component.template();
+ instance.activations = new CopyOnWriteArrayList<>();
+ instance.configurations = new CopyOnWriteArrayList<>();
+ instance.pid = event.getPid();
+ instance.references = new CopyOnWriteArrayList<>();
+ instance.template = component.template();
- instances.add(instanceDTO);
+ component.instances().add(instance);
}
containerState.findConfig(event.getPid()).ifPresent(
configuration -> {
- ExtendedConfigurationDTO configurationDTO2 = new ExtendedConfigurationDTO();
-
- configurationDTO2.configuration = configuration;
- configurationDTO2.pid = event.getPid();
- configurationDTO2.properties = Maps.of(configuration.getProcessedProperties(event.getReference()));
- configurationDTO2.template = t;
+ ExtendedConfigurationDTO configurationDTO = new ExtendedConfigurationDTO();
- instances.stream().forEach(
+ configurationDTO.configuration = configuration;
+ configurationDTO.pid = configuration.getPid();
+ configurationDTO.properties = Maps.of(configuration.getProcessedProperties(event.getReference()));
+ configurationDTO.template = t;
+
+ component.instances().stream().map(
+ ExtendedComponentInstanceDTO.class::cast
+ ).filter(
+ instance -> (!single && event.getPid().equals(instance.pid)) || single
+ ).forEach(
instance -> {
- instance.configurations.add(configurationDTO2);
- needToRefresh.set(true);
+ submit(instance.closeOp(), instance::close).then(
+ s -> {
+ instance.configurations.removeIf(c -> c.template == t);
+ instance.configurations.add(configurationDTO);
+
+ submit(instance.openOp(), instance::open);
+
+ return s;
+ }
+ );
}
);
}
);
break;
}
-
- if (needToRefresh.get()) {
- startComponent(component);
- }
}
private String type(ConfigurationEvent event) {
@@ -285,23 +290,6 @@ public class ConfigurationListener exten
throw new IllegalArgumentException("CM Event type " + event.getType());
}
- private void startComponent(Component component) {
- submit(component.closeOp(), component::close).then(
- s -> submit(component.openOp(), component::open).onFailure(
- f -> {
- _log.error(l -> l.error("CCR Error in configuration listener start on {}", component, f));
-
- error(f);
- }
- ),
- f -> {
- _log.error(l -> l.error("CCR Error in configuration listener close on {}", component, f.getFailure()));
-
- error(f.getFailure());
- }
- );
- }
-
private volatile ServiceRegistration<org.osgi.service.cm.ConfigurationListener> _listenerService;
private final Component _component;
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java Wed Apr 25 13:57:06 2018
@@ -161,8 +161,10 @@ public class ContainerState {
configurationTemplate.maximumCardinality = MaximumCardinality.ONE;
configurationTemplate.pid = Optional.ofNullable(
(String)cdiAttributes.get(CDI_CONTAINER_ID)
+ ).map(
+ s -> s.replaceAll("-", ".")
).orElse(
- "osgi.cdi." + _bundle.getSymbolicName()
+ "osgi.cdi." + _bundle.getSymbolicName().replaceAll("-", ".")
);
configurationTemplate.policy = ConfigurationPolicy.OPTIONAL;
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java Wed Apr 25 13:57:06 2018
@@ -93,12 +93,11 @@ public class ExtensionPhase extends Phas
else {
return next.map(
next -> {
- submit(next.openOp(), next::open).then(
- null,
+ submit(next.openOp(), next::open).onFailure(
f -> {
- _log.error(l -> l.error("CCR Error in extension OPEN on {}", bundle(), f.getFailure()));
+ _log.error(l -> l.error("CCR Error in extension OPEN on {}", bundle(), f));
- error(f.getFailure());
+ error(f);
}
);
@@ -186,27 +185,28 @@ public class ExtensionPhase extends Phas
snapshots().add(extensionDTO);
containerState.incrementChangeCount();
- if (snapshots().size() == extensionTemplates().size()) {
- next.ifPresent(
- next -> submit(next.closeOp(), next::close).then(
- s -> {
- return submit(next.openOp(), next::open).then(
- null,
+ next.ifPresent(
+ next -> submit(next.closeOp(), next::close).then(
+ s -> {
+ if (snapshots().size() == extensionTemplates().size()) {
+ return submit(next.openOp(), next::open).onFailure(
f -> {
- _log.error(l -> l.error("CCR Error in extension open TRACKING {} on {}", reference, bundle(), f.getFailure()));
+ _log.error(l -> l.error("CCR Error in extension open TRACKING {} on {}", reference, bundle(), f));
- error(f.getFailure());
+ error(f);
}
);
- },
- f -> {
- _log.error(l -> l.error("CCR Error extension close TRACKING {} on {}", reference, bundle(), f.getFailure()));
-
- error(f.getFailure());
}
- )
- );
- }
+
+ return s;
+ },
+ f -> {
+ _log.error(l -> l.error("CCR Error extension close TRACKING {} on {}", reference, bundle(), f.getFailure()));
+
+ error(f.getFailure());
+ }
+ )
+ );
return extensionDTO;
}
@@ -244,12 +244,11 @@ public class ExtensionPhase extends Phas
Promise<Boolean> result = submit(next.closeOp(), next::close).then(
s -> {
if (snapshots().size() == extensionTemplates().size()) {
- return submit(next.openOp(), next::open).then(
- null,
+ return submit(next.openOp(), next::open).onFailure(
f -> {
- _log.error(l -> l.error("CCR Error in extension open {} on {}", reference, bundle()));
+ _log.error(l -> l.error("CCR Error in extension open {} on {}", reference, bundle(), f));
- error(f.getFailure());
+ error(f);
}
);
}
@@ -257,7 +256,7 @@ public class ExtensionPhase extends Phas
return s;
},
f -> {
- _log.error(l -> l.error("CCR Error in extension close {} on {}", reference, bundle()));
+ _log.error(l -> l.error("CCR Error in extension close {} on {}", reference, bundle(), f.getFailure()));
error(f.getFailure());
}
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/RuntimeExtension.java Wed Apr 25 13:57:06 2018
@@ -19,7 +19,6 @@ import java.util.Hashtable;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.stream.Collectors;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.spi.Context;
@@ -58,7 +57,6 @@ import org.apache.aries.cdi.container.in
import org.apache.aries.cdi.container.internal.model.OSGiBean;
import org.apache.aries.cdi.container.internal.model.ReferenceModel;
import org.apache.aries.cdi.container.internal.model.SingleComponent;
-import org.apache.aries.cdi.container.internal.util.Conversions;
import org.apache.aries.cdi.container.internal.util.SRs;
import org.osgi.framework.Bundle;
import org.osgi.framework.PrototypeServiceFactory;
@@ -74,7 +72,6 @@ import org.osgi.service.cdi.reference.Bi
import org.osgi.service.cdi.reference.BindServiceObjects;
import org.osgi.service.cdi.reference.BindServiceReference;
import org.osgi.service.cdi.runtime.dto.ComponentDTO;
-import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
import org.osgi.service.log.Logger;
@@ -96,12 +93,6 @@ public class RuntimeExtension implements
_configurationBuilder = configurationBuilder;
_singleBuilder = singleBuilder;
_factoryBuilder = factoryBuilder;
-
- _containerComponentDTO = _containerState.containerDTO().components.stream().filter(
- c -> c.template.type == ComponentType.CONTAINER
- ).findFirst().get();
-
- _containerInstanceDTO = (ExtendedComponentInstanceDTO)_containerComponentDTO.instances.get(0);
}
void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
@@ -137,9 +128,11 @@ public class RuntimeExtension implements
new String[] {BeanManager.class.getName()}, bm,
properties);
+ ComponentDTO componentDTO = _containerState.containerDTO().components.get(0);
+
_containerState.submit(
Op.of(Mode.OPEN, Type.CONTAINER_PUBLISH_SERVICES, _containerState.id()),
- () -> registerServices(_containerComponentDTO, _containerInstanceDTO, bm)
+ () -> registerServices(componentDTO, bm)
).then(
s -> initComponents()
);
@@ -160,8 +153,6 @@ public class RuntimeExtension implements
}
);
- _containerInstanceDTO.activations.clear();
-
_registrations.removeIf(
r -> {
try {
@@ -218,12 +209,14 @@ public class RuntimeExtension implements
}
private void addBeans(ComponentTemplateDTO componentTemplate, AfterBeanDiscovery abd, BeanManager bm) {
+ ComponentDTO componentDTO = _containerState.containerDTO().components.get(0);
+
componentTemplate.references.stream().map(ExtendedReferenceTemplateDTO.class::cast).forEach(
t -> {
ReferenceBean bean = t.bean;
bean.setBeanManager(bm);
if (componentTemplate.type == ComponentType.CONTAINER) {
- _containerInstanceDTO.references.stream().filter(
+ componentDTO.instances.get(0).references.stream().filter(
r -> r.template == t
).findFirst().map(
ExtendedReferenceDTO.class::cast
@@ -248,7 +241,7 @@ public class RuntimeExtension implements
bean.setProperties(componentTemplate.properties);
}
else {
- bean.setProperties(_containerInstanceDTO.properties);
+ bean.setProperties(componentDTO.instances.get(0).properties);
}
}
@@ -273,43 +266,23 @@ public class RuntimeExtension implements
return producerFactory.createProducer(bean);
}
- private Promise<List<Boolean>> initComponents() {
+ private Promise<Boolean> initComponents() {
_containerState.containerDTO().template.components.stream().filter(
t -> t.type != ComponentType.CONTAINER
- ).map(ExtendedComponentTemplateDTO.class::cast).map(
+ ).map(ExtendedComponentTemplateDTO.class::cast).forEach(
this::initComponent
- ).collect(Collectors.toList());
+ );
return null;
}
- private Promise<Boolean> initComponent(ExtendedComponentTemplateDTO componentTemplateDTO) {
- List<ConfigurationDTO> configurations = _containerInstanceDTO.configurations;
-
- if (!configurations.isEmpty()) {
- ConfigurationDTO defaultContainerConfiguration = configurations.get(0);
-
- Boolean enabled = Conversions.convert(
- defaultContainerConfiguration.properties.get(
- componentTemplateDTO.name.concat(".enabled"))
- ).defaultValue(Boolean.TRUE).to(Boolean.class);
-
- if (!enabled) {
- _containerState.containerDTO().components.stream().filter(
- c -> c.template == componentTemplateDTO
- ).findFirst().ifPresent(
- c -> c.enabled = false
- );
-
- return _containerState.promiseFactory().resolved(Boolean.TRUE);
- }
- }
-
+ private void initComponent(ExtendedComponentTemplateDTO componentTemplateDTO) {
if (componentTemplateDTO.type == ComponentType.FACTORY) {
- return initFactoryComponent(componentTemplateDTO);
+ initFactoryComponent(componentTemplateDTO);
+ }
+ else {
+ initSingleComponent(componentTemplateDTO);
}
-
- return initSingleComponent(componentTemplateDTO);
}
private Promise<Boolean> initFactoryComponent(ExtendedComponentTemplateDTO componentTemplateDTO) {
@@ -486,22 +459,20 @@ public class RuntimeExtension implements
return serviceRegistration;
}
- private boolean registerServices(ComponentDTO componentDTO, ExtendedComponentInstanceDTO instance, BeanManager bm) {
+ private boolean registerServices(ComponentDTO componentDTO, BeanManager bm) {
componentDTO.template.activations.stream().map(
ExtendedActivationTemplateDTO.class::cast
).forEach(
- a -> registerService(instance, a, bm)
+ a -> registerService((ExtendedComponentInstanceDTO)componentDTO.instances.get(0), a, bm)
);
return true;
}
- private final ComponentDTO _containerComponentDTO;
private final ConfigurationListener.Builder _configurationBuilder;
private final List<ConfigurationListener> _configurationListeners = new CopyOnWriteArrayList<>();
private final ContainerState _containerState;
private final FactoryComponent.Builder _factoryBuilder;
- private final ExtendedComponentInstanceDTO _containerInstanceDTO;
private final Logger _log;
private final List<ServiceRegistration<?>> _registrations = new CopyOnWriteArrayList<>();
private final SingleComponent.Builder _singleBuilder;
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ContainerComponent.java Wed Apr 25 13:57:06 2018
@@ -14,7 +14,7 @@
package org.apache.aries.cdi.container.internal.model;
-import java.util.Collections;
+import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -22,13 +22,13 @@ import org.apache.aries.cdi.container.in
import org.apache.aries.cdi.container.internal.container.Op;
import org.apache.aries.cdi.container.internal.container.Op.Mode;
import org.apache.aries.cdi.container.internal.container.Op.Type;
-import org.apache.aries.cdi.container.internal.util.Conversions;
+import org.apache.aries.cdi.container.internal.util.Throw;
import org.osgi.service.cdi.runtime.dto.ComponentDTO;
import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
-import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
import org.osgi.service.log.Logger;
+import org.osgi.util.promise.Promise;
public class ContainerComponent extends Component {
@@ -52,32 +52,37 @@ public class ContainerComponent extends
_log = containerState.containerLogs().getLogger(getClass());
_template = builder._templateDTO;
-
- _snapshot = new ComponentDTO();
- _snapshot.instances = new CopyOnWriteArrayList<>();
- _snapshot.template = _template;
-
- _instanceDTO = new ExtendedComponentInstanceDTO(containerState, builder._activatorBuilder);
- _instanceDTO.activations = new CopyOnWriteArrayList<>();
- _instanceDTO.configurations = new CopyOnWriteArrayList<>();
- _instanceDTO.pid = _template.configurations.get(0).pid;
- _instanceDTO.properties = null;
- _instanceDTO.references = new CopyOnWriteArrayList<>();
- _instanceDTO.template = _template;
-
- _snapshot.instances.add(_instanceDTO);
-
- containerState.containerDTO().components.add(_snapshot);
+ _activatorBuilder = builder._activatorBuilder;
}
@Override
public boolean close() {
- submit(_instanceDTO.closeOp(), _instanceDTO::close).onFailure(
- f -> {
- _log.error(l -> l.error("CCR Error in container component close for {} on {}", _template.name, containerState.bundle()));
+ if (_snapshot == null) {
+ return true;
+ }
+
+ _snapshot.instances.removeIf(
+ instance -> {
+ ExtendedComponentInstanceDTO einstance = (ExtendedComponentInstanceDTO)instance;
+
+ Promise<Boolean> result = submit(einstance.closeOp(), einstance::close).onFailure(
+ f -> {
+ _log.error(l -> l.error("CCR Error in container component close for {} on {}", einstance.ident(), bundle(), f));
+ }
+ );
+
+ try {
+ return result.getValue();
+ }
+ catch (InvocationTargetException | InterruptedException e) {
+ return Throw.exception(e);
+ }
}
);
+ containerState.containerDTO().components.remove(_snapshot);
+ _snapshot = null;
+
return true;
}
@@ -93,27 +98,28 @@ public class ContainerComponent extends
@Override
public List<ComponentInstanceDTO> instances() {
- return Collections.singletonList(_instanceDTO);
+ return _snapshot.instances;
}
@Override
public boolean open() {
- List<ConfigurationDTO> configurations = _instanceDTO.configurations;
+ _snapshot = new ComponentDTO();
+ _snapshot.instances = new CopyOnWriteArrayList<>();
+ _snapshot.template = _template;
- if (!configurations.isEmpty()) {
- ConfigurationDTO defaultContainerConfiguration = configurations.get(0);
+ containerState.containerDTO().components.add(_snapshot);
- Boolean enabled = Conversions.convert(
- defaultContainerConfiguration.properties.get(
- _template.name.concat(".enabled"))
- ).defaultValue(Boolean.TRUE).to(Boolean.class);
+ ExtendedComponentInstanceDTO instanceDTO = new ExtendedComponentInstanceDTO(
+ containerState, _activatorBuilder);
- if (!enabled) {
- return _snapshot.enabled = false;
- }
- }
+ instanceDTO.activations = new CopyOnWriteArrayList<>();
+ instanceDTO.configurations = new CopyOnWriteArrayList<>();
+ instanceDTO.references = new CopyOnWriteArrayList<>();
+ instanceDTO.template = _template;
- submit(_instanceDTO.openOp(), _instanceDTO::open).onFailure(
+ _snapshot.instances.add(instanceDTO);
+
+ submit(instanceDTO.openOp(), instanceDTO::open).onFailure(
f -> {
_log.error(l -> l.error("CCR Error in container component open for {} on {}", _template.name, containerState.bundle()));
}
@@ -137,10 +143,9 @@ public class ContainerComponent extends
return _template;
}
-
- private final ExtendedComponentInstanceDTO _instanceDTO;
+ private final InstanceActivator.Builder<?> _activatorBuilder;
private final Logger _log;
- private final ComponentDTO _snapshot;
+ private volatile ComponentDTO _snapshot;
private final ComponentTemplateDTO _template;
}
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/ExtendedComponentInstanceDTO.java Wed Apr 25 13:57:06 2018
@@ -30,8 +30,10 @@ import org.apache.aries.cdi.container.in
import org.apache.aries.cdi.container.internal.container.Op.Mode;
import org.apache.aries.cdi.container.internal.container.Op.Type;
import org.apache.aries.cdi.container.internal.container.ReferenceSync;
+import org.apache.aries.cdi.container.internal.util.Conversions;
import org.osgi.framework.Constants;
import org.osgi.service.cdi.ConfigurationPolicy;
+import org.osgi.service.cdi.runtime.dto.ComponentDTO;
import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
import org.osgi.service.cdi.runtime.dto.ReferenceDTO;
@@ -152,6 +154,28 @@ public class ExtendedComponentInstanceDT
return false;
}
+ ConfigurationDTO containerConfiguration = containerConfiguration();
+
+ if (containerConfiguration != null) {
+ Boolean enabled = Conversions.convert(
+ containerConfiguration.properties.get(
+ template.name.concat(".enabled"))
+ ).defaultValue(Boolean.TRUE).to(Boolean.class);
+
+ if (!enabled) {
+ _containerState.containerDTO().components.stream().filter(
+ c -> c.template == template
+ ).forEach(c -> c.enabled = false);
+
+ return false;
+ }
+ else {
+ _containerState.containerDTO().components.stream().filter(
+ c -> c.template == template
+ ).forEach(c -> c.enabled = true);
+ }
+ }
+
properties = componentProperties(null);
template.references.stream().map(ExtendedReferenceTemplateDTO.class::cast).forEach(
@@ -215,6 +239,28 @@ public class ExtendedComponentInstanceDT
return true;
}
+ private ConfigurationDTO containerConfiguration() {
+ List<ComponentDTO> components = _containerState.containerDTO().components;
+
+ if (components.isEmpty()) {
+ return null;
+ }
+
+ List<ComponentInstanceDTO> instances = components.get(0).instances;
+
+ if (instances.isEmpty()) {
+ return null;
+ }
+
+ List<ConfigurationDTO> configurations = instances.get(0).configurations;
+
+ if (configurations.isEmpty()) {
+ return null;
+ }
+
+ return configurations.get(0);
+ }
+
public Op openOp() {
return Op.of(Mode.OPEN, getType(), ident());
}
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/FactoryComponent.java Wed Apr 25 13:57:06 2018
@@ -14,7 +14,7 @@
package org.apache.aries.cdi.container.internal.model;
-import java.util.Arrays;
+import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -22,12 +22,13 @@ import org.apache.aries.cdi.container.in
import org.apache.aries.cdi.container.internal.container.Op;
import org.apache.aries.cdi.container.internal.container.Op.Mode;
import org.apache.aries.cdi.container.internal.container.Op.Type;
-import org.osgi.service.cdi.MaximumCardinality;
+import org.apache.aries.cdi.container.internal.util.Throw;
import org.osgi.service.cdi.runtime.dto.ComponentDTO;
import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
import org.osgi.service.log.Logger;
+import org.osgi.util.promise.Promise;
public class FactoryComponent extends Component {
@@ -47,53 +48,39 @@ public class FactoryComponent extends Co
protected FactoryComponent(Builder builder) {
super(builder);
- _log = containerState.containerLogs().getLogger(getClass());
-
_template = builder._templateDTO;
-
- _snapshot = new ComponentDTO();
- _snapshot.instances = new CopyOnWriteArrayList<>();
- _snapshot.template = _template;
-
- containerState.containerDTO().components.add(_snapshot);
-
- configurationTemplates().stream().filter(
- t -> t.maximumCardinality == MaximumCardinality.MANY
- ).forEach(
- t -> {
- containerState.findConfigs(t.pid, true).ifPresent(
- arr -> Arrays.stream(arr).forEach(
- c -> {
- ExtendedComponentInstanceDTO instanceDTO = new ExtendedComponentInstanceDTO(containerState, builder._activatorBuilder);
- instanceDTO.activations = new CopyOnWriteArrayList<>();
- instanceDTO.configurations = new CopyOnWriteArrayList<>();
- instanceDTO.pid = c.getPid();
- instanceDTO.properties = null;
- instanceDTO.references = new CopyOnWriteArrayList<>();
- instanceDTO.template = builder._templateDTO;
-
- _snapshot.instances.add(instanceDTO);
- }
- )
- );
- }
- );
+ _log = containerState.containerLogs().getLogger(getClass());
}
@Override
public boolean close() {
- _snapshot.instances.stream().map(
- instance -> (ExtendedComponentInstanceDTO)instance
- ).forEach(
+ if (_snapshot == null) {
+ return true;
+ }
+
+ _snapshot.instances.removeIf(
instance -> {
- submit(instance.closeOp(), instance::close).onFailure(
+ ExtendedComponentInstanceDTO einstance = (ExtendedComponentInstanceDTO)instance;
+
+ Promise<Boolean> result = submit(einstance.closeOp(), einstance::close).onFailure(
f -> {
- _log.error(l -> l.error("CCR Error in factory component close for {} on {}", instance.ident(), containerState.bundle()));
+ _log.error(l -> l.error("CCR Error in factory component close for {} on {}", einstance.ident(), bundle(), f));
}
);
+
+ try {
+ return result.getValue();
+ }
+ catch (InvocationTargetException | InterruptedException e) {
+ return Throw.exception(e);
+ }
}
);
+ containerState.containerDTO().components.remove(_snapshot);
+
+ _snapshot = null;
+
return true;
}
@@ -119,21 +106,11 @@ public class FactoryComponent extends Co
@Override
public boolean open() {
- if (!snapshot().enabled || !containerState.containerDTO().components.get(0).enabled) {
- return false;
- }
+ _snapshot = new ComponentDTO();
+ _snapshot.instances = new CopyOnWriteArrayList<>();
+ _snapshot.template = _template;
- _snapshot.instances.stream().map(
- instance -> (ExtendedComponentInstanceDTO)instance
- ).forEach(
- instance -> {
- submit(instance.openOp(), instance::open).onFailure(
- f -> {
- _log.error(l -> l.error("CCR Error in factory component open for {} on {}", instance.ident(), containerState.bundle()));
- }
- );
- }
- );
+ containerState.containerDTO().components.add(_snapshot);
return true;
}
@@ -149,7 +126,7 @@ public class FactoryComponent extends Co
}
private final Logger _log;
- private final ComponentDTO _snapshot;
+ private volatile ComponentDTO _snapshot;
private final ComponentTemplateDTO _template;
}
Modified: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java (original)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/model/SingleComponent.java Wed Apr 25 13:57:06 2018
@@ -14,18 +14,20 @@
package org.apache.aries.cdi.container.internal.model;
-import java.util.Collections;
+import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.aries.cdi.container.internal.container.ContainerState;
import org.apache.aries.cdi.container.internal.container.Op;
import org.apache.aries.cdi.container.internal.container.Op.Mode;
+import org.apache.aries.cdi.container.internal.util.Throw;
import org.osgi.service.cdi.runtime.dto.ComponentDTO;
import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
import org.osgi.service.log.Logger;
+import org.osgi.util.promise.Promise;
public class SingleComponent extends Component {
@@ -45,35 +47,40 @@ public class SingleComponent extends Com
protected SingleComponent(Builder builder) {
super(builder);
- _log = containerState.containerLogs().getLogger(getClass());
-
_template = builder._templateDTO;
-
- _snapshot = new ComponentDTO();
- _snapshot.instances = new CopyOnWriteArrayList<>();
- _snapshot.template = _template;
-
- _instanceDTO = new ExtendedComponentInstanceDTO(containerState, builder._activatorBuilder);
- _instanceDTO.activations = new CopyOnWriteArrayList<>();
- _instanceDTO.configurations = new CopyOnWriteArrayList<>();
- _instanceDTO.pid = _template.configurations.get(0).pid;
- _instanceDTO.properties = null;
- _instanceDTO.references = new CopyOnWriteArrayList<>();
- _instanceDTO.template = builder._templateDTO;
-
- _snapshot.instances.add(_instanceDTO);
-
- containerState.containerDTO().components.add(_snapshot);
+ _activatorBuilder = builder._activatorBuilder;
+ _log = containerState.containerLogs().getLogger(getClass());
}
@Override
public boolean close() {
- submit(_instanceDTO.closeOp(), _instanceDTO::close).onFailure(
- f -> {
- _log.error(l -> l.error("CCR Error in single component close for {} on {}", _instanceDTO.ident(), containerState.bundle()));
+ if (_snapshot == null) {
+ return true;
+ }
+
+ _snapshot.instances.removeIf(
+ instance -> {
+ ExtendedComponentInstanceDTO einstance = (ExtendedComponentInstanceDTO)instance;
+
+ Promise<Boolean> result = submit(einstance.closeOp(), einstance::close).onFailure(
+ f -> {
+ _log.error(l -> l.error("CCR Error in single component close for {} on {}", einstance.ident(), bundle(), f));
+ }
+ );
+
+ try {
+ return result.getValue();
+ }
+ catch (InvocationTargetException | InterruptedException e) {
+ return Throw.exception(e);
+ }
}
);
+ containerState.containerDTO().components.remove(_snapshot);
+
+ _snapshot = null;
+
return true;
}
@@ -89,7 +96,7 @@ public class SingleComponent extends Com
@Override
public List<ComponentInstanceDTO> instances() {
- return Collections.singletonList(_instanceDTO);
+ return _snapshot.instances;
}
@Override
@@ -99,13 +106,24 @@ public class SingleComponent extends Com
@Override
public boolean open() {
- if (!snapshot().enabled || !containerState.containerDTO().components.get(0).enabled) {
- return false;
- }
+ _snapshot = new ComponentDTO();
+ _snapshot.instances = new CopyOnWriteArrayList<>();
+ _snapshot.template = _template;
+
+ containerState.containerDTO().components.add(_snapshot);
+
+ ExtendedComponentInstanceDTO instanceDTO = new ExtendedComponentInstanceDTO(
+ containerState, _activatorBuilder);
+ instanceDTO.activations = new CopyOnWriteArrayList<>();
+ instanceDTO.configurations = new CopyOnWriteArrayList<>();
+ instanceDTO.references = new CopyOnWriteArrayList<>();
+ instanceDTO.template = _template;
+
+ _snapshot.instances.add(instanceDTO);
- submit(_instanceDTO.openOp(), _instanceDTO::open).onFailure(
+ submit(instanceDTO.openOp(), instanceDTO::open).onFailure(
f -> {
- _log.error(l -> l.error("CCR Error in single component open for {} on {}", _instanceDTO.ident(), containerState.bundle()));
+ _log.error(l -> l.error("CCR Error in single component open for {} on {}", instanceDTO.ident(), containerState.bundle()));
}
);
@@ -122,9 +140,9 @@ public class SingleComponent extends Com
return _template;
}
- private final ExtendedComponentInstanceDTO _instanceDTO;
+ private final InstanceActivator.Builder<?> _activatorBuilder;
private final Logger _log;
- private final ComponentDTO _snapshot;
+ private volatile ComponentDTO _snapshot;
private final ComponentTemplateDTO _template;
}
Added: aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java?rev=1830079&view=auto
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java (added)
+++ aries/trunk/cdi/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/util/DTOs.java Wed Apr 25 13:57:06 2018
@@ -0,0 +1,285 @@
+package org.apache.aries.cdi.container.internal.util;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.osgi.service.cdi.runtime.dto.ActivationDTO;
+import org.osgi.service.cdi.runtime.dto.ComponentDTO;
+import org.osgi.service.cdi.runtime.dto.ComponentInstanceDTO;
+import org.osgi.service.cdi.runtime.dto.ConfigurationDTO;
+import org.osgi.service.cdi.runtime.dto.ContainerDTO;
+import org.osgi.service.cdi.runtime.dto.ExtensionDTO;
+import org.osgi.service.cdi.runtime.dto.ReferenceDTO;
+import org.osgi.service.cdi.runtime.dto.template.ActivationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ComponentTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ConfigurationTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ContainerTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ExtensionTemplateDTO;
+import org.osgi.service.cdi.runtime.dto.template.ReferenceTemplateDTO;
+
+public class DTOs {
+
+ private DTOs() {
+ // no instances
+ }
+
+ public static ContainerDTO copy(ContainerDTO original, boolean clear) {
+ try {
+ return (ContainerDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+ finally {
+ if (clear)
+ cache.remove();
+ }
+ }
+
+ static ContainerDTO copy0(ContainerDTO original) {
+ ContainerDTO copy = new ContainerDTO();
+ copy.bundle = original.bundle;
+ copy.changeCount = original.changeCount;
+ copy.errors = new ArrayList<>(original.errors);
+ copy.template = copy(original.template, false);
+ copy.extensions = copy(original.extensions);
+ copy.components = copy(original.components);
+ return copy;
+ }
+
+ static ExtensionDTO copy(ExtensionDTO original) {
+ return (ExtensionDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ExtensionDTO copy0(ExtensionDTO original) {
+ ExtensionDTO copy = new ExtensionDTO();
+ copy.service = original.service;
+ copy.template = copy(original.template);
+ return copy;
+ }
+
+ static ComponentDTO copy(ComponentDTO original) {
+ return (ComponentDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ComponentDTO copy0(ComponentDTO original) {
+ ComponentDTO copy = new ComponentDTO();
+ copy.enabled = original.enabled;
+ copy.instances = copy(original.instances);
+ copy.template = copy(original.template);
+ return copy;
+ }
+
+ static ComponentInstanceDTO copy(ComponentInstanceDTO original) {
+ return (ComponentInstanceDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ComponentInstanceDTO copy0(ComponentInstanceDTO original) {
+ ComponentInstanceDTO copy = new ComponentInstanceDTO();
+ copy.activations = copy(original.activations);
+ copy.configurations = copy(original.configurations);
+ copy.properties = original.properties == null ? null : new HashMap<>(original.properties);
+ copy.references = copy(original.references);
+ return copy;
+ }
+
+ static ActivationDTO copy(ActivationDTO original) {
+ return (ActivationDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ActivationDTO copy0(ActivationDTO original) {
+ ActivationDTO copy = new ActivationDTO();
+ copy.errors = new ArrayList<>(original.errors);
+ copy.service = original.service;
+ copy.template = copy(original.template);
+ return copy;
+ }
+
+ static ConfigurationDTO copy(ConfigurationDTO original) {
+ return (ConfigurationDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ConfigurationDTO copy0(ConfigurationDTO original) {
+ ConfigurationDTO copy = new ConfigurationDTO();
+ copy.properties = original.properties == null ? null : new HashMap<>(original.properties);
+ copy.template = copy(original.template);
+ return copy;
+ }
+
+ static ReferenceDTO copy(ReferenceDTO original) {
+ return (ReferenceDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ReferenceDTO copy0(ReferenceDTO original) {
+ ReferenceDTO copy = new ReferenceDTO();
+ copy.matches = new ArrayList<>(original.matches);
+ copy.minimumCardinality = original.minimumCardinality;
+ copy.targetFilter = original.targetFilter;
+ copy.template = copy(original.template);
+ return copy;
+ }
+
+ public static ContainerTemplateDTO copy(ContainerTemplateDTO original, boolean clear) {
+ try {
+ return (ContainerTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+ finally {
+ if (clear)
+ cache.remove();
+ }
+ }
+
+ static ContainerTemplateDTO copy0(ContainerTemplateDTO original) {
+ ContainerTemplateDTO copy = new ContainerTemplateDTO();
+ copy.components = copy(original.components);
+ copy.extensions = copy(original.extensions);
+ copy.id = original.id;
+ return copy;
+ }
+
+ static ComponentTemplateDTO copy(ComponentTemplateDTO original) {
+ return (ComponentTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ComponentTemplateDTO copy0(ComponentTemplateDTO original) {
+ ComponentTemplateDTO copy = new ComponentTemplateDTO();
+ copy.activations = copy(original.activations);
+ copy.beans = new ArrayList<>(original.beans);
+ copy.configurations = copy(original.configurations);
+ copy.name = original.name;
+ copy.properties = original.properties == null ? null : new HashMap<>(original.properties);
+ copy.references = copy(original.references);
+ copy.type = original.type;
+ return copy;
+ }
+
+ static ExtensionTemplateDTO copy(ExtensionTemplateDTO original) {
+ return (ExtensionTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ExtensionTemplateDTO copy0(ExtensionTemplateDTO original) {
+ ExtensionTemplateDTO copy = new ExtensionTemplateDTO();
+ copy.serviceFilter = original.serviceFilter;
+ return copy;
+ }
+
+ static ActivationTemplateDTO copy(ActivationTemplateDTO original) {
+ return (ActivationTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ActivationTemplateDTO copy0(ActivationTemplateDTO original) {
+ ActivationTemplateDTO copy = new ActivationTemplateDTO();
+ copy.properties = original.properties == null ? null : new HashMap<>(original.properties);
+ copy.scope = original.scope;
+ copy.serviceClasses = new ArrayList<>(original.serviceClasses);
+ return copy;
+ }
+
+ static ConfigurationTemplateDTO copy(ConfigurationTemplateDTO original) {
+ return (ConfigurationTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ConfigurationTemplateDTO copy0(ConfigurationTemplateDTO original) {
+ ConfigurationTemplateDTO copy = new ConfigurationTemplateDTO();
+ copy.componentConfiguration = original.componentConfiguration;
+ copy.maximumCardinality = original.maximumCardinality;
+ copy.pid = original.pid;
+ copy.policy = original.policy;
+ return copy;
+ }
+
+ static ReferenceTemplateDTO copy(ReferenceTemplateDTO original) {
+ return (ReferenceTemplateDTO)cache.get().computeIfAbsent(original, o -> {
+ return copy0(original);
+ });
+ }
+
+ static ReferenceTemplateDTO copy0(ReferenceTemplateDTO original) {
+ ReferenceTemplateDTO copy = new ReferenceTemplateDTO();
+ copy.maximumCardinality = original.maximumCardinality;
+ copy.minimumCardinality = original.minimumCardinality;
+ copy.name = original.name;
+ copy.policy = original.policy;
+ copy.policyOption = original.policyOption;
+ copy.serviceType = original.serviceType;
+ copy.targetFilter = original.targetFilter;
+ return copy;
+ }
+
+ @SuppressWarnings("unchecked")
+ static <T> T copy(T original) {
+ if (original instanceof ActivationDTO) {
+ return (T)copy((ActivationDTO)original);
+ }
+ else if (original instanceof ActivationTemplateDTO) {
+ return (T)copy((ActivationTemplateDTO)original);
+ }
+ else if (original instanceof ComponentDTO) {
+ return (T)copy((ComponentDTO)original);
+ }
+ else if (original instanceof ComponentInstanceDTO) {
+ return (T)copy((ComponentInstanceDTO)original);
+ }
+ else if (original instanceof ComponentTemplateDTO) {
+ return (T)copy((ComponentTemplateDTO)original);
+ }
+ else if (original instanceof ConfigurationDTO) {
+ return (T)copy((ConfigurationDTO)original);
+ }
+ else if (original instanceof ConfigurationTemplateDTO) {
+ return (T)copy((ConfigurationTemplateDTO)original);
+ }
+ else if (original instanceof ContainerDTO) {
+ return (T)copy((ContainerDTO)original);
+ }
+ else if (original instanceof ContainerTemplateDTO) {
+ return (T)copy((ContainerTemplateDTO)original);
+ }
+ else if (original instanceof ExtensionDTO) {
+ return (T)copy((ExtensionDTO)original);
+ }
+ else if (original instanceof ExtensionTemplateDTO) {
+ return (T)copy((ExtensionTemplateDTO)original);
+ }
+ else if (original instanceof ReferenceDTO) {
+ return (T)copy((ReferenceDTO)original);
+ }
+ else if (original instanceof ReferenceTemplateDTO) {
+ return (T)copy((ReferenceTemplateDTO)original);
+ }
+
+ return null;
+ }
+
+ static <T> List<T> copy(List<T> original) {
+ return original.stream().map(t -> copy(t)).collect(Collectors.toList());
+ }
+
+ private static final ThreadLocal<Map<Object, Object>> cache =
+ ThreadLocal.withInitial(() -> new HashMap<>());
+
+}
Modified: aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java (original)
+++ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ConfigurationListenerTest.java Wed Apr 25 13:57:06 2018
@@ -67,7 +67,7 @@ public class ConfigurationListenerTest e
Promise<Boolean> p0 = containerState.addCallback(
(CheckedCallback<Boolean, Boolean>) op -> {
- return op.mode == Op.Mode.OPEN && op.type == Op.Type.CONTAINER_COMPONENT;
+ return op.mode == Op.Mode.OPEN && op.type == Op.Type.CONTAINER_INSTANCE;
}
);
@@ -125,7 +125,7 @@ public class ConfigurationListenerTest e
listener.get().configurationEvent(
new ConfigurationEvent(caTracker.getServiceReference(), ConfigurationEvent.CM_UPDATED, null, pid));
- p2.timeout(200).getValue();
+ p2.timeout(200).getFailure();
assertNotNull(containerState.containerDTO().components.get(0).instances.get(0).properties);
assertEquals("bar", containerState.containerDTO().components.get(0).instances.get(0).properties.get("foo"));
@@ -139,7 +139,7 @@ public class ConfigurationListenerTest e
listener.get().configurationEvent(
new ConfigurationEvent(caTracker.getServiceReference(), ConfigurationEvent.CM_UPDATED, null, "foo.config"));
- p3.timeout(200).getValue();
+ p3.timeout(200).getFailure();
Map<String, Object> properties = containerState.containerDTO().components.get(0).instances.get(0).properties;
assertNotNull(properties);
Modified: aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java (original)
+++ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerBootstrapTest.java Wed Apr 25 13:57:06 2018
@@ -82,7 +82,7 @@ public class ContainerBootstrapTest exte
ExtendedComponentInstanceDTO componentInstanceDTO = new ExtendedComponentInstanceDTO(containerState, new ContainerActivator.Builder(containerState, containerBootstrap));
componentInstanceDTO.activations = new CopyOnWriteArrayList<>();
componentInstanceDTO.configurations = new CopyOnWriteArrayList<>();
- componentInstanceDTO.pid = componentDTO.template.configurations.get(0).pid;
+ //componentInstanceDTO.pid = componentDTO.template.configurations.get(0).pid;
componentInstanceDTO.properties = null;
componentInstanceDTO.references = new CopyOnWriteArrayList<>();
componentInstanceDTO.template = componentDTO.template;
Modified: aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java (original)
+++ aries/trunk/cdi/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ContainerReferencesTest.java Wed Apr 25 13:57:06 2018
@@ -90,7 +90,7 @@ public class ContainerReferencesTest ext
Promise<Boolean> p0 = containerState.addCallback(
(CheckedCallback<Boolean, Boolean>) op -> {
- return op.mode == Op.Mode.OPEN && op.type == Op.Type.CONTAINER_COMPONENT;
+ return op.mode == Op.Mode.OPEN && op.type == Op.Type.REFERENCES;
}
);
@@ -102,7 +102,7 @@ public class ContainerReferencesTest ext
assertTrue(containerDTO.errors + "", containerDTO.errors.isEmpty());
assertNotNull(containerDTO.template);
- p0.getValue();
+ p0.timeout(500).getValue();
ComponentDTO componentDTO = containerDTO.components.stream().filter(
c -> c.template.type == ComponentType.CONTAINER
Modified: aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java
URL: http://svn.apache.org/viewvc/aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java?rev=1830079&r1=1830078&r2=1830079&view=diff
==============================================================================
--- aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java (original)
+++ aries/trunk/cdi/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/DisableComponentTests.java Wed Apr 25 13:57:06 2018
@@ -63,7 +63,7 @@ public class DisableComponentTests exten
Configuration configurationA = null;
try {
- configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi-itests.tb8", "?");
+ configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi.itests.tb8", "?");
Dictionary<String, Object> p1 = new Hashtable<>();
p1.put("cdi-itests.tb8.enabled", false);
@@ -71,7 +71,7 @@ public class DisableComponentTests exten
configurationA.update(p1);
for (int i = 20; (i > 0) && (!tracker.isEmpty()); i--) {
- Thread.sleep(200);
+ Thread.sleep(20);
}
pojo = tracker.getService();
@@ -121,7 +121,7 @@ public class DisableComponentTests exten
Configuration configurationA = null;
try {
- configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi-itests.tb8", "?");
+ configurationA = configurationAdmin.getConfiguration("osgi.cdi.cdi.itests.tb8", "?");
Dictionary<String, Object> p1 = new Hashtable<>();
p1.put("singleComponentBean.enabled", false);
@@ -141,7 +141,7 @@ public class DisableComponentTests exten
configurationA.update(p1);
- for (int i = 10; (i > 0) && (tracker.isEmpty()); i--) {
+ for (int i = 20; (i > 0) && (tracker.isEmpty()); i--) {
Thread.sleep(20);
}