diff --git a/java/java-tests/testSrc/com/intellij/roots/libraries/RepositoryLibrarySerializationTest.java b/java/java-tests/testSrc/com/intellij/roots/libraries/RepositoryLibrarySerializationTest.java index d98060b71ab9..9731abdf5fb9 100644 --- a/java/java-tests/testSrc/com/intellij/roots/libraries/RepositoryLibrarySerializationTest.java +++ b/java/java-tests/testSrc/com/intellij/roots/libraries/RepositoryLibrarySerializationTest.java @@ -1,6 +1,7 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.roots.libraries; +import com.intellij.configurationStore.StoreReloadManager; import com.intellij.jarRepository.RepositoryLibraryType; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.application.ex.PathManagerEx; @@ -52,6 +53,7 @@ public class RepositoryLibrarySerializationTest extends ModuleRootManagerTestCas @NotNull private RepositoryLibraryProperties loadLibrary(String name) throws JDOMException, IOException { + LibraryTablesRegistrar.getInstance().getLibraryTable(myProject); String libraryPath = "jps/model-serialization/testData/repositoryLibraries/.idea/libraries/" + name + ".xml"; File librarySource = PathManagerEx.findFileUnderCommunityHome(libraryPath); @@ -59,6 +61,7 @@ public class RepositoryLibrarySerializationTest extends ModuleRootManagerTestCas VirtualFile librariesVirtualFile = VfsUtil.createDirectoryIfMissing(myProject.getBaseDir(), ".idea/libraries"); VfsUtil.copy(this, LocalFileSystem.getInstance().refreshAndFindFileByIoFile(librarySource), librariesVirtualFile); }); + StoreReloadManager.getInstance().flushChangedProjectFileAlarm(); LibraryTable projectLibraryTable = LibraryTablesRegistrar.getInstance().getLibraryTable(myProject); LibraryEx library = (LibraryEx)projectLibraryTable.getLibraryByName(name); diff --git a/platform/configuration-store-impl/src/ComponentStoreImpl.kt b/platform/configuration-store-impl/src/ComponentStoreImpl.kt index 414c7bdee841..35b33ca21965 100644 --- a/platform/configuration-store-impl/src/ComponentStoreImpl.kt +++ b/platform/configuration-store-impl/src/ComponentStoreImpl.kt @@ -398,12 +398,12 @@ abstract class ComponentStoreImpl : IComponentStore { val storage = storageManager.getStateStorage(storageSpec) // if storage marked as changed, it means that analyzeExternalChangesAndUpdateIfNeeded was called for it and storage is already reloaded - val isReloadDataForStorage = if (reloadData == ThreeState.UNSURE) changedStorages!!.contains(storage) else reloadData.toBoolean() + val isReloadDataForStorage = if (reloadData == ThreeState.UNSURE) isStorageChanged(changedStorages!!, storage) else reloadData.toBoolean() val stateGetter = doCreateStateGetter(isReloadDataForStorage, storage, info, name, stateClass) var state = stateGetter.getState(defaultState) if (state == null) { - if (changedStorages != null && changedStorages.contains(storage)) { + if (changedStorages != null && isStorageChanged(changedStorages, storage)) { // state will be null if file deleted // we must create empty (initial) state to reinit component state = deserializeState(Element("state"), stateClass, null)!! @@ -433,6 +433,9 @@ abstract class ComponentStoreImpl : IComponentStore { return true } + private fun isStorageChanged(changedStorages: Set, storage: StateStorage) = + changedStorages.contains(storage) || storage is ExternalStorageWithInternalPart && changedStorages.contains(storage.internalStorage) + protected open fun doCreateStateGetter(reloadData: Boolean, storage: StateStorage, info: ComponentInfo, diff --git a/platform/configuration-store-impl/src/XmlElementStorage.kt b/platform/configuration-store-impl/src/XmlElementStorage.kt index c085a7a7ee0d..f27e5849f3eb 100644 --- a/platform/configuration-store-impl/src/XmlElementStorage.kt +++ b/platform/configuration-store-impl/src/XmlElementStorage.kt @@ -4,6 +4,7 @@ package com.intellij.configurationStore import com.intellij.openapi.components.PathMacroManager import com.intellij.openapi.components.PathMacroSubstitutor import com.intellij.openapi.components.RoamingType +import com.intellij.openapi.components.StateStorage import com.intellij.openapi.components.impl.stores.FileStorageCoreUtil import com.intellij.openapi.diagnostic.debug import com.intellij.openapi.diagnostic.runAndLogException @@ -21,6 +22,7 @@ import com.intellij.util.io.safeOutputStream import gnu.trove.THashMap import org.jdom.Attribute import org.jdom.Element +import org.jetbrains.annotations.ApiStatus import java.io.FileNotFoundException import java.io.OutputStream import java.io.Writer @@ -439,4 +441,9 @@ internal fun createDataWriterForElement(element: Element, storageFilePathForDebu } } } +} + +@ApiStatus.Internal +interface ExternalStorageWithInternalPart { + val internalStorage: StateStorage } \ No newline at end of file diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/configurationStore/ExternalSystemStorage.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/configurationStore/ExternalSystemStorage.kt index 0d2c6c0f81ca..fdaa97db0286 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/configurationStore/ExternalSystemStorage.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/configurationStore/ExternalSystemStorage.kt @@ -3,6 +3,7 @@ package com.intellij.openapi.externalSystem.configurationStore import com.intellij.configurationStore.* import com.intellij.openapi.components.RoamingType +import com.intellij.openapi.components.StateStorage import com.intellij.openapi.components.StoragePathMacros import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project @@ -52,9 +53,12 @@ internal class ExternalProjectFilteringStorage(fileSpec: String, project: Project, storageManager: StateStorageManager, private val componentName: String, - private val inProjectStorage: DirectoryBasedStorage) : ExternalProjectStorage(fileSpec, project, storageManager, rootElementName = null /* the only component per file */) { + private val inProjectStorage: DirectoryBasedStorage) : ExternalProjectStorage(fileSpec, project, storageManager, rootElementName = null /* the only component per file */), ExternalStorageWithInternalPart { private val filter = DataWriterFilter.requireAttribute(SerializationConstants.EXTERNAL_SYSTEM_ID_ATTRIBUTE, DataWriterFilter.ElementLevel.FIRST) + override val internalStorage: StateStorage + get() = inProjectStorage + override fun loadLocalData(): Element? { val externalData = super.loadLocalData() val internalData = inProjectStorage.getSerializedState(inProjectStorage.loadData(), null, componentName, true)