mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Application, Project, Module reuse Extensions PicoContainers. Plugins can provide own classloaders.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+19
-1
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
@@ -8,5 +8,5 @@ package com.intellij.openapi.extensions;
|
||||
* @author akireyev
|
||||
*/
|
||||
public interface PluginAware {
|
||||
void setPluginName(String pluginName);
|
||||
void setPluginDescriptor(PluginDescriptor pluginDescriptor);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
+53
-18
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
+6
-5
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -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("<bean implementation=\"123\"/>"), container, "test");
|
||||
new ExtensionComponentAdapter(TestExtensionClassOne.class, readElement("<bean implementation=\"123\"/>"), 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;
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user