From 5d5a09ad401d7f7ab5532b5227d43cedfcbb98c1 Mon Sep 17 00:00:00 2001 From: Vladimir Krivosheev Date: Mon, 9 Oct 2017 16:49:25 +0200 Subject: [PATCH] =?UTF-8?q?reduce=20SchemeManagerImpl=20complexity=20?= =?UTF-8?q?=E2=80=94=20extract=20clearAllSchemes=20and=20removeFirstScheme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SchemeManagerImpl.kt | 62 ++++++------------- .../src/schemeManager/SchemeListManager.kt | 34 +++++++++- 2 files changed, 51 insertions(+), 45 deletions(-) diff --git a/platform/configuration-store-impl/src/SchemeManagerImpl.kt b/platform/configuration-store-impl/src/SchemeManagerImpl.kt index 4b6eac04d55e..94faf61c943c 100644 --- a/platform/configuration-store-impl/src/SchemeManagerImpl.kt +++ b/platform/configuration-store-impl/src/SchemeManagerImpl.kt @@ -61,7 +61,7 @@ import java.util.* import java.util.concurrent.atomic.AtomicBoolean import java.util.function.Function -class SchemeManagerImpl(val fileSpec: String, +class SchemeManagerImpl(val fileSpec: String, processor: SchemeProcessor, private val provider: StreamProvider?, private val ioDirectory: Path, @@ -86,7 +86,7 @@ class SchemeManagerImpl(val fileSpec: String, private val filesToDelete = ContainerUtil.newConcurrentSet() // scheme could be changed - so, hashcode will be changed - we must use identity hashing strategy - private val schemeToInfo = ConcurrentCollectionFactory.createMap(ContainerUtil.identityStrategy()) + internal val schemeToInfo = ConcurrentCollectionFactory.createMap(ContainerUtil.identityStrategy()) private val useVfs = messageBus != null @@ -108,6 +108,12 @@ class SchemeManagerImpl(val fileSpec: String, override val allSchemeNames: Collection get() = schemes.let { if (it.isEmpty()) emptyList() else it.map { processor.getSchemeKey(it) } } + override val allSchemes: List + get() = Collections.unmodifiableList(schemes) + + override val isEmpty: Boolean + get() = schemes.isEmpty() + private inner class SchemeFileTracker : BulkFileListener { private fun isMy(file: VirtualFile) = canRead(file.nameSequence) @@ -439,11 +445,11 @@ class SchemeManagerImpl(val fileSpec: String, schemes.firstOrNull({ processor.getSchemeKey(it) == schemeName})?.let { existingScheme -> if (schemeListManager.readOnlyExternalizableSchemes.get(processor.getSchemeKey(existingScheme)) === existingScheme) { // so, bundled scheme is shadowed - removeFirstScheme(schemes, scheduleDelete = false) { it === existingScheme } + schemeListManager.removeFirstScheme(schemes, scheduleDelete = false) { it === existingScheme } return true } else if (processor.isExternalizable(existingScheme) && isOverwriteOnLoad(existingScheme)) { - removeFirstScheme(schemes) { it === existingScheme } + schemeListManager.removeFirstScheme(schemes) { it === existingScheme } } else { if (schemeExtension != extension && schemeToInfo.get(existingScheme)?.fileNameWithoutExtension == fileNameWithoutExtension) { @@ -752,6 +758,10 @@ class SchemeManagerImpl(val fileSpec: String, filesToDelete.add(fileName) } + internal fun scheduleDelete(info: ExternalInfo) { + info.scheduleDelete() + } + private fun isRenamed(scheme: T): Boolean { val info = schemeToInfo.get(scheme) return info != null && processor.getSchemeKey(scheme) != info.schemeName @@ -880,51 +890,15 @@ class SchemeManagerImpl(val fileSpec: String, processPendingCurrentSchemeName(scheme) } - override fun clearAllSchemes() { - for (it in schemeToInfo.values) { - it.scheduleDelete() - } - - currentScheme = null - schemes.clear() - schemeToInfo.clear() - } - - override val allSchemes: List - get() = Collections.unmodifiableList(schemes) - - override val isEmpty: Boolean - get() = schemes.isEmpty() - override fun findSchemeByName(schemeName: String) = schemes.firstOrNull { processor.getSchemeKey(it) == schemeName } - override fun removeScheme(name: String) = removeFirstScheme(schemes) {processor.getSchemeKey(it) == name } + override fun removeScheme(name: String) = schemeListManager.removeFirstScheme(schemes) {processor.getSchemeKey(it) == name } - override fun removeScheme(scheme: T) = removeFirstScheme(schemes) { it == scheme } != null - - private fun removeFirstScheme(schemes: MutableList, scheduleDelete: Boolean = true, condition: (T) -> Boolean): T? { - val iterator = schemes.iterator() - for (scheme in iterator) { - if (!condition(scheme)) { - continue - } - - if (currentScheme === scheme) { - currentScheme = null - } - - iterator.remove() - - if (scheduleDelete && processor.isExternalizable(scheme)) { - schemeToInfo.remove(scheme)?.scheduleDelete() - } - return scheme - } - - return null - } + override fun removeScheme(scheme: T) = schemeListManager.removeFirstScheme(schemes) { it == scheme } != null override fun isMetadataEditable(scheme: T) = !schemeListManager.readOnlyExternalizableSchemes.containsKey(processor.getSchemeKey(scheme)) + override fun clearAllSchemes() = schemeListManager.clearAllSchemes() + override fun toString() = fileSpec } \ No newline at end of file diff --git a/platform/configuration-store-impl/src/schemeManager/SchemeListManager.kt b/platform/configuration-store-impl/src/schemeManager/SchemeListManager.kt index 0103b9fb08a7..ff3124035049 100644 --- a/platform/configuration-store-impl/src/schemeManager/SchemeListManager.kt +++ b/platform/configuration-store-impl/src/schemeManager/SchemeListManager.kt @@ -9,7 +9,7 @@ import gnu.trove.THashSet import java.util.concurrent.atomic.AtomicReference internal class SchemeListManager(private val schemeManager: SchemeManagerImpl) { - val schemesRef = AtomicReference(ContainerUtil.createLockFreeCopyOnWriteList() as ConcurrentList) + private val schemesRef = AtomicReference(ContainerUtil.createLockFreeCopyOnWriteList() as ConcurrentList) val readOnlyExternalizableSchemes = ContainerUtil.newConcurrentMap() @@ -58,9 +58,41 @@ internal class SchemeListManager(private val schemeManager: SchemeManag } } + fun clearAllSchemes() { + for (it in schemeManager.schemeToInfo.values) { + schemeManager.scheduleDelete(it) + } + + schemeManager.currentScheme = null + schemes.clear() + schemeManager.schemeToInfo.clear() + } + fun collectExistingNames(schemes: Collection): Collection { val result = THashSet(schemes.size) schemes.mapTo(result) { schemeManager.processor.getSchemeKey(it) } return result } + + fun removeFirstScheme(schemes: MutableList, scheduleDelete: Boolean = true, condition: (T) -> Boolean): T? { + val iterator = schemes.iterator() + for (scheme in iterator) { + if (!condition(scheme)) { + continue + } + + if (schemeManager.currentScheme === scheme) { + schemeManager.currentScheme = null + } + + iterator.remove() + + if (scheduleDelete && schemeManager.processor.isExternalizable(scheme)) { + schemeManager.schemeToInfo.remove(scheme)?.let(schemeManager::scheduleDelete) + } + return scheme + } + + return null + } } \ No newline at end of file