From 6b1660f22d84f894c448cb1401916e7004bb8688 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 21 Mar 2019 15:15:48 +0100 Subject: [PATCH] extract PicoContainerAwareInterfaceExtensionPoint --- .../extensions/impl/ExtensionsAreaImpl.java | 5 +- .../impl/InterfaceExtensionPoint.java | 51 ++++++++++++------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java index 512872fabdae..963e0d938ac8 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java @@ -4,6 +4,7 @@ package com.intellij.openapi.extensions.impl; import com.intellij.openapi.Disposable; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.*; +import com.intellij.openapi.extensions.impl.InterfaceExtensionPoint.PicoContainerAwareInterfaceExtensionPoint; import com.intellij.openapi.util.Disposer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; @@ -118,7 +119,7 @@ public final class ExtensionsAreaImpl implements ExtensionsArea { point = new BeanExtensionPoint<>(pointName, beanClassName, myPicoContainer, pluginDescriptor); } else { - point = new InterfaceExtensionPoint<>(pointName, interfaceClassName, myPicoContainer, pluginDescriptor); + point = new PicoContainerAwareInterfaceExtensionPoint<>(pointName, interfaceClassName, myPicoContainer, pluginDescriptor); } registerExtensionPoint(point); } @@ -259,7 +260,7 @@ public final class ExtensionsAreaImpl implements ExtensionsArea { PluginDescriptor pluginDescriptor = new UndefinedPluginDescriptor(); ExtensionPointImpl point; if (kind == ExtensionPoint.Kind.INTERFACE) { - point = new InterfaceExtensionPoint<>(extensionPointName, extensionPointBeanClass, myPicoContainer, pluginDescriptor); + point = new PicoContainerAwareInterfaceExtensionPoint<>(extensionPointName, extensionPointBeanClass, myPicoContainer, pluginDescriptor); } else { point = new BeanExtensionPoint<>(extensionPointName, extensionPointBeanClass, myPicoContainer, pluginDescriptor); diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/InterfaceExtensionPoint.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/InterfaceExtensionPoint.java index d6fab94c2f7f..077d47945123 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/InterfaceExtensionPoint.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/InterfaceExtensionPoint.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; import org.picocontainer.ComponentAdapter; import org.picocontainer.MutablePicoContainer; -public final class InterfaceExtensionPoint extends ExtensionPointImpl { +public class InterfaceExtensionPoint extends ExtensionPointImpl { public InterfaceExtensionPoint(@NotNull String name, @NotNull Class clazz, @NotNull MutablePicoContainer picoContainer) { super(name, clazz.getName(), picoContainer, new UndefinedPluginDescriptor()); @@ -22,19 +22,6 @@ public final class InterfaceExtensionPoint extends ExtensionPointImpl { super(name, className, picoContainer, pluginDescriptor); } - @Override - public synchronized void reset() { - // we don't check myLoadedAdapters because programmatically loaded extensions are not registered in pico container - //noinspection NonPrivateFieldAccessedInSynchronizedContext - for (ExtensionComponentAdapter adapter : myAdapters) { - if (adapter instanceof ComponentAdapter) { - myPicoContainer.unregisterComponent(((ComponentAdapter)adapter).getComponentKey()); - } - } - - super.reset(); - } - @Override @NotNull protected ExtensionComponentAdapter createAdapterAndRegisterInPicoContainerIfNeeded(@NotNull Element extensionElement, @NotNull PluginDescriptor pluginDescriptor, @NotNull MutablePicoContainer picoContainer) { @@ -43,10 +30,7 @@ public final class InterfaceExtensionPoint extends ExtensionPointImpl { throw new RuntimeException("'implementation' attribute not specified for '" + getName() + "' extension in '" + pluginDescriptor.getPluginId() + "' plugin"); } - ExtensionComponentAdapter adapter = doCreateAdapter(implementationClassName, extensionElement, shouldDeserializeInstance(extensionElement), pluginDescriptor, true); - // no need to register bean extension - only InterfaceExtensionPoint registers - picoContainer.registerComponent((ComponentAdapter)adapter); - return adapter; + return doCreateAdapter(implementationClassName, extensionElement, shouldDeserializeInstance(extensionElement), pluginDescriptor, true); } private static boolean shouldDeserializeInstance(@NotNull Element extensionElement) { @@ -64,4 +48,35 @@ public final class InterfaceExtensionPoint extends ExtensionPointImpl { } return false; } + + static final class PicoContainerAwareInterfaceExtensionPoint extends InterfaceExtensionPoint { + PicoContainerAwareInterfaceExtensionPoint(@NotNull String name, + @NotNull String className, + @NotNull MutablePicoContainer picoContainer, + @NotNull PluginDescriptor pluginDescriptor) { + super(name, className, picoContainer, pluginDescriptor); + } + + @NotNull + @Override + protected ExtensionComponentAdapter createAdapterAndRegisterInPicoContainerIfNeeded(@NotNull Element extensionElement, + @NotNull PluginDescriptor pluginDescriptor, + @NotNull MutablePicoContainer picoContainer) { + ExtensionComponentAdapter adapter = super.createAdapterAndRegisterInPicoContainerIfNeeded(extensionElement, pluginDescriptor, picoContainer); + picoContainer.registerComponent((ComponentAdapter)adapter); + return adapter; + } + + @Override + public synchronized void reset() { + //noinspection NonPrivateFieldAccessedInSynchronizedContext + for (ExtensionComponentAdapter adapter : myAdapters) { + if (adapter instanceof ComponentAdapter) { + myPicoContainer.unregisterComponent(((ComponentAdapter)adapter).getComponentKey()); + } + } + + super.reset(); + } + } }