@@ -6,14 +6,33 @@ import java.util.*
66import mu.KLogger
77import org.utbot.common.PathUtil.toPath
88import kotlin.properties.PropertyDelegateProvider
9+ import kotlin.properties.ReadWriteProperty
910import kotlin.reflect.KProperty
1011
11- abstract class AbstractSettings (
12+ interface SettingsContainer {
13+ fun <T > settingFor (defaultValue : T , converter : (String ) -> T ): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >>
14+ }
15+
16+ interface SettingsContainerFactory {
17+ fun createSettingsContainer (
18+ logger : KLogger ,
19+ defaultKeyForSettingsPath : String ,
20+ defaultSettingsPath : String? = null) : SettingsContainer
21+ }
22+
23+ class PropertiesSettingsContainer (
1224 private val logger : KLogger ,
1325 defaultKeyForSettingsPath : String ,
14- defaultSettingsPath : String? = null
15- ) {
16- protected val properties = Properties ().also { props ->
26+ defaultSettingsPath : String? = null ): SettingsContainer {
27+ companion object : SettingsContainerFactory {
28+ override fun createSettingsContainer (
29+ logger : KLogger ,
30+ defaultKeyForSettingsPath : String ,
31+ defaultSettingsPath : String?
32+ ): SettingsContainer = PropertiesSettingsContainer (logger, defaultKeyForSettingsPath, defaultSettingsPath)
33+ }
34+
35+ private val properties = Properties ().also { props ->
1736 val settingsPath = System .getProperty(defaultKeyForSettingsPath) ? : defaultSettingsPath
1837 val settingsPathFile = settingsPath?.toPath()?.toFile()
1938 if (settingsPathFile?.exists() == true ) {
@@ -27,18 +46,18 @@ abstract class AbstractSettings(
2746 }
2847 }
2948
30- protected val settingsValues: MutableMap <KProperty <* >, Any? > = mutableMapOf ()
49+ private val settingsValues: MutableMap <KProperty <* >, Any? > = mutableMapOf ()
3150
32- inner class SettingDelegate <T >(val property : KProperty <* >, val initializer : () -> T ) {
51+ inner class SettingDelegate <T >(val property : KProperty <* >, val initializer : () -> T ): ReadWriteProperty<Any?, T> {
3352 private var value = initializer()
3453
3554 init {
3655 updateSettingValue()
3756 }
3857
39- operator fun getValue (thisRef : Any? , property : KProperty <* >): T = value
58+ override operator fun getValue (thisRef : Any? , property : KProperty <* >): T = value
4059
41- operator fun setValue (thisRef : Any? , property : KProperty <* >, value : T ) {
60+ override operator fun setValue (thisRef : Any? , property : KProperty <* >, value : T ) {
4261 this .value = value
4362 updateSettingValue()
4463 }
@@ -48,10 +67,10 @@ abstract class AbstractSettings(
4867 }
4968 }
5069
51- protected fun <T > getProperty (
70+ override fun <T > settingFor (
5271 defaultValue : T ,
5372 converter : (String ) -> T
54- ): PropertyDelegateProvider <Any ?, SettingDelegate < T >> {
73+ ): PropertyDelegateProvider <Any ?, ReadWriteProperty < Any ?, T >> {
5574 return PropertyDelegateProvider { _, property ->
5675 SettingDelegate (property) {
5776 try {
@@ -64,17 +83,51 @@ abstract class AbstractSettings(
6483 }
6584 }
6685
86+ override fun toString (): String =
87+ settingsValues
88+ .mapKeys { it.key.name }
89+ .entries
90+ .sortedBy { it.key }
91+ .joinToString(separator = System .lineSeparator()) { " \t ${it.key} =${it.value} " }
92+ }
93+
94+ abstract class AbstractSettings (
95+ logger : KLogger ,
96+ defaultKeyForSettingsPath : String ,
97+ defaultSettingsPath : String? = null ) {
98+ private val container: SettingsContainer = createSettingsContainer(logger, defaultKeyForSettingsPath, defaultSettingsPath)
99+ init {
100+ allSettings[defaultKeyForSettingsPath] = this
101+ }
102+ companion object : SettingsContainerFactory {
103+ val allSettings = mutableMapOf<String , AbstractSettings >()
104+ private var factory: SettingsContainerFactory ? = null
105+ override fun createSettingsContainer (
106+ logger : KLogger ,
107+ defaultKeyForSettingsPath : String ,
108+ defaultSettingsPath : String?
109+ ): SettingsContainer {
110+ return (factory ? : PropertiesSettingsContainer ).createSettingsContainer(logger, defaultKeyForSettingsPath, defaultSettingsPath)
111+ }
112+
113+ fun setupFactory (factory : SettingsContainerFactory ) {
114+ this .factory = factory
115+ }
116+ }
117+
118+ protected fun <T > getProperty (
119+ defaultValue : T ,
120+ converter : (String ) -> T
121+ ): PropertyDelegateProvider <Any ?, ReadWriteProperty <Any ?, T >> {
122+ return container.settingFor(defaultValue, converter)
123+ }
124+
67125 protected fun getBooleanProperty (defaultValue : Boolean ) = getProperty(defaultValue, String ::toBoolean)
68126 protected fun getIntProperty (defaultValue : Int ) = getProperty(defaultValue, String ::toInt)
69127 protected fun getLongProperty (defaultValue : Long ) = getProperty(defaultValue, String ::toLong)
70128 protected fun getStringProperty (defaultValue : String ) = getProperty(defaultValue) { it }
71129 protected inline fun <reified T : Enum <T >> getEnumProperty (defaultValue : T ) =
72130 getProperty(defaultValue) { enumValueOf(it) }
73131
74- override fun toString (): String =
75- settingsValues
76- .mapKeys { it.key.name }
77- .entries
78- .sortedBy { it.key }
79- .joinToString(separator = System .lineSeparator()) { " \t ${it.key} =${it.value} " }
132+ override fun toString (): String = container.toString()
80133}
0 commit comments