private void add()

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