diff options
7 files changed, 632 insertions, 12 deletions
diff --git a/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/Helpers.kt b/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/Helpers.kt new file mode 100644 index 00000000..53dd8634 --- /dev/null +++ b/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/Helpers.kt @@ -0,0 +1,568 @@ +/* + * 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.CloseStatus +import org.eclipse.jetty.websocket.api.RemoteEndpoint +import org.eclipse.jetty.websocket.api.Session +import org.eclipse.jetty.websocket.api.SuspendToken +import org.eclipse.jetty.websocket.api.UpgradeRequest +import org.eclipse.jetty.websocket.api.UpgradeResponse +import org.eclipse.jetty.websocket.api.WebSocketPolicy +import java.io.BufferedReader +import java.io.PrintWriter +import java.net.InetSocketAddress +import java.security.Principal +import java.util.* +import javax.servlet.AsyncContext +import javax.servlet.DispatcherType +import javax.servlet.RequestDispatcher +import javax.servlet.ServletContext +import javax.servlet.ServletInputStream +import javax.servlet.ServletOutputStream +import javax.servlet.ServletRequest +import javax.servlet.ServletResponse +import javax.servlet.http.Cookie +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse +import javax.servlet.http.HttpSession +import javax.servlet.http.HttpUpgradeHandler +import javax.servlet.http.Part + +/** + * Empty subclass of the Context class + */ +internal class KVContext : Context(KVHttpServletRequest(), KVHttpServletResponse()) + +/** + * Empty implementation of the HttpServletRequest interface + */ +internal class KVHttpServletRequest : HttpServletRequest { + override fun isUserInRole(role: String?): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun startAsync(): AsyncContext { + throw IllegalStateException("Empty implementation") + } + + override fun startAsync(servletRequest: ServletRequest?, servletResponse: ServletResponse?): AsyncContext { + throw IllegalStateException("Empty implementation") + } + + override fun getPathInfo(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getProtocol(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getCookies(): Array<Cookie> { + throw IllegalStateException("Empty implementation") + } + + override fun getParameterMap(): MutableMap<String, Array<String>> { + throw IllegalStateException("Empty implementation") + } + + override fun getRequestURL(): StringBuffer { + throw IllegalStateException("Empty implementation") + } + + override fun getAttributeNames(): Enumeration<String> { + throw IllegalStateException("Empty implementation") + } + + override fun setCharacterEncoding(env: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun getParameterValues(name: String?): Array<String> { + throw IllegalStateException("Empty implementation") + } + + override fun getRemoteAddr(): String { + throw IllegalStateException("Empty implementation") + } + + override fun isAsyncStarted(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun getContentLengthLong(): Long { + throw IllegalStateException("Empty implementation") + } + + override fun getLocales(): Enumeration<Locale> { + throw IllegalStateException("Empty implementation") + } + + override fun getRealPath(path: String?): String { + throw IllegalStateException("Empty implementation") + } + + override fun login(username: String?, password: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun getContextPath(): String { + throw IllegalStateException("Empty implementation") + } + + override fun isRequestedSessionIdValid(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun getServerPort(): Int { + throw IllegalStateException("Empty implementation") + } + + override fun getAttribute(name: String?): Any { + throw IllegalStateException("Empty implementation") + } + + override fun getDateHeader(name: String?): Long { + throw IllegalStateException("Empty implementation") + } + + override fun getRemoteHost(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getRequestedSessionId(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getServletPath(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getSession(create: Boolean): HttpSession { + throw IllegalStateException("Empty implementation") + } + + override fun getSession(): HttpSession { + throw IllegalStateException("Empty implementation") + } + + override fun getServerName(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getLocalAddr(): String { + throw IllegalStateException("Empty implementation") + } + + override fun isSecure(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun <T : HttpUpgradeHandler?> upgrade(handlerClass: Class<T>?): T { + throw IllegalStateException("Empty implementation") + } + + override fun isRequestedSessionIdFromCookie(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun getPart(name: String?): Part { + throw IllegalStateException("Empty implementation") + } + + override fun getRemoteUser(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getLocale(): Locale { + throw IllegalStateException("Empty implementation") + } + + override fun getMethod(): String { + throw IllegalStateException("Empty implementation") + } + + override fun isRequestedSessionIdFromURL(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun getLocalPort(): Int { + throw IllegalStateException("Empty implementation") + } + + override fun isRequestedSessionIdFromUrl(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun getServletContext(): ServletContext { + throw IllegalStateException("Empty implementation") + } + + override fun getQueryString(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getDispatcherType(): DispatcherType { + throw IllegalStateException("Empty implementation") + } + + override fun getHeaders(name: String?): Enumeration<String> { + throw IllegalStateException("Empty implementation") + } + + override fun getUserPrincipal(): Principal { + throw IllegalStateException("Empty implementation") + } + + override fun getParts(): MutableCollection<Part> { + throw IllegalStateException("Empty implementation") + } + + override fun getReader(): BufferedReader { + throw IllegalStateException("Empty implementation") + } + + override fun getScheme(): String { + throw IllegalStateException("Empty implementation") + } + + override fun logout() { + throw IllegalStateException("Empty implementation") + } + + override fun getInputStream(): ServletInputStream { + throw IllegalStateException("Empty implementation") + } + + override fun getLocalName(): String { + throw IllegalStateException("Empty implementation") + } + + override fun isAsyncSupported(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun getAuthType(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getCharacterEncoding(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getParameterNames(): Enumeration<String> { + throw IllegalStateException("Empty implementation") + } + + override fun authenticate(response: HttpServletResponse?): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun removeAttribute(name: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun getPathTranslated(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getContentLength(): Int { + throw IllegalStateException("Empty implementation") + } + + override fun getHeader(name: String?): String { + throw IllegalStateException("Empty implementation") + } + + override fun getIntHeader(name: String?): Int { + throw IllegalStateException("Empty implementation") + } + + override fun changeSessionId(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getContentType(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getAsyncContext(): AsyncContext { + throw IllegalStateException("Empty implementation") + } + + override fun getRequestURI(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getRequestDispatcher(path: String?): RequestDispatcher { + throw IllegalStateException("Empty implementation") + } + + override fun getHeaderNames(): Enumeration<String> { + throw IllegalStateException("Empty implementation") + } + + override fun setAttribute(name: String?, o: Any?) { + throw IllegalStateException("Empty implementation") + } + + override fun getParameter(name: String?): String { + throw IllegalStateException("Empty implementation") + } + + override fun getRemotePort(): Int { + throw IllegalStateException("Empty implementation") + } + +} + +/** + * Empty implementation of the HttpServletResponse interface + */ +internal class KVHttpServletResponse : HttpServletResponse { + override fun encodeURL(url: String?): String { + throw IllegalStateException("Empty implementation") + } + + override fun encodeUrl(url: String?): String { + throw IllegalStateException("Empty implementation") + } + + override fun addIntHeader(name: String?, value: Int) { + throw IllegalStateException("Empty implementation") + } + + override fun addCookie(cookie: Cookie?) { + throw IllegalStateException("Empty implementation") + } + + override fun encodeRedirectUrl(url: String?): String { + throw IllegalStateException("Empty implementation") + } + + override fun flushBuffer() { + throw IllegalStateException("Empty implementation") + } + + override fun encodeRedirectURL(url: String?): String { + throw IllegalStateException("Empty implementation") + } + + override fun sendRedirect(location: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun setBufferSize(size: Int) { + throw IllegalStateException("Empty implementation") + } + + override fun getLocale(): Locale { + throw IllegalStateException("Empty implementation") + } + + override fun sendError(sc: Int, msg: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun sendError(sc: Int) { + throw IllegalStateException("Empty implementation") + } + + override fun setContentLengthLong(len: Long) { + throw IllegalStateException("Empty implementation") + } + + override fun setCharacterEncoding(charset: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun addDateHeader(name: String?, date: Long) { + throw IllegalStateException("Empty implementation") + } + + override fun setLocale(loc: Locale?) { + throw IllegalStateException("Empty implementation") + } + + override fun getHeaders(name: String?): MutableCollection<String> { + throw IllegalStateException("Empty implementation") + } + + override fun addHeader(name: String?, value: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun setContentLength(len: Int) { + throw IllegalStateException("Empty implementation") + } + + override fun getBufferSize(): Int { + throw IllegalStateException("Empty implementation") + } + + override fun resetBuffer() { + throw IllegalStateException("Empty implementation") + } + + override fun reset() { + throw IllegalStateException("Empty implementation") + } + + override fun setDateHeader(name: String?, date: Long) { + throw IllegalStateException("Empty implementation") + } + + override fun getStatus(): Int { + throw IllegalStateException("Empty implementation") + } + + override fun getCharacterEncoding(): String { + throw IllegalStateException("Empty implementation") + } + + override fun isCommitted(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun setStatus(sc: Int) { + throw IllegalStateException("Empty implementation") + } + + override fun setStatus(sc: Int, sm: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun getHeader(name: String?): String { + throw IllegalStateException("Empty implementation") + } + + override fun getContentType(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getWriter(): PrintWriter { + throw IllegalStateException("Empty implementation") + } + + override fun containsHeader(name: String?): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun setIntHeader(name: String?, value: Int) { + throw IllegalStateException("Empty implementation") + } + + override fun getHeaderNames(): MutableCollection<String> { + throw IllegalStateException("Empty implementation") + } + + override fun setHeader(name: String?, value: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun getOutputStream(): ServletOutputStream { + throw IllegalStateException("Empty implementation") + } + + override fun setContentType(type: String?) { + throw IllegalStateException("Empty implementation") + } + +} + +/** + * Empty subclass of the WsContext class + */ +internal class KVWsContext : WsContext("EMPTY", KVSession()) + +/** + * Empty implementation of the Session interface + */ +internal class KVSession : Session { + override fun getRemote(): RemoteEndpoint { + throw IllegalStateException("Empty implementation") + } + + override fun getLocalAddress(): InetSocketAddress { + throw IllegalStateException("Empty implementation") + } + + override fun disconnect() { + throw IllegalStateException("Empty implementation") + } + + override fun getProtocolVersion(): String { + throw IllegalStateException("Empty implementation") + } + + override fun getUpgradeResponse(): UpgradeResponse { + throw IllegalStateException("Empty implementation") + } + + override fun setIdleTimeout(ms: Long) { + throw IllegalStateException("Empty implementation") + } + + override fun getPolicy(): WebSocketPolicy { + throw IllegalStateException("Empty implementation") + } + + override fun getUpgradeRequest(): UpgradeRequest { + throw IllegalStateException("Empty implementation") + } + + override fun suspend(): SuspendToken { + throw IllegalStateException("Empty implementation") + } + + override fun isOpen(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun getIdleTimeout(): Long { + throw IllegalStateException("Empty implementation") + } + + override fun close() { + throw IllegalStateException("Empty implementation") + } + + override fun close(closeStatus: CloseStatus?) { + throw IllegalStateException("Empty implementation") + } + + override fun close(statusCode: Int, reason: String?) { + throw IllegalStateException("Empty implementation") + } + + override fun isSecure(): Boolean { + throw IllegalStateException("Empty implementation") + } + + override fun getRemoteAddress(): InetSocketAddress { + throw IllegalStateException("Empty implementation") + } + +}
\ No newline at end of file diff --git a/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt b/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt index aef6e2f2..874116e5 100644 --- a/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt +++ b/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt @@ -25,6 +25,8 @@ import com.google.inject.AbstractModule import com.google.inject.Guice import com.google.inject.Module import io.javalin.Javalin +import io.javalin.http.Context +import io.javalin.websocket.WsContext const val KV_INJECTOR_KEY = "pl.treksoft.kvision.injector.key" @@ -37,12 +39,15 @@ fun Javalin.kvisionInit(vararg modules: Module) { @Suppress("SpreadOperator") val injector = Guice.createInjector(MainModule(this), *modules) - before { - it.attribute(KV_INJECTOR_KEY, injector) + before { ctx -> + ctx.attribute(KV_INJECTOR_KEY, injector.createChildInjector(ContextModule(ctx), WsContextModule(KVWsContext()))) } wsBefore { ws -> ws.onConnect { ctx -> - ctx.attribute(KV_INJECTOR_KEY, injector) + ctx.attribute( + KV_INJECTOR_KEY, + injector.createChildInjector(ContextModule(KVContext()), WsContextModule(ctx)) + ) } } } @@ -52,3 +57,15 @@ internal class MainModule(private val javalin: Javalin) : AbstractModule() { bind(Javalin::class.java).toInstance(javalin) } } + +internal class ContextModule(private val ctx: Context) : AbstractModule() { + override fun configure() { + bind(Context::class.java).toInstance(ctx) + } +} + +internal class WsContextModule(private val wsCtx: WsContext) : AbstractModule() { + override fun configure() { + bind(WsContext::class.java).toInstance(wsCtx) + } +} diff --git a/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt b/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt index 33c858f4..9e4bc87f 100644 --- a/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt +++ b/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt @@ -93,6 +93,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: /** * @suppress internal function */ + @Suppress("DEPRECATION") fun initializeService(service: T, ctx: Context) { if (service is WithContext) { service.ctx = ctx @@ -105,6 +106,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: /** * @suppress internal function */ + @Suppress("DEPRECATION") fun initializeWsService(service: T, wsCtx: WsContext) { if (service is WithWsContext) { service.wsCtx = wsCtx @@ -529,8 +531,10 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: 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)!! diff --git a/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt b/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt index e44cc46f..24639f67 100644 --- a/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt +++ b/kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt @@ -26,18 +26,22 @@ import io.javalin.websocket.WsContext import org.eclipse.jetty.websocket.api.Session import javax.servlet.http.HttpSession +@Deprecated("Use dependency injection instead.") interface WithContext { var ctx: Context } +@Deprecated("Use dependency injection instead.") interface WithHttpSession { var httpSession: HttpSession } +@Deprecated("Use dependency injection instead.") interface WithWsContext { var wsCtx: WsContext } +@Deprecated("Use dependency injection instead.") interface WithWsSession { var wsSession: Session } diff --git a/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt b/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt index 2245e92b..a85752eb 100644 --- a/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt +++ b/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt @@ -22,14 +22,18 @@ package pl.treksoft.kvision.remote import com.google.inject.AbstractModule +import com.google.inject.Injector import com.google.inject.Module import com.typesafe.config.Config import io.jooby.AssetSource +import io.jooby.Context import io.jooby.Environment import io.jooby.Kooby import io.jooby.di.GuiceModule import io.jooby.json.JacksonModule +const val KV_INJECTOR_KEY = "pl.treksoft.kvision.injector.key" + /** * Initialization function for Jooby server. */ @@ -38,6 +42,10 @@ fun Kooby.kvisionInit(vararg modules: Module) { assets("/*", AssetSource.create(javaClass.classLoader, "assets")) install(GuiceModule(MainModule(this), *modules)) install(JacksonModule()) + before { ctx -> + val injector = ctx.require(Injector::class.java).createChildInjector(ContextModule(ctx)) + ctx.attribute(KV_INJECTOR_KEY, injector) + } } internal class MainModule(private val kooby: Kooby) : AbstractModule() { @@ -47,3 +55,9 @@ internal class MainModule(private val kooby: Kooby) : AbstractModule() { bind(Config::class.java).toInstance(kooby.config) } } + +class ContextModule(private val ctx: Context) : AbstractModule() { + override fun configure() { + bind(Context::class.java).toInstance(ctx) + } +} diff --git a/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt b/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt index ea37c477..69040e51 100644 --- a/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt +++ b/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt @@ -24,6 +24,7 @@ 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.jooby.Context import io.jooby.CoroutineRouter import io.jooby.HandlerContext @@ -91,6 +92,7 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: /** * @suppress internal function */ + @Suppress("DEPRECATION") fun initializeService(service: T, ctx: Context) { if (service is WithContext) { service.ctx = ctx @@ -118,7 +120,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: } else { ctx.body<JsonRpcRequest>() } - val service = ctx.require(serviceClass.java) + val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) try { val result = function.invoke(service) @@ -154,7 +157,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: val jsonRpcRequest = ctx.body<JsonRpcRequest>() if (jsonRpcRequest.params.size == 1) { val param = getParameter<PAR>(jsonRpcRequest.params[0]) - val service = ctx.require(serviceClass.java) + val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) try { val result = function.invoke(service, param) @@ -194,7 +198,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: if (jsonRpcRequest.params.size == 2) { val param1 = getParameter<PAR1>(jsonRpcRequest.params[0]) val param2 = getParameter<PAR2>(jsonRpcRequest.params[1]) - val service = ctx.require(serviceClass.java) + val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) try { val result = function.invoke(service, param1, param2) @@ -236,7 +241,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: val param1 = getParameter<PAR1>(jsonRpcRequest.params[0]) val param2 = getParameter<PAR2>(jsonRpcRequest.params[1]) val param3 = getParameter<PAR3>(jsonRpcRequest.params[2]) - val service = ctx.require(serviceClass.java) + val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) try { val result = function.invoke(service, param1, param2, param3) @@ -279,7 +285,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: val param2 = getParameter<PAR2>(jsonRpcRequest.params[1]) val param3 = getParameter<PAR3>(jsonRpcRequest.params[2]) val param4 = getParameter<PAR4>(jsonRpcRequest.params[3]) - val service = ctx.require(serviceClass.java) + val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) try { val result = function.invoke(service, param1, param2, param3, param4) @@ -324,7 +331,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: val param3 = getParameter<PAR3>(jsonRpcRequest.params[2]) val param4 = getParameter<PAR4>(jsonRpcRequest.params[3]) val param5 = getParameter<PAR5>(jsonRpcRequest.params[4]) - val service = ctx.require(serviceClass.java) + val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) try { val result = function.invoke(service, param1, param2, param3, param4, param5) @@ -370,7 +378,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: val param4 = getParameter<PAR4>(jsonRpcRequest.params[3]) val param5 = getParameter<PAR5>(jsonRpcRequest.params[4]) val param6 = getParameter<PAR6>(jsonRpcRequest.params[5]) - val service = ctx.require(serviceClass.java) + val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) try { val result = function.invoke(service, param1, param2, param3, param4, param5, param6) @@ -403,7 +412,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: ) { val routeDef = "route${this::class.simpleName}${counter++}" webSocketRequests["/kvws/$routeDef"] = { ctx, configurer -> - val service = ctx.require(serviceClass.java) + val injector = ctx.require(Injector::class.java).createChildInjector(ContextModule(ctx)) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) val incoming = Channel<String>() val outgoing = Channel<String>() @@ -487,7 +497,8 @@ actual open class KVServiceManager<T : Any> actual constructor(val serviceClass: @Suppress("MagicNumber") val param5 = getParameter<String?>(jsonRpcRequest.params[4]) - val service = ctx.require(serviceClass.java) + val injector = ctx.attribute<Injector>(KV_INJECTOR_KEY) + val service = injector.getInstance(serviceClass.java) initializeService(service, ctx) try { val result = function.invoke(service, param1, param2, param3, param4, param5) diff --git a/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt b/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt index 06955a07..6f79ebec 100644 --- a/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt +++ b/kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt @@ -24,10 +24,12 @@ package pl.treksoft.kvision.remote import io.jooby.Context import io.jooby.Session +@Deprecated("Use dependency injection instead.") interface WithContext { var ctx: Context } +@Deprecated("Use dependency injection instead.") interface WithSession { var session: Session } |