diff --git a/platform/extensions/src/com/intellij/openapi/extensions/AreaListener.java b/platform/extensions/src/com/intellij/openapi/extensions/AreaListener.java index 233e4ac2cd1e..a238636947cf 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/AreaListener.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/AreaListener.java @@ -15,10 +15,12 @@ */ package com.intellij.openapi.extensions; +import org.jetbrains.annotations.NotNull; + /** * @author akireyev */ public interface AreaListener { - void areaCreated(String areaClass, AreaInstance areaInstance); - void areaDisposing(String areaClass, AreaInstance areaInstance); + void areaCreated(@NotNull String areaClass, @NotNull AreaInstance areaInstance); + void areaDisposing(@NotNull String areaClass, @NotNull AreaInstance areaInstance); } diff --git a/platform/extensions/src/com/intellij/openapi/extensions/ExtensionPoint.java b/platform/extensions/src/com/intellij/openapi/extensions/ExtensionPoint.java index c019479b50d3..a992873032ee 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/ExtensionPoint.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/ExtensionPoint.java @@ -52,6 +52,7 @@ public interface ExtensionPoint { void reset(); + @NotNull Class getExtensionClass(); @NotNull diff --git a/platform/extensions/src/com/intellij/openapi/extensions/Extensions.java b/platform/extensions/src/com/intellij/openapi/extensions/Extensions.java index 677affff6e31..80e3d022cd31 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/Extensions.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/Extensions.java @@ -95,13 +95,13 @@ public class Extensions { @NotNull @SuppressWarnings({"unchecked"}) public static T[] getExtensions(@NotNull ExtensionPointName extensionPointName) { - return (T[])getExtensions(extensionPointName.getName(), null); + return getExtensions(extensionPointName.getName(), null); } @NotNull @SuppressWarnings({"unchecked"}) public static T[] getExtensions(@NotNull ExtensionPointName extensionPointName, AreaInstance areaInstance) { - return Extensions.getExtensions(extensionPointName.getName(), areaInstance); + return getExtensions(extensionPointName.getName(), areaInstance); } @NotNull @@ -133,20 +133,19 @@ public class Extensions { throw new IllegalArgumentException("could not find extension implementation " + extClass); } - public static void instantiateArea(@NonNls @NotNull String areaClass, @Nullable AreaInstance areaInstance, @Nullable AreaInstance parentAreaInstance) { - if (!ourAreaClass2Configuration.containsKey(areaClass)) { + public static void instantiateArea(@NonNls @NotNull String areaClass, @NotNull AreaInstance areaInstance, @Nullable AreaInstance parentAreaInstance) { + AreaClassConfiguration configuration = ourAreaClass2Configuration.get(areaClass); + if (configuration == null) { throw new IllegalArgumentException("Area class is not registered: " + areaClass); } - if (areaInstance == null || ourAreaInstance2area.containsKey(areaInstance)) { - throw new IllegalArgumentException("Area already instantiated for: " + areaInstance); - } ExtensionsArea parentArea = getArea(parentAreaInstance); - AreaClassConfiguration configuration = ourAreaClass2Configuration.get(areaClass); if (!equals(parentArea.getAreaClass(), configuration.getParentClassName())) { throw new IllegalArgumentException("Wrong parent area. Expected class: " + configuration.getParentClassName() + " actual class: " + parentArea.getAreaClass()); } ExtensionsAreaImpl area = new ExtensionsAreaImpl(areaClass, areaInstance, parentArea.getPicoContainer(), ourLogger); - ourAreaInstance2area.put(areaInstance, area); + if (ourAreaInstance2area.put(areaInstance, area) != null) { + throw new IllegalArgumentException("Area already instantiated for: " + areaInstance); + } for (AreaListener listener : getAreaListeners()) { listener.areaCreated(areaClass, areaInstance); } @@ -183,7 +182,8 @@ public class Extensions { for (AreaListener listener : getAreaListeners()) { listener.areaDisposing(areaClass, areaInstance); } - } finally { + } + finally { ourAreaInstance2area.remove(areaInstance); } } @@ -200,11 +200,12 @@ public class Extensions { private final String myClassName; private final String myParentClassName; - AreaClassConfiguration(String className, String parentClassName) { + AreaClassConfiguration(@NotNull String className, String parentClassName) { myClassName = className; myParentClassName = parentClassName; } + @NotNull public String getClassName() { return myClassName; } diff --git a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java index 44058e8516b1..9c6f782cbcc1 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java @@ -369,6 +369,7 @@ public class ExtensionPointImpl implements ExtensionPoint { } } + @NotNull @Override public Class getExtensionClass() { // racy single-check: we don't care whether the access to 'myExtensionClass' is thread-safe 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 ee8f85f1a901..55be767a4d2a 100644 --- a/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java +++ b/platform/extensions/src/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java @@ -69,8 +69,9 @@ public class ExtensionsAreaImpl implements ExtensionsArea { initialize(); } - public ExtensionsAreaImpl(MutablePicoContainer picoContainer, LogProvider logger) { - this(null, null, picoContainer, logger); + @TestOnly + ExtensionsAreaImpl(MutablePicoContainer parentPicoContainer, @NotNull LogProvider logger) { + this(null, null, parentPicoContainer, logger); } @TestOnly @@ -148,7 +149,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { ExtensionComponentAdapter adapter; final PicoContainer container = getPluginContainer(pluginId.getIdString()); - final ExtensionPoint extensionPoint = getExtensionPoint(epName); + final ExtensionPointImpl extensionPoint = getExtensionPoint(epName); if (extensionPoint.getKind() == ExtensionPoint.Kind.INTERFACE) { String implClass = extensionElement.getAttributeValue("implementation"); if (implClass == null) { @@ -161,7 +162,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } myExtensionElement2extension.put(extensionElement, adapter); internalGetPluginContainer().registerComponent(adapter); - getExtensionPoint(epName).registerExtensionAdapter(adapter); + extensionPoint.registerExtensionAdapter(adapter); } private static boolean shouldDeserializeInstance(Element extensionElement) { diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java b/platform/platform-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java index 86f44b3528b5..23b7b0a3bbcf 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java @@ -252,14 +252,14 @@ public class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor { if (myExtensions != null || myExtensionsPoints != null) { Extensions.getRootArea().getExtensionPoint(Extensions.AREA_LISTENER_EXTENSION_POINT).registerExtension(new AreaListener() { @Override - public void areaCreated(String areaClass, AreaInstance areaInstance) { + public void areaCreated(@NotNull String areaClass, @NotNull AreaInstance areaInstance) { if (PluginManager.shouldSkipPlugin(IdeaPluginDescriptorImpl.this)) return; final ExtensionsArea area = Extensions.getArea(areaInstance); area.registerAreaExtensionsAndPoints(IdeaPluginDescriptorImpl.this, myExtensionsPoints, myExtensions); } @Override - public void areaDisposing(String areaClass, AreaInstance areaInstance) { + public void areaDisposing(@NotNull String areaClass, @NotNull AreaInstance areaInstance) { } }); } diff --git a/platform/util/src/com/intellij/util/pico/DefaultPicoContainer.java b/platform/util/src/com/intellij/util/pico/DefaultPicoContainer.java index c7dc592bb474..265582c0cbf1 100644 --- a/platform/util/src/com/intellij/util/pico/DefaultPicoContainer.java +++ b/platform/util/src/com/intellij/util/pico/DefaultPicoContainer.java @@ -49,6 +49,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable this(new DefaultComponentAdapterFactory(), null); } + @Override public Collection getComponentAdapters() { return componentAdapters.getImmutableSet(); } @@ -62,6 +63,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable return nonAssignableComponentAdapters.get().getReversedList(); } + @Override @Nullable public final ComponentAdapter getComponentAdapter(Object componentKey) { ComponentAdapter adapter = getFromCache(componentKey); @@ -84,6 +86,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable return null; } + @Override @Nullable public ComponentAdapter getComponentAdapterOfType(Class componentType) { // See http://jira.codehaus.org/secure/ViewIssue.jspa?key=PICO-115 @@ -101,9 +104,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable if (parent != null) { return parent.getComponentAdapterOfType(componentType); } - else { - return null; - } + return null; } else { Class[] foundClasses = new Class[found.size()]; @@ -115,6 +116,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable } } + @Override public List getComponentAdaptersOfType(Class componentType) { if (componentType == null) { return Collections.emptyList(); @@ -130,6 +132,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable return found; } + @Override public ComponentAdapter registerComponent(ComponentAdapter componentAdapter) { Object componentKey = componentAdapter.getComponentKey(); if (componentKeyToAdapterCache.containsKey(componentKey)) { @@ -156,6 +159,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable return componentAdapter; } + @Override public ComponentAdapter unregisterComponent(Object componentKey) { ComponentAdapter adapter = componentKeyToAdapterCache.remove(componentKey); @@ -171,10 +175,12 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable } } + @Override public List getComponentInstances() throws PicoException { return getComponentInstancesOfType(Object.class); } + @Override public List getComponentInstancesOfType(Class componentType) { if (componentType == null) { return Collections.emptyList(); @@ -204,17 +210,14 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable return result; } + @Override @Nullable public Object getComponentInstance(Object componentKey) { ComponentAdapter componentAdapter = getComponentAdapter(componentKey); - if (componentAdapter != null) { - return getInstance(componentAdapter); - } - else { - return null; - } + return componentAdapter == null ? null : getInstance(componentAdapter); } + @Override @Nullable public Object getComponentInstanceOfType(Class componentType) { final ComponentAdapter componentAdapter = getComponentAdapterOfType(componentType); @@ -228,7 +231,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable if (isLocal) { return getLocalInstance(componentAdapter); } - else if (parent != null) { + if (parent != null) { return parent.getComponentInstance(componentAdapter.getComponentKey()); } @@ -263,6 +266,7 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable } + @Override @Nullable public ComponentAdapter unregisterComponentByInstance(Object componentInstance) { Collection adapters = getComponentAdapters(); @@ -276,36 +280,44 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable return null; } + @Override public void verify() throws PicoVerificationException { new VerifyingVisitor().traverse(this); } + @Override public void start() { throw new UnsupportedOperationException(); } + @Override public void stop() { throw new UnsupportedOperationException(); } + @Override public void dispose() { throw new UnsupportedOperationException(); } + @Override public MutablePicoContainer makeChildContainer() { DefaultPicoContainer pc = new DefaultPicoContainer(componentAdapterFactory, this); addChildContainer(pc); return pc; } + @Override public boolean addChildContainer(PicoContainer child) { return children.add(child); } + @Override public boolean removeChildContainer(PicoContainer child) { return children.remove(child); } + @Override public void accept(PicoVisitor visitor) { visitor.visitContainer(this); final List adapters = new ArrayList(getComponentAdapters()); @@ -318,27 +330,33 @@ public class DefaultPicoContainer implements MutablePicoContainer, Serializable } } + @Override public ComponentAdapter registerComponentInstance(@NotNull Object component) { return registerComponentInstance(component.getClass(), component); } + @Override public ComponentAdapter registerComponentInstance(@NotNull Object componentKey, @NotNull Object componentInstance) { return registerComponent(new InstanceComponentAdapter(componentKey, componentInstance)); } + @Override public ComponentAdapter registerComponentImplementation(@NotNull Class componentImplementation) { return registerComponentImplementation(componentImplementation, componentImplementation); } + @Override public ComponentAdapter registerComponentImplementation(@NotNull Object componentKey, @NotNull Class componentImplementation) { return registerComponentImplementation(componentKey, componentImplementation, null); } + @Override public ComponentAdapter registerComponentImplementation(@NotNull Object componentKey, @NotNull Class componentImplementation, Parameter[] parameters) { ComponentAdapter componentAdapter = componentAdapterFactory.createComponentAdapter(componentKey, componentImplementation, parameters); return registerComponent(componentAdapter); } + @Override public PicoContainer getParent() { return parent; }