in src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java [245:347]
private void unregister(final ResourceProviderInfo info, final String pid) {
final boolean isInvalid;
synchronized ( this.invalidProviders ) {
isInvalid = this.invalidProviders.remove(info) != null;
}
if ( !isInvalid ) {
logger.debug("Unregistering resource provider {}", info);
// 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 ) {
deactivateHandler = h;
} else {
h.dispose();
}
if (matchingHandlers.isEmpty()) {
this.handlers.remove(info.getPath());
}
storage = null;
break;
}
first = false;
}
}
}
if ( deactivateHandler != null ) {
final List<ProviderEvent> events = new ArrayList<>();
final ChangeListener cl = this.listener;
if ( cl != null ) {
cl.providerRemoved(info.getName(), pid,
info.getAuthType() != AuthType.no,
deactivateHandler.isUsed());
}
this.deactivate(deactivateHandler);
deactivateHandler.dispose();
// check if we can activate another handler
ResourceProviderHandler addingProvider = null;
synchronized ( this.handlers ) {
final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
if ( matchingHandlers != null ) {
if ( matchingHandlers.isEmpty() ) {
this.handlers.remove(info.getPath());
} else {
addingProvider = matchingHandlers.get(0);
}
}
}
boolean providerAdded = false;
while ( addingProvider != null ) {
if (this.activate(addingProvider)) {
events.add(new ProviderEvent(true, addingProvider.getInfo()));
providerAdded = true;
addingProvider = null;
synchronized ( this.handlers ) {
this.storage = null;
}
} else {
synchronized ( this.handlers ) {
final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
if ( matchingHandlers != null && !matchingHandlers.isEmpty() ) {
if ( matchingHandlers.get(0) == addingProvider ) {
this.storage = null;
matchingHandlers.remove(0);
addingProvider.dispose();
if ( matchingHandlers.isEmpty() ) {
this.handlers.remove(info.getPath());
addingProvider = null;
} else {
addingProvider = matchingHandlers.get(0);
}
}
}
}
}
}
if ( providerAdded && cl != null ) {
if ( cl != null ) {
cl.providerAdded();
}
}
events.add(new ProviderEvent(false,info));
this.postEvents(events);
}
} else {
logger.debug("Unregistering invalid resource provider {}", info);
}
}