in cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ReferenceSync.java [131:178]
public void removedService(ServiceReference<Object> reference, Object service) {
boolean active = _componentInstanceDTO.active;
boolean resolved = (_referenceDTO.matches.size() >= _templateDTO.minimumCardinality);
boolean dynamic = (_templateDTO.policy == ReferencePolicy.DYNAMIC);
CollectionType collectionType = _templateDTO.collectionType;
boolean requiresUpdate = true;
if (resolved && active && dynamic) {
requiresUpdate = false;
}
try (Syncro open = _syncro.open()) {
_referenceDTO.matches.removeIf(d -> SRs.id(reference) == d.id);
if (collectionType == CollectionType.BINDER_SERVICE ||
collectionType == CollectionType.BINDER_REFERENCE ||
collectionType == CollectionType.BINDER_BEAN_SERVICE_OBJECTS) {
requiresUpdate = false;
_referenceDTO.binder.removedService(reference);
return;
}
else if (collectionType == CollectionType.PROPERTIES) {
return;
}
else if (collectionType == CollectionType.REFERENCE) {
return;
}
else if (collectionType == CollectionType.SERVICEOBJECTS) {
((BeanServiceObjectsImpl<Object>)service).close();
return;
}
_containerState.bundleContext().ungetService(reference);
}
finally {
if (requiresUpdate) {
InstanceActivator activator = _builder.setInstance(
_componentInstanceDTO
).build();
updateStatically(activator);
}
}
}