Reeng in progress

This commit is contained in:
Claude Brisson
2023-10-23 14:53:01 +02:00
parent 58afd61f43
commit 905ccda7c9
26 changed files with 163 additions and 39 deletions

View File

@@ -86,6 +86,26 @@
</sources> </sources>
</configuration> </configuration>
</plugin> </plugin>
<!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>echo-property</id>
<goals>
<goal>run</goal>
</goals>
<phase>validate</phase>
<configuration>
<tasks>
<echo>///////////////////////////// webapp.port=${webapp.port}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
-->
</plugins> </plugins>
</build> </build>
<dependencyManagement> <dependencyManagement>

View File

@@ -1,7 +1,7 @@
package org.jeudego.pairgoth.api package org.jeudego.pairgoth.api
import com.republicate.kson.Json import com.republicate.kson.Json
import org.jeudego.pairgoth.web.ApiException import org.jeudego.pairgoth.server.ApiException
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse import javax.servlet.http.HttpServletResponse

View File

@@ -3,7 +3,7 @@ package org.jeudego.pairgoth.api
import com.republicate.kson.Json import com.republicate.kson.Json
import org.jeudego.pairgoth.model.Tournament import org.jeudego.pairgoth.model.Tournament
import org.jeudego.pairgoth.store.Store import org.jeudego.pairgoth.store.Store
import org.jeudego.pairgoth.web.Event import org.jeudego.pairgoth.server.Event
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
interface PairgothApiHandler: ApiHandler { interface PairgothApiHandler: ApiHandler {

View File

@@ -8,8 +8,8 @@ import org.jeudego.pairgoth.model.PairingType
import org.jeudego.pairgoth.model.getID import org.jeudego.pairgoth.model.getID
import org.jeudego.pairgoth.model.toID import org.jeudego.pairgoth.model.toID
import org.jeudego.pairgoth.model.toJson import org.jeudego.pairgoth.model.toJson
import org.jeudego.pairgoth.web.Event import org.jeudego.pairgoth.server.Event
import org.jeudego.pairgoth.web.Event.* import org.jeudego.pairgoth.server.Event.*
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse import javax.servlet.http.HttpServletResponse

View File

@@ -5,8 +5,8 @@ import com.republicate.kson.toJsonArray
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
import org.jeudego.pairgoth.model.Player import org.jeudego.pairgoth.model.Player
import org.jeudego.pairgoth.model.fromJson import org.jeudego.pairgoth.model.fromJson
import org.jeudego.pairgoth.web.Event import org.jeudego.pairgoth.server.Event
import org.jeudego.pairgoth.web.Event.* import org.jeudego.pairgoth.server.Event.*
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse import javax.servlet.http.HttpServletResponse

View File

@@ -5,7 +5,7 @@ import com.republicate.kson.toJsonArray
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
import org.jeudego.pairgoth.model.Game import org.jeudego.pairgoth.model.Game
import org.jeudego.pairgoth.model.toJson import org.jeudego.pairgoth.model.toJson
import org.jeudego.pairgoth.web.Event import org.jeudego.pairgoth.server.Event
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse import javax.servlet.http.HttpServletResponse

View File

@@ -4,8 +4,8 @@ import com.republicate.kson.Json
import com.republicate.kson.toJsonArray import com.republicate.kson.toJsonArray
import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest import org.jeudego.pairgoth.api.ApiHandler.Companion.badRequest
import org.jeudego.pairgoth.model.TeamTournament import org.jeudego.pairgoth.model.TeamTournament
import org.jeudego.pairgoth.web.Event import org.jeudego.pairgoth.server.Event
import org.jeudego.pairgoth.web.Event.* import org.jeudego.pairgoth.server.Event.*
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse import javax.servlet.http.HttpServletResponse

View File

@@ -10,9 +10,9 @@ import org.jeudego.pairgoth.model.Tournament
import org.jeudego.pairgoth.model.fromJson import org.jeudego.pairgoth.model.fromJson
import org.jeudego.pairgoth.model.toJson import org.jeudego.pairgoth.model.toJson
import org.jeudego.pairgoth.store.Store import org.jeudego.pairgoth.store.Store
import org.jeudego.pairgoth.web.ApiServlet import org.jeudego.pairgoth.server.ApiServlet
import org.jeudego.pairgoth.web.Event import org.jeudego.pairgoth.server.Event
import org.jeudego.pairgoth.web.Event.* import org.jeudego.pairgoth.server.Event.*
import org.w3c.dom.Element import org.w3c.dom.Element
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse import javax.servlet.http.HttpServletResponse

View File

@@ -3,7 +3,7 @@ package org.jeudego.pairgoth.oauth
// In progress // In progress
import com.republicate.kson.Json import com.republicate.kson.Json
import org.jeudego.pairgoth.web.WebappManager import org.jeudego.pairgoth.server.WebappManager
//import com.republicate.modality.util.AESCryptograph //import com.republicate.modality.util.AESCryptograph
//import com.republicate.modality.util.Cryptograph //import com.republicate.modality.util.Cryptograph
import org.apache.commons.codec.binary.Base64 import org.apache.commons.codec.binary.Base64

View File

@@ -1,4 +1,4 @@
package org.jeudego.pairgoth.web package org.jeudego.pairgoth.server
import com.republicate.kson.Json import com.republicate.kson.Json
import java.io.IOException import java.io.IOException

View File

@@ -1,4 +1,4 @@
package org.jeudego.pairgoth.web package org.jeudego.pairgoth.server
import com.republicate.kson.Json import com.republicate.kson.Json
import org.jeudego.pairgoth.api.ApiHandler import org.jeudego.pairgoth.api.ApiHandler

View File

@@ -1,4 +1,4 @@
package org.jeudego.pairgoth.web package org.jeudego.pairgoth.server
import info.macias.sse.events.MessageEvent import info.macias.sse.events.MessageEvent
import java.util.concurrent.atomic.AtomicLong import java.util.concurrent.atomic.AtomicLong

View File

@@ -1,4 +1,4 @@
package org.jeudego.pairgoth.web package org.jeudego.pairgoth.server
import com.republicate.kson.Json import com.republicate.kson.Json
import org.jeudego.pairgoth.util.Colorizer.blue import org.jeudego.pairgoth.util.Colorizer.blue

View File

@@ -1,4 +1,4 @@
package org.jeudego.pairgoth.web package org.jeudego.pairgoth.server
import info.macias.sse.EventBroadcast import info.macias.sse.EventBroadcast
import info.macias.sse.events.MessageEvent import info.macias.sse.events.MessageEvent

View File

@@ -1,4 +1,4 @@
package org.jeudego.pairgoth.web package org.jeudego.pairgoth.server
import com.republicate.mailer.SmtpLoop import com.republicate.mailer.SmtpLoop
import org.apache.commons.lang3.tuple.Pair import org.apache.commons.lang3.tuple.Pair
@@ -51,8 +51,7 @@ class WebappManager : ServletContextListener, ServletContextAttributeListener, H
/* ServletContextListener interface */ /* ServletContextListener interface */
override fun contextInitialized(sce: ServletContextEvent) { override fun contextInitialized(sce: ServletContextEvent) {
context = sce.servletContext context = sce.servletContext
logger.info("---------- Starting Pairgoth Server ----------") logger.info("---------- Starting $WEBAPP_NAME ----------")
context.setAttribute("manager", this)
webappRoot = context.getRealPath("/") webappRoot = context.getRealPath("/")
try { try {
// load default properties // load default properties
@@ -63,7 +62,8 @@ class WebappManager : ServletContextListener, ServletContextAttributeListener, H
properties[(key as String).removePrefix(PAIRGOTH_PROPERTIES_PREFIX)] = value properties[(key as String).removePrefix(PAIRGOTH_PROPERTIES_PREFIX)] = value
} }
logger.info("Using profile {}", properties.getProperty("webapp.env")) val env = properties.getProperty("webapp.env")
logger.info("Using profile $env", )
// set system user agent string to empty string // set system user agent string to empty string
System.setProperty("http.agent", "") System.setProperty("http.agent", "")
@@ -84,11 +84,15 @@ class WebappManager : ServletContextListener, ServletContextAttributeListener, H
} }
override fun contextDestroyed(sce: ServletContextEvent) { override fun contextDestroyed(sce: ServletContextEvent) {
logger.info("---------- Stopping Web Application ----------") logger.info("---------- Stopping $WEBAPP_NAME ----------")
stopService("smtp");
val context = sce.servletContext val context = sce.servletContext
for (service in webServices.keys) stopService(service, true) for (service in webServices.keys) stopService(service, true)
// ??? DriverManager.deregisterDriver(com.mysql.cj.jdbc.Driver ...); // ??? DriverManager.deregisterDriver(com.mysql.cj.jdbc.Driver ...);
logger.info("---------- Stopped $WEBAPP_NAME ----------")
} }
/* ServletContextAttributeListener interface */ /* ServletContextAttributeListener interface */
@@ -101,6 +105,7 @@ class WebappManager : ServletContextListener, ServletContextAttributeListener, H
override fun sessionDestroyed(se: HttpSessionEvent) {} override fun sessionDestroyed(se: HttpSessionEvent) {}
companion object { companion object {
const val WEBAPP_NAME = "Pairgoth API Server"
const val PAIRGOTH_PROPERTIES_PREFIX = "pairgoth." const val PAIRGOTH_PROPERTIES_PREFIX = "pairgoth."
lateinit var webappRoot: String lateinit var webappRoot: String
lateinit var context: ServletContext lateinit var context: ServletContext

View File

@@ -2,7 +2,7 @@ package org.jeudego.pairgoth.store
import org.jeudego.pairgoth.model.ID import org.jeudego.pairgoth.model.ID
import org.jeudego.pairgoth.model.Tournament import org.jeudego.pairgoth.model.Tournament
import org.jeudego.pairgoth.web.WebappManager import org.jeudego.pairgoth.server.WebappManager
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
private fun createStoreImplementation(): StoreImplementation { private fun createStoreImplementation(): StoreImplementation {

View File

@@ -1,6 +1,6 @@
# webapp # webapp
webapp.env = dev webapp.env = dev
webapp.url = http://localhost:8080 webapp.url = https://localhost:8085
# store # store
store = file store = file

View File

@@ -8,7 +8,7 @@
<listener-class>com.republicate.slf4j.impl.ServletContextLoggerListener</listener-class> <listener-class>com.republicate.slf4j.impl.ServletContextLoggerListener</listener-class>
</listener> </listener>
<listener> <listener>
<listener-class>org.jeudego.pairgoth.web.WebappManager</listener-class> <listener-class>org.jeudego.pairgoth.server.WebappManager</listener-class>
</listener> </listener>
<!-- filters --> <!-- filters -->
@@ -29,11 +29,11 @@
<!-- servlets --> <!-- servlets -->
<servlet> <servlet>
<servlet-name>api</servlet-name> <servlet-name>api</servlet-name>
<servlet-class>org.jeudego.pairgoth.web.ApiServlet</servlet-class> <servlet-class>org.jeudego.pairgoth.server.ApiServlet</servlet-class>
</servlet> </servlet>
<servlet> <servlet>
<servlet-name>sse</servlet-name> <servlet-name>sse</servlet-name>
<servlet-class>org.jeudego.pairgoth.web.SSEServlet</servlet-class> <servlet-class>org.jeudego.pairgoth.server.SSEServlet</servlet-class>
<load-on-startup>1</load-on-startup> <load-on-startup>1</load-on-startup>
<async-supported>true</async-supported> <async-supported>true</async-supported>
</servlet> </servlet>

View File

@@ -2,9 +2,9 @@ package org.jeudego.pairgoth.test
import com.republicate.kson.Json import com.republicate.kson.Json
import org.jeudego.pairgoth.api.ApiHandler import org.jeudego.pairgoth.api.ApiHandler
import org.jeudego.pairgoth.web.ApiServlet import org.jeudego.pairgoth.server.ApiServlet
import org.jeudego.pairgoth.web.SSEServlet import org.jeudego.pairgoth.server.SSEServlet
import org.jeudego.pairgoth.web.WebappManager import org.jeudego.pairgoth.server.WebappManager
import org.mockito.kotlin.* import org.mockito.kotlin.*
import java.io.* import java.io.*
import java.util.* import java.util.*

View File

@@ -6,5 +6,5 @@ CSSWATCH=$!
export MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5006" export MAVEN_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=*:5006"
#mvn --projects view-webapp -Dpairgoth.api.url=http://localhost:8085/api/ package jetty:run #mvn --projects view-webapp -Dpairgoth.api.url=http://localhost:8085/api/ package jetty:run
mvn --projects view-webapp package jetty:run mvn -o --projects view-webapp package jetty:run
kill $CSSWATCH kill $CSSWATCH

90
pom.xml
View File

@@ -8,6 +8,52 @@
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<profiles>
<profile>
<id>default-properties</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<api.env>dev</api.env>
<api.url>http://localhost:8085</api.url>
<webapp.env>dev</webapp.env>
<webapp.url>http://localhost:8080</webapp.url>
</properties>
</profile>
<profile>
<id>custom-properties</id>
<activation>
<file>
<exists>../pairgoth.properties</exists>
</file>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
<version>1.2.0</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>read-project-properties</goal>
</goals>
<configuration>
<!--<quiet>true</quiet>-->
<files>
<file>../pairgoth.properties</file>
</files>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<!-- CB: Temporary add my repository, while waiting for SSE Java server module author to incorporate my PR or for me to fork it --> <!-- CB: Temporary add my repository, while waiting for SSE Java server module author to incorporate my PR or for me to fork it -->
<repositories> <repositories>
<repository> <repository>
@@ -19,7 +65,8 @@
<snapshots> <snapshots>
<enabled>true</enabled> <enabled>true</enabled>
</snapshots> </snapshots>
</repository> <repository> </repository>
<repository>
<id>republicate.com</id> <id>republicate.com</id>
<url>https://republicate.com/maven2</url> <url>https://republicate.com/maven2</url>
<releases> <releases>
@@ -144,6 +191,47 @@
<artifactId>maven-war-plugin</artifactId> <artifactId>maven-war-plugin</artifactId>
<version>${maven.war.plugin.version}</version> <version>${maven.war.plugin.version}</version>
</plugin> </plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<id>regex-property</id>
<goals>
<goal>regex-property</goal>
</goals>
<configuration>
<name>webapp.port</name>
<value>${webapp.url}</value>
<regex>^.*:(\d+).*$</regex>
<replacement>$1</replacement>
<failIfNoMatch>true</failIfNoMatch>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>echo-property</id>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>----------------- webapp.port=${webapp.port}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
<plugin> <plugin>
<groupId>com.mycila</groupId> <groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId> <artifactId>license-maven-plugin</artifactId>

View File

@@ -101,15 +101,18 @@
<httpConnector> <httpConnector>
<port>8080</port> <port>8080</port>
</httpConnector> </httpConnector>
<!--
<systemProperties> <systemProperties>
<pairgoth.api.url>http://localhost:8085/api/</pairgoth.api.url> <pairgoth.api.url>${webapp.url}</pairgoth.api.url>
<pairgoth.env>dev</pairgoth.env> <pairgoth.env>${webapp.env}</pairgoth.env>
</systemProperties> </systemProperties>
-->
<webApp> <webApp>
<resourceBases>${project.basedir}/src/main/webapp,${project.build.directory}/generated-resources/</resourceBases> <resourceBases>${project.basedir}/src/main/webapp,${project.build.directory}/generated-resources/</resourceBases>
</webApp> </webApp>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId> <artifactId>maven-war-plugin</artifactId>
@@ -125,6 +128,10 @@
</webResources> </webResources>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>properties-maven-plugin</artifactId>
</plugin>
</plugins> </plugins>
</build> </build>
<dependencyManagement> <dependencyManagement>

View File

@@ -132,7 +132,7 @@ class Translator private constructor(private val iso: String) {
get() = textAccessor[this] as String get() = textAccessor[this] as String
set(value: String) { textAccessor[this] = value } set(value: String) { textAccessor[this] = value }
private val saveMissingTranslations = System.getProperty("pairgoth.env") == "dev" private val saveMissingTranslations = System.getProperty("pairgoth.webapp.env") == "dev"
private val missingTranslations: MutableSet<String> = ConcurrentSkipListSet() private val missingTranslations: MutableSet<String> = ConcurrentSkipListSet()
private fun reportMissingTranslation(enText: String) { private fun reportMissingTranslation(enText: String) {

View File

@@ -53,7 +53,6 @@ class WebappManager : ServletContextListener, ServletContextAttributeListener, H
override fun contextInitialized(sce: ServletContextEvent) { override fun contextInitialized(sce: ServletContextEvent) {
context = sce.servletContext context = sce.servletContext
logger.info("---------- Starting $WEBAPP_NAME ----------") logger.info("---------- Starting $WEBAPP_NAME ----------")
context.setAttribute("manager", this)
webappRoot = context.getRealPath("/") webappRoot = context.getRealPath("/")
try { try {
// load default properties // load default properties
@@ -64,7 +63,11 @@ class WebappManager : ServletContextListener, ServletContextAttributeListener, H
properties[(key as String).removePrefix(PAIRGOTH_PROPERTIES_PREFIX)] = value properties[(key as String).removePrefix(PAIRGOTH_PROPERTIES_PREFIX)] = value
} }
logger.info("Using profile {}", properties.getProperty("webapp.env")) val env = properties.getProperty("webapp.env")
logger.info("Using profile {}", )
// let the view be aware of the environment
context.setAttribute("webapp.env", env)
// set system user agent string to empty string // set system user agent string to empty string
System.setProperty("http.agent", "") System.setProperty("http.agent", "")

View File

@@ -11,6 +11,7 @@
<script type="text/javascript" src="/js/domhelper.js"></script> <script type="text/javascript" src="/js/domhelper.js"></script>
</head> </head>
<body class="vert flex"> <body class="vert flex">
#foreach($attr in $application.getAttributeNames())$attr #end
<div id="header" class="horz flex"> <div id="header" class="horz flex">
<div id="logo"> <div id="logo">
<img src="/img/logov2.svg"/> <img src="/img/logov2.svg"/>

View File

@@ -1,5 +1,5 @@
# webapp # webapp
env = dev webapp.env = dev
webapp.url = https://localhost:8080 webapp.url = https://localhost:8080
api.url = https://localhost:8085/api api.url = https://localhost:8085/api