diff options
11 files changed, 31 insertions, 11 deletions
diff --git a/gradle.properties b/gradle.properties index c68413e7..6f669a72 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,9 +1,9 @@ group=pl.treksoft version=0.0.19 -kotlinVersion=1.3.0-rc-190 +kotlinVersion=1.3.0 javaVersion=1.8 -coroutinesVersion=0.30.2-eap13 -serializationVersion=0.8.1-rc13 +coroutinesVersion=1.0.0 +serializationVersion=0.9.0 frontendPluginVersion=0.0.37 dokkaVersion=0.9.17 detektVersion=1.0.0.RC9.2 diff --git a/kvision-modules/kvision-server-jooby/build.gradle b/kvision-modules/kvision-server-jooby/build.gradle index 952e9a16..b3912c2c 100644 --- a/kvision-modules/kvision-server-jooby/build.gradle +++ b/kvision-modules/kvision-server-jooby/build.gradle @@ -11,6 +11,9 @@ dependencyManagement { dependencies { expectedBy project(":kvision-modules:kvision-common") compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" + compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" + compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion" + compile "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializationVersion" compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion" compile "org.jooby:jooby-lang-kotlin" diff --git a/kvision-modules/kvision-server-jooby/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt b/kvision-modules/kvision-server-jooby/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt index 1e19f394..bc182467 100644 --- a/kvision-modules/kvision-server-jooby/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt +++ b/kvision-modules/kvision-server-jooby/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt @@ -22,8 +22,9 @@ package pl.treksoft.kvision.remote import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Deferred -import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.GlobalScope import org.jooby.Kooby import org.jooby.Session @@ -64,8 +65,9 @@ actual typealias Profile = CommonProfile /** * A helper extension function for asynchronous request processing. */ +@UseExperimental(ExperimentalCoroutinesApi::class) fun <RESP> Request?.async(block: (Request) -> RESP): Deferred<RESP> = this?.let { req -> - GlobalScope.coroutinesAsync(Dispatchers.Unconfined) { + GlobalScope.coroutinesAsync(start = CoroutineStart.UNDISPATCHED) { block(req) } } ?: throw IllegalStateException("Request not set!") @@ -73,9 +75,10 @@ fun <RESP> Request?.async(block: (Request) -> RESP): Deferred<RESP> = this?.let /** * A helper extension function for asynchronous request processing with session. */ +@UseExperimental(ExperimentalCoroutinesApi::class) fun <RESP> Request?.asyncSession(block: (Request, Session) -> RESP): Deferred<RESP> = this?.let { req -> val session = req.session() - GlobalScope.coroutinesAsync(Dispatchers.Unconfined) { + GlobalScope.coroutinesAsync(start = CoroutineStart.UNDISPATCHED) { block(req, session) } } ?: throw IllegalStateException("Request not set!") @@ -83,11 +86,12 @@ fun <RESP> Request?.asyncSession(block: (Request, Session) -> RESP): Deferred<RE /** * A helper extension function for asynchronous request processing with session and user profile. */ +@UseExperimental(ExperimentalCoroutinesApi::class) fun <RESP> Request?.asyncAuth(block: (Request, Session, Profile) -> RESP): Deferred<RESP> = this?.let { req -> val session = req.session() val profile = req.require(CommonProfile::class.java) as CommonProfile? profile?.let { - GlobalScope.coroutinesAsync(Dispatchers.Unconfined) { + GlobalScope.coroutinesAsync(start = CoroutineStart.UNDISPATCHED) { block(req, session, profile) } } diff --git a/kvision-modules/kvision-server-spring-boot/build.gradle b/kvision-modules/kvision-server-spring-boot/build.gradle index d235f214..43d8650d 100644 --- a/kvision-modules/kvision-server-spring-boot/build.gradle +++ b/kvision-modules/kvision-server-spring-boot/build.gradle @@ -6,6 +6,7 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" compile "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$serializationVersion" compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion" + compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion" compile "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" compile "org.springframework.boot:spring-boot-starter:$springBootVersion" diff --git a/kvision-modules/kvision-server-spring-boot/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt b/kvision-modules/kvision-server-spring-boot/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt index 730288a8..11b848bf 100644 --- a/kvision-modules/kvision-server-spring-boot/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt +++ b/kvision-modules/kvision-server-spring-boot/src/main/kotlin/pl/treksoft/kvision/remote/KVServer.kt @@ -22,7 +22,6 @@ package pl.treksoft.kvision.remote import kotlinx.coroutines.Deferred -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import org.pac4j.core.context.J2EContext import org.pac4j.core.context.session.J2ESessionStore @@ -52,7 +51,7 @@ actual typealias Profile = CommonProfile * A helper extension function for asynchronous processing. */ fun <RESP> async(block: () -> RESP): Deferred<RESP> = - GlobalScope.coroutinesAsync(Dispatchers.Unconfined) { + GlobalScope.coroutinesAsync { block() } @@ -69,7 +68,7 @@ fun <RESP> asyncAuth(block: (Profile) -> RESP): Deferred<RESP> { null } return profile?.let { - GlobalScope.coroutinesAsync(Dispatchers.Unconfined) { + GlobalScope.coroutinesAsync { block(it) } } ?: throw IllegalStateException("Profile not set!") diff --git a/src/main/kotlin/pl/treksoft/kvision/form/Form.kt b/src/main/kotlin/pl/treksoft/kvision/form/Form.kt index 8f93c7ea..e2f5d730 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/Form.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/Form.kt @@ -21,6 +21,7 @@ */ package pl.treksoft.kvision.form +import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.KSerializer import kotlinx.serialization.Mapper import kotlinx.serialization.context.MutableSerialContextImpl @@ -106,7 +107,7 @@ class Form<K : Any>(private val panel: FormPanel<K>? = null, private val seriali else -> listOf(entry.key to entry.value) } }.toMap() - val mapper = Mapper.InNullableMapper(FormMapWrapper(map)) + val mapper = Mapper().InNullableMapper(FormMapWrapper(map)) mapper.context = MutableSerialContextImpl().apply { registerSerializer(Date::class, DateSerializer) } mapper.decode(serializer) } @@ -320,6 +321,7 @@ class Form<K : Any>(private val panel: FormPanel<K>? = null, private val seriali } companion object { + @UseExperimental(ImplicitReflectionSerializer::class) inline fun <reified K : Any> create( panel: FormPanel<K>? = null, noinline init: (Form<K>.() -> Unit)? = null diff --git a/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt b/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt index 3533dee5..c9b33572 100644 --- a/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/form/FormPanel.kt @@ -22,6 +22,7 @@ package pl.treksoft.kvision.form import com.github.snabbdom.VNode +import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.KSerializer import kotlinx.serialization.serializer import pl.treksoft.kvision.core.Container @@ -407,6 +408,7 @@ open class FormPanel<K : Any>( return formPanel } + @UseExperimental(ImplicitReflectionSerializer::class) inline fun <reified K : Any> create( method: FormMethod? = null, action: String? = null, enctype: FormEnctype? = null, type: FormType? = null, classes: Set<String> = setOf(), diff --git a/src/main/kotlin/pl/treksoft/kvision/remote/CallAgent.kt b/src/main/kotlin/pl/treksoft/kvision/remote/CallAgent.kt index a48a6b1f..4a086e2a 100644 --- a/src/main/kotlin/pl/treksoft/kvision/remote/CallAgent.kt +++ b/src/main/kotlin/pl/treksoft/kvision/remote/CallAgent.kt @@ -21,6 +21,8 @@ */ package pl.treksoft.kvision.remote +import kotlinx.serialization.ImplicitReflectionSerializer +import kotlinx.serialization.stringify import pl.treksoft.jquery.JQueryAjaxSettings import pl.treksoft.jquery.JQueryXHR import pl.treksoft.jquery.jQuery @@ -49,6 +51,7 @@ open class CallAgent { * @param data data to be sent * @return a promise of the result */ + @UseExperimental(ImplicitReflectionSerializer::class) @Suppress("UnsafeCastFromDynamic") fun jsonRpcCall( url: String, diff --git a/src/main/kotlin/pl/treksoft/kvision/remote/JoobyRemoteAgent.kt b/src/main/kotlin/pl/treksoft/kvision/remote/JoobyRemoteAgent.kt index b4cc6c21..30d2062d 100644 --- a/src/main/kotlin/pl/treksoft/kvision/remote/JoobyRemoteAgent.kt +++ b/src/main/kotlin/pl/treksoft/kvision/remote/JoobyRemoteAgent.kt @@ -23,6 +23,7 @@ package pl.treksoft.kvision.remote import kotlinx.coroutines.Deferred import kotlinx.coroutines.asDeferred +import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.list import kotlinx.serialization.serializer import pl.treksoft.kvision.utils.JSON @@ -34,6 +35,7 @@ import kotlin.js.JSON as NativeJSON * Client side agent for JSON-RPC remote calls with Jooby. */ @Suppress("LargeClass", "TooManyFunctions") +@UseExperimental(ImplicitReflectionSerializer::class) open class JoobyRemoteAgent<T : Any>(val serviceManager: JoobyServiceManager<T>) : RemoteAgent { val callAgent = CallAgent() diff --git a/src/main/kotlin/pl/treksoft/kvision/remote/RemoteAgent.kt b/src/main/kotlin/pl/treksoft/kvision/remote/RemoteAgent.kt index b1ee4fde..cbb2978a 100644 --- a/src/main/kotlin/pl/treksoft/kvision/remote/RemoteAgent.kt +++ b/src/main/kotlin/pl/treksoft/kvision/remote/RemoteAgent.kt @@ -21,6 +21,7 @@ */ package pl.treksoft.kvision.remote +import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.KSerializer import kotlinx.serialization.internal.BooleanSerializer import kotlinx.serialization.internal.ByteSerializer @@ -52,6 +53,7 @@ interface RemoteAgent { * @suppress * Internal function */ + @UseExperimental(ImplicitReflectionSerializer::class) @Suppress("ComplexMethod", "TooGenericExceptionCaught", "NestedBlockDepth") fun trySerialize(kClass: KClass<Any>, value: Any): String { return if (value is List<*>) { diff --git a/src/main/kotlin/pl/treksoft/kvision/remote/SpringRemoteAgent.kt b/src/main/kotlin/pl/treksoft/kvision/remote/SpringRemoteAgent.kt index f1f3b473..f329d10e 100644 --- a/src/main/kotlin/pl/treksoft/kvision/remote/SpringRemoteAgent.kt +++ b/src/main/kotlin/pl/treksoft/kvision/remote/SpringRemoteAgent.kt @@ -23,6 +23,7 @@ package pl.treksoft.kvision.remote import kotlinx.coroutines.Deferred import kotlinx.coroutines.asDeferred +import kotlinx.serialization.ImplicitReflectionSerializer import kotlinx.serialization.list import kotlinx.serialization.serializer import pl.treksoft.kvision.utils.JSON @@ -34,6 +35,7 @@ import kotlin.js.JSON as NativeJSON * Client side agent for JSON-RPC remote calls with Spring Boot. */ @Suppress("LargeClass", "TooManyFunctions") +@UseExperimental(ImplicitReflectionSerializer::class) open class SpringRemoteAgent<T : Any>(val serviceManager: SpringServiceManager<T>) : RemoteAgent { val callAgent = CallAgent() |