You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lo...@apache.org on 2024/10/09 14:29:17 UTC

(myfaces-tobago) branch main updated: refactor: forbiddenapis (#5562)

This is an automated email from the ASF dual-hosted git repository.

lofwyr pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git


The following commit(s) were added to refs/heads/main by this push:
     new 5921573adf refactor: forbiddenapis (#5562)
5921573adf is described below

commit 5921573adfb15a11791e47d434b8c87aaeeae1b2
Author: Udo Schnurpfeil <lo...@apache.org>
AuthorDate: Wed Oct 9 16:29:12 2024 +0200

    refactor: forbiddenapis (#5562)
    
    * refactor: forbiddenapis
    
    Enhance code quality with Maven plugin: forbiddenapis
    
    issue: TOBAGO-2357
---
 pom.xml                                            | 45 ++++++++++++++++++++++
 .../myfaces/tobago/convert/DurationConverter.java  | 11 ++----
 .../renderkit/renderer/ToastsRenderer.java         |  4 +-
 .../org/apache/myfaces/tobago/layout/Measure.java  |  5 ++-
 .../apache/myfaces/tobago/model/SuggestFilter.java |  6 ++-
 .../apache/myfaces/tobago/renderkit/css/Icons.java |  3 +-
 .../myfaces/tobago/util/DebugPhaseListener.java    | 14 ++++---
 .../config/TobagoConfigParserUnitTest.java         |  3 +-
 .../renderkit/renderer/RendererTestBase.java       |  3 +-
 .../tobago/renderkit/html/AriasUnitTest.java       |  3 +-
 .../renderkit/html/DataAttributesUnitTest.java     |  4 +-
 .../renderkit/html/HtmlElementsUnitTest.java       |  5 ++-
 .../myfaces/tobago/example/demo/AstroData.java     |  3 +-
 .../myfaces/tobago/example/demo/CategoryTree.java  |  5 ++-
 .../example/demo/CurrentValueController.java       |  4 +-
 .../tobago/example/demo/EventController.java       |  4 +-
 .../example/demo/InputSuggestController.java       |  4 +-
 .../myfaces/tobago/example/demo/KillSession.java   |  5 ++-
 .../tobago/example/demo/LoggingController.java     |  7 ++--
 .../tobago/example/demo/ManifestReader.java        |  3 +-
 .../tobago/example/demo/NavigationTree.java        | 11 +++---
 .../tobago/example/demo/PanelController.java       |  3 +-
 .../tobago/example/demo/ProgressController.java    | 13 ++++---
 .../tobago/example/demo/RoleController.java        |  1 -
 .../myfaces/tobago/example/demo/SearchIndex.java   |  3 +-
 .../tobago/example/demo/WebSocketController.java   |  1 -
 .../myfaces/tobago/apt/generate/ClassUtils.java    |  3 +-
 .../tobago/apt/processor/ClassesGenerator.java     |  4 +-
 28 files changed, 122 insertions(+), 58 deletions(-)

diff --git a/pom.xml b/pom.xml
index b5cff44885..c407e85001 100644
--- a/pom.xml
+++ b/pom.xml
@@ -443,6 +443,51 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>de.thetaphi</groupId>
+        <artifactId>forbiddenapis</artifactId>
+        <version>3.8</version>
+        <configuration>
+          <!--
+            if the used Java version is too new,
+            don't fail, just do nothing:
+          -->
+          <failOnUnsupportedJava>false</failOnUnsupportedJava>
+          <!--
+            If a class is missing while parsing signatures files, all methods
+            and fields from this class are silently ignored. This is useful
+            in multi-module Maven projects where only some modules have the
+            dependency to which the signature file(s) apply.
+
+            This settings prints no warning at all, so verify the signatures
+            at least once with full dependencies.
+          -->
+<!--          <ignoreSignaturesOfMissingClasses>true</ignoreSignaturesOfMissingClasses>-->
+          <bundledSignatures>
+            <!--
+              This will automatically choose the right
+              signatures based on 'maven.compiler.target':
+            -->
+<!--            <bundledSignature>jdk-unsafe</bundledSignature>-->
+<!--            <bundledSignature>jdk-deprecated</bundledSignature>-->
+            <!-- disallow undocumented classes like sun.misc.Unsafe: -->
+            <bundledSignature>jdk-non-portable</bundledSignature>
+            <!-- don't allow unsafe reflective access: -->
+            <bundledSignature>jdk-reflection</bundledSignature>
+          </bundledSignatures>
+<!--          <signaturesFiles>-->
+<!--            <signaturesFile>./rel/path/to/signatures.txt</signaturesFile>-->
+<!--          </signaturesFiles>-->
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>check</goal>
+              <goal>testCheck</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
     <pluginManagement>
       <plugins>
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/convert/DurationConverter.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/convert/DurationConverter.java
index a53f2c4956..db5d760dc3 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/convert/DurationConverter.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/convert/DurationConverter.java
@@ -28,12 +28,10 @@ import jakarta.faces.component.UIComponent;
 import jakarta.faces.context.FacesContext;
 import jakarta.faces.convert.Converter;
 import jakarta.faces.convert.ConverterException;
-
 import java.lang.invoke.MethodHandles;
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 import java.util.StringTokenizer;
 
 /**
@@ -81,7 +79,6 @@ public class DurationConverter implements Converter {
     final double factor = getUnitFactor(component);
     aDouble = aDouble * factor;
 
-    final NumberFormat format = new DecimalFormat("00");
     long value = Double.valueOf(aDouble).longValue();
     final int seconds = (int) (value % 60);
     value = value / 60;
@@ -90,11 +87,11 @@ public class DurationConverter implements Converter {
     final String string;
     if (value > 0) {
       string = (negative ? "-" : "") + value + ":"
-          + format.format(minutes) + ":"
-          + format.format(seconds);
+          + String.format(Locale.ROOT, "%02d", minutes) + ":"
+          + String.format(Locale.ROOT, "%02d", seconds);
     } else {
       string = (negative ? "-" : "") + minutes + ":"
-          + format.format(seconds);
+          + String.format(Locale.ROOT, "%02d", seconds);
     }
     LOG.debug("string = '{}'", string);
     return string;
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ToastsRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ToastsRenderer.java
index e7e0d58f18..9518915476 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ToastsRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/ToastsRenderer.java
@@ -19,8 +19,6 @@
 
 package org.apache.myfaces.tobago.internal.renderkit.renderer;
 
-import jakarta.faces.component.UIComponent;
-import jakarta.faces.context.FacesContext;
 import org.apache.myfaces.tobago.application.Toast;
 import org.apache.myfaces.tobago.component.Facets;
 import org.apache.myfaces.tobago.context.Markup;
@@ -45,6 +43,8 @@ import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import jakarta.faces.component.UIComponent;
+import jakarta.faces.context.FacesContext;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.time.LocalTime;
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/layout/Measure.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/layout/Measure.java
index 9f24dc60fd..48ed36a358 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/layout/Measure.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/layout/Measure.java
@@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.Serializable;
 import java.lang.invoke.MethodHandles;
+import java.util.Locale;
 
 /**
  * In PDLs the class {@link org.apache.myfaces.tobago.layout.MeasureEditor} will convert the string literals.
@@ -113,7 +114,7 @@ public final class Measure implements Serializable {
       for (int i = 4; i >= 2; i--) {
         final int pos = length - i;
         if (length >= i && Character.isLetter(s.charAt(pos))) {
-          return new Measure(s.substring(0, pos), Unit.valueOf(s.substring(pos).toUpperCase()));
+          return new Measure(s.substring(0, pos), Unit.valueOf(s.substring(pos).toUpperCase(Locale.ROOT)));
         }
       }
       return new Measure(s, defaultUnit);
@@ -214,7 +215,7 @@ public final class Measure implements Serializable {
     private final String value;
 
     Unit() {
-      value = name().equals("PERCENT") ? "%" : name().toLowerCase();
+      value = name().equals("PERCENT") ? "%" : name().toLowerCase(Locale.ROOT);
     }
 
     String getValue() {
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/model/SuggestFilter.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/model/SuggestFilter.java
index e616e61eaa..ea47a21aed 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/model/SuggestFilter.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/model/SuggestFilter.java
@@ -19,6 +19,8 @@
 
 package org.apache.myfaces.tobago.model;
 
+import java.util.Locale;
+
 public enum SuggestFilter {
 
   all,
@@ -30,13 +32,13 @@ public enum SuggestFilter {
   public static final String CONTAINS = "contains";
 
   public String getValue() {
-    return name().toLowerCase();
+    return name().toLowerCase(Locale.ROOT);
   }
 
   public static SuggestFilter parse(final String string) {
     if (string == null) {
       return null;
     }
-    return valueOf(string.toUpperCase());
+    return valueOf(string.toUpperCase(Locale.ROOT));
   }
 }
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/Icons.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/Icons.java
index d89a12f18f..342f1f8fd6 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/Icons.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/css/Icons.java
@@ -23,6 +23,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.lang.invoke.MethodHandles;
+import java.util.Locale;
 import java.util.regex.Pattern;
 
 /**
@@ -62,7 +63,7 @@ public enum Icons implements CssItem {
   private final String clazz;
 
   Icons() {
-    this.clazz = "bi-" + name().toLowerCase().replaceAll("_", "-");
+    this.clazz = "bi-" + name().toLowerCase(Locale.ROOT).replaceAll("_", "-");
   }
 
   @Override
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/util/DebugPhaseListener.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/util/DebugPhaseListener.java
index 8d9116e861..a1ee40b0bc 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/util/DebugPhaseListener.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/util/DebugPhaseListener.java
@@ -31,10 +31,10 @@ import jakarta.faces.event.PhaseId;
 import jakarta.faces.event.PhaseListener;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
-
 import java.lang.invoke.MethodHandles;
 import java.text.MessageFormat;
 import java.util.Iterator;
+import java.util.Locale;
 import java.util.Map;
 
 public class DebugPhaseListener implements PhaseListener {
@@ -84,10 +84,14 @@ public class DebugPhaseListener implements PhaseListener {
         for (final Iterator<FacesMessage> messageIterator
              = facesContext.getMessages(clientId); messageIterator.hasNext(); ) {
           final FacesMessage msg = messageIterator.next();
-          LOG.info(MessageFormat.format("Faces message found."
-                  + "\n  Component: {0} \n  Severity : {1}"
-                  + "\n  Summary  : {2} \n  Detail   : {3}",
-              clientId, msg.getSeverity(), msg.getSummary(), msg.getDetail()));
+          MessageFormat messageFormat = new MessageFormat("""
+              Faces message found.
+                Component: {0}
+                Severity : {1}
+                Summary  : {2}
+                Detail   : {3}""", Locale.ROOT);
+          LOG.info(messageFormat.format(new Object[]{
+              clientId, msg.getSeverity(), msg.getSummary(), msg.getDetail()}));
         }
       }
     }
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/TobagoConfigParserUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/TobagoConfigParserUnitTest.java
index 33e08ddfd5..c9fab83e8f 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/TobagoConfigParserUnitTest.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/config/TobagoConfigParserUnitTest.java
@@ -32,6 +32,7 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
@@ -176,7 +177,7 @@ public class TobagoConfigParserUnitTest {
     // check hash code values
     for (final Field field : fields) {
       final int hash = field.getInt(dummy);
-      final String name = field.getName().toLowerCase().replace('_', '-');
+      final String name = field.getName().toLowerCase(Locale.ROOT).replace('_', '-');
       Assertions.assertEquals(name.hashCode(), hash, "Are the constants correct?");
     }
   }
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/RendererTestBase.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/RendererTestBase.java
index ccedb060c6..9bea3c614e 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/RendererTestBase.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/internal/renderkit/renderer/RendererTestBase.java
@@ -27,6 +27,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -43,7 +44,7 @@ public abstract class RendererTestBase extends AbstractTobagoTestBase {
       if (is == null) {
         throw new FileNotFoundException(fileName);
       }
-      try (InputStreamReader isr = new InputStreamReader(is);
+      try (InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
            BufferedReader reader = new BufferedReader(isr)) {
         final String xml = reader.lines().collect(Collectors.joining(System.lineSeparator()))
             .replaceAll("<!--[^>]*-->", "")
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/AriasUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/AriasUnitTest.java
index 8514295984..dea688a00a 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/AriasUnitTest.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/AriasUnitTest.java
@@ -23,6 +23,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Field;
+import java.util.Locale;
 
 public class AriasUnitTest {
 
@@ -36,7 +37,7 @@ public class AriasUnitTest {
 
       final String extension = value.substring("aria-".length());
       final String name = field.getName();
-      Assertions.assertEquals(name, extension.toUpperCase());
+      Assertions.assertEquals(name, extension.toUpperCase(Locale.ROOT));
     }
   }
 
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/DataAttributesUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/DataAttributesUnitTest.java
index 1cef0c7e28..5083d58381 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/DataAttributesUnitTest.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/DataAttributesUnitTest.java
@@ -22,6 +22,8 @@ package org.apache.myfaces.tobago.renderkit.html;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.util.Locale;
+
 public class DataAttributesUnitTest {
 
   @Test
@@ -41,7 +43,7 @@ public class DataAttributesUnitTest {
           ? value.substring("data-tobago-".length())
           : value.substring("data-".length());
       final String name = d.name();
-      Assertions.assertEquals(name, extension.toUpperCase().replaceAll("-", "_"));
+      Assertions.assertEquals(name, extension.toUpperCase(Locale.ROOT).replaceAll("-", "_"));
     }
   }
 }
diff --git a/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/HtmlElementsUnitTest.java b/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/HtmlElementsUnitTest.java
index e1de0bffed..a9c974f089 100644
--- a/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/HtmlElementsUnitTest.java
+++ b/tobago-core/src/test/java/org/apache/myfaces/tobago/renderkit/html/HtmlElementsUnitTest.java
@@ -28,6 +28,7 @@ import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Locale;
 
 public class HtmlElementsUnitTest {
 
@@ -39,10 +40,10 @@ public class HtmlElementsUnitTest {
       final String value = element.getValue();
       Assertions.assertEquals(
           value,
-          element.name().toLowerCase().replaceAll("_", "-"),
+          element.name().toLowerCase(Locale.ROOT).replaceAll("_", "-"),
           "Check to lower: '" + element + "'");
       Assertions.assertEquals(
-          value.toUpperCase().replaceAll("-", "_"),
+          value.toUpperCase(Locale.ROOT).replaceAll("-", "_"),
           element.name(),
           "Check to upper: '" + element + "'");
     }
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/AstroData.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/AstroData.java
index 3ccfc3e893..fb89714149 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/AstroData.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/AstroData.java
@@ -30,6 +30,7 @@ import jakarta.inject.Named;
 import javax.swing.tree.DefaultMutableTreeNode;
 import java.io.InputStreamReader;
 import java.io.Serializable;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
@@ -53,7 +54,7 @@ public class AstroData implements Serializable {
   public AstroData() {
 
     final InputStreamReader reader
-        = new InputStreamReader(AstroData.class.getResourceAsStream("astro-data.json"));
+        = new InputStreamReader(AstroData.class.getResourceAsStream("astro-data.json"), StandardCharsets.UTF_8);
 
     Gson gson = new GsonBuilder().create();
     dataList = gson.fromJson(reader, new TypeToken<ArrayList<SolarObject>>() {
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CategoryTree.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CategoryTree.java
index adde05e73d..596ed723bc 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CategoryTree.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CategoryTree.java
@@ -26,6 +26,7 @@ import org.apache.myfaces.tobago.context.Markup;
 
 import javax.swing.tree.DefaultMutableTreeNode;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
 
 public class CategoryTree {
 
@@ -34,8 +35,8 @@ public class CategoryTree {
 
   public static DefaultMutableTreeNode createSample() {
 
-    final InputStreamReader reader
-        = new InputStreamReader(AstroData.class.getResourceAsStream("category-tree.json"));
+    final InputStreamReader reader = new InputStreamReader(
+        AstroData.class.getResourceAsStream("category-tree.json"), StandardCharsets.UTF_8);
 
     final Gson gson = new GsonBuilder().create();
     final CategoryNode node = gson.fromJson(reader, new TypeToken<CategoryNode>() {
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CurrentValueController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CurrentValueController.java
index c4ce9a0a2f..a182145c9d 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CurrentValueController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/CurrentValueController.java
@@ -21,9 +21,9 @@ package org.apache.myfaces.tobago.example.demo;
 
 import jakarta.enterprise.context.RequestScoped;
 import jakarta.inject.Named;
-
 import java.time.LocalDate;
 import java.util.Currency;
+import java.util.Locale;
 
 @Named
 @RequestScoped
@@ -41,7 +41,7 @@ public class CurrentValueController {
   }
 
   public String toUpperCase(final String text) {
-    return text != null ? text.toUpperCase() : null;
+    return text != null ? text.toUpperCase(Locale.ROOT) : null;
   }
 
   public LocalDate plus50(final LocalDate base) {
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/EventController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/EventController.java
index 686e651042..b3d6b2a8f5 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/EventController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/EventController.java
@@ -82,12 +82,12 @@ import jakarta.faces.event.ActionEvent;
 import jakarta.faces.event.AjaxBehaviorEvent;
 import jakarta.faces.event.ValueChangeEvent;
 import jakarta.inject.Named;
-
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -241,7 +241,7 @@ public class EventController implements Serializable {
 
     EventsOnComponent(final UIComponentBase component) {
       final String simpleName = component.getClass().getSimpleName();
-      tagName = simpleName.substring(2, 3).toLowerCase() + simpleName.substring(3);
+      tagName = simpleName.substring(2, 3).toLowerCase(Locale.ROOT) + simpleName.substring(3);
       if (component.getEventNames() != null) {
         this.eventNames.addAll(component.getEventNames());
       }
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/InputSuggestController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/InputSuggestController.java
index e5925bd6b5..4119a2c95e 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/InputSuggestController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/InputSuggestController.java
@@ -30,11 +30,11 @@ import jakarta.enterprise.context.SessionScoped;
 import jakarta.faces.component.UIInput;
 import jakarta.faces.model.SelectItem;
 import jakarta.inject.Named;
-
 import java.io.Serializable;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Locale;
 
 @SessionScoped
 @Named
@@ -166,7 +166,7 @@ public class InputSuggestController implements Serializable {
           items.add(item);
         }
       } else {
-        if (dataRow[2].toLowerCase().startsWith(prefix.toLowerCase())) {
+        if (dataRow[2].toLowerCase(Locale.ROOT).startsWith(prefix.toLowerCase(Locale.ROOT))) {
           final AutoSuggestItem item = new AutoSuggestItem();
           item.setLabel(dataRow[0]);
           item.setValue(dataRow[2]);
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/KillSession.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/KillSession.java
index 10ea28caa0..5bacd0c9f4 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/KillSession.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/KillSession.java
@@ -27,6 +27,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.http.HttpSession;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 
 /**
  * Simple Servlet to kill the user session.
@@ -40,9 +41,9 @@ public class KillSession extends HttpServlet {
     final HttpSession session = request.getSession(false);
     if (session != null) {
       session.invalidate();
-      response.getOutputStream().write("The user session was killed!".getBytes());
+      response.getOutputStream().write("The user session was killed!".getBytes(StandardCharsets.UTF_8));
     } else {
-      response.getOutputStream().write("There is no user session to kill!".getBytes());
+      response.getOutputStream().write("There is no user session to kill!".getBytes(StandardCharsets.UTF_8));
     }
   }
 }
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/LoggingController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/LoggingController.java
index 0d1d87dfb2..4e469f94ce 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/LoggingController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/LoggingController.java
@@ -25,12 +25,12 @@ import org.slf4j.LoggerFactory;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Named;
-
 import java.io.PrintStream;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Date;
 import java.util.List;
+import java.util.Locale;
 
 /**
  * Provides the possibility to get information about various logging APIs available in the current setup.
@@ -273,7 +273,8 @@ public class LoggingController {
       }
 
       if (SLF4J.equals(id) || JCL.equals(id)) {
-        final String methodName = "is" + level.substring(0, 1).toUpperCase() + level.substring(1) + "Enabled";
+        final String methodName
+            = "is" + level.substring(0, 1).toUpperCase(Locale.ROOT) + level.substring(1) + "Enabled";
         final Object hasLevel = c.getClass().getMethod(methodName).invoke(c);
         return (Boolean) hasLevel;
       }
@@ -287,7 +288,7 @@ public class LoggingController {
       final Class<?> levelClass = Class.forName(clazz);
       final Method isLoggable = c.getClass().getMethod(enabledMethod, levelClass);
       final Method parse = levelClass.getMethod(levelMethod, String.class);
-      final Object levelObject = parse.invoke(null, level.toUpperCase());
+      final Object levelObject = parse.invoke(null, level.toUpperCase(Locale.ROOT));
       final Object hasLevel = isLoggable.invoke(c, levelObject);
       return (Boolean) hasLevel;
     }
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/ManifestReader.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/ManifestReader.java
index 905a4cabed..6b8fc45d66 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/ManifestReader.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/ManifestReader.java
@@ -35,6 +35,7 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Enumeration;
+import java.util.Locale;
 import java.util.TimeZone;
 import java.util.jar.Attributes;
 import java.util.jar.Manifest;
@@ -75,7 +76,7 @@ public class ManifestReader {
           jar.add(new ManifestEntry(key.toString(), attributes.get(key).toString()));
         }
         if (name.startsWith("tobago-core")) {
-          final DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+          final DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT);
           format.setTimeZone(TimeZone.getTimeZone("UTC"));
           try {
             buildTime = format.parse(attributes.getValue("Build-Time"));
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationTree.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationTree.java
index ae0849aef4..96b746bd75 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationTree.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/NavigationTree.java
@@ -19,6 +19,10 @@
 
 package org.apache.myfaces.tobago.example.demo;
 
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import jakarta.annotation.PostConstruct;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.faces.context.ExternalContext;
@@ -26,10 +30,6 @@ import jakarta.faces.context.FacesContext;
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
 import jakarta.servlet.ServletContext;
-import org.apache.commons.io.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -41,6 +41,7 @@ import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
@@ -102,7 +103,7 @@ public class NavigationTree implements Serializable {
   public List<NavigationNode> search(final String searchString) {
     List<NavigationNode> result = new ArrayList<>(20);
     for (String s : searchIndex.keySet()) {
-      if (s.contains(searchString.toLowerCase())) {
+      if (s.contains(searchString.toLowerCase(Locale.ROOT))) {
         result.add(searchIndex.get(s));
       }
 //      if (result.size() >= 20) {
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/PanelController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/PanelController.java
index 8851490e6c..ce0ba76f80 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/PanelController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/PanelController.java
@@ -25,6 +25,7 @@ import jakarta.inject.Named;
 import java.io.Serializable;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Locale;
 
 @RequestScoped
 @Named
@@ -37,7 +38,7 @@ public class PanelController implements Serializable {
   }
 
   public boolean isOddDecaSecond() {
-    String second = new SimpleDateFormat("ss").format(getCurrentDate());
+    String second = new SimpleDateFormat("ss", Locale.ROOT).format(getCurrentDate());
     return second.startsWith("1") || second.startsWith("3") || second.startsWith("5");
   }
 
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/ProgressController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/ProgressController.java
index 6cfb5e9fca..a7602421a5 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/ProgressController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/ProgressController.java
@@ -27,6 +27,7 @@ import javax.swing.DefaultBoundedRangeModel;
 import java.io.Serializable;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Locale;
 
 @SessionScoped
 @Named
@@ -57,17 +58,17 @@ public class ProgressController implements Serializable {
   }
 
   public double getCurrentHours() {
-    final SimpleDateFormat sdf = new SimpleDateFormat("HH");
-    return Double.valueOf(sdf.format(getCurrentDate()));
+    final SimpleDateFormat sdf = new SimpleDateFormat("HH", Locale.ROOT);
+    return Double.parseDouble(sdf.format(getCurrentDate()));
   }
 
   public double getCurrentMinutes() {
-    final SimpleDateFormat sdf = new SimpleDateFormat("mm");
-    return Double.valueOf(sdf.format(getCurrentDate()));
+    final SimpleDateFormat sdf = new SimpleDateFormat("mm", Locale.ROOT);
+    return Double.parseDouble(sdf.format(getCurrentDate()));
   }
 
   public double getCurrentSeconds() {
-    final SimpleDateFormat sdf = new SimpleDateFormat("ss");
-    return Double.valueOf(sdf.format(getCurrentDate()));
+    final SimpleDateFormat sdf = new SimpleDateFormat("ss", Locale.ROOT);
+    return Double.parseDouble(sdf.format(getCurrentDate()));
   }
 }
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/RoleController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/RoleController.java
index 9de70076f0..2ae3c13f37 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/RoleController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/RoleController.java
@@ -22,7 +22,6 @@ package org.apache.myfaces.tobago.example.demo;
 import jakarta.annotation.security.RolesAllowed;
 import jakarta.enterprise.context.SessionScoped;
 import jakarta.inject.Named;
-
 import java.io.Serializable;
 import java.time.LocalTime;
 
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SearchIndex.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SearchIndex.java
index ce4dc25550..6323f5b445 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SearchIndex.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/SearchIndex.java
@@ -20,11 +20,12 @@
 package org.apache.myfaces.tobago.example.demo;
 
 import java.util.HashMap;
+import java.util.Locale;
 
 public class SearchIndex extends HashMap<String, NavigationNode> {
 
   public void add(NavigationNode node) {
-    String key = node.getLabel().toLowerCase();
+    String key = node.getLabel().toLowerCase(Locale.ROOT);
 
     // XXX little hack to have more than one result with same name
     while (containsKey(key)) {
diff --git a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/WebSocketController.java b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/WebSocketController.java
index f5170e3a03..014f85ffa2 100644
--- a/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/WebSocketController.java
+++ b/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/WebSocketController.java
@@ -27,7 +27,6 @@ import jakarta.faces.push.Push;
 import jakarta.faces.push.PushContext;
 import jakarta.inject.Inject;
 import jakarta.inject.Named;
-
 import java.io.Serializable;
 import java.lang.invoke.MethodHandles;
 import java.time.LocalTime;
diff --git a/tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/generate/ClassUtils.java b/tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/generate/ClassUtils.java
index 2c1d3672c9..a41ca141cf 100644
--- a/tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/generate/ClassUtils.java
+++ b/tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/generate/ClassUtils.java
@@ -20,6 +20,7 @@
 package org.apache.myfaces.tobago.apt.generate;
 
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 public class ClassUtils {
@@ -60,7 +61,7 @@ public class ClassUtils {
   public static String getSmallSimpleName(final String qualifiedName) {
     final String simpleName = getSimpleName(qualifiedName);
     if (simpleName != null && simpleName.length() > 2) {
-      return simpleName.substring(2, 3).toLowerCase() + simpleName.substring(3);
+      return simpleName.substring(2, 3).toLowerCase(Locale.ROOT) + simpleName.substring(3);
     } else {
       return simpleName;
     }
diff --git a/tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/processor/ClassesGenerator.java b/tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/processor/ClassesGenerator.java
index 1884e3e370..c9bd7d9347 100644
--- a/tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/processor/ClassesGenerator.java
+++ b/tobago-tool/tobago-tool-apt/src/main/java/org/apache/myfaces/tobago/apt/processor/ClassesGenerator.java
@@ -19,7 +19,6 @@
 
 package org.apache.myfaces.tobago.apt.processor;
 
-import jakarta.faces.component.UIComponent;
 import org.antlr.stringtemplate.StringTemplate;
 import org.antlr.stringtemplate.StringTemplateGroup;
 import org.apache.myfaces.tobago.apt.annotation.Behavior;
@@ -33,6 +32,7 @@ import org.apache.myfaces.tobago.apt.generate.ComponentInfo;
 import org.apache.myfaces.tobago.apt.generate.ComponentPropertyInfo;
 import org.apache.myfaces.tobago.apt.generate.PropertyInfo;
 
+import jakarta.faces.component.UIComponent;
 import javax.annotation.processing.SupportedAnnotationTypes;
 import javax.annotation.processing.SupportedSourceVersion;
 import javax.lang.model.SourceVersion;
@@ -115,7 +115,7 @@ public class ClassesGenerator extends AbstractGenerator {
     if (componentTag.generate()) {
       final Tag tag = declaration.getAnnotation(Tag.class);
       final String generic = "org.apache.myfaces.tobago.internal.component.AbstractUI"
-          + tag.name().substring(0, 1).toUpperCase() + tag.name().substring(1);
+          + tag.name().substring(0, 1).toUpperCase(Locale.ROOT) + tag.name().substring(1);
       final StringTemplate componentStringTemplate = componentStringTemplateGroup.getInstanceOf("component");
       final ComponentInfo componentInfo = new ComponentInfo(declaration, componentTag);
       componentInfo.setSuperClass(generic);