private void remove()

in src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java [264:313]


    private void remove(final ResourceProviderInfo info) {
        final List<ProviderEvent> events = new ArrayList<>();

        // 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) {
                            this.storage = null;
                            deactivateHandler = h;
                        }
                        if (matchingHandlers.isEmpty()) {
                            this.handlers.remove(info.getPath());
                        }

                        break;
                    }
                    first = false;
                }
            }
            if (deactivateHandler != null) {
                this.deactivate(deactivateHandler);
                events.add(new ProviderEvent(false, info));

                // check if we can activate another handler
                if (!matchingHandlers.isEmpty()) {
                    final ResourceProviderHandler addingProvider = matchingHandlers.get(0);
                    this.activate(addingProvider);
                    events.add(new ProviderEvent(true, addingProvider.getInfo()));
                }
            }
        }

        // update change listener (only once)
        final ChangeListener cl = this.listener;
        if (cl != null && deactivateHandler != null) {
            cl.providerRemoved(info.getAuthType() != AuthType.no, deactivateHandler.isUsed());
        }

        // send events
        this.postEvents(events);
    }