Application, Project, Module reuse Extensions PicoContainers. Plugins can provide own classloaders.

This commit is contained in:
Alexander Kireyev
2005-02-21 20:13:23 +03:00
parent 2ad2099ab6
commit 375677c9f5
17 changed files with 258 additions and 63 deletions
@@ -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;
}
}
@@ -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();
}
@@ -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;
}
}
}
@@ -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,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;
}
@@ -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;
}