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 1d21877b6aa4..76dde7aab884 100644 --- a/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java +++ b/platform/core-impl/src/com/intellij/ide/plugins/IdeaPluginDescriptorImpl.java @@ -146,10 +146,10 @@ public class IdeaPluginDescriptorImpl implements IdeaPluginDescriptor { } public void readExternal(@NotNull Document document, @NotNull URL url, boolean ignoreMissingInclude, @NotNull JDOMXIncluder.PathResolver pathResolver) throws InvalidDataException { - document = JDOMXIncluder.resolve(document, url.toExternalForm(), ignoreMissingInclude, pathResolver); - Element rootElement = document.getRootElement(); - Element newElement = JDOMUtil.internElement(rootElement); - readExternal(newElement); + // root element always `!isIncludeElement` and it means that result always is a singleton list + // (also, plugin xml describes one plugin, this descriptor is not able to represent several plugins) + Element rootElement = JDOMXIncluder.resolveNonXIncludeElement(document.getRootElement(), url.toExternalForm(), ignoreMissingInclude, pathResolver); + readExternal(JDOMUtil.internElement(rootElement)); } public void readExternal(@NotNull URL url) throws InvalidDataException, FileNotFoundException { diff --git a/platform/util/src/com/intellij/util/xmlb/JDOMXIncluder.java b/platform/util/src/com/intellij/util/xmlb/JDOMXIncluder.java index 936d242b2d5b..fd4f199974cc 100644 --- a/platform/util/src/com/intellij/util/xmlb/JDOMXIncluder.java +++ b/platform/util/src/com/intellij/util/xmlb/JDOMXIncluder.java @@ -82,6 +82,17 @@ public class JDOMXIncluder { return new JDOMXIncluder(ignoreMissing, pathResolver).doResolve(original, base); } + @NotNull + public static Element resolveNonXIncludeElement(@NotNull Element original, @Nullable String base, boolean ignoreMissing, PathResolver pathResolver) throws XIncludeException { + LOG.assertTrue(!isIncludeElement(original)); + + Stack bases = new Stack(); + if (base != null) { + bases.push(base); + } + return new JDOMXIncluder(ignoreMissing, pathResolver).resolveNonXIncludeElement(original, bases); + } + @NotNull public static List resolve(@NotNull Element original, String base) throws XIncludeException { return new JDOMXIncluder(false, DEFAULT_PATH_RESOLVER).doResolve(original, base); @@ -176,9 +187,7 @@ public class JDOMXIncluder { bases.push(base); } - List result = resolve(original, bases); - bases.pop(); - return result; + return resolve(original, bases); } private static boolean isIncludeElement(Element element) {