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");