From 31526f998875f2d66e237d231b64a24a501abbc7 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 2 Jul 2026 12:48:50 +0200 Subject: [PATCH 1/6] chore: Improve logging during tests at waitForPMDJobs --- .../sourceforge/pmd/eclipse/EclipseUtils.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java index 63753d62..5b0e83b2 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java @@ -36,6 +36,8 @@ import org.eclipse.jdt.launching.IVMInstall; import org.eclipse.jdt.launching.JavaRuntime; import org.junit.Assert; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import net.sourceforge.pmd.eclipse.runtime.PMDRuntimeConstants; import net.sourceforge.pmd.eclipse.runtime.builder.PMDNature; @@ -50,6 +52,8 @@ * @author Brian Remedios */ public final class EclipseUtils { + private static final Logger LOG = LoggerFactory.getLogger(EclipseUtils.class); + /** * Because this class is a utility class, it cannot be instantiated */ @@ -365,22 +369,46 @@ public static void createFolders(IProject testProject, String fullpath) throws C } public static void waitForPMDJobs() throws InterruptedException { + LOG.debug("waitForPMDJobs started..."); long start = System.currentTimeMillis(); String jobName = new ReviewCodeCmd().getName(); - while (hasPMDJob(Job.getJobManager().find(null), jobName)) { + while (findPMDJob(Job.getJobManager().find(null), jobName) != null) { Thread.sleep(500); if (System.currentTimeMillis() - start > TimeUnit.MINUTES.toMillis(1)) { + Job job = findPMDJob(Job.getJobManager().find(null), jobName); + if (job != null) { + final String state; + switch (job.getState()) { + case Job.SLEEPING: + state = "sleeping"; + break; + case Job.RUNNING: + state = "running"; + break; + case Job.WAITING: + state = "waiting"; + break; + case Job.NONE: + state = "none"; + break; + default: + state = "unknown"; + break; + } + LOG.debug("Still running? {}. state={}", job.getName(), state); + } Assert.fail("Timeout while waiting for Job " + jobName + " to finish"); } } + LOG.debug("waitForPMDJobs finished in {} ms", System.currentTimeMillis() - start); } - private static boolean hasPMDJob(Job[] jobs, String jobName) { + private static Job findPMDJob(Job[] jobs, String jobName) { for (Job job : jobs) { if (job.getName().equals(jobName)) { - return true; + return job; } } - return false; + return null; } } From 660bf49fa4563a27a374923bcd350c486f31f242 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 2 Jul 2026 13:08:11 +0200 Subject: [PATCH 2/6] chore: Include test classname in log output --- .../sourceforge/pmd/eclipse/EclipseUtils.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java index 5b0e83b2..11892d74 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java @@ -8,10 +8,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; +import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; @@ -395,12 +397,23 @@ public static void waitForPMDJobs() throws InterruptedException { state = "unknown"; break; } - LOG.debug("Still running? {}. state={}", job.getName(), state); + LOG.debug("Still running after {} ms? {}. state={}, testClass={}", + System.currentTimeMillis() - start, + job.getName(), state, determineTestClass()); } Assert.fail("Timeout while waiting for Job " + jobName + " to finish"); } } - LOG.debug("waitForPMDJobs finished in {} ms", System.currentTimeMillis() - start); + LOG.debug("waitForPMDJobs finished in {} ms ({})", System.currentTimeMillis() - start, determineTestClass()); + } + + private static String determineTestClass() { + Exception exception = new Exception(); + Optional testClass = Arrays.stream(exception.getStackTrace()) + .map(e -> e.getClassName()) + .filter(s -> s.endsWith("Test")) + .findFirst(); + return testClass.orElse("unkown"); } private static Job findPMDJob(Job[] jobs, String jobName) { From 05a950df8ed68e7d7eff522c02382b10e2411872 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 2 Jul 2026 13:08:46 +0200 Subject: [PATCH 3/6] chore: Increase timeout for waitForPMDJobs to 2 minutes --- .../src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java index 11892d74..fec60b7d 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java @@ -376,7 +376,7 @@ public static void waitForPMDJobs() throws InterruptedException { String jobName = new ReviewCodeCmd().getName(); while (findPMDJob(Job.getJobManager().find(null), jobName) != null) { Thread.sleep(500); - if (System.currentTimeMillis() - start > TimeUnit.MINUTES.toMillis(1)) { + if (System.currentTimeMillis() - start > TimeUnit.MINUTES.toMillis(2)) { Job job = findPMDJob(Job.getJobManager().find(null), jobName); if (job != null) { final String state; From bfcb7350eb7673dfdf9d4a4fd1d9f52376596265 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 2 Jul 2026 13:09:01 +0200 Subject: [PATCH 4/6] doc: Update release notes --- ReleaseNotes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ReleaseNotes.md b/ReleaseNotes.md index 043f724f..b3cf720f 100644 --- a/ReleaseNotes.md +++ b/ReleaseNotes.md @@ -16,6 +16,7 @@ This is a minor release. ### 🐛 Fixed Issues ### ✨ Merged pull requests +* [#431](https://github.com/pmd/pmd-eclipse-plugin/pull/431): chore: Improve logging during tests at waitForPMDJobs - [Andreas Dangel](https://github.com/adangel) (@adangel) ### 📦 Dependency updates From 82052a35e9794b0a469266ecdafe69c7e2665957 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 2 Jul 2026 15:51:34 +0200 Subject: [PATCH 5/6] chore: Include test method name --- .../sourceforge/pmd/eclipse/EclipseUtils.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java index fec60b7d..193d791f 100644 --- a/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java +++ b/net.sourceforge.pmd.eclipse.plugin.test/src/main/java/net/sourceforge/pmd/eclipse/EclipseUtils.java @@ -11,12 +11,13 @@ import java.util.Arrays; import java.util.Collection; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; @@ -409,11 +410,14 @@ public static void waitForPMDJobs() throws InterruptedException { private static String determineTestClass() { Exception exception = new Exception(); - Optional testClass = Arrays.stream(exception.getStackTrace()) - .map(e -> e.getClassName()) - .filter(s -> s.endsWith("Test")) - .findFirst(); - return testClass.orElse("unkown"); + List methods = Arrays.stream(exception.getStackTrace()) + .filter(e -> e.getClassName().endsWith("Test")) + .map(e -> e.getClassName() + "#" + e.getMethodName()) + .collect(Collectors.toList()); + if (methods.isEmpty()) { + return "unknown"; + } + return methods.get(methods.size() - 1); // take the last method - the entry point into the test class } private static Job findPMDJob(Job[] jobs, String jobName) { From a6267759c82cd0486758bd43accdbd35925679b1 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 2 Jul 2026 15:52:23 +0200 Subject: [PATCH 6/6] fix: Handle already closed resources in MarkerPropertyTester This avoids IllegalStateExceptions --- .../pmd/eclipse/ui/properties/MarkerPropertyTester.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/MarkerPropertyTester.java b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/MarkerPropertyTester.java index 0401dd17..e48cbcf9 100644 --- a/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/MarkerPropertyTester.java +++ b/net.sourceforge.pmd.eclipse.plugin/src/main/java/net/sourceforge/pmd/eclipse/ui/properties/MarkerPropertyTester.java @@ -19,6 +19,11 @@ public boolean test(Object receiver, String property, Object[] args, Object expe IMarker marker = (IMarker) receiver; + // during shutdown, the files/resources might have already been closed + if (!marker.exists()) { + return false; + } + try { return marker.getType().startsWith(PMDPlugin.PLUGIN_ID); } catch (CoreException e) {