aboutsummaryrefslogtreecommitdiff
path: root/kvision-modules/kvision-server-javalin/src/main/kotlin
diff options
context:
space:
mode:
authorRobert Jaros <rjaros@finn.pl>2020-03-11 16:18:17 +0100
committerRobert Jaros <rjaros@finn.pl>2020-03-11 16:18:17 +0100
commit9e243a469ae6544e8cf523ad09b959f541c3f565 (patch)
treebe9c7447e221af49180c9e98434df7f988b940b8 /kvision-modules/kvision-server-javalin/src/main/kotlin
parentec6084c42c13a621e17b17bd40d90b5c7879f0ec (diff)
downloadkvision-9e243a469ae6544e8cf523ad09b959f541c3f565.tar.gz
kvision-9e243a469ae6544e8cf523ad09b959f541c3f565.tar.bz2
kvision-9e243a469ae6544e8cf523ad09b959f541c3f565.zip
Upgrade to Kotlin 1.3.70 + other dependencies (Coroutinse, Serialization, Spring Boot)
Major refactoring of build architecture.
Diffstat (limited to 'kvision-modules/kvision-server-javalin/src/main/kotlin')
-rw-r--r--kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt54
-rw-r--r--kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt565
-rw-r--r--kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt43
-rw-r--r--kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/types/Date.kt200
-rw-r--r--kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/types/Decimal.kt47
5 files changed, 0 insertions, 909 deletions
diff --git a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt b/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt
deleted file mode 100644
index aef6e2f2..00000000
--- a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/KVModules.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2017-present Robert Jaros
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package pl.treksoft.kvision.remote
-
-import com.google.inject.AbstractModule
-import com.google.inject.Guice
-import com.google.inject.Module
-import io.javalin.Javalin
-
-const val KV_INJECTOR_KEY = "pl.treksoft.kvision.injector.key"
-
-/**
- * Initialization function for Javalin server.
- */
-fun Javalin.kvisionInit(vararg modules: Module) {
- config.addStaticFiles("/assets")
-
- @Suppress("SpreadOperator")
- val injector = Guice.createInjector(MainModule(this), *modules)
-
- before {
- it.attribute(KV_INJECTOR_KEY, injector)
- }
- wsBefore { ws ->
- ws.onConnect { ctx ->
- ctx.attribute(KV_INJECTOR_KEY, injector)
- }
- }
-}
-
-internal class MainModule(private val javalin: Javalin) : AbstractModule() {
- override fun configure() {
- bind(Javalin::class.java).toInstance(javalin)
- }
-}
diff --git a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt b/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt
deleted file mode 100644
index ffb2936b..00000000
--- a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- * Copyright (c) 2017-present Robert Jaros
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package pl.treksoft.kvision.remote
-
-import com.fasterxml.jackson.databind.module.SimpleModule
-import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
-import com.fasterxml.jackson.module.kotlin.readValue
-import com.google.inject.Injector
-import io.javalin.Javalin
-import io.javalin.core.security.Role
-import io.javalin.http.Context
-import io.javalin.websocket.WsContext
-import io.javalin.websocket.WsHandler
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.channels.Channel
-import kotlinx.coroutines.channels.ReceiveChannel
-import kotlinx.coroutines.channels.SendChannel
-import kotlinx.coroutines.coroutineScope
-import kotlinx.coroutines.future.future
-import kotlinx.coroutines.launch
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-import pl.treksoft.kvision.types.*
-import java.math.BigDecimal
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.OffsetDateTime
-import java.time.OffsetTime
-import kotlin.reflect.KClass
-
-/**
- * Multiplatform service manager for Javalin.
- */
-@Suppress("LargeClass", "TooManyFunctions")
-@UseExperimental(ExperimentalCoroutinesApi::class)
-actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: KClass<T>) {
-
- companion object {
- val LOG: Logger = LoggerFactory.getLogger(KVServiceManager::class.java.name)
- const val KV_WS_INCOMING_KEY = "pl.treksoft.kvision.ws.incoming.key"
- const val KV_WS_OUTGOING_KEY = "pl.treksoft.kvision.ws.outgoing.key"
- }
-
- val getRequests: MutableMap<String, (Context) -> Unit> = mutableMapOf()
- val postRequests: MutableMap<String, (Context) -> Unit> = mutableMapOf()
- val putRequests: MutableMap<String, (Context) -> Unit> = mutableMapOf()
- val deleteRequests: MutableMap<String, (Context) -> Unit> =
- mutableMapOf()
- val optionsRequests: MutableMap<String, (Context) -> Unit> =
- mutableMapOf()
- val webSocketRequests: MutableMap<String, (WsHandler) -> Unit> =
- mutableMapOf()
-
- val mapper = jacksonObjectMapper().apply {
- val module = SimpleModule()
- module.addSerializer(LocalDateTime::class.java, LocalDateTimeSerializer())
- module.addSerializer(LocalDate::class.java, LocalDateSerializer())
- module.addSerializer(LocalTime::class.java, LocalTimeSerializer())
- module.addSerializer(OffsetDateTime::class.java, OffsetDateTimeSerializer())
- module.addSerializer(OffsetTime::class.java, OffsetTimeSerializer())
- module.addSerializer(BigDecimal::class.java, BigDecimalSerializer())
- module.addDeserializer(LocalDateTime::class.java, LocalDateTimeDeserializer())
- module.addDeserializer(LocalDate::class.java, LocalDateDeserializer())
- module.addDeserializer(LocalTime::class.java, LocalTimeDeserializer())
- module.addDeserializer(OffsetDateTime::class.java, OffsetDateTimeDeserializer())
- module.addDeserializer(OffsetTime::class.java, OffsetTimeDeserializer())
- module.addDeserializer(BigDecimal::class.java, BigDecimalDeserializer())
- this.registerModule(module)
- }
- var counter: Int = 0
-
- /**
- * @suppress internal function
- */
- fun initializeService(service: T, ctx: Context) {
- if (service is WithContext) {
- service.ctx = ctx
- }
- if (service is WithHttpSession) {
- service.httpSession = ctx.req.session
- }
- }
-
- /**
- * @suppress internal function
- */
- fun initializeWsService(service: T, wsCtx: WsContext) {
- if (service is WithWsContext) {
- service.wsCtx = wsCtx
- }
- if (service is WithWsSession) {
- service.wsSession = wsCtx.session
- }
- }
-
- /**
- * Binds a given route with a function of the receiver.
- * @param function a function of the receiver
- * @param method a HTTP method
- * @param route a route
- */
- @Suppress("TooGenericExceptionCaught")
- protected actual inline fun <reified RET> bind(
- noinline function: suspend T.() -> RET,
- method: HttpMethod, route: String?
- ) {
- val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { ctx ->
- val jsonRpcRequest = if (method == HttpMethod.GET) {
- JsonRpcRequest(ctx.queryParam<Int>("id").get(), "", listOf())
- } else {
- ctx.body<JsonRpcRequest>()
- }
- val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY)!!
- val service = injector.getInstance(serviceClass.java)
- initializeService(service, ctx)
- val future = GlobalScope.future {
- try {
- val result = function.invoke(service)
- JsonRpcResponse(
- id = jsonRpcRequest.id,
- result = mapper.writeValueAsString(result)
- )
- } catch (e: Exception) {
- if (e !is ServiceException) LOG.error(e.message, e)
- JsonRpcResponse(
- id = jsonRpcRequest.id, error = e.message ?: "Error",
- exceptionType = e.javaClass.canonicalName
- )
- }
- }
- ctx.json(future)
- }
- }
-
- /**
- * Binds a given route with a function of the receiver.
- * @param function a function of the receiver
- * @param method a HTTP method
- * @param route a route
- */
- @Suppress("TooGenericExceptionCaught")
- protected actual inline fun <reified PAR, reified RET> bind(
- noinline function: suspend T.(PAR) -> RET,
- method: HttpMethod, route: String?
- ) {
- if (method == HttpMethod.GET)
- throw UnsupportedOperationException("GET method is only supported for methods without parameters")
- val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { ctx ->
- val jsonRpcRequest = ctx.body<JsonRpcRequest>()
- if (jsonRpcRequest.params.size == 1) {
- val param = getParameter<PAR>(jsonRpcRequest.params[0])
- val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY)!!
- val service = injector.getInstance(serviceClass.java)
- initializeService(service, ctx)
- val future = GlobalScope.future {
- try {
- val result = function.invoke(service, param)
- JsonRpcResponse(
- id = jsonRpcRequest.id,
- result = mapper.writeValueAsString(result)
- )
- } catch (e: Exception) {
- if (e !is ServiceException) LOG.error(e.message, e)
- JsonRpcResponse(
- id = jsonRpcRequest.id, error = e.message ?: "Error",
- exceptionType = e.javaClass.canonicalName
- )
- }
- }
- ctx.json(future)
- } else {
- ctx.json(JsonRpcResponse(id = jsonRpcRequest.id, error = "Invalid parameters"))
- }
- }
- }
-
- /**
- * Binds a given route with a function of the receiver.
- * @param function a function of the receiver
- * @param method a HTTP method
- * @param route a route
- */
- @Suppress("TooGenericExceptionCaught")
- protected actual inline fun <reified PAR1, reified PAR2, reified RET> bind(
- noinline function: suspend T.(PAR1, PAR2) -> RET,
- method: HttpMethod, route: String?
- ) {
- if (method == HttpMethod.GET)
- throw UnsupportedOperationException("GET method is only supported for methods without parameters")
- val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { ctx ->
- val jsonRpcRequest = ctx.body<JsonRpcRequest>()
- if (jsonRpcRequest.params.size == 2) {
- val param1 = getParameter<PAR1>(jsonRpcRequest.params[0])
- val param2 = getParameter<PAR2>(jsonRpcRequest.params[1])
- val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY)!!
- val service = injector.getInstance(serviceClass.java)
- initializeService(service, ctx)
- val future = GlobalScope.future {
- try {
- val result = function.invoke(service, param1, param2)
- JsonRpcResponse(
- id = jsonRpcRequest.id,
- result = mapper.writeValueAsString(result)
- )
- } catch (e: Exception) {
- if (e !is ServiceException) LOG.error(e.message, e)
- JsonRpcResponse(
- id = jsonRpcRequest.id, error = e.message ?: "Error",
- exceptionType = e.javaClass.canonicalName
- )
- }
- }
- ctx.json(future)
- } else {
- ctx.json(JsonRpcResponse(id = jsonRpcRequest.id, error = "Invalid parameters"))
- }
- }
- }
-
- /**
- * Binds a given route with a function of the receiver.
- * @param function a function of the receiver
- * @param method a HTTP method
- * @param route a route
- */
- @Suppress("TooGenericExceptionCaught")
- protected actual inline fun <reified PAR1, reified PAR2, reified PAR3, reified RET> bind(
- noinline function: suspend T.(PAR1, PAR2, PAR3) -> RET,
- method: HttpMethod, route: String?
- ) {
- if (method == HttpMethod.GET)
- throw UnsupportedOperationException("GET method is only supported for methods without parameters")
- val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { ctx ->
- val jsonRpcRequest = ctx.body<JsonRpcRequest>()
- @Suppress("MagicNumber")
- if (jsonRpcRequest.params.size == 3) {
- val param1 = getParameter<PAR1>(jsonRpcRequest.params[0])
- val param2 = getParameter<PAR2>(jsonRpcRequest.params[1])
- val param3 = getParameter<PAR3>(jsonRpcRequest.params[2])
- val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY)!!
- val service = injector.getInstance(serviceClass.java)
- initializeService(service, ctx)
- val future = GlobalScope.future {
- try {
- val result = function.invoke(service, param1, param2, param3)
- JsonRpcResponse(
- id = jsonRpcRequest.id,
- result = mapper.writeValueAsString(result)
- )
- } catch (e: Exception) {
- if (e !is ServiceException) LOG.error(e.message, e)
- JsonRpcResponse(
- id = jsonRpcRequest.id, error = e.message ?: "Error",
- exceptionType = e.javaClass.canonicalName
- )
- }
- }
- ctx.json(future)
- } else {
- ctx.json(JsonRpcResponse(id = jsonRpcRequest.id, error = "Invalid parameters"))
- }
- }
- }
-
- /**
- * Binds a given route with a function of the receiver.
- * @param function a function of the receiver
- * @param method a HTTP method
- * @param route a route
- */
- @Suppress("TooGenericExceptionCaught")
- protected actual inline fun <reified PAR1, reified PAR2, reified PAR3, reified PAR4, reified RET> bind(
- noinline function: suspend T.(PAR1, PAR2, PAR3, PAR4) -> RET,
- method: HttpMethod, route: String?
- ) {
- if (method == HttpMethod.GET)
- throw UnsupportedOperationException("GET method is only supported for methods without parameters")
- val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { ctx ->
- val jsonRpcRequest = ctx.body<JsonRpcRequest>()
- @Suppress("MagicNumber")
- if (jsonRpcRequest.params.size == 4) {
- val param1 = getParameter<PAR1>(jsonRpcRequest.params[0])
- val param2 = getParameter<PAR2>(jsonRpcRequest.params[1])
- val param3 = getParameter<PAR3>(jsonRpcRequest.params[2])
- val param4 = getParameter<PAR4>(jsonRpcRequest.params[3])
- val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY)!!
- val service = injector.getInstance(serviceClass.java)
- initializeService(service, ctx)
- val future = GlobalScope.future {
- try {
- val result = function.invoke(service, param1, param2, param3, param4)
- JsonRpcResponse(
- id = jsonRpcRequest.id,
- result = mapper.writeValueAsString(result)
- )
- } catch (e: Exception) {
- if (e !is ServiceException) LOG.error(e.message, e)
- JsonRpcResponse(
- id = jsonRpcRequest.id, error = e.message ?: "Error",
- exceptionType = e.javaClass.canonicalName
- )
- }
- }
- ctx.json(future)
- } else {
- ctx.json(JsonRpcResponse(id = jsonRpcRequest.id, error = "Invalid parameters"))
- }
- }
- }
-
- /**
- * Binds a given route with a function of the receiver.
- * @param function a function of the receiver
- * @param method a HTTP method
- * @param route a route
- */
- @Suppress("TooGenericExceptionCaught")
- protected actual inline fun <reified PAR1, reified PAR2, reified PAR3,
- reified PAR4, reified PAR5, reified RET> bind(
- noinline function: suspend T.(PAR1, PAR2, PAR3, PAR4, PAR5) -> RET,
- method: HttpMethod, route: String?
- ) {
- if (method == HttpMethod.GET)
- throw UnsupportedOperationException("GET method is only supported for methods without parameters")
- val routeDef = route ?: "route${this::class.simpleName}${counter++}"
- addRoute(method, "/kv/$routeDef") { ctx ->
- val jsonRpcRequest = ctx.body<JsonRpcRequest>()
- @Suppress("MagicNumber")
- if (jsonRpcRequest.params.size == 5) {
- val param1 = getParameter<PAR1>(jsonRpcRequest.params[0])
- val param2 = getParameter<PAR2>(jsonRpcRequest.params[1])
- val param3 = getParameter<PAR3>(jsonRpcRequest.params[2])
- val param4 = getParameter<PAR4>(jsonRpcRequest.params[3])
- val param5 = getParameter<PAR5>(jsonRpcRequest.params[4])
- val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY)!!
- val service = injector.getInstance(serviceClass.java)
- initializeService(service, ctx)
- val future = GlobalScope.future {
- try {
- val result = function.invoke(service, param1, param2, param3, param4, param5)
- JsonRpcResponse(
- id = jsonRpcRequest.id,
- result = mapper.writeValueAsString(result)
- )
- } catch (e: Exception) {
- if (e !is ServiceException) LOG.error(e.message, e)
- JsonRpcResponse(
- id = jsonRpcRequest.id, error = e.message ?: "Error",
- exceptionType = e.javaClass.canonicalName
- )
- }
- }
- ctx.json(future)
- } else {
- ctx.json(JsonRpcResponse(id = jsonRpcRequest.id, error = "Invalid parameters"))
- }
- }
- }
-
- /**
- * Binds a given web socket connection with a function of the receiver.
- * @param function a function of the receiver
- * @param route a route
- */
- protected actual inline fun <reified PAR1 : Any, reified PAR2 : Any> bind(
- noinline function: suspend T.(ReceiveChannel<PAR1>, SendChannel<PAR2>) -> Unit,
- route: String?
- ) {
- val routeDef = "route${this::class.simpleName}${counter++}"
- webSocketRequests["/kvws/$routeDef"] = { ws ->
- ws.onConnect { ctx ->
- val incoming = Channel<String>()
- val outgoing = Channel<String>()
- ctx.attribute(KV_WS_INCOMING_KEY, incoming)
- ctx.attribute(KV_WS_OUTGOING_KEY, outgoing)
- val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY)!!
- val service = injector.getInstance(serviceClass.java)
- initializeWsService(service, ctx)
- GlobalScope.launch {
- coroutineScope {
- launch(Dispatchers.IO) {
- for (text in outgoing) {
- ctx.send(text)
- }
- ctx.session.close()
- }
- launch {
- val requestChannel = Channel<PAR1>()
- val responseChannel = Channel<PAR2>()
- coroutineScope {
- launch {
- for (p in incoming) {
- val jsonRpcRequest = getParameter<JsonRpcRequest>(p)
- if (jsonRpcRequest.params.size == 1) {
- val par = getParameter<PAR1>(jsonRpcRequest.params[0])
- requestChannel.send(par)
- }
- }
- requestChannel.close()
- }
- launch(Dispatchers.IO) {
- for (p in responseChannel) {
- val text = mapper.writeValueAsString(
- JsonRpcResponse(
- id = 0,
- result = mapper.writeValueAsString(p)
- )
- )
- outgoing.send(text)
- }
- }
- launch {
- function.invoke(service, requestChannel, responseChannel)
- if (!responseChannel.isClosedForReceive) responseChannel.close()
- }
- }
- if (!outgoing.isClosedForReceive) outgoing.close()
- }
- }
- }
- }
- ws.onClose { ctx ->
- GlobalScope.launch {
- val outgoing = ctx.attribute<Channel<String>>(KV_WS_OUTGOING_KEY)!!
- val incoming = ctx.attribute<Channel<String>>(KV_WS_INCOMING_KEY)!!
- outgoing.close()
- incoming.close()
- }
- }
- ws.onMessage { ctx ->
- GlobalScope.launch {
- val incoming = ctx.attribute<Channel<String>>(KV_WS_INCOMING_KEY)!!
- incoming.send(ctx.message())
- }
- }
- }
- }
-
- /**
- * Binds a given function of the receiver as a tabulator component source
- * @param function a function of the receiver
- */
- @Suppress("TooGenericExceptionCaught")
- protected actual inline fun <reified RET> bindTabulatorRemote(
- noinline function: suspend T.(Int?, Int?, List<RemoteFilter>?, List<RemoteSorter>?, String?) -> RemoteData<RET>
- ) {
- val routeDef = "route${this::class.simpleName}${counter++}"
- addRoute(HttpMethod.POST, "/kv/$routeDef") { ctx ->
- val jsonRpcRequest = ctx.body<JsonRpcRequest>()
- @Suppress("MagicNumber")
- if (jsonRpcRequest.params.size == 5) {
- val param1 = getParameter<Int?>(jsonRpcRequest.params[0])
- val param2 = getParameter<Int?>(jsonRpcRequest.params[1])
- val param3 = getParameter<List<RemoteFilter>?>(jsonRpcRequest.params[2])
- @Suppress("MagicNumber")
- val param4 = getParameter<List<RemoteSorter>?>(jsonRpcRequest.params[3])
- @Suppress("MagicNumber")
- val param5 = getParameter<String?>(jsonRpcRequest.params[4])
- val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY)!!
- val service = injector.getInstance(serviceClass.java)
- initializeService(service, ctx)
- val future = GlobalScope.future {
- try {
- val result = function.invoke(service, param1, param2, param3, param4, param5)
- JsonRpcResponse(
- id = jsonRpcRequest.id,
- result = mapper.writeValueAsString(result)
- )
- } catch (e: Exception) {
- if (e !is ServiceException) LOG.error(e.message, e)
- JsonRpcResponse(
- id = jsonRpcRequest.id, error = e.message ?: "Error",
- exceptionType = e.javaClass.canonicalName
- )
- }
- }
- ctx.json(future)
- } else {
- ctx.json(JsonRpcResponse(id = jsonRpcRequest.id, error = "Invalid parameters"))
- }
- }
- }
-
- /**
- * @suppress Internal method
- */
- fun addRoute(
- method: HttpMethod,
- path: String,
- handler: (Context) -> Unit
- ) {
- when (method) {
- HttpMethod.GET -> getRequests[path] = handler
- HttpMethod.POST -> postRequests[path] = handler
- HttpMethod.PUT -> putRequests[path] = handler
- HttpMethod.DELETE -> deleteRequests[path] = handler
- HttpMethod.OPTIONS -> optionsRequests[path] = handler
- }
- }
-
- /**
- * @suppress Internal method
- */
- protected inline fun <reified T> getParameter(str: String?): T {
- return str?.let {
- if (T::class == String::class) {
- str as T
- } else {
- mapper.readValue(str)
- }
- } ?: null as T
- }
-
-}
-
-/**
- * A function to generate routes based on definitions from the service manager.
- */
-fun <T : Any> Javalin.applyRoutes(serviceManager: KVServiceManager<T>, roles: Set<Role> = setOf()) {
- serviceManager.getRequests.forEach { (path, handler) ->
- get(path, handler, roles)
- }
- serviceManager.postRequests.forEach { (path, handler) ->
- post(path, handler, roles)
- }
- serviceManager.putRequests.forEach { (path, handler) ->
- put(path, handler, roles)
- }
- serviceManager.deleteRequests.forEach { (path, handler) ->
- delete(path, handler, roles)
- }
- serviceManager.optionsRequests.forEach { (path, handler) ->
- options(path, handler, roles)
- }
- serviceManager.webSocketRequests.forEach { (path, handler) ->
- ws(path, handler, roles)
- }
-}
diff --git a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt b/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt
deleted file mode 100644
index e44cc46f..00000000
--- a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2017-present Robert Jaros
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package pl.treksoft.kvision.remote
-
-import io.javalin.http.Context
-import io.javalin.websocket.WsContext
-import org.eclipse.jetty.websocket.api.Session
-import javax.servlet.http.HttpSession
-
-interface WithContext {
- var ctx: Context
-}
-
-interface WithHttpSession {
- var httpSession: HttpSession
-}
-
-interface WithWsContext {
- var wsCtx: WsContext
-}
-
-interface WithWsSession {
- var wsSession: Session
-}
diff --git a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/types/Date.kt b/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/types/Date.kt
deleted file mode 100644
index 61f8ba58..00000000
--- a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/types/Date.kt
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (c) 2017-present Robert Jaros
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package pl.treksoft.kvision.types
-
-import com.fasterxml.jackson.core.JsonGenerator
-import com.fasterxml.jackson.core.JsonParser
-import com.fasterxml.jackson.databind.DeserializationContext
-import com.fasterxml.jackson.databind.JsonDeserializer
-import com.fasterxml.jackson.databind.JsonSerializer
-import com.fasterxml.jackson.databind.SerializerProvider
-import java.io.IOException
-import java.time.LocalDate
-import java.time.LocalDateTime
-import java.time.LocalTime
-import java.time.OffsetDateTime
-import java.time.OffsetTime
-import java.time.format.DateTimeFormatter
-import java.time.format.DateTimeParseException
-
-actual typealias LocalDateTime = LocalDateTime
-
-actual typealias LocalDate = LocalDate
-
-actual typealias LocalTime = LocalTime
-
-actual typealias OffsetDateTime = OffsetDateTime
-
-actual typealias OffsetTime = OffsetTime
-
-fun String.toDateTimeF(): LocalDateTime = LocalDateTime.parse(this)
-
-fun String.toDateF(): LocalDate = LocalDate.parse(this)
-
-fun String.toTimeF(): LocalTime = LocalTime.parse(this)
-
-fun String.toOffsetDateTimeF(): OffsetDateTime = OffsetDateTime.parse(this)
-
-fun String.toOffsetTimeF(): OffsetTime = OffsetTime.parse(this)
-
-fun LocalDateTime.toStringF(): String = this.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
-
-fun LocalDate.toStringF(): String = this.format(DateTimeFormatter.ISO_LOCAL_DATE)
-
-fun LocalTime.toStringF(): String = this.format(DateTimeFormatter.ISO_LOCAL_TIME)
-
-fun OffsetDateTime.toStringF(): String = this.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
-
-fun OffsetTime.toStringF(): String = this.format(DateTimeFormatter.ISO_OFFSET_TIME)
-
-class LocalDateTimeSerializer : JsonSerializer<LocalDateTime>() {
- @Throws(IOException::class)
- override fun serialize(value: LocalDateTime, gen: JsonGenerator, provider: SerializerProvider) {
- try {
- val s = value.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
- gen.writeString(s)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- gen.writeString("")
- }
- }
-}
-
-class LocalDateTimeDeserializer : JsonDeserializer<LocalDateTime>() {
- @Throws(IOException::class)
- override fun deserialize(p: JsonParser, ctx: DeserializationContext): LocalDateTime? {
- val str = p.text
- try {
- @Suppress("MagicNumber")
- return LocalDateTime.parse(str.dropLast(6), DateTimeFormatter.ISO_LOCAL_DATE_TIME)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- return null
- }
- }
-}
-
-class LocalDateSerializer : JsonSerializer<LocalDate>() {
- @Throws(IOException::class)
- override fun serialize(value: LocalDate, gen: JsonGenerator, provider: SerializerProvider) {
- try {
- val s = value.atStartOfDay().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
- gen.writeString(s)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- gen.writeString("")
- }
- }
-}
-
-class LocalDateDeserializer : JsonDeserializer<LocalDate>() {
- @Throws(IOException::class)
- override fun deserialize(p: JsonParser, ctx: DeserializationContext): LocalDate? {
- val str = p.text
- try {
- @Suppress("MagicNumber")
- return LocalDate.parse(str.dropLast(6), DateTimeFormatter.ISO_LOCAL_DATE_TIME)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- return null
- }
- }
-}
-
-class LocalTimeSerializer : JsonSerializer<LocalTime>() {
- @Throws(IOException::class)
- override fun serialize(value: LocalTime, gen: JsonGenerator, provider: SerializerProvider) {
- try {
- val s = value.atDate(LocalDate.now()).format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
- gen.writeString(s)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- gen.writeString("")
- }
- }
-}
-
-class LocalTimeDeserializer : JsonDeserializer<LocalTime>() {
- @Throws(IOException::class)
- override fun deserialize(p: JsonParser, ctx: DeserializationContext): LocalTime? {
- val str = p.text
- try {
- @Suppress("MagicNumber")
- return LocalTime.parse(str.dropLast(6), DateTimeFormatter.ISO_LOCAL_DATE_TIME)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- return null
- }
- }
-}
-
-class OffsetDateTimeSerializer : JsonSerializer<OffsetDateTime>() {
- @Throws(IOException::class)
- override fun serialize(value: OffsetDateTime, gen: JsonGenerator, provider: SerializerProvider) {
- try {
- val s = value.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
- gen.writeString(s)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- gen.writeString("")
- }
- }
-}
-
-class OffsetDateTimeDeserializer : JsonDeserializer<OffsetDateTime>() {
- @Throws(IOException::class)
- override fun deserialize(p: JsonParser, ctx: DeserializationContext): OffsetDateTime? {
- val str = p.text
- return try {
- OffsetDateTime.parse(str, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- null
- }
- }
-}
-
-class OffsetTimeSerializer : JsonSerializer<OffsetTime>() {
- @Throws(IOException::class)
- override fun serialize(value: OffsetTime, gen: JsonGenerator, provider: SerializerProvider) {
- try {
- val s = value.atDate(LocalDate.now()).format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
- gen.writeString(s)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- gen.writeString("")
- }
- }
-}
-
-class OffsetTimeDeserializer : JsonDeserializer<OffsetTime>() {
- @Throws(IOException::class)
- override fun deserialize(p: JsonParser, ctx: DeserializationContext): OffsetTime? {
- val str = p.text
- return try {
- OffsetTime.parse(str, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
- } catch (e: DateTimeParseException) {
- System.err.println(e)
- null
- }
- }
-}
diff --git a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/types/Decimal.kt b/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/types/Decimal.kt
deleted file mode 100644
index 1d37ae51..00000000
--- a/kvision-modules/kvision-server-javalin/src/main/kotlin/pl/treksoft/kvision/types/Decimal.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2017-present Robert Jaros
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-package pl.treksoft.kvision.types
-
-import com.fasterxml.jackson.core.JsonGenerator
-import com.fasterxml.jackson.core.JsonParser
-import com.fasterxml.jackson.databind.DeserializationContext
-import com.fasterxml.jackson.databind.JsonDeserializer
-import com.fasterxml.jackson.databind.JsonSerializer
-import com.fasterxml.jackson.databind.SerializerProvider
-import java.io.IOException
-import java.math.BigDecimal
-
-actual typealias Decimal = BigDecimal
-
-class BigDecimalSerializer : JsonSerializer<BigDecimal>() {
- @Throws(IOException::class)
- override fun serialize(value: BigDecimal, gen: JsonGenerator, provider: SerializerProvider) {
- gen.writeNumber(value.toDouble())
- }
-}
-
-class BigDecimalDeserializer : JsonDeserializer<BigDecimal>() {
- @Throws(IOException::class)
- override fun deserialize(p: JsonParser, ctx: DeserializationContext): BigDecimal? {
- return p.doubleValue.toBigDecimal()
- }
-}