Introducing Services

This commit is contained in:
Mike Aizatsky
2007-01-19 19:05:49 +03:00
parent f8649d1e82
commit e2d266d97c
32 changed files with 309 additions and 219 deletions
@@ -16,6 +16,7 @@ import com.intellij.openapi.editor.colors.CodeInsightColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.markup.SeparatorPlacement;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.progress.ProgressIndicator;
import com.intellij.openapi.progress.ProgressManager;
@@ -33,6 +34,7 @@ import com.intellij.psi.search.searches.SuperMethodsSearch;
import com.intellij.psi.util.MethodSignatureBackedByPsiMethod;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.*;
@@ -79,7 +81,7 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP
HighlightVisitor[] highlightVisitors;
synchronized (myProject) {
Integer num = myProject.getUserData(HIGHLIGHT_VISITOR_THREADS_IN_USE);
highlightVisitors = myProject.getComponents(HighlightVisitor.class);
highlightVisitors = Extensions.getExtensions(HighlightVisitor.EP_HIGHLIGHT_VISITOR, myProject);
if (num == null) {
num = 0;
}
@@ -292,6 +294,7 @@ public class GeneralHighlightingPass extends ProgressableTextEditorHighlightingP
return array;
}
@Nullable
private LineMarkerInfo getLineMarkerInfo(PsiElement element) {
if (element instanceof PsiIdentifier && element.getParent() instanceof PsiMethod) {
PsiMethod method = (PsiMethod)element.getParent();
@@ -1,10 +1,13 @@
package com.intellij.codeInsight.daemon.impl;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightInfoHolder;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
public interface HighlightVisitor {
ExtensionPointName<HighlightVisitor> EP_HIGHLIGHT_VISITOR = new ExtensionPointName<HighlightVisitor>("com.intellij.highlightVisitor");
boolean suitableForFile(PsiFile file);
void visit(PsiElement element, HighlightInfoHolder holder);
void setRefCountHolder(RefCountHolder refCountHolder);
@@ -9,7 +9,6 @@ import com.intellij.lang.annotation.Annotation;
import com.intellij.lang.annotation.Annotator;
import com.intellij.lang.annotation.HighlightSeverity;
import com.intellij.lang.jsp.JspxFileViewProvider;
import com.intellij.openapi.components.ProjectComponent;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.impl.injected.DocumentRange;
import com.intellij.openapi.fileTypes.StdFileTypes;
@@ -37,13 +36,12 @@ import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlText;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class HighlightVisitorImpl extends PsiElementVisitor implements HighlightVisitor, ProjectComponent {
public class HighlightVisitorImpl extends PsiElementVisitor implements HighlightVisitor {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.analysis.HighlightVisitorImpl");
private final PsiResolveHelper myResolveHelper;
@@ -63,20 +61,6 @@ public class HighlightVisitorImpl extends PsiElementVisitor implements Highlight
private final Map<String, Pair<PsiImportStaticReferenceElement, PsiField>> mySingleImportedFields = new THashMap<String, Pair<PsiImportStaticReferenceElement, PsiField>>();
private final AnnotationHolderImpl myAnnotationHolder = new AnnotationHolderImpl();
@NotNull
public String getComponentName() {
return "HighlightVisitorImpl";
}
public void initComponent() {
}
public void disposeComponent() {}
public void projectOpened() {}
public void projectClosed() {}
public HighlightVisitorImpl(PsiManager manager) {
this(manager.getResolveHelper());
}
@@ -18,17 +18,15 @@ import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.xml.XmlFile;
import com.intellij.ui.BooleanTableCellEditor;
import com.intellij.ui.UserActivityWatcher;
import com.intellij.ui.UserActivityListener;
import com.intellij.ui.UserActivityWatcher;
import com.intellij.util.Function;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ClassMap;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomReflectionUtil;
import com.intellij.util.xml.highlighting.DomElementsErrorPanel;
import com.intellij.util.xml.highlighting.DomElementAnnotationsManager;
import com.intellij.util.xml.highlighting.DomElementAnnotationsManagerImpl;
import org.jetbrains.annotations.NonNls;
import com.intellij.util.xml.highlighting.DomElementsErrorPanel;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
@@ -176,15 +174,4 @@ public class DomUIFactoryImpl extends DomUIFactory {
component.setBorder(new EmptyBorder(0, 0, 0, 0));
return component;
}
@NonNls
public String getComponentName() {
return getClass().getName();
}
public void initComponent() {
}
public void disposeComponent() {
}
}
@@ -4,8 +4,7 @@
package com.intellij.util.xml.ui;
import com.intellij.codeHighlighting.BackgroundEditorHighlighter;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
@@ -27,7 +26,7 @@ import java.lang.reflect.Type;
/**
* @author peter
*/
public abstract class DomUIFactory implements ApplicationComponent {
public abstract class DomUIFactory {
public static Method GET_VALUE_METHOD = null;
public static Method SET_VALUE_METHOD = null;
public static Method GET_STRING_METHOD = null;
@@ -141,7 +140,7 @@ public abstract class DomUIFactory implements ApplicationComponent {
}
public static DomUIFactory getDomUIFactory() {
return ApplicationManager.getApplication().getComponent(DomUIFactory.class);
return ServiceManager.getService(DomUIFactory.class);
}
public DomUIControl createCollectionControl(DomElement element, DomCollectionChildDescription description) {
@@ -24,17 +24,17 @@ public interface ExtensionPoint<T> {
String getBeanClassName();
void registerExtension(Object extension);
void registerExtension(Object extension, LoadingOrder order);
void registerExtension(T extension);
void registerExtension(T extension, LoadingOrder order);
T[] getExtensions();
T getExtension();
boolean hasExtension(Object extension);
boolean hasExtension(T extension);
void unregisterExtension(Object extension);
void unregisterExtension(T extension);
void addExtensionPointListener(ExtensionPointListener listener);
void removeExtensionPointListener(ExtensionPointListener extensionPointListener);
void addExtensionPointListener(ExtensionPointListener<T> listener);
void removeExtensionPointListener(ExtensionPointListener<T> extensionPointListener);
void reset();
@@ -15,7 +15,7 @@
*/
package com.intellij.openapi.extensions;
public interface ExtensionPointListener {
void extensionAdded(Object extension);
void extensionRemoved(Object extension);
public interface ExtensionPointListener<T> {
void extensionAdded(T extension);
void extensionRemoved(T extension);
}
@@ -28,7 +28,7 @@ import java.util.Set;
public abstract class Extensions {
private static LogProvider ourLogger = new SimpleLogProvider();
public static final String AREA_LISTENER_EXTENSION_POINT = "jetbrains.fabrique.platform.areaListeners";
public static final ExtensionPointName<AreaListener> AREA_LISTENER_EXTENSION_POINT = new ExtensionPointName<AreaListener>("com.intellij.arealistener");
private static Map ourAreaClass2prototypeArea;
private static Map<AreaInstance,ExtensionsAreaImpl> ourAreaInstance2area;
@@ -57,6 +57,13 @@ public abstract class Extensions {
return (T[])getExtensions(extensionPointName.getName(), null);
}
@SuppressWarnings({"unchecked"})
public static <T> T[] getExtensions(ExtensionPointName<T> extensionPointName, AreaInstance areaInstance) {
return (T[])getExtensions(extensionPointName.getName(), areaInstance);
}
public static Object[] getExtensions(String extensionPointName, AreaInstance areaInstance) {
ExtensionsArea area = getArea(areaInstance);
assert area != null: "Unable to get area for " + areaInstance;
@@ -75,7 +82,7 @@ public abstract class Extensions {
ExtensionsAreaImpl rootArea = new ExtensionsAreaImpl(null, null, null, ourLogger);
ourAreaInstance2area.put(null, rootArea);
ourAreaClass2prototypeArea.put(null, rootArea);
rootArea.registerExtensionPoint(AREA_LISTENER_EXTENSION_POINT, AreaListener.class.getName());
rootArea.registerExtensionPoint(AREA_LISTENER_EXTENSION_POINT.getName(), AreaListener.class.getName());
}
}
@@ -104,15 +111,13 @@ public abstract class Extensions {
ourAreaClass2instances.put(areaClass, areaInstance);
ourAreaInstance2class.put(areaInstance, areaClass);
AreaListener[] listeners = getAreaListeners();
for (int i = 0; i < listeners.length; i++) {
AreaListener listener = listeners[i];
for (AreaListener listener : listeners) {
listener.areaCreated(areaClass, areaInstance);
}
}
private static AreaListener[] getAreaListeners() {
AreaListener[] listeners = (AreaListener[]) getRootArea().getExtensionPoint(AREA_LISTENER_EXTENSION_POINT).getExtensions();
return listeners;
return getRootArea().getExtensionPoint(AREA_LISTENER_EXTENSION_POINT).getExtensions();
}
public static void registerAreaClass(@NonNls String areaClass, @NonNls String parentAreaClass) {
@@ -153,7 +158,7 @@ public abstract class Extensions {
public static AreaInstance[] getAllAreas() {
init();
final Set<AreaInstance> keys = ourAreaInstance2area.keySet();
return (AreaInstance[]) keys.toArray(new AreaInstance[keys.size()]);
return keys.toArray(new AreaInstance[keys.size()]);
}
public static AreaInstance[] getAllAreas(String areaClass) {
@@ -40,9 +40,9 @@ public abstract class LoadingOrder {
}
};
static final int DONT_CARE = -1;
private static final int DONT_CARE = -1;
static final int ACCEPTABLE = -2;
static final int SPECIAL = -3;
private static final int SPECIAL = -3;
private final String myName; // for debug only
private static final String BEFORE_STR = "BEFORE:";
@@ -27,7 +27,7 @@ import org.picocontainer.alternatives.AbstractDelegatingMutablePicoContainer;
* @author Alexander Kireyev
*/
@SuppressWarnings({"unchecked"})
public class AreaPicoContainerImpl extends AbstractDelegatingMutablePicoContainer implements AreaPicoContainer {
class AreaPicoContainerImpl extends AbstractDelegatingMutablePicoContainer implements AreaPicoContainer {
private final AreaInstance myAreaInstance;
public AreaPicoContainerImpl(PicoContainer parentPicoContainer, AreaInstance areaInstance) {
@@ -25,7 +25,7 @@ import org.jdom.Element;
/**
* @author Alexander Kireyev
*/
public class ElementConverter implements Converter {
class ElementConverter implements Converter {
public boolean canConvert(Class aClass) {
return Element.class.isAssignableFrom(aClass);
}
@@ -35,6 +35,7 @@ public class ElementConverter implements Converter {
}
public Object unmarshal(HierarchicalStreamReader hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) {
return hierarchicalStreamReader.peekUnderlyingNode();
//return hierarchicalStreamReader.peekUnderlyingNode();
throw new UnsupportedOperationException("This method is not yet implemented");
}
}
@@ -15,7 +15,7 @@
*/
package com.intellij.openapi.extensions.impl;
public class ExtensionClassAndAreaInstance {
class ExtensionClassAndAreaInstance {
private final Class myExtensionClass;
private final Object myAreaInstance;
@@ -17,6 +17,7 @@ package com.intellij.openapi.extensions.impl;
import com.intellij.openapi.extensions.*;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.Annotations;
import com.thoughtworks.xstream.core.util.CompositeClassLoader;
import com.thoughtworks.xstream.io.xml.JDomReader;
import org.jdom.Element;
@@ -52,14 +53,16 @@ public class ExtensionComponentAdapter extends ConstructorInjectionComponentAdap
if (myPluginDescriptor.getPluginClassLoader() != null) {
classLoader.add(myPluginDescriptor.getPluginClassLoader());
}
XStream xStream = new XStream(new PropertyReflectionProvider());
//XStream xStream = new XStream(new PropertyReflectionProvider());
XStream xStream = new XStream();
xStream.setClassLoader(classLoader);
xStream.registerConverter(new ElementConverter());
//xStream.registerConverter(new ElementConverter());
Object componentInstance = super.getComponentInstance(container);
if (componentInstance instanceof ReaderConfigurator) {
ReaderConfigurator readerConfigurator = (ReaderConfigurator) componentInstance;
readerConfigurator.configureReader(xStream);
}
Annotations.configureAliases(xStream, componentInstance.getClass());
xStream.alias(myExtensionElement.getName(), componentInstance.getClass());
myComponentInstance = xStream.unmarshal(new JDomReader(myExtensionElement), componentInstance);
}
@@ -88,7 +91,7 @@ public class ExtensionComponentAdapter extends ConstructorInjectionComponentAdap
return myExtensionElement.getAttributeValue("id");
}
public Element getExtensionElement() {
private Element getExtensionElement() {
return myExtensionElement;
}
@@ -231,6 +231,8 @@ public class ExtensionPointImpl implements ExtensionPoint {
}
public void addExtensionPointListener(ExtensionPointListener listener) {
processAdapters();
if (myEPListeners.add(listener)) {
for (Iterator iterator = myExtensions.iterator(); iterator.hasNext();) {
try {
@@ -36,7 +36,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
private final LogProvider myLogger;
private static final String ATTRIBUTE_AREA = "area";
static Map<String,String> ourDefaultEPs = new HashMap<String, String>();
private static Map<String,String> ourDefaultEPs = new HashMap<String, String>();
static {
ourDefaultEPs.put(EPAvailabilityListenerExtension.EXTENSION_POINT_NAME, EPAvailabilityListenerExtension.class.getName());
@@ -221,7 +221,7 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
}
}
public void initialize() {
private void initialize() {
for (String epName : ourDefaultEPs.keySet()) {
registerExtensionPoint(epName, ourDefaultEPs.get(epName));
}
@@ -307,9 +307,12 @@ public class ExtensionsAreaImpl implements ExtensionsArea {
if (extensions != null) {
for (Element element : extensions) {
if (equal(areaClass, element.getAttributeValue(ATTRIBUTE_AREA))) {
if (hasExtensionPoint(extractEPName(element))) {
registerExtension(pluginDescriptor, element);
}
else {
//todo check that other classes have EP
}
}
}
}
@@ -4,10 +4,13 @@
*/
package com.intellij.openapi.extensions.impl;
import com.thoughtworks.xstream.annotations.XStreamAlias;
/**
* @author Alexander Kireyev
*/
public class TestExtensionClassOne {
@XStreamAlias("text")
private String myText;
public TestExtensionClassOne() {
@@ -20,8 +23,4 @@ public class TestExtensionClassOne {
public String getText() {
return myText;
}
public void setText(String text) {
myText = text;
}
}
@@ -14,58 +14,58 @@ import java.util.Collection;
* @author Alexander Kireyev
*/
public class XMLTestBean implements PluginAware {
private boolean myOtherProperty;
private int myProp1;
private Object myProp2;
private Collection myCollectionProperty;
private PluginId myPluginId;
private boolean otherProperty;
private int prop1;
private Object prop2;
private Collection collectionProperty;
private PluginId pluginId;
public XMLTestBean() {
}
public XMLTestBean(Collection aCollectionProperty, boolean aOtherProperty, int aProp1) {
myCollectionProperty = aCollectionProperty;
myOtherProperty = aOtherProperty;
myProp1 = aProp1;
collectionProperty = aCollectionProperty;
otherProperty = aOtherProperty;
prop1 = aProp1;
}
public boolean isOtherProperty() {
return myOtherProperty;
return otherProperty;
}
public void setOtherProperty(boolean otherProperty) {
myOtherProperty = otherProperty;
this.otherProperty = otherProperty;
}
public int getProp1() {
return myProp1;
return prop1;
}
public void setProp1(int prop1) {
myProp1 = prop1;
this.prop1 = prop1;
}
public Object getProp2() {
return myProp2;
return prop2;
}
public void setProp2(Object prop2) {
myProp2 = prop2;
this.prop2 = prop2;
}
public Collection getCollectionProperty() {
return myCollectionProperty;
return collectionProperty;
}
public void setCollectionProperty(Collection collectionProperty) {
myCollectionProperty = collectionProperty;
this.collectionProperty = collectionProperty;
}
public void setPluginDescriptor(PluginDescriptor pluginDescriptor) {
myPluginId = pluginDescriptor.getPluginId();
pluginId = pluginDescriptor.getPluginId();
}
public PluginId getPluginId() {
return myPluginId;
return pluginId;
}
}
BIN
View File
Binary file not shown.
@@ -0,0 +1,39 @@
package com.intellij.openapi.components;
import com.intellij.openapi.extensions.ReaderConfigurator;
import com.thoughtworks.xstream.XStream;
public class ServiceDescriptor implements ReaderConfigurator {
private String serviceInterface;
private String serviceImplementation;
public ServiceDescriptor() {
}
public ServiceDescriptor(final String serviceInterface, final String serviceImplementation) {
this.serviceInterface = serviceInterface;
this.serviceImplementation = serviceImplementation;
}
public String getServiceInterface() {
return serviceInterface;
}
public String getServiceImplementation() {
return serviceImplementation;
}
public void setServiceInterface(final String serviceInterface) {
this.serviceInterface = serviceInterface;
}
public void setServiceImplementation(final String serviceImplementation) {
this.serviceImplementation = serviceImplementation;
}
public void configureReader(XStream xstream) {
xstream.useAttributeFor("serviceInterface", String.class);
xstream.useAttributeFor("serviceImplementation", String.class);
}
}
@@ -0,0 +1,23 @@
package com.intellij.openapi.components;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
@SuppressWarnings({"unchecked"})
public class ServiceManager {
private ServiceManager() {
}
public static <T> T getService(Class<T> serviceClass) {
return (T)ApplicationManager.getApplication().getPicoContainer().getComponentInstance(serviceClass.getName());
}
public static <T> T getService(Project project, Class<T> serviceClass) {
return (T)project.getPicoContainer().getComponentInstance(serviceClass.getName());
}
public static <T> T getService(Module module, Class<T> serviceClass) {
return (T)module.getPicoContainer().getComponentInstance(serviceClass.getName());
}
}
@@ -225,6 +225,7 @@ public class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor {
return myDependencies;
}
@NotNull
public PluginId[] getOptionalDependentPluginIds() {
return myOptionalDependencies;
@@ -440,4 +441,10 @@ public class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor {
myDescription = loadDescription(myDescriptionChildText, bundle, myId);
}
public void insertDependency(final IdeaPluginDescriptor d) {
PluginId[] deps = new PluginId[getDependentPluginIds().length + 1];
deps[0] = d.getPluginId();
System.arraycopy(myDependencies, 0, deps, 1, deps.length - 1);
myDependencies = deps;
}
}
@@ -9,9 +9,10 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.impl.PluginsFacade;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.*;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.extensions.LogProvider;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.ArrayUtil;
import com.intellij.util.graph.CachingSemiGraph;
@@ -20,9 +21,6 @@ import com.intellij.util.graph.Graph;
import com.intellij.util.graph.GraphGenerator;
import com.intellij.util.lang.UrlClassLoader;
import com.intellij.util.text.StringTokenizer;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import sun.reflect.Reflection;
@@ -31,7 +29,6 @@ import javax.swing.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -55,6 +52,7 @@ public class PluginManager {
@NonNls private static final String PROPERTY_PLUGIN_PATH = "plugin.path";
private static final Object PLUGIN_CLASSES_LOCK = new Object();
private static String myPluginError = null;
private static final String CORE_PLUGIN_ID = "com.intellij";
private static Logger getLogger() {
if (ourLogger == null) {
@@ -119,6 +117,15 @@ public class PluginManager {
for (final IdeaPluginDescriptor descriptor : pluginDescriptors) {
idToDescriptorMap.put(descriptor.getPluginId(), descriptor);
}
final IdeaPluginDescriptor corePluginDescriptor = idToDescriptorMap.get(PluginId.getId(CORE_PLUGIN_ID));
assert corePluginDescriptor != null;
for (IdeaPluginDescriptorImpl descriptor : pluginDescriptors) {
if (descriptor != corePluginDescriptor) {
descriptor.insertDependency(corePluginDescriptor);
}
}
// sort descriptors according to plugin dependencies
Arrays.sort(pluginDescriptors, getPluginDescriptorComparator(idToDescriptorMap));
@@ -140,51 +147,9 @@ public class PluginManager {
}
private static void configureExtensions() {
final List<Element> extensionPoints = new ArrayList<Element>();
final List<Element> extensions = new ArrayList<Element>();
try {
final InputStream stdExtensionsStream = PluginManager.class.getResourceAsStream("/standard-extensions.xml");
final Document stdExtensions = JDOMUtil.loadDocument(stdExtensionsStream);
final Element root = stdExtensions.getRootElement();
final List<Element> epRoots = JDOMUtil.getChildrenFromAllNamespaces(root, "extensionPoints");
for (Element epRoot : epRoots) {
for (Object o : epRoot.getChildren()) {
extensionPoints.add((Element)o);
}
}
final List<Element> extensionRoots = JDOMUtil.getChildrenFromAllNamespaces(root, "extensions");
for (Element extRoot : extensionRoots) {
for (Object o : extRoot.getChildren()) {
extensions.add((Element)o);
}
}
}
catch (JDOMException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
Extensions.setLogProvider(new IdeaLogProvider());
Extensions.registerAreaClass(AREA_IDEA_PROJECT, null);
Extensions.registerAreaClass(AREA_IDEA_MODULE, AREA_IDEA_PROJECT);
Extensions.getRootArea().registerAreaExtensionsAndPoints(RootPluginDescriptor.INSTANCE, extensionPoints, extensions);
Extensions.getRootArea().getExtensionPoint(Extensions.AREA_LISTENER_EXTENSION_POINT).registerExtension(new AreaListener() {
public void areaCreated(String areaClass, AreaInstance areaInstance) {
if (AREA_IDEA_PROJECT.equals(areaClass) || AREA_IDEA_MODULE.equals(areaClass)) {
final ExtensionsArea area = Extensions.getArea(areaInstance);
area.registerAreaExtensionsAndPoints(RootPluginDescriptor.INSTANCE, extensionPoints, extensions);
}
}
public void areaDisposing(String areaClass, AreaInstance areaInstance) {
}
}, LoadingOrder.FIRST);
}
public static boolean shouldLoadPlugins() {
@@ -200,20 +165,33 @@ public class PluginManager {
return loadPlugins == null || Boolean.TRUE.toString().equals(loadPlugins);
}
public static boolean shouldLoadPlugin(IdeaPluginDescriptor descriptor) {
//noinspection HardCodedStringLiteral
final String loadPluginCategory = System.getProperty("idea.load.plugins.category");
if (loadPluginCategory != null) {
return loadPluginCategory.equals(descriptor.getCategory());
public static boolean shouldSkipPlugin(IdeaPluginDescriptor descriptor) {
final boolean shouldLoad;
if (descriptor.getPluginId().getIdString().equals(CORE_PLUGIN_ID)) {
shouldLoad = true;
}
//noinspection HardCodedStringLiteral
final String pluginId = System.getProperty("idea.load.plugins.id");
return pluginId == null || (descriptor.getPluginId() != null &&
descriptor.getPluginId().getIdString() != null &&
pluginId.equals(descriptor.getPluginId().getIdString()));
else {
//noinspection HardCodedStringLiteral
final String loadPluginCategory = System.getProperty("idea.load.plugins.category");
if (loadPluginCategory != null) {
shouldLoad = loadPluginCategory.equals(descriptor.getCategory());
}
else {
//noinspection HardCodedStringLiteral
final String pluginId = System.getProperty("idea.load.plugins.id");
shouldLoad = pluginId == null || (descriptor.getPluginId() != null &&
descriptor.getPluginId().getIdString() != null &&
pluginId.equals(descriptor.getPluginId().getIdString()));
}
}
return !shouldLoad;
}
private static Comparator<IdeaPluginDescriptor> getPluginDescriptorComparator(Map<PluginId, IdeaPluginDescriptor> idToDescriptorMap) {
final Graph<PluginId> graph = createPluginIdGraph(idToDescriptorMap);
final DFSTBuilder<PluginId> builder = new DFSTBuilder<PluginId>(graph);
@@ -368,7 +346,6 @@ public class PluginManager {
@SuppressWarnings({"UseOfSystemOutOrSystemErr", "CallToPrintStackTrace"})
private static void loadDescriptorsFromClassPath(final List<IdeaPluginDescriptorImpl> result) {
try {
final String homePath = PathManager.getHomePath();
final Collection<URL> urls = getClassLoaderUrls();
for (URL url : urls) {
final String protocol = url.getProtocol();
@@ -395,8 +372,7 @@ public class PluginManager {
final Class<? extends ClassLoader> aClass = classLoader.getClass();
if (aClass.getName().equals(UrlClassLoader.class.getName())) {
try {
final List<URL> urls = (List<URL>)aClass.getDeclaredMethod("getUrls").invoke(classLoader);
return urls;
return (List<URL>)aClass.getDeclaredMethod("getUrls").invoke(classLoader);
}
catch (IllegalAccessException e) {
}
@@ -458,7 +434,7 @@ public class PluginManager {
}
for (Iterator<IdeaPluginDescriptorImpl> iterator = result.iterator(); iterator.hasNext();) {
IdeaPluginDescriptor descriptor = iterator.next();
if (!shouldLoadPlugins() || !shouldLoadPlugin(descriptor)) {
if (!shouldLoadPlugins() || shouldSkipPlugin(descriptor)) {
iterator.remove();
}
}
@@ -479,6 +455,7 @@ public class PluginManager {
}
@SuppressWarnings({"HardCodedStringLiteral"})
@Nullable
private static IdeaPluginDescriptorImpl loadDescriptor(final File file) {
IdeaPluginDescriptorImpl descriptor = null;
@@ -101,10 +101,6 @@
<implementation-class>com.intellij.codeInsight.daemon.impl.EditorTracker</implementation-class>
<skipForDummyProject/>
</component>
<component>
<implementation-class>com.intellij.codeInsight.daemon.impl.analysis.HighlightVisitorImpl</implementation-class>
<skipForDummyProject/>
</component>
<component>
<interface-class>com.intellij.codeInsight.guess.GuessManager</interface-class>
<implementation-class>com.intellij.codeInsight.guess.impl.GuessManagerImpl</implementation-class>
+11 -8
View File
@@ -180,11 +180,10 @@
<component>
<implementation-class>com.intellij.ide.Exe4jListener</implementation-class>
</component>
<component>
<interface-class>com.intellij.util.xml.ui.DomUIFactory</interface-class>
<implementation-class>com.intellij.util.xml.ui.DomUIFactoryImpl</implementation-class>
</component>
<implementation-class>com.intellij.openapi.components.impl.ServiceManagerImpl</implementation-class>
</component>
</application-components>
@@ -208,10 +207,6 @@
<implementation-class>com.intellij.util.xml.impl.DomElementsNavigationManagerImpl</implementation-class>
<skipForDummyProject/>
</component>
<component>
<implementation-class>com.intellij.util.xml.ui.EditorTextFieldControlHighlighter</implementation-class>
<skipForDummyProject/>
</component>
<component>
<interface-class>com.intellij.openapi.startup.StartupManager</interface-class>
<implementation-class>com.intellij.ide.startup.impl.StartupManagerImpl</implementation-class>
@@ -354,6 +349,10 @@
<interface-class>com.intellij.facet.FacetExistentceListenersRegistry</interface-class>
<implementation-class>com.intellij.facet.impl.FacetExistentceListenersRegistryImpl</implementation-class>
</component>
<component>
<implementation-class>com.intellij.openapi.components.impl.ServiceManagerImpl</implementation-class>
</component>
</project-components>
@@ -369,5 +368,9 @@
<component>
<implementation-class>com.intellij.jar.BuildJarSettings</implementation-class>
</component>
<component>
<implementation-class>com.intellij.openapi.components.impl.ServiceManagerImpl</implementation-class>
</component>
</module-components>
</components>
@@ -196,12 +196,6 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application
return myName;
}
public void initComponents() {
initComponentsFromExtensions(Extensions.getRootArea());
super.initComponents();
}
@Override
protected void handleInitComponentError(final Throwable ex, final boolean fatal, final String componentClassName) {
if (PluginManager.isPluginClass(componentClassName)) {
@@ -240,7 +234,7 @@ public class ApplicationImpl extends ComponentManagerImpl implements Application
if (PluginManager.shouldLoadPlugins()) {
final IdeaPluginDescriptor[] plugins = PluginManager.getPlugins();
for (IdeaPluginDescriptor plugin : plugins) {
if (!PluginManager.shouldLoadPlugin(plugin)) continue;
if (PluginManager.shouldSkipPlugin(plugin)) continue;
loadComponentsConfiguration(plugin.getAppComponents(), plugin, true);
}
}
@@ -1,10 +1,7 @@
package com.intellij.openapi.components.impl;
import com.intellij.ExtensionPoints;
import com.intellij.diagnostic.PluginException;
import com.intellij.ide.plugins.ComponentDescriptor;
import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.components.BaseComponent;
@@ -14,10 +11,7 @@ import com.intellij.openapi.components.SettingsSavingComponent;
import com.intellij.openapi.components.ex.ComponentManagerEx;
import com.intellij.openapi.components.impl.stores.IComponentStore;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.ExtensionsArea;
import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.IdeaPicoContainer;
import com.intellij.util.containers.HashMap;
import com.intellij.util.messages.MessageBus;
@@ -260,44 +254,6 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements
return result;
}
public void initComponentsFromExtensions(final ExtensionsArea extensionsArea) {
//if (ApplicationManagerEx.getApplicationEx().isUnitTestMode()) return; // TODO: quick and dirty. To make tests running.
final Application app = ApplicationManager.getApplication();
final boolean headless = app.isHeadlessEnvironment();
final ComponentDescriptor[] componentDescriptors =
(ComponentDescriptor[])extensionsArea.getExtensionPoint(ExtensionPoints.COMPONENT).getExtensions();
for (ComponentDescriptor descriptor : componentDescriptors) {
final Map<String, String> options = descriptor.getOptionsMap();
if (isComponentSuitable(options)) {
ClassLoader loader = findLoader(descriptor.getPluginId());
try {
final String implementation = headless ? descriptor.getHeadlessImplementation() : descriptor.getImplementation();
if (!StringUtil.isEmpty(implementation)) {
registerComponent(Class.forName(descriptor.getInterface(), true, loader), Class.forName(implementation, true, loader), options);
}
}
catch (Exception e) {
LOG.error(new PluginException(e, descriptor.getPluginId()));
}
catch (Error e) {
LOG.error(new PluginException(e, descriptor.getPluginId()));
}
}
}
}
private ClassLoader findLoader(final PluginId id) {
final Application app = ApplicationManager.getApplication();
ClassLoader loader = app.getPlugin(id).getPluginClassLoader();
if (loader == null) {
loader = getClass().getClassLoader();
}
return loader;
}
public synchronized BaseComponent getComponent(String name) {
return myComponentsRegistry.getComponentByName(name);
}
@@ -463,7 +419,7 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements
}
private boolean containsInterface(final Class interfaceClass) {
assert myClassesLoaded;
if (!myClassesLoaded) loadClasses();
return myInterfaceToClassMap.containsKey(interfaceClass);
}
@@ -0,0 +1,108 @@
package com.intellij.openapi.components.impl;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.BaseComponent;
import com.intellij.openapi.components.ComponentManager;
import com.intellij.openapi.components.ServiceDescriptor;
import com.intellij.openapi.extensions.ExtensionPoint;
import com.intellij.openapi.extensions.ExtensionPointListener;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.picocontainer.*;
import org.picocontainer.defaults.CachingComponentAdapter;
import org.picocontainer.defaults.ConstructorInjectionComponentAdapter;
public class ServiceManagerImpl implements BaseComponent {
private static final ExtensionPointName<ServiceDescriptor> APP_SERVICES = new ExtensionPointName<ServiceDescriptor>("com.intellij.applicationService");
private static final ExtensionPointName<ServiceDescriptor> PROJECT_SERVICES = new ExtensionPointName<ServiceDescriptor>("com.intellij.projectService");
private static final ExtensionPointName<ServiceDescriptor> MODULE_SERVICES = new ExtensionPointName<ServiceDescriptor>("com.intellij.moduleService");
private ExtensionPointName<ServiceDescriptor> myExtensionPointName;
private ExtensionPointListener<ServiceDescriptor> myExtensionPointListener;
public ServiceManagerImpl() {
installEP(APP_SERVICES, ApplicationManager.getApplication());
}
public ServiceManagerImpl(Project project) {
installEP(PROJECT_SERVICES, project);
}
@SuppressWarnings({"UnusedDeclaration"})
public ServiceManagerImpl(Project project, Module module) {
installEP(MODULE_SERVICES, module);
}
private void installEP(final ExtensionPointName<ServiceDescriptor> pointName, final ComponentManager componentManager) {
myExtensionPointName = pointName;
final ExtensionPoint<ServiceDescriptor> extensionPoint = Extensions.getArea(null).getExtensionPoint(pointName);
assert extensionPoint != null;
final MutablePicoContainer picoContainer = (MutablePicoContainer)componentManager.getPicoContainer();
myExtensionPointListener = new ExtensionPointListener<ServiceDescriptor>() {
public void extensionAdded(final ServiceDescriptor descriptor) {
picoContainer.registerComponent(new ComponentAdapter() {
private ComponentAdapter myDelegate = null;
public Object getComponentKey() {
return descriptor.getServiceInterface();
}
public Class getComponentImplementation() {
try {
return Class.forName(descriptor.getServiceImplementation());
}
catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public Object getComponentInstance(final PicoContainer container) throws PicoInitializationException, PicoIntrospectionException {
return getDelegate().getComponentInstance(container);
}
private synchronized ComponentAdapter getDelegate() {
if (myDelegate == null) {
myDelegate = new CachingComponentAdapter(new ConstructorInjectionComponentAdapter(getComponentKey(), getComponentImplementation(), null, true));
}
return myDelegate;
}
public void verify(final PicoContainer container) throws PicoIntrospectionException {
getDelegate().verify(container);
}
public void accept(final PicoVisitor visitor) {
visitor.visitComponentAdapter(this);
}
});
}
public void extensionRemoved(final ServiceDescriptor extension) {
picoContainer.unregisterComponent(extension.getServiceInterface());
}
};
extensionPoint.addExtensionPointListener(myExtensionPointListener);
}
@NonNls
@NotNull
public String getComponentName() {
return getClass().getName();
}
public void initComponent() {
}
public void disposeComponent() {
final ExtensionPoint<ServiceDescriptor> extensionPoint = Extensions.getArea(null).getExtensionPoint(myExtensionPointName);
assert extensionPoint != null;
extensionPoint.removeExtensionPointListener(myExtensionPointListener);
}
}
@@ -5,7 +5,6 @@ import com.intellij.openapi.application.ex.DecodeDefaultsUtil;
import com.intellij.openapi.components.ComponentConfig;
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.module.ModuleType;
import com.intellij.openapi.module.ModuleTypeManager;
@@ -164,6 +163,5 @@ class ModuleStoreImpl extends BaseFileConfigurableStoreImpl implements IModuleSt
}
public synchronized void initStore() {
getComponentManager().initComponentsFromExtensions(Extensions.getArea(myModule));
}
}
@@ -11,7 +11,6 @@ import com.intellij.openapi.components.ComponentConfig;
import com.intellij.openapi.components.PathMacroManager;
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.help.HelpManager;
import com.intellij.openapi.module.Module;
@@ -403,7 +402,6 @@ class ProjectStoreImpl extends BaseFileConfigurableStoreImpl implements IProject
}
public synchronized void initStore() {
getComponentManager().initComponentsFromExtensions(Extensions.getArea(myProject));
}
@@ -109,7 +109,7 @@ public class ModuleImpl extends ComponentManagerImpl implements Module {
if (PluginManager.shouldLoadPlugins()) {
final IdeaPluginDescriptor[] plugins = PluginManager.getPlugins();
for (IdeaPluginDescriptor plugin : plugins) {
if (!PluginManager.shouldLoadPlugin(plugin)) continue;
if (PluginManager.shouldSkipPlugin(plugin)) continue;
loadComponentsConfiguration(plugin.getModuleComponents(), plugin, true);
}
}
@@ -5,6 +5,7 @@ import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.wm.WindowManager;
import com.intellij.openapi.wm.ex.StatusBarEx;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.util.containers.HashMap;
import javax.swing.*;
@@ -19,6 +20,7 @@ public class StatusBarProgress extends ProgressIndicatorBase {
SwingUtilities.invokeLater (
new Runnable() {
public void run() {
if (ApplicationManager.getApplication().isDisposed()) return;
Project[] projects=ProjectManager.getInstance().getOpenProjects();
if(projects.length==0){
projects=new Project[]{null};
@@ -227,7 +227,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx {
final Application app = ApplicationManager.getApplication();
final IdeaPluginDescriptor[] plugins = app.getPlugins();
for (IdeaPluginDescriptor plugin : plugins) {
if (!PluginManager.shouldLoadPlugin(plugin)) continue;
if (PluginManager.shouldSkipPlugin(plugin)) continue;
loadComponentsConfiguration(plugin.getProjectComponents(), plugin, true);
}
}