extract PicoContainerAwareInterfaceExtensionPoint

This commit is contained in:
Vladimir Krivosheev
2019-03-21 15:32:35 +01:00
parent a6cc16eeb1
commit 6b1660f22d
2 changed files with 36 additions and 20 deletions
@@ -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<Object> 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);
@@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
import org.picocontainer.ComponentAdapter;
import org.picocontainer.MutablePicoContainer;
public final class InterfaceExtensionPoint<T> extends ExtensionPointImpl<T> {
public class InterfaceExtensionPoint<T> extends ExtensionPointImpl<T> {
public InterfaceExtensionPoint(@NotNull String name, @NotNull Class<T> clazz, @NotNull MutablePicoContainer picoContainer) {
super(name, clazz.getName(), picoContainer, new UndefinedPluginDescriptor());
@@ -22,19 +22,6 @@ public final class InterfaceExtensionPoint<T> extends ExtensionPointImpl<T> {
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<T> extends ExtensionPointImpl<T> {
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<T> extends ExtensionPointImpl<T> {
}
return false;
}
static final class PicoContainerAwareInterfaceExtensionPoint<T> extends InterfaceExtensionPoint<T> {
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();
}
}
}