From b61d2b59185069405528893a2eaa9e28414439e7 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 25 Sep 2014 15:06:41 +0200 Subject: [PATCH] GlobalAntConfiguration must not save defaults, as app service --- .../ExternalizablePropertyContainer.java | 32 +++++++---- .../intellij/util/config/Externalizer.java | 8 +++ .../intellij/util/config/StorageProperty.java | 3 + plugins/ant/src/META-INF/plugin.xml | 5 +- .../ant/config/impl/AntClasspathEntry.java | 3 + .../config/impl/GlobalAntConfiguration.java | 55 ++++++++++++------- 6 files changed, 72 insertions(+), 34 deletions(-) diff --git a/platform/platform-api/src/com/intellij/util/config/ExternalizablePropertyContainer.java b/platform/platform-api/src/com/intellij/util/config/ExternalizablePropertyContainer.java index 4467d3f87522..3f48ecf2a4b1 100644 --- a/platform/platform-api/src/com/intellij/util/config/ExternalizablePropertyContainer.java +++ b/platform/platform-api/src/com/intellij/util/config/ExternalizablePropertyContainer.java @@ -23,10 +23,8 @@ import org.jetbrains.annotations.NonNls; import java.util.*; -public class ExternalizablePropertyContainer - extends AbstractProperty.AbstractPropertyContainer - implements JDOMExternalizable { - private static final Logger LOG = Logger.getInstance("#com.intellij.util.config.ExternalizablePropertyContainer"); +public class ExternalizablePropertyContainer extends AbstractProperty.AbstractPropertyContainer implements JDOMExternalizable { + private static final Logger LOG = Logger.getInstance(ExternalizablePropertyContainer.class); private final Map myValues = new HashMap(); private final Map myExternalizers = new HashMap(); @@ -69,9 +67,10 @@ public class ExternalizablePropertyContainer } private Externalizer> createListExternalizer(final Externalizer itemExternalizer, final String itemTagName) { - return new ListExternalizer(itemExternalizer, itemTagName); + return new ListExternalizer(itemExternalizer, itemTagName); } + @Override public void readExternal(Element element) throws InvalidDataException { HashMap propertyByName = new HashMap(); for (AbstractProperty abstractProperty : myExternalizers.keySet()) { @@ -96,37 +95,48 @@ public class ExternalizablePropertyContainer } } + @Override public void writeExternal(Element element) throws WriteExternalException { + if (myExternalizers.isEmpty()) { + return; + } + List properties = new ArrayList(myExternalizers.keySet()); Collections.sort(properties, AbstractProperty.NAME_COMPARATOR); for (AbstractProperty property : properties) { - final Externalizer externalizer = myExternalizers.get(property); + Externalizer externalizer = myExternalizers.get(property); if (externalizer == null) { continue; } - final Object propValue = property.get(this); + + Object propValue = property.get(this); if (!Comparing.equal(propValue, property.getDefault(this))) { - final Element child = new Element(property.getName()); + Element child = new Element(property.getName()); externalizer.writeValue(child, propValue); - element.addContent(child); + if (!JDOMUtil.isEmpty(child)) { + element.addContent(child); + } } } } + @Override protected Object getValueOf(AbstractProperty property) { Object value = myValues.get(property); return value != null ? value : property.getDefault(this); } + @Override protected void setValueOf(AbstractProperty externalizableProperty, Object value) { myValues.put(externalizableProperty, value); } + @Override public boolean hasProperty(AbstractProperty property) { return myExternalizers.containsKey(property); } - private class ListExternalizer implements Externalizer> { + private static class ListExternalizer implements Externalizer> { @NonNls private static final String NULL_ELEMENT = "NULL_VALUE_ELEMENT"; private final Externalizer myItemExternalizer; private final String myItemTagName; @@ -136,6 +146,7 @@ public class ExternalizablePropertyContainer myItemTagName = itemTagName; } + @Override public List readValue(Element dataElement) throws InvalidDataException { ArrayList list = new ArrayList(); List children = dataElement.getChildren(); @@ -154,6 +165,7 @@ public class ExternalizablePropertyContainer return list; } + @Override public void writeValue(Element dataElement, List value) throws WriteExternalException { for (Iterator iterator = value.iterator(); iterator.hasNext();) { T item = iterator.next(); diff --git a/platform/platform-api/src/com/intellij/util/config/Externalizer.java b/platform/platform-api/src/com/intellij/util/config/Externalizer.java index 822020cf0c58..864b5bee0e43 100644 --- a/platform/platform-api/src/com/intellij/util/config/Externalizer.java +++ b/platform/platform-api/src/com/intellij/util/config/Externalizer.java @@ -29,11 +29,13 @@ import java.util.List; public interface Externalizer { @NonNls String VALUE_ATTRIBUTE = "value"; Externalizer STRING = new BaseExternalizer(){ + @Override public String readValue(Element dataElement) { return dataElement.getAttributeValue(VALUE_ATTRIBUTE); } }; Externalizer INTEGER = new BaseExternalizer() { + @Override public Integer readValue(Element dataElement) { try { return new Integer(dataElement.getAttributeValue(VALUE_ATTRIBUTE)); @@ -46,11 +48,13 @@ public interface Externalizer { abstract class BaseExternalizer implements Externalizer { + @Override public void writeValue(Element dataElement, T value) { dataElement.setAttribute(VALUE_ATTRIBUTE, value.toString()); } } Externalizer BOOLEAN = new BaseExternalizer() { + @Override public Boolean readValue(Element dataElement) { return Boolean.valueOf(dataElement.getAttributeValue(VALUE_ATTRIBUTE)); } @@ -67,12 +71,14 @@ public interface Externalizer { myFactory = factory; } + @Override public T readValue(Element dataElement) throws InvalidDataException { T data = myFactory.create(); data.readExternal(dataElement); return data; } + @Override public void writeValue(Element dataElement, T value) throws WriteExternalException { value.writeExternal(dataElement); } @@ -87,6 +93,7 @@ public interface Externalizer { @NonNls private static final String KEY_ATTR = "key"; @NonNls private static final String VALUE_ATTR = "value"; + @Override public Storage readValue(Element dataElement) throws InvalidDataException { Storage.MapStorage storage = new Storage.MapStorage(); List children = dataElement.getChildren(ITEM_TAG); @@ -97,6 +104,7 @@ public interface Externalizer { return storage; } + @Override public void writeValue(Element dataElement, Storage storage) throws WriteExternalException { Iterator keys = ((Storage.MapStorage)storage).getKeys(); while (keys.hasNext()) { diff --git a/platform/platform-api/src/com/intellij/util/config/StorageProperty.java b/platform/platform-api/src/com/intellij/util/config/StorageProperty.java index 3ed83939448d..8ad8fc7b02d5 100644 --- a/platform/platform-api/src/com/intellij/util/config/StorageProperty.java +++ b/platform/platform-api/src/com/intellij/util/config/StorageProperty.java @@ -27,12 +27,14 @@ public class StorageProperty extends AbstractProperty { myName = name; } + @Override public Storage getDefault(AbstractProperty.AbstractPropertyContainer container) { Storage.MapStorage storage = new Storage.MapStorage(); set(container, storage); return storage; } + @Override public Storage copy(Storage storage) { if (!(storage instanceof Storage.MapStorage)) throw new UnsupportedOperationException(storage.getClass().getName()); @@ -45,6 +47,7 @@ public class StorageProperty extends AbstractProperty { return copy; } + @Override public String getName() { return myName; } diff --git a/plugins/ant/src/META-INF/plugin.xml b/plugins/ant/src/META-INF/plugin.xml index 4e9bd959c1a8..b969e17b554e 100644 --- a/plugins/ant/src/META-INF/plugin.xml +++ b/plugins/ant/src/META-INF/plugin.xml @@ -73,6 +73,7 @@ + @@ -80,10 +81,6 @@ com.intellij.lang.ant.AntSupport com.intellij.lang.ant.AntSupport - - com.intellij.lang.ant.config.impl.GlobalAntConfiguration - com.intellij.lang.ant.config.impl.GlobalAntConfiguration - diff --git a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntClasspathEntry.java b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntClasspathEntry.java index 33458e0a11ff..fb70c3728d9d 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntClasspathEntry.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntClasspathEntry.java @@ -34,6 +34,7 @@ import java.util.List; public interface AntClasspathEntry { Externalizer EXTERNALIZER = new Externalizer() { + @Override public AntClasspathEntry readValue(Element dataElement) throws InvalidDataException { String pathUrl = dataElement.getAttributeValue(SinglePathEntry.PATH); if (pathUrl != null) @@ -44,6 +45,7 @@ public interface AntClasspathEntry { throw new InvalidDataException(); } + @Override public void writeValue(Element dataElement, AntClasspathEntry entry) throws WriteExternalException { entry.writeExternal(dataElement); } @@ -68,6 +70,7 @@ public interface AntClasspathEntry { myMapper = mapper; } + @Override public List create() { final VirtualFile[] files = FileChooser.chooseFiles(myDescriptor, myParentComponent, null, null); return files.length == 0 ? null : ContainerUtil.map(files, myMapper); diff --git a/plugins/ant/src/com/intellij/lang/ant/config/impl/GlobalAntConfiguration.java b/plugins/ant/src/com/intellij/lang/ant/config/impl/GlobalAntConfiguration.java index bf71e49b112e..43655b0463b4 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/impl/GlobalAntConfiguration.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/impl/GlobalAntConfiguration.java @@ -21,16 +21,17 @@ import com.intellij.lang.ant.config.AntBuildFile; import com.intellij.lang.ant.config.AntBuildTarget; import com.intellij.lang.ant.config.AntConfiguration; import com.intellij.lang.ant.config.AntConfigurationBase; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; -import com.intellij.openapi.components.ApplicationComponent; +import com.intellij.openapi.components.PersistentStateComponent; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.components.State; +import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.InvalidDataException; -import com.intellij.openapi.util.JDOMExternalizable; import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; @@ -38,14 +39,19 @@ import com.intellij.util.config.*; import com.intellij.util.containers.ContainerUtil; import org.jdom.Element; import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.ArrayList; import java.util.Map; -public class GlobalAntConfiguration implements ApplicationComponent, JDOMExternalizable { - private static final Logger LOG = Logger.getInstance("#com.intellij.lang.ant.config.impl.AntGlobalConfiguration"); +@State( + name = "GlobalAntConfiguration", + storages = {@com.intellij.openapi.components.Storage(file = StoragePathMacros.APP_CONFIG + "/other.xml")} +) +public class GlobalAntConfiguration implements PersistentStateComponent { + private static final Logger LOG = Logger.getInstance(GlobalAntConfiguration.class); + public static final StorageProperty FILTERS_TABLE_LAYOUT = new StorageProperty("filtersTableLayout"); public static final StorageProperty PROPERTIES_TABLE_LAYOUT = new StorageProperty("propertiesTableLayout"); static final ListProperty ANTS = ListProperty.create("registeredAnts"); @@ -53,6 +59,7 @@ public class GlobalAntConfiguration implements ApplicationComponent, JDOMExterna private final AntInstallation myBundledAnt; public static final String BUNDLED_ANT_NAME = AntBundle.message("ant.reference.bundled.ant.name"); public final Condition IS_USER_ANT = new Condition() { + @Override public boolean value(AntInstallation antInstallation) { return antInstallation != myBundledAnt; } @@ -74,15 +81,9 @@ public class GlobalAntConfiguration implements ApplicationComponent, JDOMExterna myBundledAnt = createBundledAnt(); } - @NotNull - public String getComponentName() { - return "GlobalAntConfiguration"; - } - - public void initComponent() { } - public static AntInstallation createBundledAnt() { AntInstallation bundledAnt = new AntInstallation() { + @Override public AntReference getReference() { return AntReference.BUNDLED_ANT; } @@ -97,18 +98,32 @@ public class GlobalAntConfiguration implements ApplicationComponent, JDOMExterna return bundledAnt; } - public void disposeComponent() {} - - public void readExternal(Element element) throws InvalidDataException { - myProperties.readExternal(element); + @Nullable + @Override + public Element getState() { + Element element = new Element("state"); + try { + myProperties.writeExternal(element); + } + catch (WriteExternalException e) { + LOG.error(e); + return null; + } + return element; } - public void writeExternal(Element element) throws WriteExternalException { - myProperties.writeExternal(element); + @Override + public void loadState(Element state) { + try { + myProperties.readExternal(state); + } + catch (InvalidDataException e) { + LOG.error(e); + } } public static GlobalAntConfiguration getInstance() { - return ApplicationManager.getApplication().getComponent(GlobalAntConfiguration.class); + return ServiceManager.getService(GlobalAntConfiguration.class); } public Map getConfiguredAnts() {