diff options
Diffstat (limited to 'platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/StorageData.java')
-rw-r--r-- | platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/StorageData.java | 67 |
1 files changed, 43 insertions, 24 deletions
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/StorageData.java b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/StorageData.java index 82dece3ba5e1..699440e22b54 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/StorageData.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/StorageData.java @@ -16,6 +16,7 @@ package com.intellij.openapi.components.impl.stores; import com.intellij.application.options.PathMacrosCollector; +import com.intellij.ide.plugins.IdeaPluginDescriptorImpl; import com.intellij.openapi.components.PathMacroSubstitutor; import com.intellij.openapi.components.TrackingPathMacroSubstitutor; import com.intellij.openapi.components.XmlConfigurationMerger; @@ -23,20 +24,23 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.util.JDOMUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; import gnu.trove.THashMap; import gnu.trove.THashSet; import org.jdom.Attribute; import org.jdom.Element; +import org.jdom.JDOMException; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; +import java.io.InputStream; import java.util.*; public class StorageData { - private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.components.impl.stores.StorageData"); + private static final Logger LOG = Logger.getInstance(StorageData.class); @NonNls public static final String COMPONENT = "component"; @NonNls public static final String NAME = "name"; @@ -44,17 +48,21 @@ public class StorageData { protected final String myRootElementName; private int myHash = -1; - public StorageData(final String rootElementName) { + public StorageData(@NotNull String rootElementName) { myComponentStates = new THashMap<String, Element>(); myRootElementName = rootElementName; } - StorageData(StorageData storageData) { + StorageData(@NotNull StorageData storageData) { myRootElementName = storageData.myRootElementName; myComponentStates = new THashMap<String, Element>(storageData.myComponentStates); } - public void load(@NotNull Element rootElement) throws IOException { + public void load(@NotNull Element rootElement, @Nullable PathMacroSubstitutor pathMacroSubstitutor, boolean intern) { + if (pathMacroSubstitutor != null) { + pathMacroSubstitutor.expandPaths(rootElement); + } + for (Iterator<Element> iterator = rootElement.getChildren(COMPONENT).iterator(); iterator.hasNext(); ) { Element element = iterator.next(); String name = element.getAttributeValue(NAME); @@ -63,33 +71,47 @@ public class StorageData { continue; } - iterator.remove(); - if (element.getAttributes().size() > 1 || !element.getChildren().isEmpty()) { assert element.getAttributeValue(NAME) != null : "No name attribute for component: " + name + " in " + this; - Element existingElement = myComponentStates.get(name); - if (existingElement != null) { - element = mergeElements(name, element, existingElement); + iterator.remove(); + if (intern) { + IdeaPluginDescriptorImpl.internJDOMElement(element); + } + + Element serverElement = myComponentStates.get(name); + if (serverElement != null) { + element = mergeElements(name, element, serverElement); } myComponentStates.put(name, element); } } + + if (pathMacroSubstitutor instanceof TrackingPathMacroSubstitutor) { + for (String componentName : myComponentStates.keySet()) { + ((TrackingPathMacroSubstitutor)pathMacroSubstitutor).addUnknownMacros(componentName, PathMacrosCollector.getMacroNames(myComponentStates.get(componentName))); + } + } } - private static Element mergeElements(final String name, final Element element1, final Element element2) { + @NotNull + private static Element mergeElements(@NotNull String name, @NotNull Element localElement, @NotNull Element serverElement) { ExtensionPoint<XmlConfigurationMerger> point = Extensions.getRootArea().getExtensionPoint("com.intellij.componentConfigurationMerger"); for (XmlConfigurationMerger merger : point.getExtensions()) { if (merger.getComponentName().equals(name)) { - return merger.merge(element1, element2); + return merger.merge(serverElement, localElement); } } - return element1; + return serverElement; } - @NotNull + @Nullable protected Element save() { + if (myComponentStates.isEmpty()) { + return null; + } + Element rootElement = new Element(myRootElementName); String[] componentNames = ArrayUtil.toStringArray(myComponentStates.keySet()); Arrays.sort(componentNames); @@ -101,7 +123,6 @@ public class StorageData { rootElement.addContent(element.clone()); } - return rootElement; } @@ -197,20 +218,18 @@ public class StorageData { return myComponentStates.isEmpty(); } - public boolean hasState(final String componentName) { + public boolean hasState(@NotNull String componentName) { return myComponentStates.containsKey(componentName); } - public void checkUnknownMacros(TrackingPathMacroSubstitutor pathMacroSubstitutor) { - if (pathMacroSubstitutor == null) { - return; + @NotNull + public static Element load(@NotNull VirtualFile file) throws IOException, JDOMException { + InputStream stream = file.getInputStream(); + try { + return JDOMUtil.loadDocument(stream).getRootElement(); } - - for (String componentName : myComponentStates.keySet()) { - final Set<String> unknownMacros = PathMacrosCollector.getMacroNames(myComponentStates.get(componentName)); - if (!unknownMacros.isEmpty()) { - pathMacroSubstitutor.addUnknownMacros(componentName, unknownMacros); - } + finally { + stream.close(); } } } |