in src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java [264:313]
private void remove(final ResourceProviderInfo info) {
final List<ProviderEvent> events = new ArrayList<>();
// remove provider from handlers and if the provider is active (first handler)
// keep the reference for deactivation
ResourceProviderHandler deactivateHandler = null;
synchronized (this.handlers) {
final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
if (matchingHandlers != null) {
final Iterator<ResourceProviderHandler> it = matchingHandlers.iterator();
boolean first = true;
while (it.hasNext()) {
final ResourceProviderHandler h = it.next();
if (h.getInfo() == info) {
it.remove();
if (first) {
this.storage = null;
deactivateHandler = h;
}
if (matchingHandlers.isEmpty()) {
this.handlers.remove(info.getPath());
}
break;
}
first = false;
}
}
if (deactivateHandler != null) {
this.deactivate(deactivateHandler);
events.add(new ProviderEvent(false, info));
// check if we can activate another handler
if (!matchingHandlers.isEmpty()) {
final ResourceProviderHandler addingProvider = matchingHandlers.get(0);
this.activate(addingProvider);
events.add(new ProviderEvent(true, addingProvider.getInfo()));
}
}
}
// update change listener (only once)
final ChangeListener cl = this.listener;
if (cl != null && deactivateHandler != null) {
cl.providerRemoved(info.getAuthType() != AuthType.no, deactivateHandler.isUsed());
}
// send events
this.postEvents(events);
}