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> <filter-class>com.republicate.slf4j.impl.IPTagFilter</filter-class>
<async-supported>true</async-supported> <async-supported>true</async-supported>
</filter> </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 --> <!-- filters mapping -->
<filter-mapping> <filter-mapping>
@@ -25,6 +35,18 @@
<dispatcher>REQUEST</dispatcher> <dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher> <dispatcher>FORWARD</dispatcher>
</filter-mapping> </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 --> <!-- servlets -->
<servlet> <servlet>

View File

@@ -2,10 +2,9 @@ package org.jeudego.pairgoth.view
import org.apache.velocity.tools.config.ValidScope import org.apache.velocity.tools.config.ValidScope
import org.jeudego.pairgoth.util.Translator import org.jeudego.pairgoth.util.Translator
import javax.servlet.http.HttpServletRequest
@ValidScope("request") @ValidScope("request")
class TranslationTool { class IntlTool {
fun translate(enText: String): String { fun translate(enText: String): String {
return translator.get().translate(enText) 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.Template
import org.apache.velocity.exception.ResourceNotFoundException
import org.apache.velocity.runtime.directive.Parse import org.apache.velocity.runtime.directive.Parse
import org.jeudego.pairgoth.view.TranslationTool import org.jeudego.pairgoth.view.IntlTool
import org.jeudego.pairgoth.web.LanguageFilter
class TranslateDirective : Parse() { class TranslateDirective : Parse() {
override fun getName(): String { override fun getName(): String {
@@ -13,7 +11,7 @@ class TranslateDirective : Parse() {
override fun getTemplate(path: String, encoding: String): Template? { override fun getTemplate(path: String, encoding: String): Template? {
val template = super.getTemplate(path, encoding) val template = super.getTemplate(path, encoding)
val translator = TranslationTool.translator.get() val translator = IntlTool.translator.get()
?: throw RuntimeException("no current active translator") ?: throw RuntimeException("no current active translator")
return translator.translate(path, template) 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 org.slf4j.LoggerFactory
import javax.servlet.Filter 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
import org.jeudego.pairgoth.util.Translator.Companion.defaultLanguage 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.util.Translator.Companion.providedLanguages
import org.jeudego.pairgoth.view.TranslationTool import org.jeudego.pairgoth.view.IntlTool
import javax.servlet.Filter import javax.servlet.Filter
import javax.servlet.FilterChain import javax.servlet.FilterChain
import javax.servlet.FilterConfig import javax.servlet.FilterConfig
@@ -24,6 +23,11 @@ class LanguageFilter : Filter {
val request = req as HttpServletRequest val request = req as HttpServletRequest
val response = resp as HttpServletResponse val response = resp as HttpServletResponse
val reqLang = request.getAttribute("lang") as String?
if (reqLang != null) {
IntlTool.translator.set(Translator.getTranslator(reqLang))
chain.doFilter(request, response)
} else {
val uri = request.requestURI val uri = request.requestURI
val match = langPattern.matchEntire(uri) val match = langPattern.matchEntire(uri)
val lang = match?.groupValues?.get(1) val lang = match?.groupValues?.get(1)
@@ -33,8 +37,7 @@ class LanguageFilter : Filter {
// the target URI contains a language we provide // the target URI contains a language we provide
request.setAttribute("lang", lang) request.setAttribute("lang", lang)
request.setAttribute("target", target) request.setAttribute("target", target)
TranslationTool.translator.set(Translator.getTranslator(lang)) filterConfig!!.servletContext.getRequestDispatcher(target).forward(request, response)
chain.doFilter(request, response)
} else { } else {
// the request must be redirected // the request must be redirected
val preferredLanguage = getPreferredLanguage(request) val preferredLanguage = getPreferredLanguage(request)
@@ -42,6 +45,7 @@ class LanguageFilter : Filter {
response.sendRedirect("${preferredLanguage}${destination}") response.sendRedirect("${preferredLanguage}${destination}")
} }
} }
}
private fun getPreferredLanguage(request: HttpServletRequest): String { private fun getPreferredLanguage(request: HttpServletRequest): String {
return (request.session.getAttribute("lang") as String?) ?: return (request.session.getAttribute("lang") as String?) ?:

View File

@@ -1,23 +1,14 @@
package org.jeudego.pairgoth.web package org.jeudego.pairgoth.web
import org.apache.commons.lang3.tuple.Pair
import org.apache.velocity.Template import org.apache.velocity.Template
import org.apache.velocity.context.Context 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.ServletUtils
import org.apache.velocity.tools.view.VelocityViewServlet 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.File
import java.io.IOException
import java.io.InputStreamReader
import java.io.Serializable
import java.io.UnsupportedEncodingException import java.io.UnsupportedEncodingException
import java.net.URLDecoder import java.net.URLDecoder
import java.nio.charset.StandardCharsets
import java.text.DateFormat
import java.util.* import java.util.*
import java.util.function.Function
import java.util.stream.Collectors
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse 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 { companion object {
private const val STANDARD_LAYOUT = "/WEB-INF/layouts/standard.html" private const val STANDARD_LAYOUT = "/WEB-INF/layouts/standard.html"
} }

View File

@@ -49,9 +49,7 @@ private fun extractWarFiles() {
private fun launchServer() { private fun launchServer() {
// create server // create server
val server = Server(8080) val server = Server(8080) // CB TODO port is to be calculated from webapp.url
server.start()
server.join()
// create webapps contexts // create webapps contexts
val apiContext = createContext("api", "/api"); val apiContext = createContext("api", "/api");