diff --git a/buildSrc/src/main/kotlin/common-library.gradle.kts b/buildSrc/src/main/kotlin/common-library.gradle.kts index 86dee4e..ff8e09c 100644 --- a/buildSrc/src/main/kotlin/common-library.gradle.kts +++ b/buildSrc/src/main/kotlin/common-library.gradle.kts @@ -1,6 +1,5 @@ import com.vanniktech.maven.publish.JavadocJar import com.vanniktech.maven.publish.KotlinJvm -import gradle.kotlin.dsl.accessors._94cffe4e74c4f6a3b1c88c3e0c336ef5.mavenPublishing import org.gradle.api.JavaVersion.VERSION_17 import org.gradle.api.file.DuplicatesStrategy.WARN diff --git a/spring/src/main/kotlin/com/caplin/integration/datasourcex/spring/internal/DataSourceAutoConfiguration.kt b/spring/src/main/kotlin/com/caplin/integration/datasourcex/spring/internal/DataSourceAutoConfiguration.kt index 79cfdbb..45e9358 100644 --- a/spring/src/main/kotlin/com/caplin/integration/datasourcex/spring/internal/DataSourceAutoConfiguration.kt +++ b/spring/src/main/kotlin/com/caplin/integration/datasourcex/spring/internal/DataSourceAutoConfiguration.kt @@ -7,7 +7,7 @@ import com.caplin.datasource.messaging.json.JacksonJsonHandler import com.caplin.integration.datasourcex.spring.DataSourceConfigurationProperties import com.caplin.integration.datasourcex.util.SimpleDataSourceConfig.Discovery import com.caplin.integration.datasourcex.util.SimpleDataSourceConfig.Peer -import com.caplin.integration.datasourcex.util.SimpleDatasourceFactory.createDataSource +import com.caplin.integration.datasourcex.util.SimpleDataSourceFactory.createDataSource import com.caplin.integration.datasourcex.util.getLogger import com.fasterxml.jackson.databind.ObjectMapper import java.nio.file.Paths diff --git a/util/api/datasourcex-util.api b/util/api/datasourcex-util.api index 8e737d4..8e25079 100644 --- a/util/api/datasourcex-util.api +++ b/util/api/datasourcex-util.api @@ -133,9 +133,11 @@ public final class com/caplin/integration/datasourcex/util/SimpleDataSourceConfi public fun toString ()Ljava/lang/String; } -public final class com/caplin/integration/datasourcex/util/SimpleDatasourceFactory { - public static final field INSTANCE Lcom/caplin/integration/datasourcex/util/SimpleDatasourceFactory; - public static final fun createDataSource (Lcom/caplin/integration/datasourcex/util/SimpleDataSourceConfig;)Lcom/caplin/datasource/DataSource; +public final class com/caplin/integration/datasourcex/util/SimpleDataSourceFactory { + public static final field INSTANCE Lcom/caplin/integration/datasourcex/util/SimpleDataSourceFactory; + public static final fun createDataSource (Lcom/caplin/integration/datasourcex/util/SimpleDataSourceConfig;Lcom/fasterxml/jackson/databind/ObjectMapper;)Lcom/caplin/datasource/DataSource; + public static synthetic fun createDataSource$default (Lcom/caplin/integration/datasourcex/util/SimpleDataSourceConfig;Lcom/fasterxml/jackson/databind/ObjectMapper;ILjava/lang/Object;)Lcom/caplin/datasource/DataSource; + public final fun getDefaultObjectMapper ()Lcom/fasterxml/jackson/databind/ObjectMapper; } public final class com/caplin/integration/datasourcex/util/TimeoutKt { diff --git a/util/build.gradle.kts b/util/build.gradle.kts index 59e180d..9fadde4 100644 --- a/util/build.gradle.kts +++ b/util/build.gradle.kts @@ -8,6 +8,9 @@ dependencies { api("org.slf4j:slf4j-api") api("org.jetbrains.kotlinx:kotlinx-coroutines-core") api("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm") + api("com.fasterxml.jackson.core:jackson-core") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") + implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation(libs.kotlin.collections.immutable) diff --git a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/SimpleDatasourceFactory.kt b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/SimpleDataSourceFactory.kt similarity index 72% rename from util/src/main/kotlin/com/caplin/integration/datasourcex/util/SimpleDatasourceFactory.kt rename to util/src/main/kotlin/com/caplin/integration/datasourcex/util/SimpleDataSourceFactory.kt index a3c19fb..813cc0f 100644 --- a/util/src/main/kotlin/com/caplin/integration/datasourcex/util/SimpleDatasourceFactory.kt +++ b/util/src/main/kotlin/com/caplin/integration/datasourcex/util/SimpleDataSourceFactory.kt @@ -1,14 +1,24 @@ package com.caplin.integration.datasourcex.util import com.caplin.datasource.DataSource +import com.caplin.datasource.messaging.json.JacksonJsonHandler +import com.fasterxml.jackson.databind.ObjectMapper +import com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import java.nio.file.Files import java.util.logging.Logger -object SimpleDatasourceFactory { +object SimpleDataSourceFactory { private const val MAX_PATH_LENGTH = 32 - private val logger = getLogger() + private val logger = getLogger() + + val defaultObjectMapper: ObjectMapper = + jacksonObjectMapper() + .configure(WRITE_DATES_AS_TIMESTAMPS, false) + .registerModule(JavaTimeModule()) /** * Creates a data source based on the given simple configuration. @@ -17,13 +27,17 @@ object SimpleDatasourceFactory { * @return The created data source. */ @JvmStatic - fun createDataSource(simpleConfig: SimpleDataSourceConfig): DataSource { + fun createDataSource( + simpleConfig: SimpleDataSourceConfig, + objectMapper: ObjectMapper = defaultObjectMapper + ): DataSource { val logPath = simpleConfig.logDirectory ?: run { val tmpLogPath = Files.createTempDirectory( - simpleConfig.name.replace("\\s".toRegex(), "").take(MAX_PATH_LENGTH)) + simpleConfig.name.replace("\\s".toRegex(), "").take(MAX_PATH_LENGTH), + ) logger.warn { "log file path is not specified, writing datasource logs to $tmpLogPath" } @@ -50,15 +64,15 @@ object SimpleDatasourceFactory { |datasrc-dev-override ${simpleConfig.devOverride} |discovery-require-service ${simpleConfig.requiredServices.joinToString(" ")} ${ - simpleConfig.incoming?.let { - """ + simpleConfig.incoming?.let { + """ |${if (it.isWebsocket) "datasrc-ws-port" else "datasrc-port"} ${it.port} """ - }.orEmpty() - } + }.orEmpty() + } ${ - simpleConfig.outgoing.joinToString("\n") { - """ + simpleConfig.outgoing.joinToString("\n") { + """ |add-peer | addr ${it.hostname} | port ${it.port} @@ -66,8 +80,8 @@ object SimpleDatasourceFactory { | websocket ${it.isWebsocket} |end-peer """ - } - } + } + } """ } @@ -99,5 +113,12 @@ object SimpleDatasourceFactory { .trimMargin() return DataSource.fromConfigString(config, Logger.getLogger(DataSource::class.qualifiedName)) + .apply { + extraConfiguration.jsonHandler = + JacksonJsonHandler( + Logger.getLogger(JacksonJsonHandler::class.qualifiedName), + objectMapper, + ) + } } }