View webapp structure is ready

This commit is contained in:
Claude Brisson
2023-06-09 08:32:22 +02:00
parent 2766b7a0f3
commit 3aae2f7221
7 changed files with 66 additions and 37 deletions

View File

@@ -17,6 +17,16 @@
<filter-class>com.republicate.slf4j.impl.IPTagFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter>
<filter-name>dispatching-filter</filter-name>
<filter-class>org.jeudego.pairgoth.web.DispatchingFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter>
<filter-name>language-filter</filter-name>
<filter-class>org.jeudego.pairgoth.web.LanguageFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<!-- filters mapping -->
<filter-mapping>
@@ -25,6 +35,18 @@
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>dispatching-filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>language-filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<!-- servlets -->
<servlet>

View File

@@ -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)

View File

@@ -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)
}

View File

@@ -1,4 +1,4 @@
package org.jeudego.egc2024.web
package org.jeudego.pairgoth.web
import org.slf4j.LoggerFactory
import javax.servlet.Filter

View File

@@ -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}")
}
}
}

View File

@@ -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"
}