From f1ab16ba731b94c5937f0e16278349cec4441f0b Mon Sep 17 00:00:00 2001 From: James Rogers Date: Wed, 17 Jun 2026 14:06:20 +0100 Subject: [PATCH 1/4] FEAT: Report unused code during the build via PMD. The Java compiler's -Xlint cannot detect unused local variables, private fields, private methods or private parameters. Add the maven-pmd-plugin to the parent POM, bound to the compile phase with failOnViolation=true, so these surface during a normal build and fail it. Also fix the unused local it exposed in TestOnPremiseBuilder_CreateTempFile by asserting the temp data file is actually created. --- ci/pmd-ruleset.xml | 36 +++++++++++++++++++ .../ipintelligence/IPIntelligenceTests.java | 4 +++ pom.xml | 34 ++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 ci/pmd-ruleset.xml diff --git a/ci/pmd-ruleset.xml b/ci/pmd-ruleset.xml new file mode 100644 index 0000000..644ad72 --- /dev/null +++ b/ci/pmd-ruleset.xml @@ -0,0 +1,36 @@ + + + + + Reports unused code as part of the build. The Java compiler's -Xlint + cannot detect unused local variables, private fields, private methods or + private/constructor parameters, so these slip through unnoticed. PMD fills + that gap. Kept deliberately narrow (unused declarations only) so the gate + stays meaningful and low-noise. + + Note: there is no reliable rule for "unused public class/method" - those may + form part of the published API and cannot be judged from this codebase alone, + so they are intentionally out of scope. + + + + + + + + + + + + + + + + + + diff --git a/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceTests.java b/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceTests.java index b40f3c6..55fcef7 100644 --- a/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceTests.java +++ b/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceTests.java @@ -43,6 +43,7 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -56,6 +57,7 @@ import static fiftyone.ipintelligence.shared.testhelpers.FileUtils.IP_ADDRESSES_FILE_NAME; import static fiftyone.pipeline.engines.Constants.PerformanceProfiles.*; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; @@ -230,6 +232,8 @@ public void TestOnPremiseBuilder_CreateTempFile() throws Exception { pipeline.getElement(IPIntelligenceOnPremiseEngine.class); String tempDir = engine.getTempDataDirPath(); Path tempPath = Paths.get(tempDir); + assertTrue("A temp data file should have been created under " + tempPath, + Files.exists(tempPath)); } } logger.info("Completed {} creations", i); diff --git a/pom.xml b/pom.xml index 0b1391c..f9796f9 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ 20211205 3.9.0 + 3.26.0 1.6.0 2.5.2 3.2.2 @@ -158,6 +159,39 @@ published + + + org.apache.maven.plugins + maven-pmd-plugin + ${maven-pmd-plugin.version} + + + + ${maven.multiModuleProjectDirectory}/ci/pmd-ruleset.xml + + + true + true + true + + false + + + + check-unused-code + compile + + check + + + + org.apache.maven.plugins maven-surefire-plugin From a00e867b08fdedf99e8710a726a95c30bed52522 Mon Sep 17 00:00:00 2001 From: James Rogers Date: Wed, 17 Jun 2026 15:38:57 +0100 Subject: [PATCH 2/4] CLEANUP --- ci/pmd-ruleset.xml | 6 ++---- pom.xml | 8 ++++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/ci/pmd-ruleset.xml b/ci/pmd-ruleset.xml index 644ad72..6866d59 100644 --- a/ci/pmd-ruleset.xml +++ b/ci/pmd-ruleset.xml @@ -7,11 +7,9 @@ Reports unused code as part of the build. The Java compiler's -Xlint cannot detect unused local variables, private fields, private methods or - private/constructor parameters, so these slip through unnoticed. PMD fills - that gap. Kept deliberately narrow (unused declarations only) so the gate - stays meaningful and low-noise. + private/constructor parameters. - Note: there is no reliable rule for "unused public class/method" - those may + Note: there is no reliable rule for "unused public class/method" as those may form part of the published API and cannot be judged from this codebase alone, so they are intentionally out of scope. diff --git a/pom.xml b/pom.xml index f9796f9..79d343c 100644 --- a/pom.xml +++ b/pom.xml @@ -163,9 +163,9 @@ org.apache.maven.plugins maven-pmd-plugin @@ -175,7 +175,7 @@ ${maven.multiModuleProjectDirectory}/ci/pmd-ruleset.xml - + true true true From 4b7afd8a1ce8b8b9044c5eea027a935bf77fc407 Mon Sep 17 00:00:00 2001 From: James Rogers Date: Fri, 19 Jun 2026 11:17:19 +0100 Subject: [PATCH 3/4] Merge remote-tracking branch 'origin/main' into fix/incorrect-ipi-nomenclature --- .vscode/settings.json | 3 +++ .../cloud/flowelements/IPIntelligenceCloudEngineTests.java | 1 - .../cloud/flowelements/MissingPropertyHandlingTests.java | 1 - .../engine/onpremise/data/DataValidatorHash.java | 3 --- .../OnPremiseIPIntelligenceEngineBuilderBase.java | 1 - .../ipintelligence/shared/testhelpers/FileUtilsTest.java | 1 - .../shared/testhelpers/ListRuntimeConfigTest.java | 1 - .../shared/testhelpers/data/MetaDataTests.java | 1 - .../shared/testhelpers/flowelements/ProcessTests.java | 3 --- .../IPIntelligenceOnPremisePipelineBuilder.java | 1 - .../IPIntelligenceOnPremisePipelineBuilderTest.java | 3 +-- .../java/fiftyone/ipintelligence/IPIntelligenceTests.java | 1 - pom.xml | 5 +++++ 13 files changed, 9 insertions(+), 16 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..c5f3f6b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.configuration.updateBuildConfiguration": "interactive" +} \ No newline at end of file diff --git a/ip-intelligence.cloud/src/test/java/fiftyone/ipintelligence/cloud/flowelements/IPIntelligenceCloudEngineTests.java b/ip-intelligence.cloud/src/test/java/fiftyone/ipintelligence/cloud/flowelements/IPIntelligenceCloudEngineTests.java index 6b14439..dc30c66 100644 --- a/ip-intelligence.cloud/src/test/java/fiftyone/ipintelligence/cloud/flowelements/IPIntelligenceCloudEngineTests.java +++ b/ip-intelligence.cloud/src/test/java/fiftyone/ipintelligence/cloud/flowelements/IPIntelligenceCloudEngineTests.java @@ -38,7 +38,6 @@ import java.net.InetAddress; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/ip-intelligence.cloud/src/test/java/fiftyone/ipintelligence/cloud/flowelements/MissingPropertyHandlingTests.java b/ip-intelligence.cloud/src/test/java/fiftyone/ipintelligence/cloud/flowelements/MissingPropertyHandlingTests.java index fa7ec56..2e860d0 100644 --- a/ip-intelligence.cloud/src/test/java/fiftyone/ipintelligence/cloud/flowelements/MissingPropertyHandlingTests.java +++ b/ip-intelligence.cloud/src/test/java/fiftyone/ipintelligence/cloud/flowelements/MissingPropertyHandlingTests.java @@ -26,7 +26,6 @@ import fiftyone.pipeline.cloudrequestengine.data.CloudRequestData; import fiftyone.pipeline.cloudrequestengine.flowelements.CloudRequestEngine; import fiftyone.pipeline.core.data.FlowData; -import fiftyone.pipeline.core.data.IWeightedValue; import fiftyone.pipeline.engines.data.AspectPropertyMetaData; import fiftyone.pipeline.engines.data.AspectPropertyMetaDataDefault; import fiftyone.pipeline.engines.data.AspectPropertyValue; diff --git a/ip-intelligence.engine.on-premise/src/test/java/fiftyone/ipintelligence/engine/onpremise/data/DataValidatorHash.java b/ip-intelligence.engine.on-premise/src/test/java/fiftyone/ipintelligence/engine/onpremise/data/DataValidatorHash.java index 017ee63..3ae0e1d 100644 --- a/ip-intelligence.engine.on-premise/src/test/java/fiftyone/ipintelligence/engine/onpremise/data/DataValidatorHash.java +++ b/ip-intelligence.engine.on-premise/src/test/java/fiftyone/ipintelligence/engine/onpremise/data/DataValidatorHash.java @@ -26,13 +26,10 @@ import fiftyone.ipintelligence.shared.IPIntelligenceData; import fiftyone.ipintelligence.shared.testhelpers.data.DataValidator; import fiftyone.pipeline.core.data.FlowData; -import fiftyone.pipeline.core.data.IWeightedValue; import fiftyone.pipeline.engines.data.AspectPropertyValue; import fiftyone.pipeline.engines.exceptions.NoValueException; import fiftyone.pipeline.engines.fiftyone.data.FiftyOneAspectPropertyMetaData; -import java.util.Arrays; -import java.util.List; import java.util.Map; import static org.junit.Assert.*; diff --git a/ip-intelligence.shared/src/main/java/fiftyone/ipintelligence/shared/flowelements/OnPremiseIPIntelligenceEngineBuilderBase.java b/ip-intelligence.shared/src/main/java/fiftyone/ipintelligence/shared/flowelements/OnPremiseIPIntelligenceEngineBuilderBase.java index a3612c7..52c90d9 100644 --- a/ip-intelligence.shared/src/main/java/fiftyone/ipintelligence/shared/flowelements/OnPremiseIPIntelligenceEngineBuilderBase.java +++ b/ip-intelligence.shared/src/main/java/fiftyone/ipintelligence/shared/flowelements/OnPremiseIPIntelligenceEngineBuilderBase.java @@ -24,7 +24,6 @@ import fiftyone.pipeline.engines.data.AspectData; import fiftyone.pipeline.engines.data.AspectPropertyMetaData; -import fiftyone.pipeline.engines.data.AspectPropertyValue; import fiftyone.pipeline.engines.fiftyone.flowelements.FiftyOneAspectEngine; import fiftyone.pipeline.engines.fiftyone.flowelements.FiftyOneOnPremiseAspectEngineBuilderBase; import fiftyone.pipeline.engines.services.DataUpdateService; diff --git a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/FileUtilsTest.java b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/FileUtilsTest.java index a06de96..bb1b302 100644 --- a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/FileUtilsTest.java +++ b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/FileUtilsTest.java @@ -22,7 +22,6 @@ package fiftyone.ipintelligence.shared.testhelpers; -import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/ListRuntimeConfigTest.java b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/ListRuntimeConfigTest.java index 14b85ca..bdf7aae 100644 --- a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/ListRuntimeConfigTest.java +++ b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/ListRuntimeConfigTest.java @@ -22,7 +22,6 @@ package fiftyone.ipintelligence.shared.testhelpers; -import org.junit.Ignore; import org.junit.Test; public class ListRuntimeConfigTest { diff --git a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/data/MetaDataTests.java b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/data/MetaDataTests.java index d4563f9..7a5f5e9 100644 --- a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/data/MetaDataTests.java +++ b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/data/MetaDataTests.java @@ -30,7 +30,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertEquals; diff --git a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/flowelements/ProcessTests.java b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/flowelements/ProcessTests.java index c2d0fbb..5b27366 100644 --- a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/flowelements/ProcessTests.java +++ b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/flowelements/ProcessTests.java @@ -27,10 +27,7 @@ import fiftyone.ipintelligence.shared.testhelpers.data.DataValidator; import fiftyone.pipeline.core.data.FlowData; -import java.util.Arrays; -import java.util.List; -import static fiftyone.pipeline.util.StringManipulation.stringJoin; public class ProcessTests { diff --git a/ip-intelligence/src/main/java/fiftyone/ipintelligence/IPIntelligenceOnPremisePipelineBuilder.java b/ip-intelligence/src/main/java/fiftyone/ipintelligence/IPIntelligenceOnPremisePipelineBuilder.java index 5904202..0ebff7a 100644 --- a/ip-intelligence/src/main/java/fiftyone/ipintelligence/IPIntelligenceOnPremisePipelineBuilder.java +++ b/ip-intelligence/src/main/java/fiftyone/ipintelligence/IPIntelligenceOnPremisePipelineBuilder.java @@ -34,7 +34,6 @@ import fiftyone.pipeline.engines.flowelements.AspectEngine; import fiftyone.pipeline.engines.flowelements.PrePackagedPipelineBuilderBase; import fiftyone.pipeline.engines.services.DataUpdateService; -import fiftyone.pipeline.engines.services.HttpClient; import org.slf4j.ILoggerFactory; import org.slf4j.LoggerFactory; diff --git a/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceOnPremisePipelineBuilderTest.java b/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceOnPremisePipelineBuilderTest.java index dd74516..98b386e 100644 --- a/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceOnPremisePipelineBuilderTest.java +++ b/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceOnPremisePipelineBuilderTest.java @@ -42,7 +42,6 @@ import java.io.File; import java.lang.reflect.Field; -import java.nio.file.Files; import java.util.List; import static org.junit.Assert.*; @@ -160,7 +159,7 @@ public void setDataFileSystemWatcher_PropertyPropagatedToDataFileConfiguration() @Test public void setDataUpdateService_RegisterDataFileTriggered() throws Exception { DataUpdateServiceDefault dataUpdateServiceDefault = mock(DataUpdateServiceDefault.class); - Pipeline pipeline = builder + builder .setAutoUpdate(true) .setDataUpdateService(dataUpdateServiceDefault) .build(); diff --git a/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceTests.java b/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceTests.java index 55fcef7..231e719 100644 --- a/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceTests.java +++ b/ip-intelligence/src/test/java/fiftyone/ipintelligence/IPIntelligenceTests.java @@ -58,7 +58,6 @@ import static fiftyone.pipeline.engines.Constants.PerformanceProfiles.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; diff --git a/pom.xml b/pom.xml index 79d343c..960e07d 100644 --- a/pom.xml +++ b/pom.xml @@ -181,6 +181,11 @@ true false + + + **/interop/swig/*.java + From c76302a71cb9f59fdf8789cedc037ad604ebd5fe Mon Sep 17 00:00:00 2001 From: James Rogers Date: Fri, 19 Jun 2026 12:25:15 +0100 Subject: [PATCH 4/4] FIX: address compiler warnings: Fix this-escape warning in MultiIPIDataCloud Declare MultiIPIDataCloud final to resolve the "possible 'this' escape before subclass is fully initialized" warning emitted by javac on JDK 21+ Replace java.util wildcard import in ValueTests with explicit imports Expand `import java.util.*` to the four types the test actually uses (ArrayList, Arrays, List, Map) in the shared module's ValueTests helper. Uncomment -Werror to make sure no warning regressions are introduced. --- .../ipintelligence/cloud/data/MultiIPIDataCloud.java | 2 +- .../ipintelligence/shared/testhelpers/data/ValueTests.java | 5 ++++- pom.xml | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ip-intelligence.cloud/src/main/java/fiftyone/ipintelligence/cloud/data/MultiIPIDataCloud.java b/ip-intelligence.cloud/src/main/java/fiftyone/ipintelligence/cloud/data/MultiIPIDataCloud.java index bd6d870..f25e0ed 100644 --- a/ip-intelligence.cloud/src/main/java/fiftyone/ipintelligence/cloud/data/MultiIPIDataCloud.java +++ b/ip-intelligence.cloud/src/main/java/fiftyone/ipintelligence/cloud/data/MultiIPIDataCloud.java @@ -41,7 +41,7 @@ * by the 51Degrees Cloud service when evidence matching multiple profiles is * provided. */ -public class MultiIPIDataCloud +public final class MultiIPIDataCloud extends AspectDataBase implements MultiProfileData { private static final String PROFILE_LIST_KEY = "profiles"; diff --git a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/data/ValueTests.java b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/data/ValueTests.java index bc03340..4934d97 100644 --- a/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/data/ValueTests.java +++ b/ip-intelligence.shared/src/test/java/fiftyone/ipintelligence/shared/testhelpers/data/ValueTests.java @@ -33,7 +33,10 @@ import fiftyone.pipeline.engines.fiftyone.data.FiftyOneAspectPropertyMetaData; import java.lang.reflect.Method; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; import static fiftyone.pipeline.util.StringManipulation.stringJoin; import static org.junit.Assert.*; diff --git a/pom.xml b/pom.xml index 960e07d..62ea847 100644 --- a/pom.xml +++ b/pom.xml @@ -120,7 +120,7 @@ true -Xlint:all,-try,-options - + -Werror