aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Jaros <rjaros@finn.pl>2020-04-16 23:34:51 +0200
committerRobert Jaros <rjaros@finn.pl>2020-04-16 23:34:51 +0200
commit68ebd29099f0bcc97d528d8829b1aba32b188839 (patch)
tree6da7bb3d7a7261540418b13882f27d34d47ab038
parent702c6965a9f7856f59257b55a1927fbc834d26e0 (diff)
downloadkvision-68ebd29099f0bcc97d528d8829b1aba32b188839.tar.gz
kvision-68ebd29099f0bcc97d528d8829b1aba32b188839.tar.bz2
kvision-68ebd29099f0bcc97d528d8829b1aba32b188839.zip
Deprecate session interfaces in favour of dependency injection
-rw-r--r--kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/Helpers.kt568
-rw-r--r--kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt23
-rw-r--r--kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt4
-rw-r--r--kvision-modules/kvision-server-javalin/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt4
-rw-r--r--kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVModules.kt14
-rw-r--r--kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/KVServiceManager.kt29
-rw-r--r--kvision-modules/kvision-server-jooby/src/jvmMain/kotlin/pl/treksoft/kvision/remote/SessionInterfaces.kt2
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
}