summaryrefslogtreecommitdiff
path: root/platform/projectModel-impl/src/com/intellij/openapi/components/impl/stores/StorageData.java
diff options
context:
space:
mode:
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.java67
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();
}
}
}