in cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ExtensionPhase.java [163:236]
public ExtendedExtensionDTO addingService(ServiceReference<Extension> reference) {
if (!Perms.hasExtensionServicePermission(containerState.bundleContext())) {
return null;
}
ExtendedExtensionTemplateDTO template = extensionTemplates().stream().map(
t -> (ExtendedExtensionTemplateDTO)t
).filter(
t -> t.filter.match(reference)
).findFirst().orElseGet(() -> {
if (implicitFilter.match(reference)) {
ExtendedExtensionTemplateDTO implicitTemplate = new ExtendedExtensionTemplateDTO();
implicitTemplate.filter = asFilter("(&(aries.cdi.extension.mode=implicit)(service.id=%s))", reference.getProperty(Constants.SERVICE_ID));
implicitTemplate.serviceFilter = implicitTemplate.filter.toString();
return implicitTemplate;
}
return null;
});
ExtendedExtensionDTO snapshot = snapshots().stream().map(
s -> (ExtendedExtensionDTO)s
).filter(
s -> s.template == template
).findFirst().orElse(null);
if (snapshot != null) {
if (reference.compareTo(snapshot.serviceReference) <= 0) {
return null;
}
if (snapshots().remove(snapshot)) {
_references.add(snapshot);
snapshot.extension = null;
containerState.bundleContext().ungetService(snapshot.serviceReference);
}
}
ExtendedExtensionDTO extensionDTO = new ExtendedExtensionDTO();
BundleContext bc = containerState.bundleContext();
extensionDTO.extension = bc.getServiceObjects(reference);
extensionDTO.service = SRs.from(reference);
extensionDTO.serviceReference = reference;
extensionDTO.template = template;
snapshots().add(extensionDTO);
containerState.incrementChangeCount();
next.ifPresent(
next -> submit(next.closeOp(), next::close).then(
s -> {
if (extensionTemplates().stream().allMatch(tmpl -> snapshots().stream().anyMatch(ext -> ext.template == tmpl))) {
return submit(next.openOp(), next::open).onFailure(
f -> {
_log.error(l -> l.error("CCR Error in extension open TRACKING {} on {}", reference, bundle(), f));
error(f);
}
);
}
return s;
},
f -> {
_log.error(l -> l.error("CCR Error extension close TRACKING {} on {}", reference, bundle(), f.getFailure()));
error(f.getFailure());
}
)
);
return extensionDTO;
}