From 508c2a0b7a7e5998b44d77aa69dc6252f5870e2d Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 25 Jun 2015 17:16:36 +0200 Subject: [PATCH] =?UTF-8?q?IDEA-132813=20correct=20fix=20=E2=80=94=20don't?= =?UTF-8?q?=20save=20module=20file=20twice=20(1=20-=20regular=20save=202?= =?UTF-8?q?=20-=20forced=20save)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stores/ModuleStateStorageManager.java | 22 ++++----------- .../impl/stores/ModuleStoreImpl.java | 3 +- .../impl/stores/FileBasedStorage.java | 7 ----- .../impl/stores/StateStorageManagerImpl.java | 2 +- .../impl/stores/XmlElementStorage.java | 28 +++++++++---------- .../components/impl/stores/StorageData.java | 4 +++ 6 files changed, 25 insertions(+), 41 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStateStorageManager.java b/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStateStorageManager.java index d8b11be8e38e..688a81e60bf7 100644 --- a/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStateStorageManager.java +++ b/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStateStorageManager.java @@ -20,13 +20,10 @@ import com.intellij.openapi.components.StateStorageOperation; import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.components.TrackingPathMacroSubstitutor; import com.intellij.openapi.module.impl.ModuleImpl; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.util.Collections; import java.util.List; public class ModuleStateStorageManager extends StateStorageManagerImpl { @@ -52,20 +49,11 @@ public class ModuleStateStorageManager extends StateStorageManagerImpl { @NotNull @Override public List createSaveSessions() { - final ModuleStoreImpl.ModuleFileData data = myModule.getStateStore().getMainStorageData(); - List sessions = super.createSaveSessions(); - if (!data.isDirty()) { - return sessions; + if (myModule.getStateStore().getMainStorageData().isDirty()) { + // force XmlElementStorageSaveSession creation + getExternalizationSession(myModule.getStateStore().getMainStorage()); } - - return ContainerUtil.concat(sessions, Collections.singletonList(new StateStorage.SaveSession() { - @Override - public void save() throws IOException { - if (data.isDirty()) { - myModule.getStateStore().getMainStorage().forceSave(); - } - } - })); + return super.createSaveSessions(); } }; } @@ -81,4 +69,4 @@ public class ModuleStateStorageManager extends StateStorageManagerImpl { protected StateStorage.Listener createStorageTopicListener() { return myModule.getProject().getMessageBus().syncPublisher(StateStorage.PROJECT_STORAGE_TOPIC); } -} +} \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java b/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java index 90cef8ce5f63..3929fda2c7f0 100644 --- a/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/components/impl/stores/ModuleStoreImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -108,6 +108,7 @@ public class ModuleStoreImpl extends BaseFileConfigurableStoreImpl implements IM myOptions = new TreeMap(); } + @Override public boolean isDirty() { return dirty; } diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java index 69970c82666c..79e008b48c22 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/FileBasedStorage.java @@ -103,13 +103,6 @@ public class FileBasedStorage extends XmlElementStorage { return new FileSaveSession(storageData); } - public void forceSave() throws IOException { - XmlElementStorageSaveSession externalizationSession = startExternalization(); - if (externalizationSession != null) { - externalizationSession.forceSave(); - } - } - private class FileSaveSession extends XmlElementStorageSaveSession { protected FileSaveSession(@NotNull StorageData storageData) { super(storageData); diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StateStorageManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StateStorageManagerImpl.java index dd8079546eda..3c92d34361a8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StateStorageManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/StateStorageManagerImpl.java @@ -320,7 +320,7 @@ public abstract class StateStorageManagerImpl implements StateStorageManager, Di } @Nullable - private StateStorage.ExternalizationSession getExternalizationSession(@NotNull StateStorage stateStorage) { + protected final StateStorage.ExternalizationSession getExternalizationSession(@NotNull StateStorage stateStorage) { StateStorage.ExternalizationSession session = mySessions.get(stateStorage); if (session == null) { session = stateStorage.startExternalization(); diff --git a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/XmlElementStorage.java b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/XmlElementStorage.java index 653841a79c23..86b2fcd1c1c3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/XmlElementStorage.java +++ b/platform/platform-impl/src/com/intellij/openapi/components/impl/stores/XmlElementStorage.java @@ -29,7 +29,6 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Collection; -import java.util.Collections; import java.util.Map; import java.util.Set; @@ -160,8 +159,9 @@ public abstract class XmlElementStorage extends StateStorageBase { } } - protected abstract class XmlElementStorageSaveSession extends SaveSessionBase { + public abstract class XmlElementStorageSaveSession extends SaveSessionBase { private final StorageData myOriginalStorageData; + @Nullable private StorageData myCopiedStorageData; private final Map myNewLiveStates = new THashMap(); @@ -173,7 +173,7 @@ public abstract class XmlElementStorage extends StateStorageBase { @Nullable @Override public final SaveSession createSaveSession() { - return checkIsSavingDisabled() || myCopiedStorageData == null ? null : this; + return checkIsSavingDisabled() || (myCopiedStorageData == null && !myOriginalStorageData.isDirty()) ? null : this; } @Override @@ -186,24 +186,22 @@ public abstract class XmlElementStorage extends StateStorageBase { } } - public void forceSave() throws IOException { - LOG.assertTrue(myCopiedStorageData == null); - - if (myBlockSavingTheContent) { - return; - } - - doSave(getElement(myOriginalStorageData, isCollapsePathsOnSave(), Collections.emptyMap())); - } - @Override public final void save() throws IOException { if (myBlockSavingTheContent) { return; } - doSave(getElement(myCopiedStorageData, isCollapsePathsOnSave(), myNewLiveStates)); - myStorageData = myCopiedStorageData; + StorageData storageData = myCopiedStorageData; + if (storageData == null) { + storageData = myOriginalStorageData; + if (!storageData.isDirty()) { + LOG.warn("Copied storage data must be not null because original storage data is not dirty"); + } + } + + doSave(getElement(storageData, isCollapsePathsOnSave(), myNewLiveStates)); + myStorageData = storageData; } // only because default project store hack 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 b1fc4001c668..02eccd2fad3e 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 @@ -46,6 +46,10 @@ public class StorageData extends StorageDataBase { this(COMPONENT); } + public boolean isDirty() { + return false; + } + public StorageData(@NotNull String rootElementName) { myStates = new StateMap(); myRootElementName = rootElementName;