generic SchemeManagerIprProvider

This commit is contained in:
Vladimir Krivosheev
2016-08-31 17:08:10 +02:00
parent b7f5ceba06
commit 6a041fa2b4
5 changed files with 42 additions and 50 deletions
@@ -195,13 +195,11 @@ internal class ProjectInspectionManagerTest {
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="InspectionProjectProfileManager">
<settings>
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Convert2Diamond" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
<version value="1.0" />
</settings>
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Convert2Diamond" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
<version value="1.0" />
</component>
</project>""".trimIndent())
assertThat(projectFile.parent.resolve(".inspectionProfiles")).doesNotExist()
@@ -18,10 +18,7 @@ package com.intellij.profile.codeInspection
import com.intellij.codeInspection.InspectionProfile
import com.intellij.codeInspection.ex.InspectionProfileImpl
import com.intellij.codeInspection.ex.InspectionToolRegistrar
import com.intellij.configurationStore.SchemeDataHolder
import com.intellij.configurationStore.SchemeManagerIprProvider
import com.intellij.configurationStore.digest
import com.intellij.configurationStore.wrapState
import com.intellij.configurationStore.*
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.PersistentStateComponent
@@ -94,7 +91,7 @@ class ProjectInspectionProfileManager(val project: Project,
}
}
private val schemeManagerIprProvider = if (project.isDirectoryBased) null else SchemeManagerIprProvider()
private val schemeManagerIprProvider = if (project.isDirectoryBased) null else SchemeManagerIprProvider("profile")
override val schemeManager = schemeManagerFactory.create("inspectionProfiles", object : InspectionProfileProcessor() {
override fun createScheme(dataHolder: SchemeDataHolder<InspectionProfileImpl>,
@@ -223,16 +220,11 @@ class ProjectInspectionProfileManager(val project: Project,
severityRegistrar.writeExternal(result)
return wrapState(result)
return wrapState(result, project)
}
@Synchronized override fun loadState(state: Element) {
val data = state.getChild("settings")
schemeManagerIprProvider?.let {
it.load(data)
schemeManager.reload()
}
val data = unwrapState(state, project, schemeManagerIprProvider, schemeManager)
val newState = State()
@@ -24,8 +24,8 @@ import com.intellij.util.toByteArray
import org.jdom.Element
import java.io.InputStream
class SchemeManagerIprProvider : StreamProvider {
var nameToData = ContainerUtil.newConcurrentMap<String, ByteArray>()
class SchemeManagerIprProvider(private val subStateTagName: String) : StreamProvider {
private val nameToData = ContainerUtil.newConcurrentMap<String, ByteArray>()
override fun read(fileSpec: String, roamingType: RoamingType): InputStream? {
val name = PathUtilRt.getFileName(fileSpec)
@@ -59,7 +59,7 @@ class SchemeManagerIprProvider : StreamProvider {
return
}
for (profileElement in state.getChildren("profile")) {
for (profileElement in state.getChildren(subStateTagName)) {
var name: String? = null
for (optionElement in profileElement.getChildren("option")) {
if (optionElement.getAttributeValue("name") == "myName") {
@@ -15,10 +15,9 @@
*/
package com.intellij.configurationStore
import com.intellij.openapi.options.ExternalizableSchemeAdapter
import com.intellij.openapi.options.Scheme
import com.intellij.openapi.options.SchemeProcessor
import com.intellij.openapi.options.SchemeState
import com.intellij.openapi.options.*
import com.intellij.openapi.project.Project
import com.intellij.project.isDirectoryBased
import com.intellij.util.isEmpty
import org.jdom.Element
import java.io.OutputStream
@@ -111,8 +110,17 @@ class InitializedSchemeWrapper<out T : Scheme>(scheme: T, private val writer: (s
override fun writeScheme() = writer(scheme)
}
fun wrapState(element: Element): Element {
if (element.isEmpty()) {
fun unwrapState(element: Element, project: Project, iprAdapter: SchemeManagerIprProvider?, schemeManager: SchemeManager<*>): Element? {
val data = if (project.isDirectoryBased) element.getChild("settings") else element
iprAdapter?.let {
it.load(data)
schemeManager.reload()
}
return data
}
fun wrapState(element: Element, project: Project): Element {
if (element.isEmpty() || !project.isDirectoryBased) {
element.name = "state"
return element
}
+16 -22
View File
@@ -79,7 +79,13 @@ class CopyrightManager(private val project: Project, schemeManagerFactory: Schem
val scopeToCopyright = LinkedHashMap<String, String>()
val options = Options()
private val schemeManagerIprProvider = if (project.isDirectoryBased) null else SchemeManagerIprProvider()
private val schemeWriter = { scheme: CopyrightProfile ->
val element = Element("copyright")
scheme.writeExternal(element)
if (project.isDirectoryBased) wrapScheme(element) else element
}
private val schemeManagerIprProvider = if (project.isDirectoryBased) null else SchemeManagerIprProvider("copyright")
val schemeManager = schemeManagerFactory.create("copyright", object : LazySchemeProcessor<SchemeWrapper<CopyrightProfile>, SchemeWrapper<CopyrightProfile>>() {
override fun createScheme(dataHolder: SchemeDataHolder<SchemeWrapper<CopyrightProfile>>,
@@ -138,24 +144,14 @@ class CopyrightManager(private val project: Project, schemeManagerFactory: Schem
result.setAttribute(DEFAULT, it)
}
return wrapState(result)
return wrapState(result, project)
}
override fun loadState(state: Element) {
val data: Element? = state.getChild("settings")
val data: Element = unwrapState(state, project, schemeManagerIprProvider, schemeManager) ?: return
schemeManagerIprProvider?.let {
it.load(data)
schemeManager.reload()
}
if (data == null) {
return
}
val moduleToCopyright = data.getChild(MODULE2COPYRIGHT)
if (moduleToCopyright != null) {
for (element in moduleToCopyright.getChildren(ELEMENT)) {
data.getChild(MODULE2COPYRIGHT)?.let {
for (element in it.getChildren(ELEMENT)) {
scopeToCopyright.put(element.getAttributeValue(MODULE), element.getAttributeValue(COPYRIGHT))
}
}
@@ -257,12 +253,6 @@ private fun wrapScheme(element: Element): Element {
return wrapper
}
private val schemeWriter = { scheme: CopyrightProfile ->
val element = Element("copyright")
scheme.writeExternal(element)
wrapScheme(element)
}
private class LazySchemeWrapper(name: String,
dataHolder: SchemeDataHolder<SchemeWrapper<CopyrightProfile>>,
private val writer: (scheme: CopyrightProfile) -> Element,
@@ -273,7 +263,11 @@ private class LazySchemeWrapper(name: String,
val scheme = CopyrightProfile()
@Suppress("NAME_SHADOWING")
val dataHolder = this.dataHolder.getAndSet(null)
val element = dataHolder.read().getChild(subStateTagName)
var element = dataHolder.read()
if (element.name != subStateTagName) {
element = element.getChild(subStateTagName)
}
scheme.readExternal(element)
dataHolder.updateDigest(writer(scheme))
scheme