private void unregister()

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


    private void unregister(final ResourceProviderInfo info, final String pid) {
        final boolean isInvalid;
        synchronized ( this.invalidProviders ) {
            isInvalid = this.invalidProviders.remove(info) != null;
        }

        if ( !isInvalid ) {
            logger.debug("Unregistering resource provider {}", info);

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

                            break;
                        }
                        first = false;
                    }
                }
            }

            if ( deactivateHandler != null ) {
                final List<ProviderEvent> events = new ArrayList<>();
                final ChangeListener cl = this.listener;
                if ( cl != null ) {
                    cl.providerRemoved(info.getName(), pid,
                            info.getAuthType() != AuthType.no,
                                    deactivateHandler.isUsed());
                }
                this.deactivate(deactivateHandler);
                deactivateHandler.dispose();

                // check if we can activate another handler
                ResourceProviderHandler addingProvider = null;
                synchronized ( this.handlers ) {
                    final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
                    if ( matchingHandlers != null ) {
                        if ( matchingHandlers.isEmpty() ) {
                            this.handlers.remove(info.getPath());
                        } else {
                            addingProvider = matchingHandlers.get(0);
                        }
                    }
                }
                boolean providerAdded = false;
                while ( addingProvider != null ) {
                    if (this.activate(addingProvider)) {
                        events.add(new ProviderEvent(true, addingProvider.getInfo()));
                        providerAdded = true;
                        addingProvider = null;
                        synchronized ( this.handlers ) {
                            this.storage = null;
                        }
                    } else {
                        synchronized ( this.handlers ) {
                            final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
                            if ( matchingHandlers != null && !matchingHandlers.isEmpty() ) {
                                if ( matchingHandlers.get(0) == addingProvider ) {
                                    this.storage = null;
                                    matchingHandlers.remove(0);
                                    addingProvider.dispose();
                                    if ( matchingHandlers.isEmpty() ) {
                                        this.handlers.remove(info.getPath());
                                        addingProvider = null;
                                    } else {
                                        addingProvider = matchingHandlers.get(0);
                                    }
                                }
                            }
                        }
                    }
                }

                if ( providerAdded && cl != null ) {
                    if ( cl != null ) {
                        cl.providerAdded();
                    }
                }
                events.add(new ProviderEvent(false,info));
                this.postEvents(events);

            }
        } else {
            logger.debug("Unregistering invalid resource provider {}", info);
        }
    }