From fa6f97ef421e1a94c77c99908acf2b27baed2685 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Wed, 15 Jul 2026 15:27:16 +0100 Subject: [PATCH 1/6] Add SLF4J NOP binding for JGit --- GitPlus/build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GitPlus/build.gradle b/GitPlus/build.gradle index fa2fcb99..6036837a 100644 --- a/GitPlus/build.gradle +++ b/GitPlus/build.gradle @@ -22,6 +22,10 @@ dependencies { implementation 'com.google.guava:guava:33.4.0-jre' implementation 'org.eclipse.jgit:org.eclipse.jgit:7.1.0.202411261347-r' + // JGit uses SLF4J 1.7. Keep its logs intentionally disabled without the + // missing StaticLoggerBinder startup warning. + runtimeOnly 'org.slf4j:slf4j-nop:1.7.36' + // JUnit 5 testing framework testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' testImplementation 'org.mockito:mockito-core:5.5.0' From ee22bea02720d64b14faea5a8001e5e1f744b387 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Wed, 15 Jul 2026 15:40:50 +0100 Subject: [PATCH 2/6] build: upgrade Mockito for JDK 26 --- CommonsLangPlus/build.gradle | 5 ++--- GitPlus/build.gradle | 5 ++--- JacksonPlus/build.gradle | 5 ++--- JadxPlus/build.gradle | 5 ++--- JavaGenerator/build.gradle | 5 ++--- SpecsUtils/build.gradle | 5 ++--- SymjaPlus/build.gradle | 5 ++--- XStreamPlus/build.gradle | 5 ++--- jOptions/build.gradle | 5 ++--- tdrcLibrary/build.gradle | 5 ++--- 10 files changed, 20 insertions(+), 30 deletions(-) diff --git a/CommonsLangPlus/build.gradle b/CommonsLangPlus/build.gradle index f247cd87..cd03cda2 100644 --- a/CommonsLangPlus/build.gradle +++ b/CommonsLangPlus/build.gradle @@ -22,10 +22,9 @@ dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/GitPlus/build.gradle b/GitPlus/build.gradle index 6036837a..b930a533 100644 --- a/GitPlus/build.gradle +++ b/GitPlus/build.gradle @@ -28,10 +28,9 @@ dependencies { // JUnit 5 testing framework testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/JacksonPlus/build.gradle b/JacksonPlus/build.gradle index 2f2e1595..8e225331 100644 --- a/JacksonPlus/build.gradle +++ b/JacksonPlus/build.gradle @@ -21,10 +21,9 @@ dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/JadxPlus/build.gradle b/JadxPlus/build.gradle index 6f781b9b..c3488401 100644 --- a/JadxPlus/build.gradle +++ b/JadxPlus/build.gradle @@ -25,10 +25,9 @@ dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/JavaGenerator/build.gradle b/JavaGenerator/build.gradle index e96ca8f5..bf1de802 100644 --- a/JavaGenerator/build.gradle +++ b/JavaGenerator/build.gradle @@ -23,10 +23,9 @@ dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/SpecsUtils/build.gradle b/SpecsUtils/build.gradle index 97479b3f..488ab381 100644 --- a/SpecsUtils/build.gradle +++ b/SpecsUtils/build.gradle @@ -19,10 +19,9 @@ repositories { dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testImplementation 'org.junit-pioneer:junit-pioneer:2.3.0' // For test retries testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/SymjaPlus/build.gradle b/SymjaPlus/build.gradle index 4fddbf75..822b4eb2 100644 --- a/SymjaPlus/build.gradle +++ b/SymjaPlus/build.gradle @@ -25,10 +25,9 @@ dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testImplementation 'org.junit-pioneer:junit-pioneer:2.3.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/XStreamPlus/build.gradle b/XStreamPlus/build.gradle index e32fd8a0..4d72fe39 100644 --- a/XStreamPlus/build.gradle +++ b/XStreamPlus/build.gradle @@ -23,10 +23,9 @@ dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/jOptions/build.gradle b/jOptions/build.gradle index 54b11f99..37d36fd1 100644 --- a/jOptions/build.gradle +++ b/jOptions/build.gradle @@ -27,10 +27,9 @@ dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testImplementation 'org.junit-pioneer:junit-pioneer:2.3.0' // For test retries testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } diff --git a/tdrcLibrary/build.gradle b/tdrcLibrary/build.gradle index 9e5c16de..3496f064 100644 --- a/tdrcLibrary/build.gradle +++ b/tdrcLibrary/build.gradle @@ -23,10 +23,9 @@ dependencies { // Testing dependencies testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' - testImplementation 'org.mockito:mockito-core:5.5.0' - testImplementation 'org.mockito:mockito-junit-jupiter:5.5.0' + testImplementation 'org.mockito:mockito-core:5.23.0' + testImplementation 'org.mockito:mockito-junit-jupiter:5.23.0' testImplementation 'org.assertj:assertj-core:3.24.2' - testImplementation 'org.mockito:mockito-inline:5.2.0' // For static mocking testImplementation 'org.junit-pioneer:junit-pioneer:2.3.0' // For test retries testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.0' } From 2461682d22fed971185e0bed3905287094ecb9f5 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Wed, 15 Jul 2026 15:43:43 +0100 Subject: [PATCH 3/6] Configure Symja Log4j SimpleLogger --- SymjaPlus/src/main/resources/log4j2.component.properties | 1 + 1 file changed, 1 insertion(+) create mode 100644 SymjaPlus/src/main/resources/log4j2.component.properties diff --git a/SymjaPlus/src/main/resources/log4j2.component.properties b/SymjaPlus/src/main/resources/log4j2.component.properties new file mode 100644 index 00000000..3e44e0d4 --- /dev/null +++ b/SymjaPlus/src/main/resources/log4j2.component.properties @@ -0,0 +1 @@ +log4j2.loggerContextFactory=org.apache.logging.log4j.simple.SimpleLoggerContextFactory From 489e7266aa9601f9bc50167526b49d5201e24240 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Wed, 15 Jul 2026 22:40:28 +0100 Subject: [PATCH 4/6] fix: reject empty input paths explicitly Avoid treating an empty File path as the current directory on newer JDKs while preserving the existing null and valid-path behavior. --- SpecsUtils/src/pt/up/fe/specs/util/io/InputFiles.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SpecsUtils/src/pt/up/fe/specs/util/io/InputFiles.java b/SpecsUtils/src/pt/up/fe/specs/util/io/InputFiles.java index 4fb6e700..39d22b5f 100644 --- a/SpecsUtils/src/pt/up/fe/specs/util/io/InputFiles.java +++ b/SpecsUtils/src/pt/up/fe/specs/util/io/InputFiles.java @@ -16,6 +16,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import pt.up.fe.specs.util.SpecsIo; import pt.up.fe.specs.util.SpecsLogs; @@ -32,6 +33,13 @@ public record InputFiles(boolean isSingleFile, File inputPath, List inputF * @param inputPath can be the path to a single file or to a folder */ public static InputFiles newInstance(String inputPath) { + Objects.requireNonNull(inputPath, "inputPath"); + + if (inputPath.isEmpty()) { + SpecsLogs.warn("Input path is empty."); + return null; + } + File inputPathFile = new File(inputPath); if (!inputPathFile.exists()) { SpecsLogs.warn("Input path '" + inputPathFile + "' does not exist."); From 46c5f680eebb9849a63dd558aab43e7ff7d307f9 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Wed, 15 Jul 2026 22:50:35 +0100 Subject: [PATCH 5/6] ci: stop building JsEngine Remove the unused JsEngine project from the nightly Gradle build and test sequence. --- .github/workflows/nightly.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 5023bbb4..ddbe79af 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -50,7 +50,6 @@ jobs: JadxPlus JavaGenerator jOptions - JsEngine LogbackPlus MvelPlus SlackPlus From dd42be84db932562c3ddffd333c1106166064484 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Sun, 30 Aug 2026 22:31:56 +0100 Subject: [PATCH 6/6] Add @SuppressWarnings("unchecked") to BiFunctionClassMap copy constructor The cast is a guarded one: the ER-to-R widening is covariantly sound, and the parameter narrowing is guaranteed by the put/apply contract (the key class is always a subtype of the function's first parameter, and lookup only dispatches to registered ancestor keys). Mirrors the existing suppression in get() and in the FunctionClassMap copy constructor. --- .../src/pt/up/fe/specs/util/classmap/BiFunctionClassMap.java | 1 + 1 file changed, 1 insertion(+) diff --git a/SpecsUtils/src/pt/up/fe/specs/util/classmap/BiFunctionClassMap.java b/SpecsUtils/src/pt/up/fe/specs/util/classmap/BiFunctionClassMap.java index 2599f147..786a37f5 100644 --- a/SpecsUtils/src/pt/up/fe/specs/util/classmap/BiFunctionClassMap.java +++ b/SpecsUtils/src/pt/up/fe/specs/util/classmap/BiFunctionClassMap.java @@ -41,6 +41,7 @@ public BiFunctionClassMap() { this.classMapper = new ClassMapper(); } + @SuppressWarnings("unchecked") public BiFunctionClassMap(BiFunctionClassMap other) { this.map = new HashMap<>(); for (var keyPair : other.map.entrySet()) {