private void unregisterAdapterFactory()

in src/main/java/org/apache/sling/adapter/internal/AdapterManagerImpl.java [305:347]


    private void unregisterAdapterFactory(final ServiceReference<AdapterFactory> reference) {
        final List<AdapterFactoryDescriptorMap> list = new ArrayList<>();
        synchronized (this.descriptors) {
            for (final AdapterFactoryDescriptorMap map : this.descriptors.values()) {
                list.add(map);
            }
        }
        AdapterFactoryDescriptor removedDescriptor = null;
        for (final AdapterFactoryDescriptorMap map : list) {
            synchronized (map) {
                final AdapterFactoryDescriptor factoryDesc = map.remove(reference);
                if (factoryDesc != null) {
                    removedDescriptor = factoryDesc;
                }
            }
        }

        // unregister adaption
        if (removedDescriptor != null) {
            // only remove cache if some adapter factories have actually been
            // removed
            this.factoryCache.clear();

            final ServiceRegistration<Adaption> reg = removedDescriptor.getAdaption();
            if (reg != null) {
                removedDescriptor.setAdaption(null);
                try {
                    reg.unregister();
                } catch (final IllegalStateException ignore) {
                    // ignore IAE on shutdown
                }
            }
            if (log.isDebugEnabled()) {
                log.debug("Unregistered service {} with {} : {} and {} : {}", new Object[] {
                    Adaption.class.getName(),
                    SlingConstants.PROPERTY_ADAPTABLE_CLASSES,
                    Arrays.toString(removedDescriptor.getAdaptables()),
                    SlingConstants.PROPERTY_ADAPTER_CLASSES,
                    Arrays.toString(removedDescriptor.getAdapters())
                });
            }
        }
    }