From e1c867fe8ea0548b5c28d13a58dea8ce90ad5db7 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 13 Mar 2019 12:01:48 +0300 Subject: [PATCH] platform: load components from optional descriptors in deterministic order (IDEA-203089) --- .../multipleOptionalDescriptors/META-INF/dep1.xml | 1 + .../multipleOptionalDescriptors/META-INF/dep2.xml | 1 + .../multipleOptionalDescriptors/META-INF/plugin.xml | 5 +++++ .../ide/plugins/IdeaPluginDescriptorImpl.java | 2 +- .../com/intellij/ide/plugins/PluginManagerCore.java | 2 +- .../intellij/ide/plugins/PluginDescriptorTest.java | 13 +++++++++++++ 6 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep1.xml create mode 100644 java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep2.xml create mode 100644 java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/plugin.xml diff --git a/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep1.xml b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep1.xml new file mode 100644 index 000000000000..affe2a025c85 --- /dev/null +++ b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep1.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep2.xml b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep2.xml new file mode 100644 index 000000000000..affe2a025c85 --- /dev/null +++ b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/dep2.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/plugin.xml b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/plugin.xml new file mode 100644 index 000000000000..3176257f630b --- /dev/null +++ b/java/java-tests/testData/ide/plugins/pluginDescriptor/multipleOptionalDescriptors/META-INF/plugin.xml @@ -0,0 +1,5 @@ + + main + dep2 + dep1 + \ No newline at end of file diff --git a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java index 46febadc7cb6..1d3e9b1708ae 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java @@ -227,7 +227,7 @@ public class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor { Set dependentPlugins = new LinkedHashSet<>(); Set nonOptionalDependentPlugins = new LinkedHashSet<>(); if (pluginBean.dependencies != null) { - myOptionalConfigs = new THashMap<>(); + myOptionalConfigs = new LinkedHashMap<>(); for (PluginDependency dependency : pluginBean.dependencies) { String text = dependency.pluginId; if (!StringUtil.isEmptyOrSpaces(text)) { 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 49d1d8ee83c6..f38aab1efe95 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/PluginManagerCore.java @@ -917,7 +917,7 @@ public class PluginManagerCore { @NotNull Function optionalDescriptorLoader) { Map> optionalConfigs = descriptor.getOptionalConfigs(); if (optionalConfigs != null && !optionalConfigs.isEmpty()) { - Map> descriptors = new THashMap<>(optionalConfigs.size()); + Map> descriptors = new LinkedHashMap<>(optionalConfigs.size()); for (Map.Entry> entry : optionalConfigs.entrySet()) { for (String optionalDescriptorName : entry.getValue()) { diff --git a/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.java b/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.java index 79edbaeee9ca..5b1f49d62c2d 100644 --- a/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.java +++ b/platform/platform-tests/testSrc/com/intellij/ide/plugins/PluginDescriptorTest.java @@ -2,6 +2,7 @@ package com.intellij.ide.plugins; import com.intellij.openapi.application.ex.PathManagerEx; +import com.intellij.openapi.extensions.PluginId; import com.intellij.util.lang.UrlClassLoader; import org.junit.Test; @@ -11,6 +12,7 @@ import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.NoSuchElementException; +import java.util.Set; import static com.intellij.testFramework.UsefulTestCase.assertEmpty; import static com.intellij.testFramework.UsefulTestCase.assertOneElement; @@ -39,6 +41,17 @@ public class PluginDescriptorTest { assertEquals(1, descriptor.getOptionalDescriptors().size()); } + @Test + public void testMultipleOptionalDescriptors() { + IdeaPluginDescriptorImpl descriptor = loadDescriptor("multipleOptionalDescriptors"); + assertNotNull(descriptor); + Set ids = descriptor.getOptionalDescriptors().keySet(); + assertEquals(2, ids.size()); + PluginId[] idsArray = ids.toArray(PluginId.EMPTY_ARRAY); + assertEquals("dep2", idsArray[0].getIdString()); + assertEquals("dep1", idsArray[1].getIdString()); + } + @Test public void testMalformedDescriptor() { assertNull(loadDescriptor("malformed"));