diff --git a/demo/pom.xml b/demo/pom.xml
index abbcf69..62f05e3 100644
--- a/demo/pom.xml
+++ b/demo/pom.xml
@@ -13,7 +13,11 @@
${project.jdk.version}
UTF-8
UTF-8
+ true
+ true
+ 8.0.33
+ 2.24.3
configured-demo
jar
@@ -24,38 +28,112 @@
${project.parent.groupId}
configured-core
${project.parent.version}
- compile
${project.parent.groupId}
configured-feature-commentable
${project.parent.version}
- compile
${project.parent.groupId}
configured-feature-versioned
${project.parent.version}
- compile
${project.parent.groupId}
configured-feature-validators
${project.parent.version}
- compile
+
+
+
+ ${project.parent.groupId}
+ configured-feature-kotlin
+ ${project.parent.version}
+
+
+
+ ${project.parent.groupId}
+ configured-yaml
+ ${project.parent.version}
+ test
+
+
+
+ ${project.parent.groupId}
+ configured-gson
+ ${project.parent.version}
+ test
+
+
+
+ ${project.parent.groupId}
+ configured-sql
+ ${project.parent.version}
+ test
+
+
+
+ cc.carm.lib
+ easysql-beecp
+ 0.4.7
+ test
+
+
+
+ mysql
+ mysql-connector-java
+ ${deps.mysql-driver.version}
+ test
+
+
+
+ ${project.parent.groupId}
+ configured-mongodb
+ ${project.parent.version}
+ test
+
+
+
+ ${project.parent.groupId}
+ configured-hocon
+ ${project.parent.version}
+ test
+
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib-jdk8
+ ${kotlin.version}
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+ ${log4j.version}
+ test
+
+
+
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j.version}
+ test
+
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+ ${log4j.version}
+ test
-
- org.apache.maven.plugins
- maven-compiler-plugin
-
org.apache.maven.plugins
maven-jar-plugin
@@ -68,6 +146,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/providers/gson/src/test/java/config/JSONConfigTest.java b/demo/src/test/java/cc/carm/lib/configuration/tests/test/JSONConfigTests.java
similarity index 88%
rename from providers/gson/src/test/java/config/JSONConfigTest.java
rename to demo/src/test/java/cc/carm/lib/configuration/tests/test/JSONConfigTests.java
index c5cca74..4f9d77d 100644
--- a/providers/gson/src/test/java/config/JSONConfigTest.java
+++ b/demo/src/test/java/cc/carm/lib/configuration/tests/test/JSONConfigTests.java
@@ -1,4 +1,4 @@
-package config;
+package cc.carm.lib.configuration.tests.test;
import cc.carm.lib.configuration.demo.tests.ConfigurationTest;
import cc.carm.lib.configuration.source.ConfigurationHolder;
@@ -7,7 +7,7 @@ import org.junit.Test;
import java.io.File;
-public class JSONConfigTest {
+public class JSONConfigTests {
protected final ConfigurationHolder> holder = JSONConfigFactory
.from(new File("target"), "config.json")
diff --git a/providers/yaml/src/test/java/yaml/test/YamlTests.java b/demo/src/test/java/cc/carm/lib/configuration/tests/test/YamlTests.java
similarity index 84%
rename from providers/yaml/src/test/java/yaml/test/YamlTests.java
rename to demo/src/test/java/cc/carm/lib/configuration/tests/test/YamlTests.java
index 7540ab8..5c974b4 100644
--- a/providers/yaml/src/test/java/yaml/test/YamlTests.java
+++ b/demo/src/test/java/cc/carm/lib/configuration/tests/test/YamlTests.java
@@ -1,4 +1,4 @@
-package yaml.test;
+package cc.carm.lib.configuration.tests.test;
import cc.carm.lib.configuration.commentable.CommentableMeta;
import cc.carm.lib.configuration.demo.tests.ConfigurationTest;
@@ -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);
+ }
}
diff --git a/providers/mongodb/src/test/java/config/MongoConfig.java b/demo/src/test/java/cc/carm/lib/configuration/tests/test/mongodb/MongoConfig.java
similarity index 90%
rename from providers/mongodb/src/test/java/config/MongoConfig.java
rename to demo/src/test/java/cc/carm/lib/configuration/tests/test/mongodb/MongoConfig.java
index b831c37..ec856c6 100644
--- a/providers/mongodb/src/test/java/config/MongoConfig.java
+++ b/demo/src/test/java/cc/carm/lib/configuration/tests/test/mongodb/MongoConfig.java
@@ -1,4 +1,4 @@
-package config;
+package cc.carm.lib.configuration.tests.test.mongodb;
import cc.carm.lib.configuration.Configuration;
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
diff --git a/providers/mongodb/src/test/java/config/MongoTest.java b/demo/src/test/java/cc/carm/lib/configuration/tests/test/mongodb/MongoTest.java
similarity index 97%
rename from providers/mongodb/src/test/java/config/MongoTest.java
rename to demo/src/test/java/cc/carm/lib/configuration/tests/test/mongodb/MongoTest.java
index 7abdfd1..c179dd0 100644
--- a/providers/mongodb/src/test/java/config/MongoTest.java
+++ b/demo/src/test/java/cc/carm/lib/configuration/tests/test/mongodb/MongoTest.java
@@ -1,4 +1,4 @@
-package config;
+package cc.carm.lib.configuration.tests.test.mongodb;
import cc.carm.lib.configuration.demo.tests.ConfigurationTest;
import cc.carm.lib.configuration.source.ConfigurationHolder;
diff --git a/providers/sql/src/test/java/config/SQLConfigTest.java b/demo/src/test/java/cc/carm/lib/configuration/tests/test/sql/SQLConfigTest.java
similarity index 96%
rename from providers/sql/src/test/java/config/SQLConfigTest.java
rename to demo/src/test/java/cc/carm/lib/configuration/tests/test/sql/SQLConfigTest.java
index 24bf9cb..f8f36ff 100644
--- a/providers/sql/src/test/java/config/SQLConfigTest.java
+++ b/demo/src/test/java/cc/carm/lib/configuration/tests/test/sql/SQLConfigTest.java
@@ -1,4 +1,4 @@
-package config;
+package cc.carm.lib.configuration.tests.test.sql;
import cc.carm.lib.configuration.demo.DatabaseConfiguration;
import cc.carm.lib.configuration.demo.tests.ConfigurationTest;
diff --git a/providers/gson/src/test/resources/example.json b/demo/src/test/resources/example.json
similarity index 100%
rename from providers/gson/src/test/resources/example.json
rename to demo/src/test/resources/example.json
diff --git a/providers/mongodb/src/test/resources/log4j2.xml b/demo/src/test/resources/log4j2.xml
similarity index 89%
rename from providers/mongodb/src/test/resources/log4j2.xml
rename to demo/src/test/resources/log4j2.xml
index f06fcad..b624382 100644
--- a/providers/mongodb/src/test/resources/log4j2.xml
+++ b/demo/src/test/resources/log4j2.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/features/kotlin/pom.xml b/features/kotlin/pom.xml
new file mode 100644
index 0000000..7624207
--- /dev/null
+++ b/features/kotlin/pom.xml
@@ -0,0 +1,120 @@
+
+
+ 4.0.0
+
+ cc.carm.lib
+ configured-parent
+ 4.1.3
+ ../../pom.xml
+
+
+ ${project.jdk.version}
+ ${project.jdk.version}
+ UTF-8
+ UTF-8
+ 1.9.22
+
+
+ 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.jetbrains.dokka
+ dokka-maven-plugin
+ 2.0.0
+
+
+ pre-site
+
+ dokka
+
+
+
+
+
+ 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