DebuggerSettings — use PersistentStateComponent instead of deprecated JDOMExternalizable

This commit is contained in:
Vladimir Krivosheev
2014-07-18 17:26:28 +02:00
parent 189f3f5897
commit 55a8bd43b0
4 changed files with 78 additions and 69 deletions
@@ -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<Element> children) throws InvalidDataException {
if (ContainerUtil.isEmpty(children)) {
return ClassFilter.EMPTY_ARRAY;
}
List<ClassFilter> classFiltersList = new ArrayList<ClassFilter>(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);
}
}
@@ -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<Element> {
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<String, ContentState> myContentStates = new HashMap<String, ContentState>();
private Map<String, ContentState> myContentStates = new LinkedHashMap<String, ContentState>();
// 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<ClassFilter> filtersList = new ArrayList<ClassFilter>();
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();
}
@@ -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();
@@ -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<Element> 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 ) {