diff --git a/CHANGELOG.md b/CHANGELOG.md index df83689..9e9799b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +========================================================= +2015-09-14 v0.5.0 release +========================================================= + +Kotlin M13 support, updated to Kovenant 2.5.0, Jackson 2.6.2, Injekt 1.5.0, ElasticSearch 1.7.2 + +========================================================= +2015-09-14 v0.4.0 release +========================================================= + +Added ElasticSearch helpers, integration with Kovenant promises in klutter/elasticsearch module, see module docs for more information + ========================================================= 2015-08-31 v0.3.0 release ========================================================= diff --git a/README.md b/README.md index 3f13c22..15f84cf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Kotlin M12](https://img.shields.io/badge/Kotlin-M12%20%40%200.12.1230-blue.svg)](http://kotlinlang.org) [![Maven Version](https://img.shields.io/maven-central/v/uy.klutter/klutter-all-jdk8.svg)](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22uy.klutter%22) [![CircleCI branch](https://img.shields.io/circleci/project/klutter/klutter/master.svg)](https://circleci.com/gh/klutter/klutter/tree/master) [![Issues](https://img.shields.io/github/issues/klutter/klutter.svg)](https://github.com/klutter/klutter/issues?q=is%3Aopen) [![DUB](https://img.shields.io/dub/l/vibe-d.svg)](https://github.com/klutter/klutter/blob/master/LICENSE) +[![Kotlin M13](https://img.shields.io/badge/Kotlin-M12%20%40%200.13.1513-blue.svg)](http://kotlinlang.org) [![Maven Version](https://img.shields.io/maven-central/v/uy.klutter/klutter-all-jdk8.svg)](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22uy.klutter%22) [![CircleCI branch](https://img.shields.io/circleci/project/klutter/klutter/master.svg)](https://circleci.com/gh/klutter/klutter/tree/master) [![Issues](https://img.shields.io/github/issues/klutter/klutter.svg)](https://github.com/klutter/klutter/issues?q=is%3Aopen) [![DUB](https://img.shields.io/dub/l/vibe-d.svg)](https://github.com/klutter/klutter/blob/master/LICENSE) # klutter Random small libraries, usually extensions making other libraries happier. @@ -10,8 +10,8 @@ rights for the code to be used in Klutter. Each module has its own set of dependencies. There is a main dependency which is always the most current JDK version of the module, and also a version suffixed by the JDK version for which it is compatible (that version or newer). -Include the dependency in your Gradle / Maven projects, ones that already have Kotlin configured for Kotlin M12 versions -`0.12.1218` or `0.12.1230` +Include the dependency in your Gradle / Maven projects, ones that already have Kotlin configured for Kotlin M13 versions +`0.13.1513` For example, for the whole package (one of `klutter-all` (lastest JDK), `klutter-all-jdk6`, `klutter-all-jdk7`, or `klutter-all-jdk8`) and using an open-ended dependency number while Klutter is in early active development: @@ -19,7 +19,7 @@ open-ended dependency number while Klutter is in early active development: **Gradle:** ``` -compile "uy.klutter:klutter-all:0.4.+" +compile "uy.klutter:klutter-all:0.5.+" ``` **Maven:** @@ -27,7 +27,7 @@ compile "uy.klutter:klutter-all:0.4.+" uy.klutter klutter-all - [0.4.0,0.5.0) + [0.5.0,0.6.0) ``` diff --git a/aws-s3-jdk6/src/main/kotlin/uy/klutter/aws/s3/AmazonS3Client_Ext.kt b/aws-s3-jdk6/src/main/kotlin/uy/klutter/aws/s3/AmazonS3Client_Ext.kt index 4765ca4..de44a9b 100644 --- a/aws-s3-jdk6/src/main/kotlin/uy/klutter/aws/s3/AmazonS3Client_Ext.kt +++ b/aws-s3-jdk6/src/main/kotlin/uy/klutter/aws/s3/AmazonS3Client_Ext.kt @@ -6,11 +6,11 @@ import com.amazonaws.services.s3.model.ObjectMetadata import org.apache.http.HttpStatus import uy.klutter.aws.defaultSafeCredentialsProviderChain -fun AmazonS3Client.exists(bucket: String, key: String): Boolean { +public fun AmazonS3Client.exists(bucket: String, key: String): Boolean { return ifExistsReturnMetadata(bucket, key) != null } -fun AmazonS3Client.ifExistsReturnMetadata(bucket: String, key: String): ObjectMetadata? { +public fun AmazonS3Client.ifExistsReturnMetadata(bucket: String, key: String): ObjectMetadata? { try { val metadata = getObjectMetadata(bucket, key) return metadata @@ -23,7 +23,7 @@ fun AmazonS3Client.ifExistsReturnMetadata(bucket: String, key: String): ObjectMe } -fun AmazonS3Client.ifExistsReturnUserMetadata(bucket: String, key: String): Map? { +public fun AmazonS3Client.ifExistsReturnUserMetadata(bucket: String, key: String): Map? { return ifExistsReturnMetadata(bucket, key)?.getUserMetadata() } diff --git a/build.gradle b/build.gradle index 60357fe..67cf56c 100644 --- a/build.gradle +++ b/build.gradle @@ -70,6 +70,9 @@ subprojects { repositories { mavenCentral() + maven { + url 'https://oss.sonatype.org/content/repositories/snapshots' + } } dependencies { diff --git a/config-typesafe-jdk6/build.gradle b/config-typesafe-jdk6/build.gradle index 3cf34c8..43c5c09 100644 --- a/config-typesafe-jdk6/build.gradle +++ b/config-typesafe-jdk6/build.gradle @@ -1,3 +1,6 @@ dependencies { compile "com.typesafe:config:$version_typesafe_config" + compile "uy.kohesive.injekt:injekt-core:$version_kohesive_injekt" + + compile relativeProject(":klutter-json-jackson-jdk6") } \ No newline at end of file diff --git a/config-typesafe-jdk6/src/main/kotlin/uy/klutter/config/typesafe/InjektConfig.kt b/config-typesafe-jdk6/src/main/kotlin/uy/klutter/config/typesafe/InjektConfig.kt new file mode 100644 index 0000000..0fc0616 --- /dev/null +++ b/config-typesafe-jdk6/src/main/kotlin/uy/klutter/config/typesafe/InjektConfig.kt @@ -0,0 +1,115 @@ +package uy.klutter.config.typesafe + +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.type.TypeFactory +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.typesafe.config.Config +import com.typesafe.config.ConfigRenderOptions +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.* +import kotlin.properties.Delegates + +/** + * A class that startups up an system using Injekt + TypesafeConfig, using the default global scope, and default object binder + */ +public abstract class KonfigAndInjektMain() : KonfigAndInjektScopedMain(Injekt) + +/** + * A startup module that registers and uses singletons/object factories from a specific scope, + * and an ObjectMapper to bind configuration properties into class instances. + */ +public abstract class KonfigAndInjektScopedMain(public val scope: InjektScope, public val mapper: ObjectMapper = jacksonObjectMapper()) : InjektModule, KonfigModule { + private val ADDON_ID = "Konfigure" + + protected var resolvedConfig: Config by Delegates.notNull() + + abstract fun configFactory(): Config + + private inner class ScopedKonfigRegistrar(val path: List, val scope: InjektScope) : KonfigRegistrar, InjektRegistrar by scope { + override fun importModule(atPath: String, module: KonfigModule) { + module.registerWith(ScopedKonfigRegistrar(path + atPath.split('.'), scope)) + } + + override fun bindClassAtConfigRoot(klass: TypeReference) { + val fullpath = path.filter { it.isNotBlank() }.map { it.removePrefix(".").removeSuffix(".") }.joinToString(".") + loadAndInject(resolvedConfig, fullpath, klass) + } + + override fun bindClassAtConfigPath(configPath: String, klass: TypeReference) { + val fullpath = (path + configPath.split('.')).filter { it.isNotBlank() }.map { it.removePrefix(".").removeSuffix(".") }.joinToString(".") + loadAndInject(resolvedConfig, fullpath, klass) + } + + @Suppress("UNCHECKED_CAST") + fun loadAndInject(config: Config, fullPath: String, klass: TypeReference) { + val configAtPath = config.getConfig(fullPath) + val asJson = configAtPath.root().render(ConfigRenderOptions.concise().setJson(true)) + val instance: T = mapper.readValue(asJson, TypeFactory.defaultInstance().constructType(klass.type))!! + scope.registrar.addSingleton(klass, instance) + } + } + + init { + resolvedConfig = configFactory() + val registrar = ScopedKonfigRegistrar(emptyList(), scope) + registrar.registerConfigurables() + scope.registrar.registerInjectables() + } +} + +public interface KonfigRegistrar : InjektRegistrar { + /** + * import a module loading it and any submodules immediately + */ + fun importModule(atPath: String, module: KonfigModule) + + /** + * bind a class bindings its values from a configuration path immediately + */ + final inline fun bindClassAtConfigPath(configPath: String) { + bindClassAtConfigPath(configPath, fullType()) + } + + /** + * bind a class bindings its values from a configuration path immediately + */ + fun bindClassAtConfigPath(configPath: String, klass: TypeReference) + + /** + * bind a class bindings its values from a configuration path immediately + */ + final inline fun bindClassAtConfigPath(configPath: String, klass: Class) { + bindClassAtConfigPath(configPath, fullType()) + } + + /** + * bind a class bindings its values from the root of the current configuration path immediately + */ + final inline fun bindClassAtConfigRoot() { + bindClassAtConfigRoot(fullType()) + } + + /** + * bind a class bindings its values from the root of the current configuration path immediately + */ + fun bindClassAtConfigRoot(klass: TypeReference) + + /** + * bind a class bindings its values from the root of the current configuration path immediately + */ + final inline fun bindClassAtConfigRoot(klass: Class) { + bindClassAtConfigRoot(fullType()) + } +} + +/** + * A package of configuration bound items that can be included into a scope of someone else + */ +public interface KonfigModule { + final internal fun registerWith(intoModule: KonfigRegistrar) { + intoModule.registerConfigurables() + } + + fun KonfigRegistrar.registerConfigurables() +} + diff --git a/config-typesafe-jdk6/src/test/kotlin/uy/klutter/config/typesafe/TestConfigLoading.kt b/config-typesafe-jdk6/src/test/kotlin/uy/klutter/config/typesafe/TestConfigLoading.kt index e72a99e..683e385 100644 --- a/config-typesafe-jdk6/src/test/kotlin/uy/klutter/config/typesafe/TestConfigLoading.kt +++ b/config-typesafe-jdk6/src/test/kotlin/uy/klutter/config/typesafe/TestConfigLoading.kt @@ -1,21 +1,21 @@ -package uy.klutter.config.typesafe +package uy.klutter.config.typesafe.tests import com.typesafe.config.ConfigFactory import org.junit.AfterClass import org.junit.Before import org.junit.BeforeClass import org.junit.Test -import kotlin.platform.platformStatic +import uy.klutter.config.typesafe.* import kotlin.test.assertEquals public class TestConfigLoading { companion object { - @BeforeClass @platformStatic public fun setupSystemProps() { + @BeforeClass @JvmStatic public fun setupSystemProps() { System.setProperty("systemKey", "value System") System.setProperty("base.value4", "four-sys") } - @AfterClass @platformStatic public fun removeSystemProps() { + @AfterClass @JvmStatic public fun removeSystemProps() { System.clearProperty("base.value4") System.clearProperty("systemKey") ConfigFactory.invalidateCaches() diff --git a/config-typesafe-jdk6/src/test/kotlin/uy/klutter/config/typesafe/TestInjektConfig.kt b/config-typesafe-jdk6/src/test/kotlin/uy/klutter/config/typesafe/TestInjektConfig.kt new file mode 100644 index 0000000..babaf4e --- /dev/null +++ b/config-typesafe-jdk6/src/test/kotlin/uy/klutter/config/typesafe/TestInjektConfig.kt @@ -0,0 +1,77 @@ +package uy.klutter.config.typesafe.tests + +import com.typesafe.config.Config +import org.junit.Test +import uy.klutter.config.typesafe.* +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.InjektModule +import uy.kohesive.injekt.api.InjektRegistrar +import kotlin.test.assertEquals + +class TestTypesafeConfigInjection { + companion object : KonfigAndInjektMain() { + override fun configFactory(): Config { + return loadConfig(MapAsConfig(kotlin.mapOf( + "http" to kotlin.mapOf("httpPort" to 8080, "workerThreads" to 16), + "data" to kotlin.mapOf("bucket" to "com.test.bucket", "region" to "us-east"), + "other" to kotlin.mapOf("name" to "frisbee")))) + } + + override fun KonfigRegistrar.registerConfigurables() { + bindClassAtConfigPath("http") + bindClassAtConfigPath("data") + importModule("other", OtherModule) + } + + override fun InjektRegistrar.registerInjectables() { + addFactory { ConfiguredThing() } + importModule(OtherModule) + } + + } + + @Test public fun testConfigSingletonsExist() { + val matchHttp = HttpConfig(8080,16) + val matchData = DataConfig("com.test.bucket", "us-east") + + assertEquals(matchHttp, Injekt.get()) + assertEquals(matchData, Injekt.get()) + } + + @Test public fun testFactoryUsingConfigWorks() { + val matchHttp = HttpConfig(8080,16) + val matchData = DataConfig("com.test.bucket", "us-east") + + val thing = Injekt.get() + assertEquals(matchHttp, thing.httpCfg) + assertEquals(matchData, thing.dataCfg) + } + + @Test public fun testWithModules() { + val thing = Injekt.get() + assertEquals("frisbee", thing.cfg.name) + } + + + data class HttpConfig(val httpPort: Int, val workerThreads: Int) + data class DataConfig(val bucket: String, val region: String) + data class ConfiguredThing(val httpCfg: HttpConfig = Injekt.get(), val dataCfg: DataConfig = Injekt.get()) +} + + +data class OtherConfig(val name: String) +data class OtherThingWantingConfig(val cfg: OtherConfig = Injekt.get()) + +public object OtherModule : KonfigModule, InjektModule { + override fun KonfigRegistrar.registerConfigurables() { + bindClassAtConfigRoot() + } + + override fun InjektRegistrar.registerInjectables() { + addFactory { OtherThingWantingConfig() } + } +} + + + + diff --git a/config-typesafe-jdk7/build.gradle b/config-typesafe-jdk7/build.gradle index 1d054ba..edfbde7 100644 --- a/config-typesafe-jdk7/build.gradle +++ b/config-typesafe-jdk7/build.gradle @@ -1,4 +1,6 @@ dependencies { compile relativeProject(":klutter-config-typesafe-jdk6") compile "com.typesafe:config:$version_typesafe_config" + + compile relativeProject(":klutter-json-jackson-jdk6") } \ No newline at end of file diff --git a/config-typesafe-jdk7/src/main/kotlin/uy/klutter/config/typesafe/jdk7/TypesafeConfig_Jdk7_Ext.kt b/config-typesafe-jdk7/src/main/kotlin/uy/klutter/config/typesafe/jdk7/TypesafeConfig_Jdk7_Ext.kt index 3a66c12..ac931b1 100644 --- a/config-typesafe-jdk7/src/main/kotlin/uy/klutter/config/typesafe/jdk7/TypesafeConfig_Jdk7_Ext.kt +++ b/config-typesafe-jdk7/src/main/kotlin/uy/klutter/config/typesafe/jdk7/TypesafeConfig_Jdk7_Ext.kt @@ -4,16 +4,16 @@ import uy.klutter.config.typesafe.ConfiguredValue import java.nio.file.Path import java.nio.file.Paths -fun ConfiguredValue.asPath(): Path = Paths.get(cfg.getString(key).trim()).toAbsolutePath() -fun ConfiguredValue.asPathOrNull(): Path? = if (exists()) asPath() else null +public fun ConfiguredValue.asPath(): Path = Paths.get(cfg.getString(key).trim()).toAbsolutePath() +public fun ConfiguredValue.asPathOrNull(): Path? = if (exists()) asPath() else null -fun ConfiguredValue.asPathRelative(relativeTo: Path): Path = relativeTo.resolve(cfg.getString(key).trim()).toAbsolutePath() -fun ConfiguredValue.asPathRelativeOrNull(relativeTo: Path): Path? = if (exists()) asPathRelative(relativeTo) else null +public fun ConfiguredValue.asPathRelative(relativeTo: Path): Path = relativeTo.resolve(cfg.getString(key).trim()).toAbsolutePath() +public fun ConfiguredValue.asPathRelativeOrNull(relativeTo: Path): Path? = if (exists()) asPathRelative(relativeTo) else null -fun ConfiguredValue.asPathSibling(relativeTo: Path): Path = relativeTo.resolveSibling(cfg.getString(key).trim()).toAbsolutePath() -fun ConfiguredValue.asPathSiblingOrNull(relativeTo: Path): Path? = if (exists()) asPathSibling(relativeTo) else null +public fun ConfiguredValue.asPathSibling(relativeTo: Path): Path = relativeTo.resolveSibling(cfg.getString(key).trim()).toAbsolutePath() +public fun ConfiguredValue.asPathSiblingOrNull(relativeTo: Path): Path? = if (exists()) asPathSibling(relativeTo) else null -fun ConfiguredValue.asPathList(): List = cfg.getStringList(key).map { Paths.get(it).toAbsolutePath() } -fun ConfiguredValue.asPathList(defaultValue: List): List = if (exists()) asPathList() else defaultValue -fun ConfiguredValue.asPathListOrNull(): List? = if (exists()) asPathList() else null -fun ConfiguredValue.asPathListOrEmpty(): List = asPathList(emptyList()) \ No newline at end of file +public fun ConfiguredValue.asPathList(): List = cfg.getStringList(key).map { Paths.get(it).toAbsolutePath() } +public fun ConfiguredValue.asPathList(defaultValue: List): List = if (exists()) asPathList() else defaultValue +public fun ConfiguredValue.asPathListOrNull(): List? = if (exists()) asPathList() else null +public fun ConfiguredValue.asPathListOrEmpty(): List = asPathList(emptyList()) \ No newline at end of file diff --git a/config-typesafe-jdk8/build.gradle b/config-typesafe-jdk8/build.gradle index 8150d27..adb78ef 100644 --- a/config-typesafe-jdk8/build.gradle +++ b/config-typesafe-jdk8/build.gradle @@ -1,5 +1,7 @@ dependencies { compile relativeProject(':klutter-config-typesafe-jdk6') compile relativeProject(':klutter-config-typesafe-jdk7') + compile relativeProject(":klutter-json-jackson-jdk8") + compile "com.typesafe:config:$version_typesafe_config_jdk8" } \ No newline at end of file diff --git a/core-jdk6/src/main/kotlin/uy/klutter/core/jdk/Strings.kt b/core-jdk6/src/main/kotlin/uy/klutter/core/jdk/Strings.kt index e599ebf..1d6e994 100644 --- a/core-jdk6/src/main/kotlin/uy/klutter/core/jdk/Strings.kt +++ b/core-jdk6/src/main/kotlin/uy/klutter/core/jdk/Strings.kt @@ -77,7 +77,7 @@ public fun String.mustEndWith(postfix: Char): String { } } -inline public fun String.whenStartsWith(prefix: String, thenWithRest: (String)->Unit): Boolean { +public inline fun String.whenStartsWith(prefix: String, thenWithRest: (String)->Unit): Boolean { if (this.startsWith(prefix)) { thenWithRest(this.exceptStarting(prefix.length())) return true @@ -86,7 +86,7 @@ inline public fun String.whenStartsWith(prefix: String, thenWithRest: (String)-> } -inline public fun String.whenStartsWith(prefixes: List, thenWithRest: (String)->Unit): Boolean { +public inline fun String.whenStartsWith(prefixes: List, thenWithRest: (String)->Unit): Boolean { prefixes.forEach { prefix -> if (this.startsWith(prefix)) { thenWithRest(this.exceptStarting(prefix.length())) diff --git a/core-jdk6/src/main/kotlin/uy/klutter/core/uri/UriBuilder.kt b/core-jdk6/src/main/kotlin/uy/klutter/core/uri/UriBuilder.kt index 9563982..815bc31 100644 --- a/core-jdk6/src/main/kotlin/uy/klutter/core/uri/UriBuilder.kt +++ b/core-jdk6/src/main/kotlin/uy/klutter/core/uri/UriBuilder.kt @@ -59,7 +59,7 @@ public interface ImmutableUri { fun fragmentAsDecodedQueryDeduped(): Map? = if (encodedFragment == null) null else UrlEncoding.decodeQueryToMap(encodedFragment!!) } -class UriBuilder(scheme: String? = null, encodedUserInfo: String? = null, host: String? = null, port: Int? = null, encodedPath: String? = null, encodedQuery: String? = null, encodedFragment: String? = null): ImmutableUri { +public class UriBuilder(scheme: String? = null, encodedUserInfo: String? = null, host: String? = null, port: Int? = null, encodedPath: String? = null, encodedQuery: String? = null, encodedFragment: String? = null): ImmutableUri { override var scheme: String? = scheme override var host: String? = host override var port: Int? = port diff --git a/core-jdk6/src/main/kotlin/uy/klutter/core/uri/UrlEncoding.kt b/core-jdk6/src/main/kotlin/uy/klutter/core/uri/UrlEncoding.kt index 2c057f2..4be8049 100644 --- a/core-jdk6/src/main/kotlin/uy/klutter/core/uri/UrlEncoding.kt +++ b/core-jdk6/src/main/kotlin/uy/klutter/core/uri/UrlEncoding.kt @@ -309,7 +309,7 @@ public object UrlEncoding { var state: ParseState = ParseState.sText var i = 0 var code = 0 - val c: Char + var c: Char var pos = 0 var ofs = 0 var buf: ByteArray? = null diff --git a/core-jdk6/src/test/kotlin/uy/klutter/core/uri/TestUriBuilder.kt b/core-jdk6/src/test/kotlin/uy/klutter/core/uri/TestUriBuilder.kt index 8c821ba..7da8fef 100644 --- a/core-jdk6/src/test/kotlin/uy/klutter/core/uri/TestUriBuilder.kt +++ b/core-jdk6/src/test/kotlin/uy/klutter/core/uri/TestUriBuilder.kt @@ -1,6 +1,7 @@ -package uy.klutter.core.uri +package uy.klutter.core.uri.tests import org.junit.Test +import uy.klutter.core.uri.buildUri import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertNull diff --git a/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Client.kt b/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Client.kt index d7a399a..35fba04 100644 --- a/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Client.kt +++ b/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Client.kt @@ -25,11 +25,11 @@ import uy.klutter.core.common.with import java.nio.file.Path public object EsConfig { - public volatile var adminActionTimeoutInSeconds: Long = 30 - public volatile var indexReplicaCount: Int = 1 - public volatile var indexShardCount: Int = 4 + public @Volatile var adminActionTimeoutInSeconds: Long = 30 + public @Volatile var indexReplicaCount: Int = 1 + public @Volatile var indexShardCount: Int = 4 - public volatile var objectMapper: ObjectMapper = jacksonObjectMapper() + public @Volatile var objectMapper: ObjectMapper = jacksonObjectMapper() } diff --git a/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Exceptions.kt b/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Exceptions.kt index a411633..ae5adf4 100644 --- a/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Exceptions.kt +++ b/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Exceptions.kt @@ -1,7 +1,5 @@ package uy.klutter.elasticsearch -import nl.komponents.kovenant.Deferred - public class WrappedThrowableException(cause: Throwable): Exception(cause.getMessage(), cause) public fun wrapThrowable(rawEx: Throwable): Exception = if (rawEx is Exception) rawEx else WrappedThrowableException(rawEx) diff --git a/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Indexing.kt b/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Indexing.kt index 6c7b05b..1dc106e 100644 --- a/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Indexing.kt +++ b/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Indexing.kt @@ -2,7 +2,6 @@ package uy.klutter.elasticsearch import org.elasticsearch.action.index.IndexRequestBuilder - public fun IndexRequestBuilder.setSourceFromObject(pojo: Any) { setSource(EsConfig.objectMapper.writeValueAsString(pojo)) } diff --git a/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Kovenant.kt b/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Kovenant.kt index fce7600..7cbc337 100644 --- a/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Kovenant.kt +++ b/elasticsearch-jdk7/src/main/kotlin/uy/klutter/elasticsearch/Kovenant.kt @@ -7,7 +7,6 @@ import org.elasticsearch.action.ActionListener import org.elasticsearch.action.ActionRequest import org.elasticsearch.action.ActionRequestBuilder import org.elasticsearch.action.ActionResponse -import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse import org.elasticsearch.client.ElasticsearchClient public fun promiseResult(deferred: Deferred): ActionListener { diff --git a/gradle.properties b/gradle.properties index 5af6e87..74c4451 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,10 +1,11 @@ -version=0.4.0 +version=0.5.0 group=uy.klutter version_gradle=2.5 -version_kotlin=0.12.1230 +version_kotlin=0.13.1513 +version_dokka=0.1-SNAPSHOT -version_kohesive_injekt=1.4.1 +version_kohesive_injekt=1.5.0 version_junit=4.12 version_slf4j=1.7.12 @@ -12,7 +13,9 @@ version_logback=1.1.3 version_aws_sdk=1.10.11 -version_jackson=2.6.1 + +version_jackson_kotlin=2.6.2 +version_jackson=2.6.2 version_jodatime=2.8.2 @@ -21,8 +24,9 @@ version_typesafe_config=1.2.1 version_typesafe_config_jdk8=1.3.0 version_vertx=3.0.0 -version_kovenant=2.3.3 + +version_kovenant=2.5.0 version_netflix_graph=1.5.2 -version_elasticsearch=1.6.0 \ No newline at end of file +version_elasticsearch=1.7.2 \ No newline at end of file diff --git a/json-jackson-jdk6/build.gradle b/json-jackson-jdk6/build.gradle index 0eb3639..5c034e3 100644 --- a/json-jackson-jdk6/build.gradle +++ b/json-jackson-jdk6/build.gradle @@ -1,4 +1,4 @@ dependencies { compile "uy.kohesive.injekt:injekt-core:${version_kohesive_injekt}" - compile "com.fasterxml.jackson.module:jackson-module-kotlin:$version_jackson" + compile "com.fasterxml.jackson.module:jackson-module-kotlin:$version_jackson_kotlin" } diff --git a/json-jackson-jdk8/build.gradle b/json-jackson-jdk8/build.gradle index 61e92d4..6204221 100644 --- a/json-jackson-jdk8/build.gradle +++ b/json-jackson-jdk8/build.gradle @@ -1,7 +1,7 @@ dependencies { compile "uy.kohesive.injekt:injekt-core:${version_kohesive_injekt}" - compile "com.fasterxml.jackson.module:jackson-module-kotlin:$version_jackson" + compile "com.fasterxml.jackson.module:jackson-module-kotlin:$version_jackson_kotlin" compile "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$version_jackson" compile "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:$version_jackson" compile "com.fasterxml.jackson.module:jackson-module-parameter-names:$version_jackson" diff --git a/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/NetflixGraph.kt b/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/NetflixGraph.kt index bf3cf7e..60df290 100644 --- a/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/NetflixGraph.kt +++ b/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/NetflixGraph.kt @@ -5,7 +5,7 @@ import java.io.InputStream public inline fun , reified R : Enum> defineGraphSchema(defaultStructure: RelationStructure, init: GraphSchemaBuilder.() -> Unit): CompiledGraphSchema { - val schema = GraphSchemaBuilder(javaClass(), javaClass(), defaultStructure) + val schema = GraphSchemaBuilder(N::class.java, R::class.java, defaultStructure) schema.init() return CompiledGraphSchema(schema) } @@ -17,7 +17,7 @@ public fun , R : Enum> constructGraph(schema: CompiledGraphSchema } public inline fun , reified R : Enum> useGraph(inputStream: InputStream, run: ReadOnlyGraph.() -> Unit): ReadOnlyGraph { - val graph = ReadOnlyGraph(javaClass(), javaClass(), inputStream) + val graph = ReadOnlyGraph(N::class.java, R::class.java, inputStream) graph.run() return graph } @@ -40,7 +40,7 @@ public enum class RelationStructure(override val flags: Int) : GraphRelationOpti HASH(com.netflix.nfgraph.spec.NFPropertySpec.HASH) } -private interface GraphRelationOptions { +internal interface GraphRelationOptions { val flags: Int } diff --git a/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/internal/Building.kt b/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/internal/Building.kt index e40b381..1d15758 100644 --- a/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/internal/Building.kt +++ b/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/internal/Building.kt @@ -74,7 +74,7 @@ public class CompiledGraphSchema, R : Enum>(val schema: GraphSche val fullyQualify = groupMembers.size() > 1 groupMembers.forEach { trippleKey -> val relateName = if (fullyQualify) "${trippleKey.relationship.name()}.${trippleKey.toNode.name()}" else trippleKey.relationship.name() - propSpecs.add(NFPropertySpec(relateName, trippleKey.toNode.name(), relationshipFlags.get(trippleKey))) + propSpecs.add(NFPropertySpec(relateName, trippleKey.toNode.name(), relationshipFlags.get(trippleKey) ?: 0)) } } } diff --git a/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/internal/Common.kt b/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/internal/Common.kt index 1e09eda..56eab7b 100644 --- a/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/internal/Common.kt +++ b/netflix-graph-jdk6/src/main/kotlin/uy/klutter/graph/netflix/internal/Common.kt @@ -1,12 +1,12 @@ package uy.klutter.graph.netflix.internal -private data class RelationshipPairKey, R : Enum>(val fromNode: N, val relationship: R) -private data class RelationshipTrippleKey, R : Enum>(val fromNode: N, val relationship: R, val toNode: N) +internal data class RelationshipPairKey, R : Enum>(val fromNode: N, val relationship: R) +internal data class RelationshipTrippleKey, R : Enum>(val fromNode: N, val relationship: R, val toNode: N) -private val GRAPH_MARKERS_HEADER = "**KOTLIN-NFGRAPH**" -private val GRAPH_MARKERS_SCHEMA_HEADER = "**SCHEMA**" -private val GRAPH_MARKERS_ORDINAL_HEADER = "**ORDINALS**" -private val GRAPH_MARKERS_GRAPH_HEADER = "**GRAPH**" +internal val GRAPH_MARKERS_HEADER = "**KOTLIN-NFGRAPH**" +internal val GRAPH_MARKERS_SCHEMA_HEADER = "**SCHEMA**" +internal val GRAPH_MARKERS_ORDINAL_HEADER = "**ORDINALS**" +internal val GRAPH_MARKERS_GRAPH_HEADER = "**GRAPH**" diff --git a/netflix-graph-jdk6/src/test/kotlin/uy/klutter/graph/netflix/TestNetflixGraph.kt b/netflix-graph-jdk6/src/test/kotlin/uy/klutter/graph/netflix/TestNetflixGraph.kt index 26a8e54..9443281 100644 --- a/netflix-graph-jdk6/src/test/kotlin/uy/klutter/graph/netflix/TestNetflixGraph.kt +++ b/netflix-graph-jdk6/src/test/kotlin/uy/klutter/graph/netflix/TestNetflixGraph.kt @@ -1,12 +1,13 @@ -package uy.klutter.graph.netflix +package uy.klutter.graph.netflix.tests import org.junit.Test +import uy.klutter.graph.netflix.* import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import kotlin.test import kotlin.test.assertEquals -import uy.klutter.graph.netflix.MyNodes.* -import uy.klutter.graph.netflix.MyRelations.* +import uy.klutter.graph.netflix.tests.MyNodes.* +import uy.klutter.graph.netflix.tests.MyRelations.* enum class MyNodes { Movie, diff --git a/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/KovenantVertxDispatcher.kt b/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/KovenantVertxDispatcher.kt index 74832b5..2b89257 100644 --- a/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/KovenantVertxDispatcher.kt +++ b/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/KovenantVertxDispatcher.kt @@ -7,7 +7,7 @@ import nl.komponents.kovenant.DispatcherContext // -- connects the context of Kovenant promises to dispatch into Vert.x thread and context management. -class VertxKovenantContext(val originalContext: nl.komponents.kovenant.Context) : nl.komponents.kovenant.Context { +internal class VertxKovenantContext(val originalContext: nl.komponents.kovenant.Context) : nl.komponents.kovenant.Context { override val callbackContext: DispatcherContext get() { val currentVertxContext = vertxContext() @@ -31,7 +31,7 @@ class VertxKovenantContext(val originalContext: nl.komponents.kovenant.Context) get() = { curVal: Any, newVal: Any -> throw IllegalStateException("Value[$curVal] is set, can't override with new value[$newVal]") } } -class VertxCallbackDispatcherContext(private val ctx: Context) : DispatcherContext { +internal class VertxCallbackDispatcherContext(private val ctx: Context) : DispatcherContext { override val dispatcher: Dispatcher get() = VertxCallbackDispatcher(ctx) override val errorHandler: (Exception) -> Unit @@ -39,7 +39,7 @@ class VertxCallbackDispatcherContext(private val ctx: Context) : DispatcherConte } -class VertxCallbackDispatcher(private val ctx: Context) : BasicDispatcher() { +internal class VertxCallbackDispatcher(private val ctx: Context) : BasicDispatcher() { override fun offer(task: () -> Unit): Boolean { ctx.runOnContext { task() @@ -49,7 +49,7 @@ class VertxCallbackDispatcher(private val ctx: Context) : BasicDispatcher() { } -class VertxWorkerDispatcherContext(private val ctx: Context) : DispatcherContext { +internal class VertxWorkerDispatcherContext(private val ctx: Context) : DispatcherContext { override val dispatcher: Dispatcher get() = VertxWorkerDispatcher(ctx) override val errorHandler: (Exception) -> Unit @@ -57,7 +57,7 @@ class VertxWorkerDispatcherContext(private val ctx: Context) : DispatcherContext } -class VertxWorkerDispatcher(private val ctx: Context) : BasicDispatcher() { +internal class VertxWorkerDispatcher(private val ctx: Context) : BasicDispatcher() { override fun offer(task: () -> Unit): Boolean { ctx.owner().executeBlocking({ task() @@ -66,7 +66,7 @@ class VertxWorkerDispatcher(private val ctx: Context) : BasicDispatcher() { } } -abstract class BasicDispatcher : Dispatcher { +internal abstract class BasicDispatcher : Dispatcher { override fun stop(force: Boolean, timeOutMs: Long, block: Boolean): List<() -> Unit> = throw UnsupportedOperationException() override fun tryCancel(task: () -> Unit): Boolean = false override val terminated: Boolean diff --git a/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/Vertx.kt b/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/Vertx.kt index ec59a3f..5b1cc13 100644 --- a/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/Vertx.kt +++ b/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/Vertx.kt @@ -222,7 +222,7 @@ public fun Vertx.promiseClose(): Promise { * vertx dispatching are united, this is the same as doing async { ... } in Kovenant, no need to call on a * vertx instance. */ -public fun Vertx.promiseExecuteBlocking(blockingCode: () -> T): Promise { +public fun Vertx.promiseExecuteBlocking(blockingCode: () -> T): Promise { VertxInit.ensure() val deferred = deferred() @@ -241,7 +241,7 @@ public fun Vertx.promiseExecuteBlocking(blockingCode: () -> T): Promise Vertx.executeBlocking(blockingCode: () -> T): Promise { +public fun Vertx.executeBlocking(blockingCode: () -> T): Promise { VertxInit.ensure() val deferred = deferred() @@ -291,7 +291,7 @@ public object VertxInit { } - @suppress("NOTHING_TO_INLINE") + @Suppress("NOTHING_TO_INLINE") public inline fun ensure() { // TODO: here to be sure we have intiailized anything related before using, // although this function may remain empty it causes initializers on the @@ -309,7 +309,7 @@ public object VertxInit { * return deferred.promise * } */ -public fun promiseResult(deferred: Deferred): (AsyncResult) -> Unit { +public fun promiseResult(deferred: Deferred): (AsyncResult) -> Unit { return { completion -> if (completion.succeeded()) { deferred.resolve(completion.result()) diff --git a/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/VertxJson.kt b/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/VertxJson.kt index 8b89d9e..e4c7a95 100644 --- a/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/VertxJson.kt +++ b/vertx3-jdk8/src/main/kotlin/uy/klutter/vertx/VertxJson.kt @@ -7,29 +7,29 @@ import uy.klutter.core.jdk8.toIsoString import java.time.temporal.Temporal -@suppress("NOTHING_TO_INLINE") +@Suppress("NOTHING_TO_INLINE") public inline fun jsonObjectFromString(json: String): JsonObject { return JsonObject(json) } -@suppress("NOTHING_TO_INLINE") +@Suppress("NOTHING_TO_INLINE") public inline fun jsonArrayFromString(json: String): JsonArray { return JsonArray(json) } -@suppress("NOTHING_TO_INLINE") +@Suppress("NOTHING_TO_INLINE") public inline fun jsonObjectFromMap(map: Map): JsonObject { return JsonObject(map) } -@suppress("NOTHING_TO_INLINE") +@Suppress("NOTHING_TO_INLINE") public inline fun jsonArrayFromList(list: List): JsonArray { return JsonArray(list) } -@suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST", "PLATFORM_CLASS_MAPPED_TO_KOTLIN") +@Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST", "PLATFORM_CLASS_MAPPED_TO_KOTLIN") public inline fun jsonObjectFromPojo(something: Any): JsonObject { - return jsonObjectFromMap(Json.mapper.convertValue(something, javaClass>()) as Map) + return jsonObjectFromMap(Json.mapper.convertValue(something, java.util.Map::class.java) as Map) } public inline fun jsonObject(init: JsonObject.() -> Unit): JsonObject { @@ -64,10 +64,10 @@ public inline fun JsonArray.addArray(init: JsonArray.() -> Unit): JsonArray { return this } -@suppress("NOTHING_TO_INLINE") +@Suppress("NOTHING_TO_INLINE") public inline fun JsonObject.putDateIsoString(name: String, value: Temporal): JsonObject = put(name, value.toIsoString()) -@suppress("NOTHING_TO_INLINE") +@Suppress("NOTHING_TO_INLINE") public inline fun JsonArray.addDateIsoString(value: Temporal): JsonArray = add(value.toIsoString()) diff --git a/vertx3-jdk8/src/test/kotlin/uy/klutter/vertx/tests/TestVertxHelpers.kt b/vertx3-jdk8/src/test/kotlin/uy/klutter/vertx/tests/TestVertxHelpers.kt new file mode 100644 index 0000000..289f0b5 --- /dev/null +++ b/vertx3-jdk8/src/test/kotlin/uy/klutter/vertx/tests/TestVertxHelpers.kt @@ -0,0 +1,26 @@ +package uy.klutter.vertx.tests + +import io.vertx.core.AbstractVerticle +import org.junit.Test +import uy.klutter.vertx.promiseClose +import uy.klutter.vertx.promiseDeployVerticle +import uy.klutter.vertx.promiseUndeploy +import uy.klutter.vertx.vertx + + +public class TestVertxHelpers { + @Test public fun testStartupAndDeployPromises() { + val _vertx = vertx().get() + val _deployment = _vertx.promiseDeployVerticle(TestVertxVerticle::class.java).get() + _vertx.promiseUndeploy(_deployment).get() + _vertx.promiseClose().get() + + } +} + +public class TestVertxVerticle : AbstractVerticle() { + override fun start() { + println("Started") + } + +} \ No newline at end of file