diff --git a/extensions/source/com/intellij/openapi/extensions/AreaPicoContainer.java b/extensions/source/com/intellij/openapi/extensions/AreaPicoContainer.java new file mode 100644 index 000000000000..5948ccb17467 --- /dev/null +++ b/extensions/source/com/intellij/openapi/extensions/AreaPicoContainer.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved. + * Use is subject to license terms. + */ +package com.intellij.openapi.extensions; + +import org.picocontainer.MutablePicoContainer; +import org.picocontainer.defaults.ComponentAdapterFactory; + +/** + * @author Alexander Kireyev + */ +public interface AreaPicoContainer extends MutablePicoContainer { + void setComponentAdapterFactory(ComponentAdapterFactory factory); +} diff --git a/extensions/source/com/intellij/openapi/extensions/DefaultPluginDescriptor.java b/extensions/source/com/intellij/openapi/extensions/DefaultPluginDescriptor.java new file mode 100644 index 000000000000..7cf0755aa434 --- /dev/null +++ b/extensions/source/com/intellij/openapi/extensions/DefaultPluginDescriptor.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved. + * Use is subject to license terms. + */ +package com.intellij.openapi.extensions; + +/** + * @author Alexander Kireyev + */ +public class DefaultPluginDescriptor implements PluginDescriptor { + private String myPluginName; + private ClassLoader myPluginClassLoader; + + public DefaultPluginDescriptor(final String pluginName) { + myPluginName = pluginName; + } + + public DefaultPluginDescriptor(final String pluginName, final ClassLoader pluginClassLoader) { + myPluginName = pluginName; + myPluginClassLoader = pluginClassLoader; + } + + public String getPluginName() { + return myPluginName; + } + + public ClassLoader getPluginClassLoader() { + return myPluginClassLoader; + } + + public void setPluginName(final String pluginName) { + myPluginName = pluginName; + } + + public void setPluginClassLoader(final ClassLoader pluginClassLoader) { + myPluginClassLoader = pluginClassLoader; + } +} diff --git a/extensions/source/com/intellij/openapi/extensions/EPAvailabilityListenerExtension.java b/extensions/source/com/intellij/openapi/extensions/EPAvailabilityListenerExtension.java index 13a69b6ff36d..a6aa18b76f0f 100644 --- a/extensions/source/com/intellij/openapi/extensions/EPAvailabilityListenerExtension.java +++ b/extensions/source/com/intellij/openapi/extensions/EPAvailabilityListenerExtension.java @@ -7,11 +7,12 @@ package com.intellij.openapi.extensions; /** * @author AKireyev */ -public class EPAvailabilityListenerExtension { +public class EPAvailabilityListenerExtension implements PluginAware { public static final String EXTENSION_POINT_NAME = "com.intellij.openapi.extensions.epAvailabilityListener"; private String myExtensionPointName; private String myListenerClass; + private PluginDescriptor myPluginDescriptor; public EPAvailabilityListenerExtension() { } @@ -36,4 +37,21 @@ public class EPAvailabilityListenerExtension { public void setListenerClass(String listenerClass) { myListenerClass = listenerClass; } + + public void setPluginDescriptor(PluginDescriptor pluginDescriptor) { + myPluginDescriptor = pluginDescriptor; + } + + public PluginDescriptor getPluginDescriptor() { + return myPluginDescriptor; + } + + public Class loadListenerClass() throws ClassNotFoundException { + if (myPluginDescriptor.getPluginClassLoader() != null) { + return Class.forName(getListenerClass(), true, myPluginDescriptor.getPluginClassLoader()); + } + else { + return Class.forName(getListenerClass()); + } + } } diff --git a/extensions/source/com/intellij/openapi/extensions/ExtensionsArea.java b/extensions/source/com/intellij/openapi/extensions/ExtensionsArea.java index 2860dace1f8f..d09f6c761731 100644 --- a/extensions/source/com/intellij/openapi/extensions/ExtensionsArea.java +++ b/extensions/source/com/intellij/openapi/extensions/ExtensionsArea.java @@ -5,7 +5,6 @@ package com.intellij.openapi.extensions; import org.jdom.Element; -import org.picocontainer.MutablePicoContainer; import org.picocontainer.PicoContainer; /** @@ -27,10 +26,12 @@ public interface ExtensionsArea { void addAvailabilityListener(String epName, ExtensionPointAvailabilityListener listener); - MutablePicoContainer getPicoContainer(); + AreaPicoContainer getPicoContainer(); 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 unregisterExtensionPoint(String pluginName, Element extensionPointElement); @@ -39,4 +40,5 @@ public interface ExtensionsArea { PicoContainer getPluginContainer(String pluginName); String getAreaClass(); + } diff --git a/extensions/source/com/intellij/openapi/extensions/PluginAware.java b/extensions/source/com/intellij/openapi/extensions/PluginAware.java index ca01c8cd34d7..0147cc4213aa 100644 --- a/extensions/source/com/intellij/openapi/extensions/PluginAware.java +++ b/extensions/source/com/intellij/openapi/extensions/PluginAware.java @@ -8,5 +8,5 @@ package com.intellij.openapi.extensions; * @author akireyev */ public interface PluginAware { - void setPluginName(String pluginName); + void setPluginDescriptor(PluginDescriptor pluginDescriptor); } diff --git a/extensions/source/com/intellij/openapi/extensions/PluginDescriptor.java b/extensions/source/com/intellij/openapi/extensions/PluginDescriptor.java new file mode 100644 index 000000000000..915e67ad8418 --- /dev/null +++ b/extensions/source/com/intellij/openapi/extensions/PluginDescriptor.java @@ -0,0 +1,13 @@ +/* + * Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved. + * Use is subject to license terms. + */ +package com.intellij.openapi.extensions; + +/** + * @author Alexander Kireyev + */ +public interface PluginDescriptor { + String getPluginName(); + ClassLoader getPluginClassLoader(); +} diff --git a/extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainer.java b/extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainerImpl.java similarity index 72% rename from extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainer.java rename to extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainerImpl.java index 3e3f8360ae73..e65197cf602d 100644 --- a/extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainer.java +++ b/extensions/source/com/intellij/openapi/extensions/impl/AreaPicoContainerImpl.java @@ -4,25 +4,27 @@ */ package com.intellij.openapi.extensions.impl; -import org.picocontainer.MutablePicoContainer; -import org.picocontainer.PicoContainer; -import org.picocontainer.ComponentAdapter; -import org.picocontainer.Parameter; -import org.picocontainer.defaults.DefaultPicoContainer; -import org.picocontainer.defaults.AmbiguousComponentResolutionException; -import org.picocontainer.defaults.AbstractPicoVisitor; +import com.intellij.openapi.extensions.AreaPicoContainer; +import org.picocontainer.*; import org.picocontainer.alternatives.AbstractDelegatingMutablePicoContainer; +import org.picocontainer.defaults.*; import java.util.*; /** * @author Alexander Kireyev */ -public class AreaPicoContainer extends AbstractDelegatingMutablePicoContainer implements MutablePicoContainer { +public class AreaPicoContainerImpl extends AbstractDelegatingMutablePicoContainer implements AreaPicoContainer { private ExtensionsAreaImpl myArea; + private ComponentAdapterFactory myComponentAdapterFactory; - public AreaPicoContainer(PicoContainer parentPicoContainer, ExtensionsAreaImpl area) { - super(new DefaultPicoContainer(parentPicoContainer)); + public AreaPicoContainerImpl(PicoContainer parentPicoContainer, ExtensionsAreaImpl area) { + this(new MyPicoContainer(parentPicoContainer), area); + } + + private AreaPicoContainerImpl(MyPicoContainer picoContainer, ExtensionsAreaImpl area) { + super(picoContainer); + picoContainer.setWrapperContainer(this); myArea = area; } @@ -82,13 +84,6 @@ public class AreaPicoContainer extends AbstractDelegatingMutablePicoContainer im } public Object getComponentInstance(final Object componentKey) { - if (getParent() != null) { - Object parentInstance = getParent().getComponentInstance(componentKey); - if (parentInstance != null) { - return parentInstance; - } - } - final Object[] result = new Object[] { null }; accept(new EmptyPicoVisitor() { public void visitContainer(PicoContainer pico) { @@ -109,7 +104,16 @@ public class AreaPicoContainer extends AbstractDelegatingMutablePicoContainer im } } }); - return result[0]; + if (result[0] != null) { + return result[0]; + } + if (getParent() != null) { + Object parentInstance = getParent().getComponentInstance(componentKey); + if (parentInstance != null) { + return parentInstance; + } + } + return null; } public ComponentAdapter getComponentAdapterOfType(Class componentType) { @@ -168,6 +172,14 @@ public class AreaPicoContainer extends AbstractDelegatingMutablePicoContainer im throw new UnsupportedOperationException("Method makeChildContainer() is not implemented"); } + public void setComponentAdapterFactory(ComponentAdapterFactory factory) { + myComponentAdapterFactory = factory; + } + + public ComponentAdapterFactory getComponentAdapterFactory() { + return myComponentAdapterFactory; + } + private abstract class EmptyPicoVisitor extends AbstractPicoVisitor { public void visitContainer(PicoContainer pico) { } @@ -178,4 +190,27 @@ public class AreaPicoContainer extends AbstractDelegatingMutablePicoContainer im public void visitParameter(Parameter parameter) { } } + + private static class MyPicoContainer extends DefaultPicoContainer { + private AreaPicoContainerImpl myWrapperContainer; + private ComponentAdapterFactory myDefault = new DefaultComponentAdapterFactory(); + + public MyPicoContainer(final PicoContainer parentPicoContainer) { + super(parentPicoContainer); + } + + public void setWrapperContainer(AreaPicoContainerImpl wrapperContainer) { + myWrapperContainer = wrapperContainer; + } + + public ComponentAdapter registerComponentImplementation(Object componentKey, Class componentImplementation, Parameter[] parameters) throws PicoRegistrationException { + ComponentAdapter componentAdapter = getAdapterFactory().createComponentAdapter(componentKey, componentImplementation, parameters); + registerComponent(componentAdapter); + return componentAdapter; + } + + private ComponentAdapterFactory getAdapterFactory() { + return myWrapperContainer.getComponentAdapterFactory() != null ? myWrapperContainer.getComponentAdapterFactory() : myDefault; + } + } } diff --git a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter.java b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter.java index 5138c903eac2..c78c4b67ff95 100644 --- a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter.java +++ b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionComponentAdapter.java @@ -7,6 +7,7 @@ package com.intellij.openapi.extensions.impl; import com.intellij.openapi.extensions.LoadingOrder; import com.intellij.openapi.extensions.PluginAware; import com.intellij.openapi.extensions.ReaderConfigurator; +import com.intellij.openapi.extensions.PluginDescriptor; import com.thoughtworks.xstream.XStream; import org.jdom.Element; import org.picocontainer.PicoContainer; @@ -23,13 +24,13 @@ public class ExtensionComponentAdapter extends ConstructorInjectionComponentAdap private Object myComponentInstance; private Element myExtensionElement; private PicoContainer myContainer; - private String myPluginName; + private PluginDescriptor myPluginDescriptor; - public ExtensionComponentAdapter(Class implementationClass, Element extensionElement, PicoContainer container, String pluginName) { + public ExtensionComponentAdapter(Class implementationClass, Element extensionElement, PicoContainer container, PluginDescriptor pluginDescriptor) { super(new Object(), implementationClass); myExtensionElement = extensionElement; myContainer = container; - myPluginName = pluginName; + myPluginDescriptor = pluginDescriptor; } public Object getComponentInstance(final PicoContainer container) throws PicoInitializationException, PicoIntrospectionException, AssignabilityRegistrationException, NotConcreteRegistrationException { @@ -52,7 +53,7 @@ public class ExtensionComponentAdapter extends ConstructorInjectionComponentAdap } if (myComponentInstance instanceof PluginAware) { PluginAware pluginAware = (PluginAware) myComponentInstance; - pluginAware.setPluginName(myPluginName); + pluginAware.setPluginDescriptor(myPluginDescriptor); } } @@ -81,6 +82,6 @@ public class ExtensionComponentAdapter extends ConstructorInjectionComponentAdap } public String getPluginName() { - return myPluginName; + return myPluginDescriptor.getPluginName(); } } diff --git a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java index 0f88244931df..1345c3df4c09 100644 --- a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java +++ b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionPointImpl.java @@ -28,13 +28,20 @@ public class ExtensionPointImpl implements ExtensionPoint { private ExtensionsAreaImpl myOwner; private final AreaInstance myArea; private Class myExtensionClass; + private PluginDescriptor myDescriptor; - public ExtensionPointImpl(String name, String beanClassName, ExtensionsAreaImpl owner, AreaInstance area, LogProvider logger) { + public ExtensionPointImpl(String name, + String beanClassName, + ExtensionsAreaImpl owner, + AreaInstance area, + LogProvider logger, + PluginDescriptor descriptor) { myName = name; myBeanClassName = beanClassName; myOwner = owner; myArea = area; myLogger = logger; + myDescriptor = descriptor; } public String getName() { @@ -247,7 +254,12 @@ public class ExtensionPointImpl implements ExtensionPoint { public Class getExtensionClass() { if (myExtensionClass == null) { try { - myExtensionClass = Class.forName(myBeanClassName); + if (myDescriptor.getPluginClassLoader() == null) { + myExtensionClass = Class.forName(myBeanClassName); + } + else { + myExtensionClass = Class.forName(myBeanClassName, true, myDescriptor.getPluginClassLoader()); + } } catch (ClassNotFoundException e) { myExtensionClass = Object.class; diff --git a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java index 274a3cd52930..8abe3479877a 100644 --- a/extensions/source/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java +++ b/extensions/source/com/intellij/openapi/extensions/impl/ExtensionsAreaImpl.java @@ -31,7 +31,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { private static boolean DEBUG_REGISTRATION = true; - private MutablePicoContainer myPicoContainer; + private AreaPicoContainerImpl myPicoContainer; private Throwable myCreationTrace = null; private Map myExtensionPoints = new HashMap(); private Map myEPTraces = new HashMap(); @@ -50,10 +50,10 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } myAreaClass = areaClass; myAreaInstance = areaInstance; - myPicoContainer = new AreaPicoContainer(parentPicoContainer, this); - if (areaInstance != null) { - myPicoContainer.registerComponentInstance(areaInstance); - } + myPicoContainer = new AreaPicoContainerImpl(parentPicoContainer, this); + //if (areaInstance != null) { + // myPicoContainer.registerComponentInstance(areaInstance); + //} initialize(); myLogger = logger; } @@ -62,7 +62,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { this(null, null, picoContainer, logger); } - public MutablePicoContainer getPicoContainer() { + public AreaPicoContainer getPicoContainer() { return myPicoContainer; } @@ -75,8 +75,12 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } public void registerExtensionPoint(String pluginName, Element extensionPointElement) { - assert pluginName != null; - String epName = pluginName + '.' + extensionPointElement.getAttributeValue("name"); + registerExtensionPoint(new DefaultPluginDescriptor(pluginName), extensionPointElement); + } + + public void registerExtensionPoint(PluginDescriptor pluginDescriptor, Element extensionPointElement) { + assert pluginDescriptor.getPluginName() != null; + String epName = pluginDescriptor.getPluginName() + '.' + extensionPointElement.getAttributeValue("name"); String className = extensionPointElement.getAttributeValue("beanClass"); if (className == null) { className = extensionPointElement.getAttributeValue("interface"); @@ -88,6 +92,12 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } public void registerExtension(final String pluginName, final Element extensionElement) { + registerExtension(new DefaultPluginDescriptor(pluginName), extensionElement); + } + + public void registerExtension(final PluginDescriptor pluginDescriptor, final Element extensionElement) { + final String pluginName = pluginDescriptor.getPluginName(); + String epName = extractEPName(extensionElement); ExtensionComponentAdapter adapter; String implClass; @@ -100,8 +110,14 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } if (implClass != null) { try { - Class implementationClass = Class.forName(implClass); - adapter = new ExtensionComponentAdapter(implementationClass, extensionElement, getPluginContainer(pluginName), pluginName); + Class implementationClass; + if (pluginDescriptor.getPluginClassLoader() == null) { + implementationClass = Class.forName(implClass); + } + else { + implementationClass = Class.forName(implClass, true, pluginDescriptor.getPluginClassLoader()); + } + adapter = new ExtensionComponentAdapter(implementationClass, extensionElement, getPluginContainer(pluginName), pluginDescriptor); } catch (ClassNotFoundException e) { myLogger.warn("Extension implementation class not found: " + implClass); @@ -111,7 +127,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } else { final ExtensionPoint extensionPoint = getExtensionPoint(epName); - adapter = new ExtensionComponentAdapter(extensionPoint.getExtensionClass(), extensionElement, getPluginContainer(pluginName), pluginName); + adapter = new ExtensionComponentAdapter(extensionPoint.getExtensionClass(), extensionElement, getPluginContainer(pluginName), pluginDescriptor); } myExtensionElement2extension.put(extensionElement, adapter); internalGetPluginContainer(pluginName).registerComponent(adapter); @@ -207,7 +223,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { try { String epName = epListenerExtension.getExtensionPointName(); - ExtensionPointAvailabilityListener listener = (ExtensionPointAvailabilityListener) instantiate(Class.forName(epListenerExtension.getListenerClass())); + ExtensionPointAvailabilityListener listener = (ExtensionPointAvailabilityListener) instantiate(epListenerExtension.loadListenerClass()); addAvailabilityListener(epName, listener); } catch (Exception e) { @@ -234,6 +250,10 @@ public class ExtensionsAreaImpl implements ExtensionsArea { } public void registerExtensionPoint(final String extensionPointName, String extensionPointBeanClass) { + registerExtensionPoint(extensionPointName, extensionPointBeanClass, new UndefinedPluginDescriptor()); + } + + public void registerExtensionPoint(final String extensionPointName, String extensionPointBeanClass, PluginDescriptor descriptor) { if (hasExtensionPoint(extensionPointName)) { if (DEBUG_REGISTRATION) { myLogger.error((Throwable) myEPTraces.get(extensionPointName)); @@ -241,7 +261,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea { throw new RuntimeException("Duplicate registration for EP: " + extensionPointName); } - ExtensionPointImpl extensionPoint = new ExtensionPointImpl(extensionPointName, extensionPointBeanClass, this, myAreaInstance, myLogger); + ExtensionPointImpl extensionPoint = new ExtensionPointImpl(extensionPointName, extensionPointBeanClass, this, myAreaInstance, myLogger, descriptor); myExtensionPoints.put(extensionPointName, extensionPoint); notifyEPRegistered(extensionPoint); if (DEBUG_REGISTRATION) { @@ -360,4 +380,5 @@ public class ExtensionsAreaImpl implements ExtensionsArea { internalGetPluginContainer(pluginName).unregisterComponent(componentAdapter.getComponentKey()); } } + } diff --git a/extensions/source/com/intellij/openapi/extensions/impl/UndefinedPluginDescriptor.java b/extensions/source/com/intellij/openapi/extensions/impl/UndefinedPluginDescriptor.java new file mode 100644 index 000000000000..36f75da9e936 --- /dev/null +++ b/extensions/source/com/intellij/openapi/extensions/impl/UndefinedPluginDescriptor.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2000-2004 by JetBrains s.r.o. All Rights Reserved. + * Use is subject to license terms. + */ +package com.intellij.openapi.extensions.impl; + +import com.intellij.openapi.extensions.PluginDescriptor; + +/** + * @author Alexander Kireyev + */ +class UndefinedPluginDescriptor implements PluginDescriptor { + public String getPluginName() { + throw new UnsupportedOperationException("This method should not be called on this object"); + } + + public ClassLoader getPluginClassLoader() { + return null; + } +} diff --git a/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionComponentAdapterTest.java b/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionComponentAdapterTest.java index cbd680898e2a..dd0da1b65171 100644 --- a/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionComponentAdapterTest.java +++ b/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionComponentAdapterTest.java @@ -4,6 +4,8 @@ */ package com.intellij.openapi.extensions.impl; +import com.intellij.openapi.extensions.DefaultPluginDescriptor; +import com.intellij.openapi.extensions.LoadingOrder; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.input.SAXBuilder; @@ -13,8 +15,6 @@ import org.picocontainer.defaults.DefaultPicoContainer; import java.io.IOException; import java.io.StringReader; -import com.intellij.openapi.extensions.LoadingOrder; - /** * @author Alexander Kireyev */ @@ -30,14 +30,14 @@ public class ExtensionComponentAdapterTest extends MockObjectTestCase { public void testUnknownAttributes() { final DefaultPicoContainer container = new DefaultPicoContainer(); final ExtensionComponentAdapter extensionComponentAdapter = - new ExtensionComponentAdapter(TestExtensionClassOne.class, readElement(""), container, "test"); + new ExtensionComponentAdapter(TestExtensionClassOne.class, readElement(""), container, new DefaultPluginDescriptor("test")); extensionComponentAdapter.getComponentInstance(container); } private ExtensionComponentAdapter createAdapter(String text) { Element extensionElement = readElement(text); - ExtensionComponentAdapter adapter = new ExtensionComponentAdapter(Object.class, extensionElement, new DefaultPicoContainer(), ""); + ExtensionComponentAdapter adapter = new ExtensionComponentAdapter(Object.class, extensionElement, new DefaultPicoContainer(), new DefaultPluginDescriptor("")); return adapter; } diff --git a/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionPointImplTest.java b/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionPointImplTest.java index b5e57b861c41..049d402e3ad5 100644 --- a/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionPointImplTest.java +++ b/extensions/testSource/com/intellij/openapi/extensions/impl/ExtensionPointImplTest.java @@ -19,7 +19,7 @@ public class ExtensionPointImplTest extends TestCase { } private ExtensionPointImpl buildExtensionPoint() { - return new ExtensionPointImpl(ExtensionsImplTest.EXTENSION_POINT_NAME_1, Integer.class.getName(), buildExtensionArea(), null, new Extensions.SimpleLogProvider()); + return new ExtensionPointImpl(ExtensionsImplTest.EXTENSION_POINT_NAME_1, Integer.class.getName(), buildExtensionArea(), null, new Extensions.SimpleLogProvider(), new UndefinedPluginDescriptor()); } private ExtensionsAreaImpl buildExtensionArea() { @@ -39,7 +39,7 @@ public class ExtensionPointImplTest extends TestCase { public void testRegisterUnregister_Extension() { final AreaInstance area = new AreaInstance() {}; - final ExtensionPointImpl extensionPoint = new ExtensionPointImpl("an.extension.point", Object.class.getName(), buildExtensionArea(), area, new Extensions.SimpleLogProvider()); + final ExtensionPointImpl extensionPoint = new ExtensionPointImpl("an.extension.point", Object.class.getName(), buildExtensionArea(), area, new Extensions.SimpleLogProvider(), new UndefinedPluginDescriptor()); final boolean[] flags = new boolean[2]; Extension extension = new Extension() { diff --git a/extensions/testSource/com/intellij/openapi/extensions/impl/XMLTestBean.java b/extensions/testSource/com/intellij/openapi/extensions/impl/XMLTestBean.java index 5de9b4d99de1..f58c93496f7a 100644 --- a/extensions/testSource/com/intellij/openapi/extensions/impl/XMLTestBean.java +++ b/extensions/testSource/com/intellij/openapi/extensions/impl/XMLTestBean.java @@ -5,6 +5,7 @@ package com.intellij.openapi.extensions.impl; import com.intellij.openapi.extensions.PluginAware; +import com.intellij.openapi.extensions.PluginDescriptor; import java.util.Collection; @@ -59,8 +60,8 @@ public class XMLTestBean implements PluginAware { myCollectionProperty = collectionProperty; } - public void setPluginName(String pluginName) { - myPluginName = pluginName; + public void setPluginDescriptor(PluginDescriptor pluginDescriptor) { + myPluginName = pluginDescriptor.getPluginName(); } public String getPluginName() { diff --git a/source/com/intellij/openapi/application/impl/ApplicationImpl.java b/source/com/intellij/openapi/application/impl/ApplicationImpl.java index 1472c190511b..d7c8dcd88dc2 100644 --- a/source/com/intellij/openapi/application/impl/ApplicationImpl.java +++ b/source/com/intellij/openapi/application/impl/ApplicationImpl.java @@ -15,7 +15,6 @@ import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.components.BaseComponent; import com.intellij.openapi.components.impl.ComponentManagerImpl; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; @@ -31,12 +30,15 @@ import com.intellij.openapi.project.impl.convertors.Convertor34; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.extensions.AreaPicoContainer; +import com.intellij.openapi.extensions.Extensions; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.util.ArrayUtil; import com.intellij.util.concurrency.ReentrantWriterPreferenceReadWriteLock; import org.jdom.Document; import org.jdom.Element; import org.jdom.JDOMException; +import org.picocontainer.MutablePicoContainer; import javax.swing.*; import java.awt.*; @@ -144,6 +146,12 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application } } + protected MutablePicoContainer createPicoContainer() { + final AreaPicoContainer picoContainer = Extensions.getRootArea().getPicoContainer(); + picoContainer.setComponentAdapterFactory(new MyComponentAdapterFactory()); + return picoContainer; + } + public boolean isInternal() { return myIsInternal; } diff --git a/source/com/intellij/openapi/components/impl/ComponentManagerImpl.java b/source/com/intellij/openapi/components/impl/ComponentManagerImpl.java index 04c6b20fb8ab..ba9dda782feb 100644 --- a/source/com/intellij/openapi/components/impl/ComponentManagerImpl.java +++ b/source/com/intellij/openapi/components/impl/ComponentManagerImpl.java @@ -353,19 +353,24 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements protected abstract ComponentManagerImpl getParentComponentManager(); - public MutablePicoContainer getPicoContainer() { if (myPicoContainer == null) { - if (getParentComponentManager() != null) { - myPicoContainer = new DefaultPicoContainer(new MyComponentAdapterFactory(), getParentComponentManager().getPicoContainer()); - } - else { - myPicoContainer = new DefaultPicoContainer(new MyComponentAdapterFactory()); - } + myPicoContainer = createPicoContainer(); } return myPicoContainer; } + protected MutablePicoContainer createPicoContainer() { + MutablePicoContainer result; + if (getParentComponentManager() != null) { + result = new DefaultPicoContainer(new MyComponentAdapterFactory(), getParentComponentManager().getPicoContainer()); + } + else { + result = new DefaultPicoContainer(new MyComponentAdapterFactory()); + } + return result; + } + protected void initComponentsFromExtensions(final ExtensionsArea extensionsArea) { if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return; // TODO: quick and dirty. To make tests running. @@ -558,7 +563,10 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements } } - private class MyComponentAdapterFactory implements ComponentAdapterFactory { + protected class MyComponentAdapterFactory implements ComponentAdapterFactory { + public MyComponentAdapterFactory() { + } + public ComponentAdapter createComponentAdapter(final Object componentKey, Class componentImplementation, Parameter[] parameters) throws PicoIntrospectionException, AssignabilityRegistrationException, diff --git a/testSource/com/intellij/mock/MockApplication.java b/testSource/com/intellij/mock/MockApplication.java index f3f05186efd4..532b016b36ad 100644 --- a/testSource/com/intellij/mock/MockApplication.java +++ b/testSource/com/intellij/mock/MockApplication.java @@ -1,21 +1,19 @@ package com.intellij.mock; -import com.intellij.ide.plugins.PluginDescriptor; import com.intellij.openapi.application.ApplicationListener; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ex.ApplicationEx; +import com.intellij.openapi.components.BaseComponent; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.UserDataHolderBase; -import com.intellij.openapi.components.BaseComponent; import com.intellij.util.ArrayUtil; +import org.picocontainer.PicoContainer; import java.awt.*; import java.io.IOException; -import org.picocontainer.PicoContainer; - public class MockApplication extends UserDataHolderBase implements ApplicationEx { public String getName() { return "mock"; @@ -35,6 +33,11 @@ public class MockApplication extends UserDataHolderBase implements ApplicationEx public void setupIdeQueue(EventQueue queue) { } + //used in Fabrique + public boolean isExceptionalThreadWithReadAccess(Thread thread) { + return false; + } + public String getComponentsDescriptor() { return null; }