@@ -6,14 +6,33 @@ import java.util.*
6
6
import mu.KLogger
7
7
import org.utbot.common.PathUtil.toPath
8
8
import kotlin.properties.PropertyDelegateProvider
9
+ import kotlin.properties.ReadWriteProperty
9
10
import kotlin.reflect.KProperty
10
11
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 (
12
24
private val logger : KLogger ,
13
25
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 ->
17
36
val settingsPath = System .getProperty(defaultKeyForSettingsPath) ? : defaultSettingsPath
18
37
val settingsPathFile = settingsPath?.toPath()?.toFile()
19
38
if (settingsPathFile?.exists() == true ) {
@@ -27,18 +46,18 @@ abstract class AbstractSettings(
27
46
}
28
47
}
29
48
30
- protected val settingsValues: MutableMap <KProperty <* >, Any? > = mutableMapOf ()
49
+ private val settingsValues: MutableMap <KProperty <* >, Any? > = mutableMapOf ()
31
50
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> {
33
52
private var value = initializer()
34
53
35
54
init {
36
55
updateSettingValue()
37
56
}
38
57
39
- operator fun getValue (thisRef : Any? , property : KProperty <* >): T = value
58
+ override operator fun getValue (thisRef : Any? , property : KProperty <* >): T = value
40
59
41
- operator fun setValue (thisRef : Any? , property : KProperty <* >, value : T ) {
60
+ override operator fun setValue (thisRef : Any? , property : KProperty <* >, value : T ) {
42
61
this .value = value
43
62
updateSettingValue()
44
63
}
@@ -48,10 +67,10 @@ abstract class AbstractSettings(
48
67
}
49
68
}
50
69
51
- protected fun <T > getProperty (
70
+ override fun <T > settingFor (
52
71
defaultValue : T ,
53
72
converter : (String ) -> T
54
- ): PropertyDelegateProvider <Any ?, SettingDelegate < T >> {
73
+ ): PropertyDelegateProvider <Any ?, ReadWriteProperty < Any ?, T >> {
55
74
return PropertyDelegateProvider { _, property ->
56
75
SettingDelegate (property) {
57
76
try {
@@ -64,17 +83,51 @@ abstract class AbstractSettings(
64
83
}
65
84
}
66
85
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
+
67
125
protected fun getBooleanProperty (defaultValue : Boolean ) = getProperty(defaultValue, String ::toBoolean)
68
126
protected fun getIntProperty (defaultValue : Int ) = getProperty(defaultValue, String ::toInt)
69
127
protected fun getLongProperty (defaultValue : Long ) = getProperty(defaultValue, String ::toLong)
70
128
protected fun getStringProperty (defaultValue : String ) = getProperty(defaultValue) { it }
71
129
protected inline fun <reified T : Enum <T >> getEnumProperty (defaultValue : T ) =
72
130
getProperty(defaultValue) { enumValueOf(it) }
73
131
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()
80
133
}
0 commit comments