summaryrefslogtreecommitdiff
path: root/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java')
-rw-r--r--platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java55
1 files changed, 35 insertions, 20 deletions
diff --git a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java
index cf2d45ad4945..8f4fd771ebdd 100644
--- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java
+++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java
@@ -25,10 +25,7 @@ import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.components.ExtensionAreas;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.extensions.*;
-import com.intellij.openapi.util.BuildNumber;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.util.Condition;
-import com.intellij.openapi.util.JDOMUtil;
+import com.intellij.openapi.util.*;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.StreamUtil;
import com.intellij.openapi.util.io.ZipFileCache;
@@ -479,8 +476,10 @@ public class PluginManagerCore {
}
static void prepareLoadingPluginsErrorMessage(final String errorMessage) {
- if (errorMessage != null) {
- if (!ApplicationManager.getApplication().isHeadlessEnvironment() && !ApplicationManager.getApplication().isUnitTestMode()) {
+ if (!StringUtil.isEmptyOrSpaces(errorMessage)) {
+ if (ApplicationManager.getApplication() != null
+ && !ApplicationManager.getApplication().isHeadlessEnvironment()
+ && !ApplicationManager.getApplication().isUnitTestMode()) {
if (myPluginError == null) {
myPluginError = errorMessage;
}
@@ -499,6 +498,7 @@ public class PluginManagerCore {
}
}
+ @Deprecated
static Comparator<IdeaPluginDescriptor> getPluginDescriptorComparator(Map<PluginId, IdeaPluginDescriptorImpl> idToDescriptorMap) {
final Graph<PluginId> graph = createPluginIdGraph(idToDescriptorMap);
final DFSTBuilder<PluginId> builder = new DFSTBuilder<PluginId>(graph);
@@ -549,6 +549,7 @@ public class PluginManagerCore {
}));
}
+ @Deprecated
static IdeaPluginDescriptorImpl[] findCorePlugin(IdeaPluginDescriptorImpl[] pluginDescriptors) {
for (IdeaPluginDescriptorImpl descriptor : pluginDescriptors) {
if (CORE_PLUGIN_ID.equals(descriptor.getPluginId().getIdString())) {
@@ -820,7 +821,7 @@ public class PluginManagerCore {
message.insert(0, IdeBundle.message("error.problems.found.loading.plugins"));
return message.toString();
}
- return null;
+ return "";
}
static void loadDescriptorsFromClassPath(@NotNull List<IdeaPluginDescriptorImpl> result, @Nullable StartupProgress progress) {
@@ -900,14 +901,7 @@ public class PluginManagerCore {
loadDescriptorsFromClassPath(result, fromSources ? progress : null);
IdeaPluginDescriptorImpl[] pluginDescriptors = result.toArray(new IdeaPluginDescriptorImpl[result.size()]);
- try {
- Arrays.sort(pluginDescriptors, new PluginDescriptorComparator(pluginDescriptors));
- }
- catch (Exception e) {
- prepareLoadingPluginsErrorMessage(IdeBundle.message("error.plugins.were.not.loaded", e.getMessage()));
- getLogger().info(e);
- return findCorePlugin(pluginDescriptors);
- }
+ Arrays.sort(pluginDescriptors, new PluginDescriptorComparator(pluginDescriptors));
return pluginDescriptors;
}
@@ -1090,12 +1084,13 @@ public class PluginManagerCore {
String errorMessage = filterBadPlugins(result, disabledPluginNames);
if (!brokenPluginsList.isEmpty()) {
- errorMessage = "Following plugins are incompatible with current IDE build: " + StringUtil.join(brokenPluginsList, ", ")
- + "<br>\n" + StringUtil.notNullize(errorMessage);
+ if (!StringUtil.isEmptyOrSpaces(errorMessage)) {
+ errorMessage += "<br>";
+ }
+ errorMessage += "Following plugins are incompatible with current IDE build: " + StringUtil.join(brokenPluginsList, ", ")
+ + "<br>\n" + StringUtil.notNullize(errorMessage);
}
- prepareLoadingPluginsErrorMessage(errorMessage);
-
final Map<PluginId, IdeaPluginDescriptorImpl> idToDescriptorMap = new HashMap<PluginId, IdeaPluginDescriptorImpl>();
for (final IdeaPluginDescriptorImpl descriptor : result) {
idToDescriptorMap.put(descriptor.getPluginId(), descriptor);
@@ -1112,8 +1107,28 @@ public class PluginManagerCore {
mergeOptionalConfigs(idToDescriptorMap);
addModulesAsDependents(idToDescriptorMap);
+ final Graph<PluginId> graph = createPluginIdGraph(idToDescriptorMap);
+ final DFSTBuilder<PluginId> builder = new DFSTBuilder<PluginId>(graph);
+ if (!builder.isAcyclic()) {
+ final Couple<PluginId> circularDependency = builder.getCircularDependency();
+ final PluginId id = circularDependency.getFirst();
+ final PluginId parentId = circularDependency.getSecond();
+ if (!StringUtil.isEmptyOrSpaces(errorMessage)) {
+ errorMessage += "<br>";
+ }
+ errorMessage += IdeBundle.message("error.plugins.should.not.have.cyclic.dependencies") + id + "->" + parentId + "->...->" + id;
+ }
+
+ prepareLoadingPluginsErrorMessage(errorMessage);
+
+ final Comparator<PluginId> idComparator = builder.comparator();
// sort descriptors according to plugin dependencies
- Collections.sort(result, getPluginDescriptorComparator(idToDescriptorMap));
+ Collections.sort(result, new Comparator<IdeaPluginDescriptor>() {
+ @Override
+ public int compare(IdeaPluginDescriptor o1, IdeaPluginDescriptor o2) {
+ return idComparator.compare(o1.getPluginId(), o2.getPluginId());
+ }
+ });
for (int i = 0; i < result.size(); i++) {
ourId2Index.put(result.get(i).getPluginId(), i);