From 579c34be31efc91b0b2aee1b2336e26770b49348 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Thu, 25 Feb 2016 19:23:18 +0100 Subject: [PATCH] expose ProjectStateStorageManager for upsource extract DirectoryBasedStorageBase for upsource --- .../src/DirectoryBasedStorage.kt | 46 +++++++++++-------- .../src/ProjectStateStorageManager.kt | 5 +- .../src/StateStorageManagerImpl.kt | 16 +++++-- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/platform/configuration-store-impl/src/DirectoryBasedStorage.kt b/platform/configuration-store-impl/src/DirectoryBasedStorage.kt index ec04f166a574..27c42c213e50 100644 --- a/platform/configuration-store-impl/src/DirectoryBasedStorage.kt +++ b/platform/configuration-store-impl/src/DirectoryBasedStorage.kt @@ -41,16 +41,15 @@ import java.io.IOException import java.nio.ByteBuffer import java.nio.file.Path -open class DirectoryBasedStorage(private val dir: Path, - private val splitter: StateSplitter, - private val pathMacroSubstitutor: TrackingPathMacroSubstitutor? = null) : StateStorageBase() { - private @Volatile var virtualFile: VirtualFile? = null +abstract class DirectoryBasedStorageBase(@Suppress("DEPRECATION") protected val splitter: StateSplitter, + protected val pathMacroSubstitutor: TrackingPathMacroSubstitutor? = null) : StateStorageBase() { + protected var componentName: String? = null - private var componentName: String? = null + protected abstract val virtualFile: VirtualFile? - fun setVirtualDir(dir: VirtualFile?) { - virtualFile = dir - } + override fun loadData() = StateMap.fromMap(DirectoryStorageUtil.loadFrom(virtualFile, pathMacroSubstitutor)) + + override fun startExternalization(): StateStorage.ExternalizationSession? = null override fun analyzeExternalChangesAndUpdateIfNeed(componentNames: MutableSet) { // todo reload only changed file, compute diff @@ -89,15 +88,26 @@ open class DirectoryBasedStorage(private val dir: Path, return state } - override fun loadData() = StateMap.fromMap(DirectoryStorageUtil.loadFrom(getVirtualFile(), pathMacroSubstitutor)) + override fun hasState(storageData: StateMap, componentName: String) = storageData.hasStates() +} - private fun getVirtualFile(): VirtualFile? { - var result = virtualFile - if (result == null) { - result = LocalFileSystem.getInstance().findFileByPath(dir.systemIndependentPath) - virtualFile = result +open class DirectoryBasedStorage(private val dir: Path, + @Suppress("DEPRECATION") splitter: StateSplitter, + pathMacroSubstitutor: TrackingPathMacroSubstitutor? = null) : DirectoryBasedStorageBase(splitter, pathMacroSubstitutor) { + private @Volatile var cachedVirtualFile: VirtualFile? = null + + override val virtualFile: VirtualFile? + get() { + var result = cachedVirtualFile + if (result == null) { + result = LocalFileSystem.getInstance().findFileByPath(dir.systemIndependentPath) + cachedVirtualFile = result + } + return result } - return result + + internal fun setVirtualDir(dir: VirtualFile?) { + cachedVirtualFile = dir } override fun startExternalization(): StateStorage.ExternalizationSession? = if (checkIsSavingDisabled()) null else MySaveSession(this, getStorageData()) @@ -159,7 +169,7 @@ open class DirectoryBasedStorage(private val dir: Path, override fun save() { val stateMap = StateMap.fromMap(copiedStorageData!!) - var dir = storage.getVirtualFile() + var dir = storage.virtualFile if (copiedStorageData!!.isEmpty()) { if (dir != null && dir.exists()) { deleteFile(this, dir) @@ -170,7 +180,7 @@ open class DirectoryBasedStorage(private val dir: Path, if (dir == null || !dir.isValid) { dir = createDir(storage.dir, this) - storage.virtualFile = dir + storage.cachedVirtualFile = dir } if (!dirtyFileNames.isEmpty) { @@ -233,8 +243,6 @@ open class DirectoryBasedStorage(private val dir: Path, private fun setStorageData(newStates: StateMap) { storageDataRef.set(newStates) } - - override fun hasState(storageData: StateMap, componentName: String) = storageData.hasStates() } private val NON_EXISTENT_FILE_DATA = Pair.create(null, SystemProperties.getLineSeparator()) diff --git a/platform/configuration-store-impl/src/ProjectStateStorageManager.kt b/platform/configuration-store-impl/src/ProjectStateStorageManager.kt index 8f6af8dd2680..e550dbcfcd86 100644 --- a/platform/configuration-store-impl/src/ProjectStateStorageManager.kt +++ b/platform/configuration-store-impl/src/ProjectStateStorageManager.kt @@ -22,7 +22,10 @@ import com.intellij.openapi.components.TrackingPathMacroSubstitutor import com.intellij.openapi.project.impl.ProjectImpl import org.jdom.Element -class ProjectStateStorageManager(macroSubstitutor: TrackingPathMacroSubstitutor, private val project: ProjectImpl) : StateStorageManagerImpl("project", macroSubstitutor, project) { +// extended in upsource +open class ProjectStateStorageManager(macroSubstitutor: TrackingPathMacroSubstitutor, + private val project: ProjectImpl, + useVirtualFileTracker: Boolean = true) : StateStorageManagerImpl("project", macroSubstitutor, if (useVirtualFileTracker) project else null) { companion object { val VERSION_OPTION = "version" } diff --git a/platform/configuration-store-impl/src/StateStorageManagerImpl.kt b/platform/configuration-store-impl/src/StateStorageManagerImpl.kt index 66c7e103a0d2..7597be807f0e 100644 --- a/platform/configuration-store-impl/src/StateStorageManagerImpl.kt +++ b/platform/configuration-store-impl/src/StateStorageManagerImpl.kt @@ -200,8 +200,10 @@ open class StateStorageManagerImpl(private val rootTagName: String, val filePath = expandMacros(collapsedPath) @Suppress("DEPRECATION") if (stateSplitter != StateSplitter::class.java && stateSplitter != StateSplitterEx::class.java) { - val storage = MyDirectoryStorage(this, Paths.get(filePath), ReflectionUtil.newInstance(stateSplitter)) - virtualFileTracker?.put(filePath, storage) + val storage = createDirectoryBasedStorage(filePath, collapsedPath, ReflectionUtil.newInstance(stateSplitter)) + if (storage is StorageVirtualFileTracker.TrackedStorage) { + virtualFileTracker?.put(filePath, storage) + } return storage } @@ -210,13 +212,19 @@ open class StateStorageManagerImpl(private val rootTagName: String, } val effectiveRoamingType = if (roamingType == RoamingType.DEFAULT && collapsedPath == StoragePathMacros.WORKSPACE_FILE) RoamingType.DISABLED else roamingType - val storage = MyFileStorage(this, File(filePath), collapsedPath, rootTagName, effectiveRoamingType, getMacroSubstitutor(collapsedPath), streamProvider) - if (isUseVfsListener == ThreeState.YES) { + val storage = createFileBasedStorage(filePath, collapsedPath, effectiveRoamingType) + if (isUseVfsListener == ThreeState.YES && storage is StorageVirtualFileTracker.TrackedStorage) { virtualFileTracker?.put(filePath, storage) } return storage } + protected open fun createFileBasedStorage(path: String, collapsedPath: String, roamingType: RoamingType): StateStorage + = MyFileStorage(this, File(path), collapsedPath, rootTagName, roamingType, getMacroSubstitutor(collapsedPath), streamProvider) + + protected open fun createDirectoryBasedStorage(path: String, collapsedPath: String, @Suppress("DEPRECATION") splitter: StateSplitter): StateStorage + = MyDirectoryStorage(this, Paths.get(path), splitter) + private class MyDirectoryStorage(override val storageManager: StateStorageManagerImpl, file: Path, @Suppress("DEPRECATION") splitter: StateSplitter) : DirectoryBasedStorage(file, splitter, storageManager.pathMacroSubstitutor), StorageVirtualFileTracker.TrackedStorage