private void register()

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);
        }
    }