This commit is contained in:
Alexey Kudravtsev
2013-02-26 14:33:14 +04:00
parent 53e491ddc5
commit 45c3feee70
7 changed files with 80 additions and 74 deletions
@@ -15,6 +15,8 @@
*/
package com.intellij.openapi.extensions;
import org.jetbrains.annotations.NotNull;
/**
* @author AKireyev
*/
@@ -28,24 +30,26 @@ public class EPAvailabilityListenerExtension implements PluginAware {
public EPAvailabilityListenerExtension() {
}
public EPAvailabilityListenerExtension(String extensionPointName, String listenerClass) {
public EPAvailabilityListenerExtension(@NotNull String extensionPointName, @NotNull String listenerClass) {
myExtensionPointName = extensionPointName;
myListenerClass = listenerClass;
}
@NotNull
public String getExtensionPointName() {
return myExtensionPointName;
}
public void setExtensionPointName(String extensionPointName) {
public void setExtensionPointName(@NotNull String extensionPointName) {
myExtensionPointName = extensionPointName;
}
@NotNull
public String getListenerClass() {
return myListenerClass;
}
public void setListenerClass(String listenerClass) {
public void setListenerClass(@NotNull String listenerClass) {
myListenerClass = listenerClass;
}
@@ -15,12 +15,14 @@
*/
package com.intellij.openapi.extensions;
import org.jetbrains.annotations.NotNull;
/**
* @author kir
*
* An extension can implement this interface to get notifications when it is added/removed to {@link ExtensionPoint}
*/
public interface Extension {
void extensionAdded(ExtensionPoint extensionPoint);
void extensionRemoved(ExtensionPoint extensionPoint);
void extensionAdded(@NotNull ExtensionPoint extensionPoint);
void extensionRemoved(@NotNull ExtensionPoint extensionPoint);
}
@@ -23,12 +23,14 @@ import org.jetbrains.annotations.Nullable;
* @author AKireyev
*/
public interface ExtensionPoint<T> {
@NotNull
String getName();
AreaInstance getArea();
/**
* @deprecated use {@link #getClassName()} instead
*/
@NotNull
String getBeanClassName();
void registerExtension(@NotNull T extension);
@@ -52,8 +54,10 @@ public interface ExtensionPoint<T> {
Class<T> getExtensionClass();
@NotNull
Kind getKind();
@NotNull
String getClassName();
enum Kind {INTERFACE, BEAN_CLASS}
@@ -18,6 +18,7 @@ package com.intellij.openapi.extensions;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.picocontainer.PicoContainer;
import java.util.List;
@@ -26,41 +27,44 @@ import java.util.List;
* @author AKireyev
*/
public interface ExtensionsArea {
void registerExtensionPoint(@NonNls String extensionPointName, String extensionPointBeanClass);
void registerExtensionPoint(@NonNls String extensionPointName, String extensionPointBeanClass, ExtensionPoint.Kind kind);
void unregisterExtensionPoint(@NonNls String extensionPointName);
void registerExtensionPoint(@NonNls @NotNull String extensionPointName, @NotNull String extensionPointBeanClass);
void registerExtensionPoint(@NonNls @NotNull String extensionPointName, @NotNull String extensionPointBeanClass, @NotNull ExtensionPoint.Kind kind);
void registerExtensionPoint(@NotNull String extensionPointName, @NotNull String extensionPointBeanClass, @NotNull PluginDescriptor descriptor);
void unregisterExtensionPoint(@NonNls @NotNull String extensionPointName);
boolean hasExtensionPoint(@NonNls String extensionPointName);
boolean hasExtensionPoint(@NonNls @NotNull String extensionPointName);
@NotNull
<T> ExtensionPoint<T> getExtensionPoint(@NonNls String extensionPointName);
<T> ExtensionPoint<T> getExtensionPoint(ExtensionPointName<T> extensionPointName);
<T> ExtensionPoint<T> getExtensionPoint(@NonNls @NotNull String extensionPointName);
<T> ExtensionPoint<T> getExtensionPoint(@NotNull ExtensionPointName<T> extensionPointName);
@NotNull
ExtensionPoint[] getExtensionPoints();
void suspendInteractions();
void resumeInteractions();
void killPendingInteractions();
void addAvailabilityListener(String epName, ExtensionPointAvailabilityListener listener);
void addAvailabilityListener(@NotNull String extensionPointName, @NotNull ExtensionPointAvailabilityListener listener);
@NotNull
AreaPicoContainer getPicoContainer();
void registerExtensionPoint(@NotNull String pluginName, @NotNull Element extensionPointElement);
void registerExtensionPoint(@NotNull PluginDescriptor pluginDescriptor, @NotNull Element extensionPointElement);
void registerExtension(@NotNull String pluginName, @NotNull Element extensionElement);
void registerExtensionPoint(String pluginName, Element extensionPointElement);
void registerExtensionPoint(PluginDescriptor pluginDescriptor, Element extensionPointElement);
void registerExtension(String pluginName, Element extensionElement);
void registerExtension(PluginDescriptor pluginDescriptor, Element extensionElement);
void registerExtension(@NotNull PluginDescriptor pluginDescriptor, @NotNull Element extensionElement);
void unregisterExtensionPoint(String pluginName, Element extensionPointElement);
void unregisterExtensionPoint(@NotNull String pluginName, @NotNull Element extensionPointElement);
void unregisterExtension(String pluginName, Element extensionElement);
void unregisterExtension(@NotNull String pluginName, @NotNull Element extensionElement);
PicoContainer getPluginContainer(String pluginName);
@NotNull
PicoContainer getPluginContainer(@NotNull String pluginName);
String getAreaClass();
void registerExtensionPoint(String extensionPointName, String extensionPointBeanClass, PluginDescriptor descriptor);
void registerAreaExtensionsAndPoints(final PluginDescriptor pluginDescriptor,
final List<Element> extensionsPoints,
final List<Element> extensions);
void registerAreaExtensionsAndPoints(@NotNull PluginDescriptor pluginDescriptor,
@Nullable List<Element> extensionsPoints,
@Nullable List<Element> extensions);
}
@@ -19,6 +19,7 @@ import com.intellij.openapi.extensions.*;
import com.intellij.util.pico.AssignableToComponentAdapter;
import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.picocontainer.*;
import org.picocontainer.defaults.AssignabilityRegistrationException;
import org.picocontainer.defaults.CachingComponentAdapter;
@@ -40,12 +41,11 @@ public class ExtensionComponentAdapter implements LoadingOrder.Orderable, Assign
private ComponentAdapter myDelegate;
private Class myImplementationClass;
public ExtensionComponentAdapter(
String implementationClass,
Element extensionElement,
PicoContainer container,
PluginDescriptor pluginDescriptor,
boolean deserializeInstance) {
public ExtensionComponentAdapter(@NotNull String implementationClass,
Element extensionElement,
PicoContainer container,
PluginDescriptor pluginDescriptor,
boolean deserializeInstance) {
myImplementationClassName = implementationClass;
myExtensionElement = extensionElement;
myContainer = container;
@@ -25,11 +25,11 @@ import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
import org.picocontainer.MutablePicoContainer;
import org.picocontainer.PicoContainer;
import org.picocontainer.defaults.ConstructorInjectionComponentAdapter;
import org.picocontainer.defaults.DefaultPicoContainer;
import java.io.IOException;
import java.io.StringWriter;
@@ -59,7 +59,6 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
private final AreaInstance myAreaInstance;
private final String myAreaClass;
private final Map<Element,ExtensionComponentAdapter> myExtensionElement2extension = new HashMap<Element, ExtensionComponentAdapter>();
private final Map<String,DefaultPicoContainer> myPluginName2picoContainer = new HashMap<String, DefaultPicoContainer>();
public ExtensionsAreaImpl(String areaClass, AreaInstance areaInstance, PicoContainer parentPicoContainer, @NotNull LogProvider logger) {
myCreationTrace = DEBUG_REGISTRATION ? new Throwable("Area creation trace") : null;
@@ -81,6 +80,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
}
}
@NotNull
@Override
public AreaPicoContainer getPicoContainer() {
return myPicoContainer;
@@ -96,12 +96,12 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
}
@Override
public void registerExtensionPoint(String pluginName, Element extensionPointElement) {
public void registerExtensionPoint(@NotNull String pluginName, @NotNull Element extensionPointElement) {
registerExtensionPoint(new DefaultPluginDescriptor(PluginId.getId(pluginName)), extensionPointElement);
}
@Override
public void registerExtensionPoint(PluginDescriptor pluginDescriptor, Element extensionPointElement) {
public void registerExtensionPoint(@NotNull PluginDescriptor pluginDescriptor, @NotNull Element extensionPointElement) {
assert pluginDescriptor.getPluginId() != null;
final String pluginId = pluginDescriptor.getPluginId().getIdString();
String epName = extensionPointElement.getAttributeValue("qualifiedName");
@@ -136,12 +136,12 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
}
@Override
public void registerExtension(final String pluginName, final Element extensionElement) {
public void registerExtension(@NotNull final String pluginName, @NotNull final Element extensionElement) {
registerExtension(new DefaultPluginDescriptor(PluginId.getId(pluginName)), extensionElement);
}
@Override
public void registerExtension(final PluginDescriptor pluginDescriptor, final Element extensionElement) {
public void registerExtension(@NotNull final PluginDescriptor pluginDescriptor, @NotNull final Element extensionElement) {
final PluginId pluginId = pluginDescriptor.getPluginId();
String epName = extractEPName(extensionElement);
@@ -194,8 +194,9 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
return epName;
}
@NotNull
@Override
public PicoContainer getPluginContainer(String pluginName) {
public PicoContainer getPluginContainer(@NotNull String pluginName) {
return internalGetPluginContainer();
}
@@ -203,22 +204,14 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
return myPicoContainer;
}
private void disposePluginContainer(String pluginName) {
DefaultPicoContainer pluginContainer = myPluginName2picoContainer.remove(pluginName);
if (pluginContainer != null) {
myPicoContainer.removeChildContainer(pluginContainer);
}
}
@Override
public void unregisterExtensionPoint(String pluginName, Element extensionPointElement) {
assert pluginName != null;
public void unregisterExtensionPoint(@NotNull String pluginName, @NotNull Element extensionPointElement) {
String epName = pluginName + '.' + extensionPointElement.getAttributeValue("name");
unregisterExtensionPoint(epName);
}
@Override
public void unregisterExtension(String pluginName, Element extensionElement) {
public void unregisterExtension(@NotNull String pluginName, @NotNull Element extensionElement) {
String epName = extractEPName(extensionElement);
if (!myExtensionElement2extension.containsKey(extensionElement)) {
XMLOutputter xmlOutputter = new XMLOutputter();
@@ -239,9 +232,6 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
if (getExtensionPoint(epName).unregisterComponentAdapter(adapter)) {
MutablePicoContainer pluginContainer = internalGetPluginContainer();
pluginContainer.unregisterComponent(adapter.getComponentKey());
if (pluginContainer.getComponentAdapters().isEmpty()) {
disposePluginContainer(pluginName);
}
}
}
@@ -297,32 +287,32 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
}
@Override
public void addAvailabilityListener(String epName, ExtensionPointAvailabilityListener listener) {
myAvailabilityListeners.putValue(epName, listener);
if (hasExtensionPoint(epName)) {
notifyAvailableListener(listener, myExtensionPoints.get(epName));
public void addAvailabilityListener(@NotNull String extensionPointName, @NotNull ExtensionPointAvailabilityListener listener) {
myAvailabilityListeners.putValue(extensionPointName, listener);
if (hasExtensionPoint(extensionPointName)) {
notifyAvailableListener(listener, myExtensionPoints.get(extensionPointName));
}
}
@Override
public void registerExtensionPoint(final String extensionPointName, String extensionPointBeanClass) {
public void registerExtensionPoint(@NotNull final String extensionPointName, @NotNull String extensionPointBeanClass) {
registerExtensionPoint(extensionPointName, extensionPointBeanClass, ExtensionPoint.Kind.INTERFACE);
}
@Override
public void registerExtensionPoint(@NonNls String extensionPointName, String extensionPointBeanClass, ExtensionPoint.Kind kind) {
public void registerExtensionPoint(@NotNull @NonNls String extensionPointName, @NotNull String extensionPointBeanClass, @NotNull ExtensionPoint.Kind kind) {
registerExtensionPoint(extensionPointName, extensionPointBeanClass, new UndefinedPluginDescriptor(), kind);
}
@Override
public void registerExtensionPoint(final String extensionPointName, String extensionPointBeanClass, PluginDescriptor descriptor) {
public void registerExtensionPoint(@NotNull final String extensionPointName, @NotNull String extensionPointBeanClass, @NotNull PluginDescriptor descriptor) {
registerExtensionPoint(extensionPointName, extensionPointBeanClass, descriptor, ExtensionPoint.Kind.INTERFACE);
}
private void registerExtensionPoint(final String extensionPointName,
String extensionPointBeanClass,
PluginDescriptor descriptor,
ExtensionPoint.Kind kind) {
private void registerExtensionPoint(@NotNull String extensionPointName,
@NotNull String extensionPointBeanClass,
@NotNull PluginDescriptor descriptor,
@NotNull ExtensionPoint.Kind kind) {
if (hasExtensionPoint(extensionPointName)) {
if (DEBUG_REGISTRATION) {
final ExtensionPointImpl oldEP = getExtensionPoint(extensionPointName);
@@ -336,8 +326,8 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
registerExtensionPoint(new ExtensionPointImpl(extensionPointName, extensionPointBeanClass, kind, this, myAreaInstance, myLogger, descriptor));
}
public void registerExtensionPoint(final ExtensionPointImpl extensionPoint) {
final String name = extensionPoint.getName();
public void registerExtensionPoint(@NotNull ExtensionPointImpl extensionPoint) {
String name = extensionPoint.getName();
myExtensionPoints.put(name, extensionPoint);
notifyEPRegistered(extensionPoint);
if (DEBUG_REGISTRATION) {
@@ -346,9 +336,9 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
}
@Override
public void registerAreaExtensionsAndPoints(final PluginDescriptor pluginDescriptor,
final List<Element> extensionsPoints,
final List<Element> extensions) {
public void registerAreaExtensionsAndPoints(@NotNull final PluginDescriptor pluginDescriptor,
@Nullable List<Element> extensionsPoints,
@Nullable List<Element> extensions) {
final String areaClass = getAreaClass();
if (extensionsPoints != null) {
//noinspection ForLoopReplaceableByForEach
@@ -406,7 +396,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
@Override
@NotNull
public <T> ExtensionPointImpl<T> getExtensionPoint(String extensionPointName) {
public <T> ExtensionPointImpl<T> getExtensionPoint(@NotNull String extensionPointName) {
ExtensionPointImpl<T> extensionPoint = myExtensionPoints.get(extensionPointName);
if (extensionPoint == null) {
throw new IllegalArgumentException("Missing extension point: " + extensionPointName + " in area " + myAreaInstance);
@@ -416,17 +406,18 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
@Override
@SuppressWarnings({"unchecked"})
public <T> ExtensionPoint<T> getExtensionPoint(ExtensionPointName<T> extensionPointName) {
public <T> ExtensionPoint<T> getExtensionPoint(@NotNull ExtensionPointName<T> extensionPointName) {
return getExtensionPoint(extensionPointName.getName());
}
@NotNull
@Override
public ExtensionPoint[] getExtensionPoints() {
return myExtensionPoints.values().toArray(new ExtensionPoint[myExtensionPoints.size()]);
}
@Override
public void unregisterExtensionPoint(final String extensionPointName) {
public void unregisterExtensionPoint(@NotNull final String extensionPointName) {
ExtensionPoint extensionPoint = myExtensionPoints.get(extensionPointName);
if (extensionPoint != null) {
extensionPoint.reset();
@@ -453,7 +444,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
}
@Override
public boolean hasExtensionPoint(String extensionPointName) {
public boolean hasExtensionPoint(@NotNull String extensionPointName) {
return myExtensionPoints.containsKey(extensionPointName);
}
@@ -485,8 +476,9 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
mySuspendedListenerActions.clear();
}
@NotNull
public MutablePicoContainer[] getPluginContainers() {
return myPluginName2picoContainer.values().toArray(new MutablePicoContainer[myPluginName2picoContainer.values().size()]);
return new MutablePicoContainer[0];
}
public void removeAllComponents(final Set<ExtensionComponentAdapter> extensionAdapters) {
@@ -56,14 +56,14 @@ public class ExtensionPointImplTest extends TestCase {
final boolean[] flags = new boolean[2];
Extension extension = new Extension() {
@Override
public void extensionAdded(ExtensionPoint extensionPoint1) {
public void extensionAdded(@NotNull ExtensionPoint extensionPoint1) {
assertSame(extensionPoint, extensionPoint1);
assertSame(area, extensionPoint1.getArea());
flags[0] = true;
}
@Override
public void extensionRemoved(ExtensionPoint extensionPoint1) {
public void extensionRemoved(@NotNull ExtensionPoint extensionPoint1) {
assertSame(extensionPoint, extensionPoint1);
assertSame(area, extensionPoint1.getArea());
flags[1] = true;