diff options
Diffstat (limited to 'src')
11 files changed, 211 insertions, 0 deletions
diff --git a/src/main/kotlin/com/romangraef/jrconfig/Config.kt b/src/main/kotlin/com/romangraef/jrconfig/Config.kt new file mode 100644 index 0000000..7641689 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/Config.kt @@ -0,0 +1,55 @@ +package com.romangraef.jrconfig + +import com.romangraef.jrconfig.variables.IntegerVariable +import com.romangraef.jrconfig.variables.StringVariable + +typealias ConfigVariableProvider<T> = (ConfigProvider, String) -> ConfigVariable<T> + +object Config { + private var configProvider: ConfigProvider? = null + private val map: MutableMap<Class<*>, ConfigVariableProvider<*>> = mutableMapOf() + private val proxyProvider: ConfigProvider = object : ConfigProvider { + + override fun provideData(point: String): String? = + configProvider?.provideData(point) + + + override fun setData(point: String, data: String) = + configProvider?.setData(point, data) ?: Unit + } + + init { + map[Int::class.java] = ::IntegerVariable + map[String::class.java] = ::StringVariable + } + + + @Suppress("UNCHECKED_CAST") + @JvmStatic + fun <T> get(clazz: Class<out T>, point: String): ConfigVariable<T> { + return (map[clazz] as? ConfigVariableProvider<T>)?.invoke(proxyProvider, point) + ?: throw ConfigMissingProviderException(clazz) + } + + inline fun <reified T> get(point: String) = get(T::class.java, point) + + @JvmStatic + fun <T> registerConfigVariableProvider(clazz: Class<T>, provider: ConfigVariableProvider<T>) { + map[clazz] = provider + } + + inline fun <reified T> registerConfigVariableProvider(noinline provider: ConfigVariableProvider<T>) = + registerConfigVariableProvider(T::class.java, provider) + + + @JvmStatic + fun use(provider: ConfigProvider?) { + configProvider = provider + } + + @JvmStatic + fun getString(point: String): ConfigVariable<String> { + return get(String::class.java, point) + } + +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingException.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingException.kt new file mode 100644 index 0000000..1b609f9 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingException.kt @@ -0,0 +1,5 @@ +package com.romangraef.jrconfig + +class ConfigMissingException(val point: String) : RuntimeException("The point $point is missing from your config.") { + +} diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingProviderException.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingProviderException.kt new file mode 100644 index 0000000..4cf03b8 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigMissingProviderException.kt @@ -0,0 +1,4 @@ +package com.romangraef.jrconfig + +class ConfigMissingProviderException(val clazz: Class<*>) : + RuntimeException("You are missing a config provider for the type ${clazz.canonicalName}") diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt new file mode 100644 index 0000000..019cdef --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigProvider.kt @@ -0,0 +1,6 @@ +package com.romangraef.jrconfig + +interface ConfigProvider { + fun provideData(point: String): String? + fun setData(point: String, data: String) +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt new file mode 100644 index 0000000..5874e76 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/ConfigVariable.kt @@ -0,0 +1,6 @@ +package com.romangraef.jrconfig + +interface ConfigVariable<T> { + fun get(): T + fun set(value: T) +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt b/src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt new file mode 100644 index 0000000..fda7bf9 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/FilePropertiesProvider.kt @@ -0,0 +1,45 @@ +package com.romangraef.jrconfig + +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.util.* + +class FilePropertiesProvider(private val file: File) : ConfigProvider { + private var properties: Properties = Properties() + + init { + try { + properties.load(FileInputStream(file)) + } catch (e: IOException) { + e.printStackTrace() + } + } + + companion object { + @JvmStatic + fun create(fileName: String): ConfigProvider { + return FilePropertiesProvider(File(fileName)) + } + } + + override fun provideData(point: String): String? { + return properties.getProperty(point) + } + + override fun setData(point: String, data: String) { + properties.setProperty(point, data) + save() + } + + private fun save() { + try { + properties.store(FileOutputStream(file), "application config") + } catch (e: IOException) { + e.printStackTrace() + } + } + + +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt new file mode 100644 index 0000000..ae38409 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/TransformerConfigVariable.kt @@ -0,0 +1,41 @@ +package com.romangraef.jrconfig + +import java.util.function.Function + +abstract class TransformerConfigVariable<T>(private val provider: ConfigProvider, private val point: String) : + ConfigVariable<T> { + protected abstract fun transform(value: String): T + protected abstract fun serialize(data: T): String + + override fun get(): T { + return transform(provider.provideData(point) ?: throw ConfigMissingException(point)) + } + + + override fun set(value: T) = + provider.setData(point, serialize(value)) + + + companion object { + /** + * Quick and dirty. Please consider using a subclass. + */ + fun <T> getVariable( + provider: ConfigProvider, + point: String, + transform: Function<String, T>, + serialize: Function<T, String> + ): TransformerConfigVariable<T> { + return object : TransformerConfigVariable<T>(provider, point) { + override fun transform(value: String): T { + return transform.apply(value) + } + + override fun serialize(data: T): String { + return serialize.apply(data) + } + } + } + } + +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt new file mode 100644 index 0000000..97cd719 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/variables/IntegerVariable.kt @@ -0,0 +1,15 @@ +package com.romangraef.jrconfig.variables + +import com.romangraef.jrconfig.ConfigProvider +import com.romangraef.jrconfig.TransformerConfigVariable + +class IntegerVariable(provider: ConfigProvider, point: String) : + TransformerConfigVariable<Int>(provider, point) { + override fun transform(value: String): Int { + return value.toInt() + } + + override fun serialize(data: Int): String { + return data.toString() + } +}
\ No newline at end of file diff --git a/src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt b/src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt new file mode 100644 index 0000000..62ee801 --- /dev/null +++ b/src/main/kotlin/com/romangraef/jrconfig/variables/StringVariable.kt @@ -0,0 +1,15 @@ +package com.romangraef.jrconfig.variables + +import com.romangraef.jrconfig.ConfigProvider +import com.romangraef.jrconfig.TransformerConfigVariable + +class StringVariable(provider: ConfigProvider, point: String) : + TransformerConfigVariable<String>(provider, point) { + override fun transform(value: String): String { + return value + } + + override fun serialize(data: String): String { + return data + } +}
\ No newline at end of file diff --git a/src/test/java/com/romangraef/jrconfig/Main.java b/src/test/java/com/romangraef/jrconfig/Main.java new file mode 100644 index 0000000..28dc9ec --- /dev/null +++ b/src/test/java/com/romangraef/jrconfig/Main.java @@ -0,0 +1,11 @@ +package com.romangraef.jrconfig; + +public class Main { + + public static ConfigVariable<String> token = Config.getString("token"); + + public static void main(String[] args) { + Config.use(FilePropertiesProvider.create("config.properties")); + System.out.println(token.get()); + } +} diff --git a/src/test/kotlin/com/romangraef/jrconfig/MainKt.kt b/src/test/kotlin/com/romangraef/jrconfig/MainKt.kt new file mode 100644 index 0000000..504b446 --- /dev/null +++ b/src/test/kotlin/com/romangraef/jrconfig/MainKt.kt @@ -0,0 +1,8 @@ +package com.romangraef.jrconfig + +val token = Config.get<String>("token") + +fun main() { + Config.use(FilePropertiesProvider.create("config.properties")) + println(token.get()) +}
\ No newline at end of file |