in src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java [171:239]
private void register(final ResourceProviderInfo info) {
if ( info.isValid() ) {
logger.debug("Registering new resource provider {}", info);
final List<ProviderEvent> events = new ArrayList<>();
boolean providerAdded = false;
ResourceProviderHandler deactivateHandler = null;
ResourceProviderHandler activate = null;
synchronized ( this.handlers ) {
final List<ResourceProviderHandler> matchingHandlers = this.handlers.computeIfAbsent(info.getPath(), key -> new ArrayList<>());
final ResourceProviderHandler handler = new ResourceProviderHandler(bundleContext, info);
matchingHandlers.add(handler);
Collections.sort(matchingHandlers);
if ( matchingHandlers.get(0) == handler ) {
activate = handler;
}
}
if ( activate != null ) {
if ( this.activate(activate) ) {
providerAdded = true;
events.add(new ProviderEvent(true, info));
synchronized ( this.handlers ) {
storage = null;
final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
if ( matchingHandlers != null && matchingHandlers.size() > 1 ) {
deactivateHandler = matchingHandlers.get(1);
}
}
} else {
synchronized ( this.handlers ) {
final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
if ( matchingHandlers != null && !matchingHandlers.isEmpty() && matchingHandlers.remove(activate) ) {
storage = null;
if ( matchingHandlers.isEmpty() ) {
this.handlers.remove(info.getPath());
}
}
}
}
}
final ChangeListener cl = this.listener;
if ( providerAdded && cl != null ) {
cl.providerAdded();
}
// we have to check for deactivated handlers
if ( deactivateHandler != null ) {
final ResourceProviderInfo handlerInfo = deactivateHandler.getInfo();
if ( cl != null ) {
Object pid = handlerInfo.getServiceReference().getProperty(Constants.SERVICE_PID);
if ( pid != null && !(pid instanceof String) ) {
pid = null;
}
cl.providerRemoved(handlerInfo.getName(), (String)pid,
handlerInfo.getAuthType() != AuthType.no,
deactivateHandler.isUsed());
}
this.deactivate(deactivateHandler);
synchronized ( this.handlers ) {
storage = null;
}
events.add(new ProviderEvent(false, handlerInfo));
}
this.postEvents(events);
} else {
logger.warn("Ignoring invalid resource provider {}", info);
this.invalidProviders.put(info, FailureReason.invalid);
}
}