View webapp structure is ready
This commit is contained in:
@@ -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>
|
||||
|
@@ -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)
|
@@ -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)
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
package org.jeudego.egc2024.web
|
||||
package org.jeudego.pairgoth.web
|
||||
|
||||
import org.slf4j.LoggerFactory
|
||||
import javax.servlet.Filter
|
||||
|
@@ -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,6 +23,11 @@ class LanguageFilter : Filter {
|
||||
val request = req as HttpServletRequest
|
||||
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 match = langPattern.matchEntire(uri)
|
||||
val lang = match?.groupValues?.get(1)
|
||||
@@ -33,8 +37,7 @@ class LanguageFilter : Filter {
|
||||
// the target URI contains a language we provide
|
||||
request.setAttribute("lang", lang)
|
||||
request.setAttribute("target", target)
|
||||
TranslationTool.translator.set(Translator.getTranslator(lang))
|
||||
chain.doFilter(request, response)
|
||||
filterConfig!!.servletContext.getRequestDispatcher(target).forward(request, response)
|
||||
} else {
|
||||
// the request must be redirected
|
||||
val preferredLanguage = getPreferredLanguage(request)
|
||||
@@ -42,6 +45,7 @@ class LanguageFilter : Filter {
|
||||
response.sendRedirect("${preferredLanguage}${destination}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun getPreferredLanguage(request: HttpServletRequest): String {
|
||||
return (request.session.getAttribute("lang") as String?) ?:
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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");
|
||||
|
Reference in New Issue
Block a user