in cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ConfigurationListener.java [220:303]
private void processEvent(Component component, ConfigurationTemplateDTO t, ConfigurationEvent event) {
boolean required = t.policy == ConfigurationPolicy.REQUIRED;
boolean single = t.maximumCardinality == MaximumCardinality.ONE;
switch (event.getType()) {
case ConfigurationEvent.CM_DELETED:
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;
}
);
}
);
return;
case ConfigurationEvent.CM_LOCATION_CHANGED:
break;
case ConfigurationEvent.CM_UPDATED:
if (!single &&
!component.instances().stream().map(
ExtendedComponentInstanceDTO.class::cast
).filter(
instance -> event.getPid().equals(instance.pid)
).findFirst().isPresent()) {
ExtendedComponentInstanceDTO instance = new ExtendedComponentInstanceDTO(
containerState, _component.activatorBuilder());
instance.activations = new CopyOnWriteArrayList<>();
instance.configurations = new CopyOnWriteArrayList<>();
instance.pid = event.getPid();
instance.references = new CopyOnWriteArrayList<>();
instance.template = component.template();
component.instances().add(instance);
}
containerState.findConfig(event.getPid()).ifPresent(
configuration -> {
ExtendedConfigurationDTO configurationDTO = new ExtendedConfigurationDTO();
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 -> {
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;
}
}