From 3aae2f722152954d9608eb4fddd72d7f45e798b6 Mon Sep 17 00:00:00 2001 From: Claude Brisson Date: Fri, 9 Jun 2023 08:32:22 +0200 Subject: [PATCH] View webapp structure is ready --- view-webapp/src/main/config/web.xml | 22 ++++++++++++ .../view/{TranslationTool.kt => IntlTool.kt} | 3 +- .../{util => view}/TranslateDirective.kt | 8 ++--- .../jeudego/pairgoth/web/DispatchingFilter.kt | 2 +- .../jeudego/pairgoth/web/LanguageFilter.kt | 36 ++++++++++--------- .../org/jeudego/pairgoth/web/ViewServlet.kt | 28 +++++++++------ .../jeudego/pairgoth/application/Pairgoth.kt | 4 +-- 7 files changed, 66 insertions(+), 37 deletions(-) rename view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/{TranslationTool.kt => IntlTool.kt} (82%) rename view-webapp/src/main/kotlin/org/jeudego/pairgoth/{util => view}/TranslateDirective.kt (64%) diff --git a/view-webapp/src/main/config/web.xml b/view-webapp/src/main/config/web.xml index b9e50de..c14e220 100644 --- a/view-webapp/src/main/config/web.xml +++ b/view-webapp/src/main/config/web.xml @@ -17,6 +17,16 @@ com.republicate.slf4j.impl.IPTagFilter true + + dispatching-filter + org.jeudego.pairgoth.web.DispatchingFilter + true + + + language-filter + org.jeudego.pairgoth.web.LanguageFilter + true + @@ -25,6 +35,18 @@ REQUEST FORWARD + + dispatching-filter + /* + REQUEST + FORWARD + + + language-filter + /* + REQUEST + FORWARD + diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/TranslationTool.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/IntlTool.kt similarity index 82% rename from view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/TranslationTool.kt rename to view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/IntlTool.kt index c9299ed..94f7247 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/TranslationTool.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/IntlTool.kt @@ -2,10 +2,9 @@ package org.jeudego.pairgoth.view import org.apache.velocity.tools.config.ValidScope import org.jeudego.pairgoth.util.Translator -import javax.servlet.http.HttpServletRequest @ValidScope("request") -class TranslationTool { +class IntlTool { fun translate(enText: String): String { return translator.get().translate(enText) diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/util/TranslateDirective.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/TranslateDirective.kt similarity index 64% rename from view-webapp/src/main/kotlin/org/jeudego/pairgoth/util/TranslateDirective.kt rename to view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/TranslateDirective.kt index 3a30187..a3af756 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/util/TranslateDirective.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/view/TranslateDirective.kt @@ -1,10 +1,8 @@ -package org.jeudego.pairgoth.util +package org.jeudego.pairgoth.view import org.apache.velocity.Template -import org.apache.velocity.exception.ResourceNotFoundException import org.apache.velocity.runtime.directive.Parse -import org.jeudego.pairgoth.view.TranslationTool -import org.jeudego.pairgoth.web.LanguageFilter +import org.jeudego.pairgoth.view.IntlTool class TranslateDirective : Parse() { override fun getName(): String { @@ -13,7 +11,7 @@ class TranslateDirective : Parse() { override fun getTemplate(path: String, encoding: String): Template? { val template = super.getTemplate(path, encoding) - val translator = TranslationTool.translator.get() + val translator = IntlTool.translator.get() ?: throw RuntimeException("no current active translator") return translator.translate(path, template) } diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/DispatchingFilter.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/DispatchingFilter.kt index ca3bcea..82d4681 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/DispatchingFilter.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/DispatchingFilter.kt @@ -1,4 +1,4 @@ -package org.jeudego.egc2024.web +package org.jeudego.pairgoth.web import org.slf4j.LoggerFactory import javax.servlet.Filter diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/LanguageFilter.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/LanguageFilter.kt index 6b4cab0..c4de83b 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/LanguageFilter.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/LanguageFilter.kt @@ -2,9 +2,8 @@ package org.jeudego.pairgoth.web import org.jeudego.pairgoth.util.Translator import org.jeudego.pairgoth.util.Translator.Companion.defaultLanguage -import org.jeudego.pairgoth.util.Translator.Companion.getTranslator import org.jeudego.pairgoth.util.Translator.Companion.providedLanguages -import org.jeudego.pairgoth.view.TranslationTool +import org.jeudego.pairgoth.view.IntlTool import javax.servlet.Filter import javax.servlet.FilterChain import javax.servlet.FilterConfig @@ -24,22 +23,27 @@ class LanguageFilter : Filter { val request = req as HttpServletRequest val response = resp as HttpServletResponse - val uri = request.requestURI - val match = langPattern.matchEntire(uri) - val lang = match?.groupValues?.get(1) - val target = match?.groupValues?.get(2) ?: uri - - if (lang != null && providedLanguages.contains(lang)) { - // the target URI contains a language we provide - request.setAttribute("lang", lang) - request.setAttribute("target", target) - TranslationTool.translator.set(Translator.getTranslator(lang)) + val reqLang = request.getAttribute("lang") as String? + if (reqLang != null) { + IntlTool.translator.set(Translator.getTranslator(reqLang)) chain.doFilter(request, response) } else { - // the request must be redirected - val preferredLanguage = getPreferredLanguage(request) - val destination = if (lang != null) target else uri - response.sendRedirect("${preferredLanguage}${destination}") + val uri = request.requestURI + val match = langPattern.matchEntire(uri) + val lang = match?.groupValues?.get(1) + val target = match?.groupValues?.get(2) ?: uri + + if (lang != null && providedLanguages.contains(lang)) { + // the target URI contains a language we provide + request.setAttribute("lang", lang) + request.setAttribute("target", target) + filterConfig!!.servletContext.getRequestDispatcher(target).forward(request, response) + } else { + // the request must be redirected + val preferredLanguage = getPreferredLanguage(request) + val destination = if (lang != null) target else uri + response.sendRedirect("${preferredLanguage}${destination}") + } } } diff --git a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/ViewServlet.kt b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/ViewServlet.kt index 37d7606..07aa37b 100644 --- a/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/ViewServlet.kt +++ b/view-webapp/src/main/kotlin/org/jeudego/pairgoth/web/ViewServlet.kt @@ -1,23 +1,14 @@ package org.jeudego.pairgoth.web -import org.apache.commons.lang3.tuple.Pair import org.apache.velocity.Template import org.apache.velocity.context.Context +import org.apache.velocity.exception.ResourceNotFoundException import org.apache.velocity.tools.view.ServletUtils import org.apache.velocity.tools.view.VelocityViewServlet -import org.jeudego.pairgoth.util.Translator -import org.jeudego.pairgoth.web.WebappManager import java.io.File -import java.io.IOException -import java.io.InputStreamReader -import java.io.Serializable import java.io.UnsupportedEncodingException import java.net.URLDecoder -import java.nio.charset.StandardCharsets -import java.text.DateFormat import java.util.* -import java.util.function.Function -import java.util.stream.Collectors import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse @@ -87,6 +78,23 @@ class ViewServlet : VelocityViewServlet() { } } + override fun manageResourceNotFound( + request: HttpServletRequest?, + response: HttpServletResponse?, + e: ResourceNotFoundException? + ) { + val path = ServletUtils.getPath(request) + log.debug("Resource not found for path '{}'", path, e) + val message = e!!.message + if (!response!!.isCommitted && message != null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, path) + } else { + error(request, response, e) + throw e + } + + } + companion object { private const val STANDARD_LAYOUT = "/WEB-INF/layouts/standard.html" } diff --git a/webserver/src/main/kotlin/org/jeudego/pairgoth/application/Pairgoth.kt b/webserver/src/main/kotlin/org/jeudego/pairgoth/application/Pairgoth.kt index dfc810d..ebd9781 100644 --- a/webserver/src/main/kotlin/org/jeudego/pairgoth/application/Pairgoth.kt +++ b/webserver/src/main/kotlin/org/jeudego/pairgoth/application/Pairgoth.kt @@ -49,9 +49,7 @@ private fun extractWarFiles() { private fun launchServer() { // create server - val server = Server(8080) - server.start() - server.join() + val server = Server(8080) // CB TODO port is to be calculated from webapp.url // create webapps contexts val apiContext = createContext("api", "/api");