View webapp structure is ready
This commit is contained in:
@@ -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>
|
||||||
|
@@ -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)
|
@@ -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)
|
||||||
}
|
}
|
@@ -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
|
||||||
|
@@ -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,22 +23,27 @@ class LanguageFilter : Filter {
|
|||||||
val request = req as HttpServletRequest
|
val request = req as HttpServletRequest
|
||||||
val response = resp as HttpServletResponse
|
val response = resp as HttpServletResponse
|
||||||
|
|
||||||
val uri = request.requestURI
|
val reqLang = request.getAttribute("lang") as String?
|
||||||
val match = langPattern.matchEntire(uri)
|
if (reqLang != null) {
|
||||||
val lang = match?.groupValues?.get(1)
|
IntlTool.translator.set(Translator.getTranslator(reqLang))
|
||||||
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))
|
|
||||||
chain.doFilter(request, response)
|
chain.doFilter(request, response)
|
||||||
} else {
|
} else {
|
||||||
// the request must be redirected
|
val uri = request.requestURI
|
||||||
val preferredLanguage = getPreferredLanguage(request)
|
val match = langPattern.matchEntire(uri)
|
||||||
val destination = if (lang != null) target else uri
|
val lang = match?.groupValues?.get(1)
|
||||||
response.sendRedirect("${preferredLanguage}${destination}")
|
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}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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"
|
||||||
}
|
}
|
||||||
|
@@ -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");
|
||||||
|
Reference in New Issue
Block a user