in src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java [220:258]
private void add(final ResourceProviderHandler handler) {
final List<ProviderEvent> events = new ArrayList<>();
boolean providerAdded = false;
ResourceProviderHandler deactivateHandler = null;
// update list of active handlers
synchronized (this.handlers) {
final List<ResourceProviderHandler> matchingHandlers =
this.handlers.computeIfAbsent(handler.getInfo().getPath(), key -> new ArrayList<>());
matchingHandlers.add(handler);
Collections.sort(matchingHandlers);
if (matchingHandlers.get(0) == handler) {
this.storage = null;
providerAdded = true;
events.add(new ProviderEvent(true, handler.getInfo()));
this.activate(handler);
if (matchingHandlers.size() > 1) {
deactivateHandler = matchingHandlers.get(1);
this.deactivate(deactivateHandler);
events.add(new ProviderEvent(false, deactivateHandler.getInfo()));
}
}
}
// update change listener (only once)
final ChangeListener cl = this.listener;
if (cl != null) {
if (deactivateHandler != null) {
cl.providerRemoved(
deactivateHandler.getInfo().getAuthType() != AuthType.no, deactivateHandler.isUsed());
} else if (providerAdded) {
cl.providerAdded();
}
}
// send events
this.postEvents(events);
}