From 3da3c8a06ef4f1a43e738b10f809261dde63d871 Mon Sep 17 00:00:00 2001
From: Koen Aben <koen.aben@carapaxit.nl>
Date: Sat, 4 May 2024 15:41:28 +0200
Subject: [PATCH 1/2] security upgrade: the core project j2html had an insecure
 dependency (a very old apache velocity).

also added an GETTING_STARTED.md document, so it is easier getting started with this project.
---
 .gitignore                                    |  2 ++
 GETTING_STARTED.md                            | 21 +++++++++++++++++++
 j2html-codegen/pom.xml                        |  4 ++--
 j2html-website/pom.xml                        |  2 --
 j2html-website/src/main/java/app/Main.java    | 21 ++++++++++++++++---
 j2html/pom.xml                                |  8 ++++++-
 .../src/test/java/j2html/PerformanceTest.java |  4 ++--
 .../java/j2html/RenderPerformanceTest.java    |  2 +-
 .../RenderPerformanceComparisonTest.java      | 16 +++++++-------
 ...tJ2html.java => TestOptionsForJ2html.java} |  5 ++++-
 ...ocity.java => TestOptionsForVelocity.java} |  9 ++++++--
 pom.xml                                       | 20 ++++++++++++------
 12 files changed, 86 insertions(+), 28 deletions(-)
 create mode 100644 GETTING_STARTED.md
 rename j2html/src/test/java/j2html/comparison/{TestJ2html.java => TestOptionsForJ2html.java} (87%)
 rename j2html/src/test/java/j2html/comparison/{TestVelocity.java => TestOptionsForVelocity.java} (91%)

diff --git a/.gitignore b/.gitignore
index bcc0e4eb..379aafd4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,3 +13,5 @@ buildNumber.properties
 ### IntelliJ ###
 *.iml
 .idea/
+
+target
diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md
new file mode 100644
index 00000000..eb096aa8
--- /dev/null
+++ b/GETTING_STARTED.md
@@ -0,0 +1,21 @@
+# Getting started 
+
+### Build all projects:
+- `mvn clean install`
+
+### Core project
+- The core project is situated in the `j2html` directory. When building, source code is generated using the maven plugin from project `j2html-codegen`
+
+### Extra projects
+- `j2html-website` - the project website (using j2html code) that runs via Javalin (https://javalin.io/)
+- `j2html-codegen` - maven plugin for generating Java sources from a configured collection of tags (in a .model file).
+- `j2html-mathml` - a mathml extension
+
+### Hints when using Intellij: 
+- Mark directory `j2html/target/generated-sources/j2html-codegen` as Generated Sources Root
+- Mark directory `j2html-ext-mathml/target/generated-sources/j2html-codegen` as Generated Sources Root
+
+### Security check on dependencies
+- Type `mvn org.owasp:dependency-check-maven:6.5.3:aggregate` and wait for the generated security report
+
+
diff --git a/j2html-codegen/pom.xml b/j2html-codegen/pom.xml
index e9ca1495..56553a1f 100644
--- a/j2html-codegen/pom.xml
+++ b/j2html-codegen/pom.xml
@@ -18,14 +18,14 @@
         <dependency>
             <groupId>org.apache.maven</groupId>
             <artifactId>maven-plugin-api</artifactId>
-            <version>3.8.4</version>
+            <version>3.8.8</version>
             <scope>provided</scope>
         </dependency>
 
         <dependency>
             <groupId>org.apache.maven.plugin-tools</groupId>
             <artifactId>maven-plugin-annotations</artifactId>
-            <version>3.6.0</version>
+            <version>3.6.4</version>
             <scope>provided</scope>
         </dependency>
 
diff --git a/j2html-website/pom.xml b/j2html-website/pom.xml
index c0598da9..64a432f3 100644
--- a/j2html-website/pom.xml
+++ b/j2html-website/pom.xml
@@ -15,13 +15,11 @@
         <dependency>
             <groupId>io.javalin</groupId>
             <artifactId>javalin</artifactId>
-            <version>4.0.0.ALPHA2</version>
         </dependency>
 
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-simple</artifactId>
-            <version>1.7.26</version>
         </dependency>
 
         <dependency>
diff --git a/j2html-website/src/main/java/app/Main.java b/j2html-website/src/main/java/app/Main.java
index 60164f06..66134666 100644
--- a/j2html-website/src/main/java/app/Main.java
+++ b/j2html-website/src/main/java/app/Main.java
@@ -3,12 +3,27 @@
 import app.controllers.PageController;
 import io.javalin.Javalin;
 import io.javalin.http.staticfiles.Location;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
 
 public class Main {
+    private static final Logger LOG = LoggerFactory.getLogger(Main.class);
+
+    public static void main(String[] args)  {
+        String path = "./src/main/resources/public";
+        File file = new File(path);
+
+        try {
+            LOG.info("static files served from location: {}, ready {} ", file.getCanonicalFile(), file.exists());
+        } catch (IOException ex) {
+            throw new IllegalStateException(ex);
+        }
 
-    public static void main(String[] args) {
-        Javalin app = Javalin.create(config ->
-            config.addStaticFiles("website/src/main/resources/public", Location.EXTERNAL)
+        Javalin app = Javalin.create(
+            config -> config.staticFiles.add(path, Location.EXTERNAL)
         ).start(8888);
 
         app.get("/", PageController::serveIndex);
diff --git a/j2html/pom.xml b/j2html/pom.xml
index 14434bb0..2016c202 100644
--- a/j2html/pom.xml
+++ b/j2html/pom.xml
@@ -39,9 +39,15 @@
 
         <dependency>
             <groupId>org.apache.velocity</groupId>
-            <artifactId>velocity</artifactId>
+            <artifactId>velocity-engine-core</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.hsqldb</groupId>
+            <artifactId>hsqldb</artifactId>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
     <packaging>jar</packaging>
diff --git a/j2html/src/test/java/j2html/PerformanceTest.java b/j2html/src/test/java/j2html/PerformanceTest.java
index de33ee7e..06767a1a 100644
--- a/j2html/src/test/java/j2html/PerformanceTest.java
+++ b/j2html/src/test/java/j2html/PerformanceTest.java
@@ -18,13 +18,13 @@ public class PerformanceTest {
     @Rule
     public TestRule benchmarkRun = new BenchmarkRule();
 
-    private String shortTestString = "<body>\n"
+    private final String shortTestString = "<body>\n"
         + "    <h1 class=\"example\">Heading!</h1>\n"
         + "    <img src=\"img/hello.png\">\n"
         + "</body>";
 
     // syntax-highlighted getting started example from j2html.com:
-    private String longTestString =
+    private final String longTestString =
         "<pre class=\" language-java\"><code class=\" language-java\"><span class=\"token keyword\">import</span> <span class=\"token keyword\">static</span> j2html<span class=\"token punctuation\">.</span>TagCreator<span class=\"token punctuation\">.</span>*<span class=\"token punctuation\">;</span>\n"
             + "\n"
             + "<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">Main</span> <span class=\"token punctuation\">{</span>\n"
diff --git a/j2html/src/test/java/j2html/RenderPerformanceTest.java b/j2html/src/test/java/j2html/RenderPerformanceTest.java
index f4869c96..fda74fd3 100644
--- a/j2html/src/test/java/j2html/RenderPerformanceTest.java
+++ b/j2html/src/test/java/j2html/RenderPerformanceTest.java
@@ -29,7 +29,7 @@ public class RenderPerformanceTest {
     @Rule
     public TestRule benchmarkRun = new BenchmarkRule();
     String expected = "<html><head><title>Browsertitle</title></head><body><h1>Hello World!</h1><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h2 id=\"title\" class=\"visible-small\">Hello World!</h2><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h2>Hello World!</h2><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h2 id=\"title\" class=\"visible-small\">Hello World!</h2><div class=\"button\"><div class=\"button-text\">Action!</div></div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h2>Hello World!</h2><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h1>Hello World!</h1><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h2>Hello World!</h2><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h2>Hello World!</h2><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h2>Hello World!</h2><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><h2>Hello World!</h2><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><p>Hello World!</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></body></html>";
-    private DomContent template;
+    private final DomContent template;
 
     public RenderPerformanceTest() {
         this.template =
diff --git a/j2html/src/test/java/j2html/comparison/RenderPerformanceComparisonTest.java b/j2html/src/test/java/j2html/comparison/RenderPerformanceComparisonTest.java
index e821c50c..98399b24 100644
--- a/j2html/src/test/java/j2html/comparison/RenderPerformanceComparisonTest.java
+++ b/j2html/src/test/java/j2html/comparison/RenderPerformanceComparisonTest.java
@@ -17,18 +17,18 @@ public class RenderPerformanceComparisonTest {
 
     @Test
     public void j2htmlPerformance() throws Exception {
-        TestJ2html.helloWorld();
-        TestJ2html.fiveHundredEmployees();
-        TestJ2html.macros();
-        TestJ2html.multiplicationTable();
+        TestOptionsForJ2html.helloWorld();
+        TestOptionsForJ2html.fiveHundredEmployees();
+        TestOptionsForJ2html.macros();
+        TestOptionsForJ2html.multiplicationTable();
     }
 
     @Test
     public void velocityPerformance() throws Exception {
-        TestVelocity.helloWorld();
-        TestVelocity.fiveHundredEmployees();
-        TestVelocity.macros();
-        TestVelocity.multiplicationTable();
+        TestOptionsForVelocity.helloWorld();
+        TestOptionsForVelocity.fiveHundredEmployees();
+        TestOptionsForVelocity.macros();
+        TestOptionsForVelocity.multiplicationTable();
     }
 
 }
diff --git a/j2html/src/test/java/j2html/comparison/TestJ2html.java b/j2html/src/test/java/j2html/comparison/TestOptionsForJ2html.java
similarity index 87%
rename from j2html/src/test/java/j2html/comparison/TestJ2html.java
rename to j2html/src/test/java/j2html/comparison/TestOptionsForJ2html.java
index ec66dab1..9c0df25c 100644
--- a/j2html/src/test/java/j2html/comparison/TestJ2html.java
+++ b/j2html/src/test/java/j2html/comparison/TestOptionsForJ2html.java
@@ -5,7 +5,10 @@
 import j2html.comparison.j2html.Macros;
 import j2html.comparison.j2html.MultiplicationTable;
 
-public class TestJ2html {
+/**
+ * Options are used in {@link RenderPerformanceComparisonTest}
+ */
+class TestOptionsForJ2html {
 
     public static String helloWorld() {
         return HelloWorld.tag.render();
diff --git a/j2html/src/test/java/j2html/comparison/TestVelocity.java b/j2html/src/test/java/j2html/comparison/TestOptionsForVelocity.java
similarity index 91%
rename from j2html/src/test/java/j2html/comparison/TestVelocity.java
rename to j2html/src/test/java/j2html/comparison/TestOptionsForVelocity.java
index 3048014d..f92613f5 100644
--- a/j2html/src/test/java/j2html/comparison/TestVelocity.java
+++ b/j2html/src/test/java/j2html/comparison/TestOptionsForVelocity.java
@@ -7,9 +7,12 @@
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 
-public class TestVelocity {
+/**
+ * Options are used in {@link RenderPerformanceComparisonTest}
+ */
+class TestOptionsForVelocity {
 
-    private static VelocityEngine velocityEngine;
+    private static final VelocityEngine velocityEngine;
 
     static {
         velocityEngine = new VelocityEngine();
@@ -45,6 +48,8 @@ public static String multiplicationTable() {
         return render("/comparison/velocity/multiplicationTable.vm", model);
     }
 
+
+
     public static void main(String[] args) {
         System.out.println(multiplicationTable());
     }
diff --git a/pom.xml b/pom.xml
index 919ca8b7..8d4eef82 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,16 +66,17 @@
         <maven.compiler.source>${jdk.version}</maven.compiler.source>
         <maven.compiler.target>${jdk.version}</maven.compiler.target>
 
-        <junit.version>4.13.1</junit.version>
+        <junit.version>4.13.2</junit.version>
         <mockito.version>4.8.1</mockito.version>
         <hamcrest-library.version>1.3</hamcrest-library.version>
         <commons-lang3.version>3.0</commons-lang3.version>
         <junit-benchmarks.version>0.7.2</junit-benchmarks.version>
-        <apache-velocity.version>1.7</apache-velocity.version>
-        <jsoup.version>1.14.3</jsoup.version>
+        <apache-velocity.version>2.3</apache-velocity.version>
+        <hsqldb.version>2.7.2</hsqldb.version>
+        <jsoup.version>1.17.2</jsoup.version>
         <javapoet.version>1.9.0</javapoet.version>
-        <javalin.version>4.0.0.ALPHA2</javalin.version>
-        <slf4j-simple.version>1.7.26</slf4j-simple.version>
+        <javalin.version>6.1.3</javalin.version>
+        <slf4j-simple.version>2.0.13</slf4j-simple.version>
     </properties>
 
     <dependencyManagement>
@@ -109,12 +110,19 @@
             </dependency>
 
             <!-- performance test dependencies -->
+
             <dependency>
                 <groupId>org.apache.velocity</groupId>
-                <artifactId>velocity</artifactId>
+                <artifactId>velocity-engine-core</artifactId>
                 <version>${apache-velocity.version}</version>
                 <scope>test</scope>
             </dependency>
+            <dependency>
+                <groupId>org.hsqldb</groupId>
+                <artifactId>hsqldb</artifactId>
+                <version>${hsqldb.version}</version>
+                <scope>test</scope>
+            </dependency>
 
             <dependency>
                 <groupId>org.apache.commons</groupId>

From 6c70d13385352ccf3c4123a0c151dc8df0085686 Mon Sep 17 00:00:00 2001
From: Koen Aben <koen.aben@carapaxit.nl>
Date: Tue, 14 May 2024 21:41:04 +0200
Subject: [PATCH 2/2] updates .github/workflow/main.yml for build for Java21
 (and removed the outdated Java8

---
 .github/workflows/main.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index d829b820..d6b5c291 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -9,7 +9,7 @@ jobs:
     strategy:
       fail-fast: false
       matrix:
-        java_version: [1.8, 11, 17]
+        java_version: [11, 17, 21]
         os: [windows-latest, macOS-latest, ubuntu-latest]
 
     steps: