From ea6264e519e0d836d60b5a66ed37c1c3432fcc7a Mon Sep 17 00:00:00 2001 From: Bas de Jong Date: Sun, 12 Oct 2025 07:14:26 +0200 Subject: [PATCH] Added ErrorProne for potential bugs. Fixed potential bugs. --- app/pom.xml | 69 ++++++++++++-- app/src/main/java/org/toop/Main.java | 3 + framework/pom.xml | 52 ++++++++++- .../main/java/org/toop/framework/Logging.java | 4 +- .../toop/framework/annotations/TestsOnly.java | 7 ++ .../toop/framework/audio/MusicManager.java | 12 ++- .../framework/audio/SoundEffectManager.java | 8 +- .../toop/framework/audio/VolumeControl.java | 3 + .../framework/eventbus/events/EventsBase.java | 26 +++--- .../NetworkingGameClientHandler.java | 2 + game/pom.xml | 90 +++++++++++++------ pom.xml | 61 ++++++++++--- 12 files changed, 265 insertions(+), 72 deletions(-) create mode 100644 framework/src/main/java/org/toop/framework/annotations/TestsOnly.java diff --git a/app/pom.xml b/app/pom.xml index eb93b3b..189ade6 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -42,6 +42,18 @@ javafx-controls 25 + + + com.google.errorprone + error_prone_core + 2.42.0 + + + com.google.errorprone + error_prone_annotations + 2.42.0 + + @@ -112,14 +124,55 @@ - - org.apache.maven.plugins - maven-compiler-plugin - - 25 - 25 - - + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.1 + + true + true + ${java.home}/bin/javac + 25 + 25 + 25 + UTF-8 + + -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + + -Xplugin:ErrorProne \ + -Xep:RestrictedApi:ERROR \ + -XepOpt:RestrictedApi:annotation=org.toop.framework.annotations.TestsOnly \ + -XepOpt:RestrictedApi:allowlistRegex=(?s).*/src/test/java/.*|.*test\.java \ + -XepOpt:RestrictedApi:message=This API is marked @TestsOnly and shouldn't be normally used. + + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + + + + com.google.errorprone + error_prone_core + 2.42.0 + + + + + + com.google.errorprone + error_prone_core + 2.42.0 + + + \ No newline at end of file diff --git a/app/src/main/java/org/toop/Main.java b/app/src/main/java/org/toop/Main.java index ce1b23d..bb903b6 100644 --- a/app/src/main/java/org/toop/Main.java +++ b/app/src/main/java/org/toop/Main.java @@ -7,6 +7,9 @@ import org.toop.framework.networking.NetworkingInitializationException; import org.toop.framework.resource.ResourceLoader; import org.toop.framework.resource.ResourceManager; import org.toop.framework.resource.resources.MusicAsset; +import org.toop.framework.resource.resources.SoundEffectAsset; + +import java.util.Arrays; public final class Main { static void main(String[] args) { diff --git a/framework/pom.xml b/framework/pom.xml index 33b077a..b0e037c 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -123,6 +123,16 @@ compile + + com.google.errorprone + error_prone_core + 2.42.0 + + + com.google.errorprone + error_prone_annotations + 2.42.0 + @@ -132,11 +142,49 @@ maven-compiler-plugin 3.14.1 - 25 + true + true + ${java.home}/bin/javac + 25 25 - 25 + 25 UTF-8 + + -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + + -Xplugin:ErrorProne \ + -Xep:RestrictedApi:ERROR \ + -XepOpt:RestrictedApi:annotation=org.toop.framework.annotations.TestsOnly \ + -XepOpt:RestrictedApi:allowlistRegex=(?s).*/src/test/java/.*|.*test\.java \ + -XepOpt:RestrictedApi:message=This API is marked @TestsOnly and shouldn't be normally used. + + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + + + + com.google.errorprone + error_prone_core + 2.42.0 + + + + + com.google.errorprone + error_prone_core + 2.42.0 + + com.diffplug.spotless diff --git a/framework/src/main/java/org/toop/framework/Logging.java b/framework/src/main/java/org/toop/framework/Logging.java index ad28f0b..186f186 100644 --- a/framework/src/main/java/org/toop/framework/Logging.java +++ b/framework/src/main/java/org/toop/framework/Logging.java @@ -6,6 +6,8 @@ import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.LoggerConfig; +import java.util.Locale; + /** * Utility class for configuring logging levels dynamically at runtime using Log4j 2. * @@ -144,7 +146,7 @@ public final class Logging { * @param levelToLog name of the logging level (e.g., "DEBUG", "INFO") */ public static void enableLogsForClass(String className, String levelToLog) { - Level level = Level.valueOf(levelToLog.trim().toUpperCase()); + Level level = Level.valueOf(levelToLog.trim().toUpperCase(Locale.ROOT)); if (level != null && verifyStringIsActualClass(className)) { enableLogsForClassInternal(className, level); } diff --git a/framework/src/main/java/org/toop/framework/annotations/TestsOnly.java b/framework/src/main/java/org/toop/framework/annotations/TestsOnly.java new file mode 100644 index 0000000..0f77ff5 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/annotations/TestsOnly.java @@ -0,0 +1,7 @@ +package org.toop.framework.annotations; + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.SOURCE) +@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE}) +public @interface TestsOnly {} \ No newline at end of file diff --git a/framework/src/main/java/org/toop/framework/audio/MusicManager.java b/framework/src/main/java/org/toop/framework/audio/MusicManager.java index 01ad94d..d6a40bb 100644 --- a/framework/src/main/java/org/toop/framework/audio/MusicManager.java +++ b/framework/src/main/java/org/toop/framework/audio/MusicManager.java @@ -2,6 +2,7 @@ package org.toop.framework.audio; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.toop.framework.annotations.TestsOnly; import org.toop.framework.audio.interfaces.Dispatcher; import org.toop.framework.resource.ResourceManager; import org.toop.framework.resource.resources.BaseResource; @@ -12,7 +13,7 @@ import java.util.*; public class MusicManager implements org.toop.framework.audio.interfaces.MusicManager { private static final Logger logger = LogManager.getLogger(MusicManager.class); - private final List backgroundMusic = new LinkedList<>(); + private final List backgroundMusic = new ArrayList<>(); private final Dispatcher dispatcher; private final List resources; private int playingIndex = 0; @@ -27,8 +28,11 @@ public class MusicManager implements org.toop.framework createShuffled(); } - // Used in unit testing - MusicManager(List resources, Dispatcher dispatcher) { + /** + * {@code @TestsOnly} DO NOT USE + */ + @TestsOnly + public MusicManager(List resources, Dispatcher dispatcher) { this.dispatcher = dispatcher; this.resources = new ArrayList<>(resources); backgroundMusic.addAll(resources); @@ -49,6 +53,7 @@ public class MusicManager implements org.toop.framework backgroundMusic.addAll(resources); } + @Override public void play() { if (playing) { logger.warn("MusicManager is already playing."); @@ -114,6 +119,7 @@ public class MusicManager implements org.toop.framework }); } + @Override public void stop() { if (!playing) return; diff --git a/framework/src/main/java/org/toop/framework/audio/SoundEffectManager.java b/framework/src/main/java/org/toop/framework/audio/SoundEffectManager.java index 969b20c..e74ac98 100644 --- a/framework/src/main/java/org/toop/framework/audio/SoundEffectManager.java +++ b/framework/src/main/java/org/toop/framework/audio/SoundEffectManager.java @@ -5,6 +5,7 @@ import org.apache.logging.log4j.Logger; import org.toop.framework.resource.ResourceManager; import org.toop.framework.resource.ResourceMeta; import org.toop.framework.resource.resources.BaseResource; +import org.toop.framework.resource.resources.MusicAsset; import org.toop.framework.resource.resources.SoundEffectAsset; import javax.sound.sampled.Clip; @@ -12,10 +13,7 @@ import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; public class SoundEffectManager implements org.toop.framework.audio.interfaces.SoundEffectManager { @@ -23,6 +21,8 @@ public class SoundEffectManager implements org.toop.framework.audio.interfaces.S private final HashMap soundEffectResources; public SoundEffectManager(){ + MusicAsset[] abcd = {}; + new MusicManager<>(Arrays.stream(abcd).toList(), new JavaFXDispatcher()); // If there are duplicates, takes discards the first soundEffectResources = ResourceManager.getAllOfType(SoundEffectAsset.class).stream() .collect(Collectors.toMap(ResourceMeta::getName, ResourceMeta::getResource, (a, b) -> b, HashMap::new)); diff --git a/framework/src/main/java/org/toop/framework/audio/VolumeControl.java b/framework/src/main/java/org/toop/framework/audio/VolumeControl.java index 697ef76..31bbc57 100644 --- a/framework/src/main/java/org/toop/framework/audio/VolumeControl.java +++ b/framework/src/main/java/org/toop/framework/audio/VolumeControl.java @@ -52,8 +52,11 @@ public enum VolumeControl { FX(), MUSIC(); + @SuppressWarnings("ImmutableEnumChecker") private final List> managers = new CopyOnWriteArrayList<>(); + @SuppressWarnings("ImmutableEnumChecker") private double volume = 1.0; + @SuppressWarnings("ImmutableEnumChecker") private double masterVolume = 1.0; /** diff --git a/framework/src/main/java/org/toop/framework/eventbus/events/EventsBase.java b/framework/src/main/java/org/toop/framework/eventbus/events/EventsBase.java index 18b86d2..f0815b4 100644 --- a/framework/src/main/java/org/toop/framework/eventbus/events/EventsBase.java +++ b/framework/src/main/java/org/toop/framework/eventbus/events/EventsBase.java @@ -9,10 +9,10 @@ public class EventsBase { /** * WIP, DO NOT USE! * - * @param eventName - * @param args - * @return - * @throws Exception + * @param eventName todo + * @param args todo + * @return todo + * @throws Exception todo */ public static Object get(String eventName, Object... args) throws Exception { Class clazz = Class.forName("org.toop.framework.eventbus.events.Events$ServerEvents$" + eventName); @@ -24,11 +24,11 @@ public class EventsBase { /** * WIP, DO NOT USE! * - * @param eventCategory - * @param eventName - * @param args - * @return - * @throws Exception + * @param eventCategory todo + * @param eventName todo + * @param args todo + * @return todo + * @throws Exception todo */ public static Object get(String eventCategory, String eventName, Object... args) throws Exception { @@ -42,10 +42,10 @@ public class EventsBase { /** * WIP, DO NOT USE! * - * @param eventName - * @param args - * @return - * @throws Exception + * @param eventName todo + * @param args todo + * @return todo + * @throws Exception todo */ public static Object get2(String eventName, Object... args) throws Exception { // Fully qualified class name diff --git a/framework/src/main/java/org/toop/framework/networking/NetworkingGameClientHandler.java b/framework/src/main/java/org/toop/framework/networking/NetworkingGameClientHandler.java index 8c97f60..388e420 100644 --- a/framework/src/main/java/org/toop/framework/networking/NetworkingGameClientHandler.java +++ b/framework/src/main/java/org/toop/framework/networking/NetworkingGameClientHandler.java @@ -119,6 +119,7 @@ public class NetworkingGameClientHandler extends ChannelInboundHandlerAdapter { } private void gameWinConditionHandler(String rec) { + @SuppressWarnings("StreamToString") String condition = Pattern.compile("\\b(win|draw|lose)\\b", Pattern.CASE_INSENSITIVE) .matcher(rec) @@ -180,6 +181,7 @@ public class NetworkingGameClientHandler extends ChannelInboundHandlerAdapter { } private void gameYourTurnHandler(String rec) { + @SuppressWarnings("StreamToString") String msg = Pattern.compile("TURNMESSAGE:\\s*\"([^\"]*)\"") .matcher(rec) diff --git a/game/pom.xml b/game/pom.xml index 9ab2b59..efd9aaf 100644 --- a/game/pom.xml +++ b/game/pom.xml @@ -83,39 +83,71 @@ slf4j-simple 2.0.17 + + + com.google.errorprone + error_prone_core + 2.42.0 + + + com.google.errorprone + error_prone_annotations + 2.42.0 + + - - org.apache.maven.plugins - maven-compiler-plugin - 3.14.1 - - 25 - 25 - 25 - UTF-8 - - - - - - - - - - - - - - - - - - - - + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.1 + + true + true + ${java.home}/bin/javac + 25 + 25 + 25 + UTF-8 + + -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + + -Xplugin:ErrorProne \ + -Xep:RestrictedApi:ERROR \ + -XepOpt:RestrictedApi:annotation=org.toop.framework.annotations.TestsOnly \ + -XepOpt:RestrictedApi:allowlistRegex=(?s).*/src/test/java/.*|.*test\.java \ + -XepOpt:RestrictedApi:message=This API is marked @TestsOnly and shouldn't be normally used. + + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + + + + com.google.errorprone + error_prone_core + 2.42.0 + + + + + + com.google.errorprone + error_prone_core + 2.42.0 + + + com.diffplug.spotless spotless-maven-plugin diff --git a/pom.xml b/pom.xml index a6c34cf..8742145 100644 --- a/pom.xml +++ b/pom.xml @@ -107,18 +107,55 @@ - - - - - - - - - - - - + + org.apache.maven.plugins + maven-compiler-plugin + 3.14.1 + + true + true + ${java.home}/bin/javac + 25 + 25 + 25 + UTF-8 + + -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED + -J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED + -J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED + + -Xplugin:ErrorProne \ + -Xep:RestrictedApi:ERROR \ + -XepOpt:RestrictedApi:annotation=org.toop.framework.annotations.TestsOnly \ + -XepOpt:RestrictedApi:allowlistRegex=(?s).*/src/test/java/.*|.*test\.java \ + -XepOpt:RestrictedApi:message=This API is marked @TestsOnly and shouldn't be normally used. + + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + + + + com.google.errorprone + error_prone_core + 2.42.0 + + + + + + com.google.errorprone + error_prone_core + 2.42.0 + + +