diff --git a/demo/pom.xml b/demo/pom.xml index a217cb1..6415e6c 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -48,14 +48,22 @@ compile + + ${project.parent.groupId} + configured-feature-kotlin + ${project.parent.version} + compile + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + + - - org.apache.maven.plugins - maven-compiler-plugin - org.apache.maven.plugins maven-jar-plugin @@ -68,6 +76,64 @@ org.apache.maven.plugins maven-javadoc-plugin + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + src/main/java + target/generated-sources/annotations + + + + + test-compile + test-compile + + test-compile + + + + + 1.8 + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + none + + + default-testCompile + none + + + compile + compile + + compile + + + + testCompile + test-compile + + testCompile + + + + diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java index ce21b20..d5cf665 100644 --- a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/ConfigurationTest.java @@ -1,11 +1,13 @@ package cc.carm.lib.configuration.demo.tests; import cc.carm.lib.configuration.demo.tests.conf.DemoConfiguration; +import cc.carm.lib.configuration.demo.tests.conf.KotlinConfiguration; import cc.carm.lib.configuration.demo.tests.conf.RegistryConfig; import cc.carm.lib.configuration.demo.tests.model.UserRecord; import cc.carm.lib.configuration.source.ConfigurationHolder; import org.jetbrains.annotations.TestOnly; +import java.util.LinkedHashMap; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @@ -80,6 +82,22 @@ public class ConfigurationTest { } + public static void testKotlin(ConfigurationHolder provider) { + provider.initialize(KotlinConfiguration.class); + + System.out.println("> Test Kotlin value before:"); + System.out.println(KotlinConfiguration.INSTANCE.getLINKED_MAP().get()); + + LinkedHashMap map = new LinkedHashMap<>(); + map.put("Language", "Kotlin"); + System.out.println("> Test Kotlin value -> " + map); + KotlinConfiguration.INSTANCE.getLINKED_MAP().set(map); + + System.out.println("> Test Kotlin value after:"); + System.out.println(KotlinConfiguration.INSTANCE.getLINKED_MAP().get()); + + } + public static void save(ConfigurationHolder provider) { try { provider.save(); diff --git a/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/KotlinConfiguration.kt b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/KotlinConfiguration.kt new file mode 100644 index 0000000..ccef89e --- /dev/null +++ b/demo/src/main/java/cc/carm/lib/configuration/demo/tests/conf/KotlinConfiguration.kt @@ -0,0 +1,33 @@ +package cc.carm.lib.configuration.demo.tests.conf + +import cc.carm.lib.configuration.Configuration +import cc.carm.lib.configuration.annotation.ConfigPath +import cc.carm.lib.configuration.annotation.ConfigVersion +import cc.carm.lib.configuration.kotlin.value.* +import java.util.* + +@ConfigPath(root = true) +object KotlinConfiguration : Configuration { + @ConfigVersion(1) + val VERSION = valueFrom(Double::class) { + defaults(1.0) + } + + val USER_LIST = listFrom(String::class) { + defaults("Carm Jos") + } + + val NICKNAME = mapFrom(String::class, ::mutableMapOf) { + defaultMap(mapOf("Carm Jos" to "Carm")) + parse { v -> v } + serialize { v -> v } + } + + val LINKED_MAP = linkedMapFrom(String::class) { + parse { value -> + value + } + serialize { v -> v } + defaults("key", "value") + } +} \ No newline at end of file diff --git a/features/kotlin/pom.xml b/features/kotlin/pom.xml new file mode 100644 index 0000000..cceb257 --- /dev/null +++ b/features/kotlin/pom.xml @@ -0,0 +1,106 @@ + + + 4.0.0 + + cc.carm.lib + configured-parent + 4.1.2 + ../../pom.xml + + + ${project.jdk.version} + ${project.jdk.version} + UTF-8 + UTF-8 + + + configured-feature-kotlin + jar + + + + ${project.groupId} + configured-core + ${project.version} + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + compile + + + + + ${project.basedir}/src/main/kotlin + + + + org.apache.maven.plugins + maven-jar-plugin + + + org.apache.maven.plugins + maven-source-plugin + + + org.apache.maven.plugins + maven-javadoc-plugin + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + 1.8 + + + + org.apache.maven.plugins + maven-compiler-plugin + + + default-compile + none + + + default-testCompile + none + + + compile + compile + + compile + + + + testCompile + test-compile + + testCompile + + + + + + + \ No newline at end of file diff --git a/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt new file mode 100644 index 0000000..bcddeaf --- /dev/null +++ b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Lists.kt @@ -0,0 +1,29 @@ +package cc.carm.lib.configuration.kotlin.value + +import cc.carm.lib.configuration.adapter.ValueType +import cc.carm.lib.configuration.builder.list.SourceListBuilder +import cc.carm.lib.configuration.value.standard.ConfiguredList +import kotlin.reflect.KClass + +inline fun listFrom( + clazz: KClass, block: (SourceListBuilder.() -> Unit) +): ConfiguredList { + return listFrom(clazz.java, block) +} + +inline fun listFrom( + clazz: Class, block: (SourceListBuilder.() -> Unit) +): ConfiguredList { + return listFrom(ValueType.of(clazz), block) +} + +inline fun listFrom( + valueType: ValueType, block: (SourceListBuilder.() -> Unit) +): ConfiguredList { + val configBuilder = ConfiguredList.builderOf(V::class.java) + val sourceValueBuilder: SourceListBuilder = if (valueType.rawType == String::class.java) { + @Suppress("UNCHECKED_CAST") + configBuilder.fromString() as SourceListBuilder + } else configBuilder.from(valueType) + return sourceValueBuilder.also(block).build() +} \ No newline at end of file diff --git a/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Maps.kt b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Maps.kt new file mode 100644 index 0000000..e784a38 --- /dev/null +++ b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Maps.kt @@ -0,0 +1,107 @@ +package cc.carm.lib.configuration.kotlin.value + +import cc.carm.lib.configuration.adapter.ValueType +import cc.carm.lib.configuration.builder.map.SourceMapBuilder +import cc.carm.lib.configuration.value.standard.ConfiguredMap +import java.util.* +import kotlin.reflect.KClass + +inline fun hashmapFrom( + clazz: KClass, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + return hashmapFrom(clazz.java, block) +} + +inline fun hashmapFrom( + clazz: Class, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + return hashmapFrom(ValueType.of(clazz), block) +} + +inline fun hashmapFrom( + valueType: ValueType, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + val mapCreator = ConfiguredMap.builderOf(K::class.java, V::class.java) + val sourceValueBuilder: SourceMapBuilder, S, K, V> = mapCreator.asHashMap().from(valueType) + return sourceValueBuilder.also(block).build() +} + +inline fun linkedMapFrom( + clazz: KClass, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + return linkedMapFrom(clazz.java, block) +} + +inline fun linkedMapFrom( + clazz: Class, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + return linkedMapFrom(ValueType.of(clazz), block) +} + +inline fun linkedMapFrom( + valueType: ValueType, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + val mapCreator = ConfiguredMap.builderOf(K::class.java, V::class.java) + val sourceValueBuilder: SourceMapBuilder, S, K, V> = mapCreator.asLinkedMap().from(valueType) + return sourceValueBuilder.also(block).build() +} + +inline fun treeMapFrom( + clazz: KClass, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + return treeMapFrom(clazz.java, block) +} + +inline fun treeMapFrom( + clazz: Class, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + return treeMapFrom(ValueType.of(clazz), block) +} + +inline fun treeMapFrom( + valueType: ValueType, + block: SourceMapBuilder, S, K, V>.() -> Unit +): ConfiguredMap { + val mapCreator = ConfiguredMap.builderOf(K::class.java, V::class.java) + val sourceValueBuilder: SourceMapBuilder, S, K, V> = mapCreator.asTreeMap().from(valueType) + return sourceValueBuilder.also(block).build() +} + +inline fun , S : Any, reified K, reified V> mapFrom( + clazz: KClass, + noinline map: () -> MAP, + block: SourceMapBuilder.() -> Unit +): ConfiguredMap { + return mapFrom(clazz.java, map, block) +} + +inline fun , S : Any, reified K, reified V> mapFrom( + clazz: Class, + noinline map: () -> MAP, + block: SourceMapBuilder.() -> Unit +): ConfiguredMap { + return mapFrom(ValueType.of(clazz), map, block) +} + +inline fun , S : Any, reified K, reified V> mapFrom( + valueType: ValueType, + noinline map: () -> MAP, + block: SourceMapBuilder.() -> Unit +): ConfiguredMap { + val mapCreator = ConfiguredMap.builderOf(K::class.java, V::class.java) + val sourceValueBuilder: SourceMapBuilder = mapCreator.constructor(map).from(valueType) + return sourceValueBuilder.also(block).build() +} + + +fun , S, K, V> SourceMapBuilder.defaultMap(map: MAP): SourceMapBuilder { + return defaults(map) +} \ No newline at end of file diff --git a/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Values.kt b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Values.kt new file mode 100644 index 0000000..5d9be11 --- /dev/null +++ b/features/kotlin/src/main/kotlin/cc/carm/lib/configuration/kotlin/value/Values.kt @@ -0,0 +1,36 @@ +package cc.carm.lib.configuration.kotlin.value + +import cc.carm.lib.configuration.adapter.ValueType +import cc.carm.lib.configuration.builder.value.SourceValueBuilder +import cc.carm.lib.configuration.value.standard.ConfiguredValue +import kotlin.reflect.KClass + +inline fun valueFrom( + clazz: KClass, block: (SourceValueBuilder.() -> Unit) +): ConfiguredValue { + return valueFrom(clazz.java, block) +} + +inline fun valueFrom( + clazz: Class, block: (SourceValueBuilder.() -> Unit) +): ConfiguredValue { + return valueFrom(ValueType.of(clazz), block) +} + +inline fun valueFrom( + valueType: ValueType, block: (SourceValueBuilder.() -> Unit) +): ConfiguredValue { + val configBuilder = ConfiguredValue.builderOf(V::class.java) + val sourceValueBuilder: SourceValueBuilder = if (valueType.rawType == String::class.java) { + @Suppress("UNCHECKED_CAST") + configBuilder.fromString() as SourceValueBuilder + } else configBuilder.from(valueType) + sourceValueBuilder.parse { holder, data -> + holder.deserialize(V::class.java, data) + } + sourceValueBuilder.serialize { holder, data -> + @Suppress("UNCHECKED_CAST") + holder.serialize(data) as? S + } + return sourceValueBuilder.also(block).build() +} diff --git a/pom.xml b/pom.xml index 7ae54fe..845fbfc 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,7 @@ ${project.jdk.version} UTF-8 UTF-8 + 2.0.21 cc.carm.lib @@ -24,6 +25,7 @@ features/versioned features/validators features/text + features/kotlin providers/yaml providers/gson diff --git a/providers/yaml/src/test/java/yaml/test/YamlTests.java b/providers/yaml/src/test/java/yaml/test/YamlTests.java index 7540ab8..df6fe05 100644 --- a/providers/yaml/src/test/java/yaml/test/YamlTests.java +++ b/providers/yaml/src/test/java/yaml/test/YamlTests.java @@ -44,5 +44,13 @@ public class YamlTests { ConfigurationTest.save(holder); } + @Test + public void testKotlin() { + ConfigurationHolder holder = YAMLConfigFactory.from("target/kotlin.yml").build(); + + ConfigurationTest.testKotlin(holder); + + ConfigurationTest.save(holder); + } }