From 55a8bd43b01ac13b87cf42cc650e927cbe817921 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Fri, 18 Jul 2014 17:24:50 +0200 Subject: [PATCH] =?UTF-8?q?DebuggerSettings=20=E2=80=94=20use=20Persistent?= =?UTF-8?q?StateComponent=20instead=20of=20deprecated=20JDOMExternalizable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../debugger/impl/DebuggerUtilsEx.java | 20 ++--- .../debugger/settings/DebuggerSettings.java | 90 +++++++++++-------- .../intellij/ui/classFilter/ClassFilter.java | 16 +--- .../JavaCoverageEnabledConfiguration.java | 21 +++-- 4 files changed, 78 insertions(+), 69 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java index e937aac836ef..026b7111d18f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerUtilsEx.java @@ -45,6 +45,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import com.intellij.ui.classFilter.ClassFilter; import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import com.intellij.xdebugger.XSourcePosition; import com.intellij.xdebugger.impl.XSourcePositionImpl; import com.sun.jdi.*; @@ -199,7 +200,7 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { public static ClassFilter create(Element element) throws InvalidDataException { ClassFilter filter = new ClassFilter(); - filter.readExternal(element); + DefaultJDOMExternalizer.readExternal(filter, element); return filter; } @@ -245,24 +246,23 @@ public abstract class DebuggerUtilsEx extends DebuggerUtils { return res; } - public static ClassFilter[] readFilters(List children) throws InvalidDataException { - if (children == null || children.size() == 0) { + public static ClassFilter[] readFilters(List children) throws InvalidDataException { + if (ContainerUtil.isEmpty(children)) { return ClassFilter.EMPTY_ARRAY; } - List classFiltersList = new ArrayList(children.size()); - for (Object aChildren : children) { - final ClassFilter classFilter = new ClassFilter(); - classFilter.readExternal((Element)aChildren); - classFiltersList.add(classFilter); + + ClassFilter[] filters = new ClassFilter[children.size()]; + for (int i = 0, size = children.size(); i < size; i++) { + filters[i] = create(children.get(i)); } - return classFiltersList.toArray(new ClassFilter[classFiltersList.size()]); + return filters; } public static void writeFilters(Element parentNode, @NonNls String tagName, ClassFilter[] filters) throws WriteExternalException { for (ClassFilter filter : filters) { Element element = new Element(tagName); parentNode.addContent(element); - filter.writeExternal(element); + DefaultJDOMExternalizer.writeExternal(filter, element); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java index e25c895858a5..a6aada62a61f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerSettings.java @@ -16,24 +16,31 @@ package com.intellij.debugger.settings; import com.intellij.debugger.impl.DebuggerUtilsEx; -import com.intellij.openapi.components.NamedComponent; -import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.JDOMExternalizable; import com.intellij.openapi.util.WriteExternalException; import com.intellij.ui.classFilter.ClassFilter; +import com.intellij.util.containers.hash.LinkedHashMap; +import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; +import com.intellij.util.xmlb.XmlSerializer; +import com.intellij.util.xmlb.annotations.Transient; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; -public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Cloneable { +@State( + name = "DebuggerSettings", + storages = { + @Storage( + file = StoragePathMacros.APP_CONFIG + "/other.xml" + )} +) +public class DebuggerSettings implements Cloneable, PersistentStateComponent { private static final Logger LOG = Logger.getInstance("#com.intellij.debugger.settings.DebuggerSettings"); public static final int SOCKET_TRANSPORT = 0; public static final int SHMEM_TRANSPORT = 1; @@ -72,8 +79,10 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo private ClassFilter[] mySteppingFilters = ClassFilter.EMPTY_ARRAY; - private Map myContentStates = new HashMap(); + private Map myContentStates = new LinkedHashMap(); + // transient - custom serialization + @Transient public ClassFilter[] getSteppingFilters() { final ClassFilter[] rv = new ClassFilter[mySteppingFilters.length]; for (int idx = 0; idx < rv.length; idx++) { @@ -82,50 +91,51 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo return rv; } + public static DebuggerSettings getInstance() { + return ServiceManager.getService(DebuggerSettings.class); + } + public void setSteppingFilters(ClassFilter[] steppingFilters) { mySteppingFilters = steppingFilters != null ? steppingFilters : ClassFilter.EMPTY_ARRAY; } - @SuppressWarnings({"HardCodedStringLiteral"}) - public void readExternal(Element parentNode) throws InvalidDataException { - DefaultJDOMExternalizer.readExternal(this, parentNode); - List filtersList = new ArrayList(); - - for (final Object o : parentNode.getChildren("filter")) { - Element filter = (Element)o; - filtersList.add(DebuggerUtilsEx.create(filter)); + @Nullable + @Override + public Element getState() { + Element state = XmlSerializer.serialize(this, new SkipDefaultValuesSerializationFilters()); + try { + DebuggerUtilsEx.writeFilters(state, "filter", mySteppingFilters); } - setSteppingFilters(filtersList.toArray(new ClassFilter[filtersList.size()])); - - filtersList.clear(); - - final List contents = parentNode.getChildren("content"); - myContentStates.clear(); - for (Object content : contents) { - final ContentState state = new ContentState((Element)content); - myContentStates.put(state.getType(), state); - } - } - - @SuppressWarnings({"HardCodedStringLiteral"}) - public void writeExternal(Element parentNode) throws WriteExternalException { - DefaultJDOMExternalizer.writeExternal(this, parentNode); - for (ClassFilter mySteppingFilter : mySteppingFilters) { - Element element = new Element("filter"); - parentNode.addContent(element); - mySteppingFilter.writeExternal(element); + catch (WriteExternalException e) { + LOG.error(e); + return null; } for (ContentState eachState : myContentStates.values()) { final Element content = new Element("content"); if (eachState.write(content)) { - parentNode.addContent(content); + state.addContent(content); } } + return state; } - public static DebuggerSettings getInstance() { - return ServiceManager.getService(DebuggerSettings.class); + @Override + public void loadState(Element state) { + XmlSerializer.deserializeInto(this, state); + + try { + setSteppingFilters(DebuggerUtilsEx.readFilters(state.getChildren("filter"))); + } + catch (InvalidDataException e) { + LOG.error(e); + } + + myContentStates.clear(); + for (Element content : state.getChildren("content")) { + ContentState contentState = new ContentState(content); + myContentStates.put(contentState.getType(), contentState); + } } public boolean equals(Object obj) { @@ -150,6 +160,7 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo DebuggerUtilsEx.filterEquals(mySteppingFilters, secondSettings.mySteppingFilters); } + @Override public DebuggerSettings clone() { try { final DebuggerSettings cloned = (DebuggerSettings)super.clone(); @@ -208,7 +219,7 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo if (mySelectedTab != null) { element.setAttribute("selected", mySelectedTab); } - element.setAttribute("split", new Double(mySplitProportion).toString()); + element.setAttribute("split", Double.toString(mySplitProportion)); element.setAttribute("detached", Boolean.valueOf(myDetached).toString()); element.setAttribute("horizontal", Boolean.valueOf(myHorizontalToolbar).toString()); return true; @@ -266,6 +277,7 @@ public class DebuggerSettings implements JDOMExternalizable, NamedComponent, Clo myHorizontalToolbar = horizontalToolbar; } + @Override public ContentState clone() throws CloneNotSupportedException { return (ContentState)super.clone(); } diff --git a/java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java b/java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java index 7521d3bd7c13..05500e31ebd3 100644 --- a/java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java +++ b/java/openapi/src/com/intellij/ui/classFilter/ClassFilter.java @@ -17,20 +17,15 @@ package com.intellij.ui.classFilter; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.util.DefaultJDOMExternalizer; -import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.JDOMExternalizable; -import com.intellij.openapi.util.WriteExternalException; import com.intellij.util.xmlb.annotations.Attribute; import com.intellij.util.xmlb.annotations.Tag; import com.intellij.util.xmlb.annotations.Transient; -import org.jdom.Element; import java.util.regex.Matcher; import java.util.regex.Pattern; @Tag("class-filter") -public class ClassFilter implements JDOMExternalizable, Cloneable{ +public class ClassFilter implements Cloneable { private static final Logger LOG = Logger.getInstance("#com.intellij.ui.classFilter.ClassFilter"); public static final ClassFilter[] EMPTY_ARRAY = new ClassFilter[0]; @@ -72,14 +67,6 @@ public class ClassFilter implements JDOMExternalizable, Cloneable{ return getPattern(); } - public void readExternal(Element element) throws InvalidDataException { - DefaultJDOMExternalizer.readExternal(this, element); - } - - public void writeExternal(Element element) throws WriteExternalException { - DefaultJDOMExternalizer.writeExternal(this, element); - } - public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof ClassFilter)) return false; @@ -99,6 +86,7 @@ public class ClassFilter implements JDOMExternalizable, Cloneable{ return result; } + @Override public ClassFilter clone() { try { return (ClassFilter) super.clone(); diff --git a/plugins/coverage/src/com/intellij/execution/configurations/coverage/JavaCoverageEnabledConfiguration.java b/plugins/coverage/src/com/intellij/execution/configurations/coverage/JavaCoverageEnabledConfiguration.java index f8d3c14ace28..6a2ca1ff2f18 100644 --- a/plugins/coverage/src/com/intellij/execution/configurations/coverage/JavaCoverageEnabledConfiguration.java +++ b/plugins/coverage/src/com/intellij/execution/configurations/coverage/JavaCoverageEnabledConfiguration.java @@ -23,6 +23,7 @@ import com.intellij.coverage.JavaCoverageRunner; import com.intellij.execution.configurations.RunConfigurationBase; import com.intellij.execution.configurations.SimpleJavaParameters; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.DefaultJDOMExternalizer; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.ui.classFilter.ClassFilter; @@ -116,6 +117,7 @@ public class JavaCoverageEnabledConfiguration extends CoverageEnabledConfigurati myCoveragePatterns = coveragePatterns; } + @Override public void readExternal(Element element) throws InvalidDataException { super.readExternal(element); @@ -126,14 +128,13 @@ public class JavaCoverageEnabledConfiguration extends CoverageEnabledConfigurati mySuiteToMergeWith = element.getAttributeValue(COVERAGE_MERGE_SUITE_ATT_NAME); // coverage patters - final List children = element.getChildren(COVERAGE_PATTERN_ELEMENT_NAME); + List children = element.getChildren(COVERAGE_PATTERN_ELEMENT_NAME); if (children.size() > 0) { myCoveragePatterns = new ClassFilter[children.size()]; for (int i = 0; i < children.size(); i++) { - myCoveragePatterns[i] = new ClassFilter(); - @NonNls final Element e = (Element)children.get(i); - myCoveragePatterns[i].readExternal(e); - final String val = e.getAttributeValue("value"); + Element e = children.get(i); + myCoveragePatterns[i] = createClassFilter(e); + String val = e.getAttributeValue("value"); if (val != null) { myCoveragePatterns[i].setPattern(val); } @@ -141,6 +142,13 @@ public class JavaCoverageEnabledConfiguration extends CoverageEnabledConfigurati } } + public static ClassFilter createClassFilter(Element element) throws InvalidDataException { + ClassFilter filter = new ClassFilter(); + DefaultJDOMExternalizer.readExternal(filter, element); + return filter; + } + + @Override public void writeExternal(Element element) throws WriteExternalException { // just for backward compatibility with settings format before "Huge Coverage Refactoring" // see [IDEA-56800] ProjectRunConfigurationManager component: "coverage" extension: "merge" attribute is misplaced @@ -187,12 +195,13 @@ public class JavaCoverageEnabledConfiguration extends CoverageEnabledConfigurati if (myCoveragePatterns != null) { for (ClassFilter pattern : myCoveragePatterns) { @NonNls final Element patternElement = new Element(COVERAGE_PATTERN_ELEMENT_NAME); - pattern.writeExternal(patternElement); + DefaultJDOMExternalizer.writeExternal(pattern, patternElement); element.addContent(patternElement); } } } + @Override @Nullable public String getCoverageFilePath() { if (myCoverageFilePath != null ) {