From 6658bc5ac41e78d230ec6d292d7e24b46154caa0 Mon Sep 17 00:00:00 2001 From: Holger Friedrich Date: Fri, 9 Oct 2026 23:55:10 +0200 Subject: [PATCH 1/3] Upgrade Checkstyle to 14.3.0, PMD to 7.28.0, SpotBugs to 4.10.4 - Checkstyle from 12.3.0 to 14.3.0 - PMD from 7.19.0 to 7.28.0 - SpotBugs from 4.9.8 to 4.10.4 Dependency upgrades: - JUnit from 6.0.1 to 6.1.3 - Mockito from 5.21.0 to 5.24.0 - commons-io from 2.21.0 to 2.22.0 - commons-lang3 from 3.20.0 to 3.21.0 - slf4j from 2.0.17 to 2.0.20 - logback from 1.5.23 to 1.6.5 - jsoup from 1.19.1 to 1.23.2 - maven-core from 3.9.12 to 3.10.0 - jakarta.xml.bind-api from 4.0.4 to 4.0.5 - jaxb-runtime from 4.0.6 to 4.0.9 - plexus-compiler-eclipse from 2.16.1 to 2.17.1 - Spotless from 3.10.3 to 3.10.4 - Jetty (tests) from 9.4.50 to 12.1.14 - Saxon 9.1.0.8 replaced by Saxon-HE 12.10 - hamcrest-library 3.0 replaced by hamcrest 3.0 - javax.activation 1.2.0 removed Code changes: - Rewrite MissingJavadocFilterCheck on AbstractCheck, because MissingJavadocTypeCheck can no longer be subclassed - Adapt AuthorTagCheck config to the WriteTagCheck API changes - Align the runtime tool versions with the compile versions (fixes NoSuchMethodError in user builds) Users may see new errors: - Malformed Javadoc now fails the build (javadoc.parse.rule.error) - Missing @author tags are now detected on annotated classes, which were silently skipped before Signed-off-by: Holger Friedrich --- .../checkstyle/MissingJavadocFilterCheck.java | 121 +++++++++++++++++- ...uthorContributionDescriptionCheckTest.java | 2 +- .../checkstyle/test/AuthorTagCheckTest.java | 26 ++-- .../AvoidScheduleAtFixedRateCheckTest.java | 2 +- ...eServicesDependencyInjectionCheckTest.java | 2 +- .../test/ForbiddenPackageUsageCheckTest.java | 2 +- .../checkstyle/test/InheritDocCheckTest.java | 2 +- .../test/JavadocMethodStyleCheckTest.java | 2 +- .../test/KarafAddonFeatureCheckTest.java | 4 +- .../test/KarafFeatureCheckTest.java | 2 +- .../checkstyle/test/MarkdownCheckTest.java | 2 +- .../test/MissingJavadocFilterCheckTest.java | 5 +- .../test/NoEmptyLineSeparatorCheckTest.java | 2 +- .../test/NullAnnotationsCheckTest.java | 2 +- .../test/OhInfXmlLabelCheckTest.java | 8 +- .../test/OhInfXmlUsageCheckTest.java | 2 +- .../test/OhInfXmlValidationCheckTest.java | 2 +- .../test/OnlyTabIndentationCheckTest.java | 2 +- .../test/OptionalFieldCheckTest.java | 2 +- ...ridingParentPomConfigurationCheckTest.java | 2 +- .../ParameterizedRegexpHeaderCheckTest.java | 2 +- .../checkstyle/test/PomXmlCheckTest.java | 2 +- .../test/RequiredFilesCheckTest.java | 2 +- .../analysis/utils/CachingHttpClientTest.java | 89 ++++++------- docs/maven-plugin.md | 2 +- pom.xml | 53 ++++---- sat-extension/pom.xml | 4 +- sat-plugin/pom.xml | 4 +- .../analysis/tools/CheckstyleChecker.java | 5 +- .../tools/analysis/tools/PmdChecker.java | 2 +- .../tools/analysis/tools/SpotBugsChecker.java | 2 +- .../resources/rulesets/checkstyle/rules.xml | 3 +- 32 files changed, 236 insertions(+), 128 deletions(-) diff --git a/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/MissingJavadocFilterCheck.java b/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/MissingJavadocFilterCheck.java index 77e2a570..e28a5405 100644 --- a/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/MissingJavadocFilterCheck.java +++ b/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/MissingJavadocFilterCheck.java @@ -12,34 +12,141 @@ */ package org.openhab.tools.analysis.checkstyle; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import com.puppycrawl.tools.checkstyle.api.AbstractCheck; import com.puppycrawl.tools.checkstyle.api.DetailAST; +import com.puppycrawl.tools.checkstyle.api.Scope; import com.puppycrawl.tools.checkstyle.api.TokenTypes; -import com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck; +import com.puppycrawl.tools.checkstyle.utils.AnnotationUtil; +import com.puppycrawl.tools.checkstyle.utils.CommonUtil; +import com.puppycrawl.tools.checkstyle.utils.JavadocUtil; +import com.puppycrawl.tools.checkstyle.utils.ScopeUtil; /** * Provides a filter that determines whether to check the inner units for a * javadoc. * + * Based on Checkstyle's MissingJavadocTypeCheck, which cannot be subclassed + * anymore since Checkstyle 14. + * * @author Petar Valchev - Initial contribution */ -public class MissingJavadocFilterCheck extends MissingJavadocTypeCheck { +public class MissingJavadocFilterCheck extends AbstractCheck { + + public static final String MSG_JAVADOC_MISSING = "javadoc.missing"; + + private final List javadocComments = new ArrayList<>(); + private boolean checkInnerUnits = false; + private Scope scope = Scope.PUBLIC; + private Scope excludeScope; + private Set skipAnnotations = Set.of("Generated"); // A configuration property that determines whether to check the inner units public void setCheckInnerUnits(boolean checkInnerUnits) { this.checkInnerUnits = checkInnerUnits; } + public void setScope(Scope scope) { + this.scope = scope; + } + + public void setExcludeScope(Scope excludeScope) { + this.excludeScope = excludeScope; + } + + public void setSkipAnnotations(String... userAnnotations) { + skipAnnotations = Set.of(userAnnotations); + } + + @Override + public boolean isCommentNodesRequired() { + return true; + } + + @Override + public int[] getDefaultTokens() { + return getAcceptableTokens(); + } + + @Override + public int[] getAcceptableTokens() { + return new int[] { TokenTypes.INTERFACE_DEF, TokenTypes.CLASS_DEF, TokenTypes.ENUM_DEF, + TokenTypes.ANNOTATION_DEF, TokenTypes.RECORD_DEF }; + } + + @Override + public int[] getRequiredTokens() { + return CommonUtil.EMPTY_INT_ARRAY; + } + + @Override + public void beginTree(DetailAST rootAST) { + javadocComments.clear(); + collectJavadocComments(rootAST); + } + @Override public void visitToken(DetailAST ast) { if (!checkInnerUnits) { DetailAST astParent = ast.getParent(); - // if outer class/interface/enum - if (astParent == null || astParent.getType() == TokenTypes.COMPILATION_UNIT) { - super.visitToken(ast); + // if not outer class/interface/enum + if (astParent != null && astParent.getType() != TokenTypes.COMPILATION_UNIT) { + return; + } + } + if (shouldCheck(ast) && !hasJavadoc(ast)) { + log(ast, MSG_JAVADOC_MISSING); + } + } + + private void collectJavadocComments(DetailAST rootAST) { + DetailAST current = rootAST; + while (current != null) { + if (current.getType() == TokenTypes.BLOCK_COMMENT_BEGIN && JavadocUtil.isJavadocComment(current)) { + javadocComments.add(current); + } + if (current.getFirstChild() != null) { + current = current.getFirstChild(); + } else { + DetailAST parent = current; + while (parent != null && current.getNextSibling() == null) { + current = parent; + parent = parent.getParent(); + } + current = current.getNextSibling(); + } + } + } + + private boolean shouldCheck(DetailAST ast) { + Scope surroundingScope = ScopeUtil.getSurroundingScope(ast).orElse(null); + return surroundingScope != null && surroundingScope.isIn(scope) + && (excludeScope == null || !surroundingScope.isIn(excludeScope)) + && !AnnotationUtil.containsAnnotation(ast, skipAnnotations); + } + + private boolean hasJavadoc(DetailAST ast) { + DetailAST closestJavadoc = null; + for (DetailAST comment : javadocComments) { + if (comment.getLineNo() <= ast.getLineNo()) { + closestJavadoc = comment; + } + } + return closestJavadoc != null && noInterveningCode(closestJavadoc, ast); + } + + private static boolean noInterveningCode(DetailAST javadoc, DetailAST type) { + int typeStartLine = type.getLineNo(); + for (DetailAST node = javadoc; node != null; node = node.getNextSibling()) { + if (node.getLineNo() < typeStartLine && node.getType() != TokenTypes.BLOCK_COMMENT_BEGIN + && node.getType() != TokenTypes.SINGLE_LINE_COMMENT) { + return false; } - } else { - super.visitToken(ast); } + return true; } } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AuthorContributionDescriptionCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AuthorContributionDescriptionCheckTest.java index 4d324f8c..f4f05078 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AuthorContributionDescriptionCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AuthorContributionDescriptionCheckTest.java @@ -46,7 +46,7 @@ public class AuthorContributionDescriptionCheckTest extends AbstractStaticCheckT private DefaultConfiguration configuration; @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/authorContributionDescriptionCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AuthorTagCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AuthorTagCheckTest.java index 5abf8e09..a83693fa 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AuthorTagCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AuthorTagCheckTest.java @@ -17,6 +17,7 @@ import org.openhab.tools.analysis.checkstyle.api.AbstractStaticCheckTest; import com.puppycrawl.tools.checkstyle.DefaultConfiguration; +import com.puppycrawl.tools.checkstyle.checks.javadoc.WriteTagCheck; import com.puppycrawl.tools.checkstyle.utils.CommonUtil; /** @@ -29,7 +30,7 @@ public class AuthorTagCheckTest extends AbstractStaticCheckTest { private static final String EXPECTED_WARNING_MESSAGE = "An author tag is missing"; @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/authorTagCheckTest"; } @@ -40,9 +41,9 @@ public void testOuterClassWithNoAuthorTag() throws Exception { * an error is expected at the line where the outer class is declared * in the file */ - int warningLine = 4; + String warningLocation = "4:1"; boolean checkInnerClasses = false; - checkFileForAuthorTags(checkInnerClasses, fileName, warningLine); + checkFileForAuthorTags(checkInnerClasses, fileName, warningLocation); } @Test @@ -52,10 +53,10 @@ public void testOuterAndInnerClassesWithNoAuthorTag() throws Exception { * errors are expected at the lines where the classes are declared in * the file */ - int firstWarningLine = 4; - int secondWarningLine = 9; + String firstWarningLocation = "4:1"; + String secondWarningLocation = "9:9"; boolean checkInnerClasses = true; - checkFileForAuthorTags(checkInnerClasses, fileName, firstWarningLine, secondWarningLine); + checkFileForAuthorTags(checkInnerClasses, fileName, firstWarningLocation, secondWarningLocation); } @Test @@ -92,14 +93,14 @@ public void testOuterAndInnerClassesWithPresentAuthorTag() throws Exception { checkFileForAuthorTags(checkInnerClasses, fileName); } - private void checkFileForAuthorTags(boolean checkInnerUnits, String fileName, Integer... warningLine) + private void checkFileForAuthorTags(boolean checkInnerUnits, String fileName, String... warningLocation) throws Exception { String filePath = getPath(fileName); String[] expected; - if (warningLine.length > 0) { - expected = new String[warningLine.length]; - for (int i = 0; i < warningLine.length; i++) { - expected[i] = warningLine[i] + ": " + EXPECTED_WARNING_MESSAGE; + if (warningLocation.length > 0) { + expected = new String[warningLocation.length]; + for (int i = 0; i < warningLocation.length; i++) { + expected[i] = warningLocation[i] + ": " + EXPECTED_WARNING_MESSAGE; } } else { expected = CommonUtil.EMPTY_STRING_ARRAY; @@ -118,9 +119,8 @@ private DefaultConfiguration createConfiguration(boolean checkInnerUnits) { */ configuration.addProperty("tag", "@author"); configuration.addProperty("tagFormat", "\\S"); - configuration.addProperty("tagSeverity", "ignore"); configuration.addProperty("checkInnerUnits", String.valueOf(checkInnerUnits)); - configuration.addMessage("type.missingTag", EXPECTED_WARNING_MESSAGE); + configuration.addMessage(WriteTagCheck.MSG_MISSING_TAG, EXPECTED_WARNING_MESSAGE); return configuration; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AvoidScheduleAtFixedRateCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AvoidScheduleAtFixedRateCheckTest.java index 0cbdf957..cc07b434 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AvoidScheduleAtFixedRateCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/AvoidScheduleAtFixedRateCheckTest.java @@ -31,7 +31,7 @@ public class AvoidScheduleAtFixedRateCheckTest extends AbstractStaticCheckTest { private final Configuration config = createModuleConfig(AvoidScheduleAtFixedRateCheck.class); @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/avoidScheduleAtFixedRateCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/DeclarativeServicesDependencyInjectionCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/DeclarativeServicesDependencyInjectionCheckTest.java index b2c5677a..6e059093 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/DeclarativeServicesDependencyInjectionCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/DeclarativeServicesDependencyInjectionCheckTest.java @@ -29,7 +29,7 @@ public class DeclarativeServicesDependencyInjectionCheckTest extends AbstractSta private static final String SERVICE_CUSTOMIZER_IMPLEMENTED = "Avoid using ServiceTrackerCustomizer for dependency injection, consider using Declarative Services"; @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/declarativeServicesDependencyInjectionTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/ForbiddenPackageUsageCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/ForbiddenPackageUsageCheckTest.java index c6ccd481..cf031438 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/ForbiddenPackageUsageCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/ForbiddenPackageUsageCheckTest.java @@ -36,7 +36,7 @@ public void setUp() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/ForbiddenPackageUsageCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/InheritDocCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/InheritDocCheckTest.java index 7f795377..5f49957b 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/InheritDocCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/InheritDocCheckTest.java @@ -30,7 +30,7 @@ public class InheritDocCheckTest extends AbstractStaticCheckTest { Configuration config = createModuleConfig(InheritDocCheck.class); @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/inheritDocCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/JavadocMethodStyleCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/JavadocMethodStyleCheckTest.java index b9cb709c..2e047165 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/JavadocMethodStyleCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/JavadocMethodStyleCheckTest.java @@ -33,7 +33,7 @@ public class JavadocMethodStyleCheckTest extends AbstractStaticCheckTest { private DefaultConfiguration configuration = createModuleConfig(JavadocMethodStyleCheck.class); @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/javadocMethodStyleCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/KarafAddonFeatureCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/KarafAddonFeatureCheckTest.java index bcf3dd88..a75e2b9b 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/KarafAddonFeatureCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/KarafAddonFeatureCheckTest.java @@ -19,7 +19,7 @@ import java.text.MessageFormat; import org.apache.commons.lang3.ArrayUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.openhab.tools.analysis.checkstyle.KarafAddonFeatureCheck; import org.openhab.tools.analysis.checkstyle.api.AbstractStaticCheckTest; @@ -36,7 +36,7 @@ public class KarafAddonFeatureCheckTest extends AbstractStaticCheckTest { private static final DefaultConfiguration CONFIGURATION = createModuleConfig(KarafAddonFeatureCheck.class); @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/karafAddonFeatureCheck"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/KarafFeatureCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/KarafFeatureCheckTest.java index 4b34865c..04621a74 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/KarafFeatureCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/KarafFeatureCheckTest.java @@ -48,7 +48,7 @@ public static void setUp() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/karafFeatureCheck"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/MarkdownCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/MarkdownCheckTest.java index 453d4eb1..266626e1 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/MarkdownCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/MarkdownCheckTest.java @@ -39,7 +39,7 @@ public void setUpClass() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/markdownCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/MissingJavadocFilterCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/MissingJavadocFilterCheckTest.java index 8f1a303f..81467d1b 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/MissingJavadocFilterCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/MissingJavadocFilterCheckTest.java @@ -17,7 +17,6 @@ import org.openhab.tools.analysis.checkstyle.api.AbstractStaticCheckTest; import com.puppycrawl.tools.checkstyle.DefaultConfiguration; -import com.puppycrawl.tools.checkstyle.checks.javadoc.MissingJavadocTypeCheck; import com.puppycrawl.tools.checkstyle.utils.CommonUtil; /** @@ -28,7 +27,7 @@ public class MissingJavadocFilterCheckTest extends AbstractStaticCheckTest { @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/missingJavadocFilterCheckTest"; } @@ -65,7 +64,7 @@ private void verifyJavadoc(String testFileName, boolean checkInnerClasses, Strin if (locations != null) { expectedMessages = new String[locations.length]; for (int i = 0; i < locations.length; i++) { - expectedMessages[i] = locations[i] + ": " + MissingJavadocTypeCheck.MSG_JAVADOC_MISSING; + expectedMessages[i] = locations[i] + ": " + MissingJavadocFilterCheck.MSG_JAVADOC_MISSING; } } else { expectedMessages = CommonUtil.EMPTY_STRING_ARRAY; diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NoEmptyLineSeparatorCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NoEmptyLineSeparatorCheckTest.java index 73e02aa5..dbf808e9 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NoEmptyLineSeparatorCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NoEmptyLineSeparatorCheckTest.java @@ -34,7 +34,7 @@ public class NoEmptyLineSeparatorCheckTest extends AbstractStaticCheckTest { private static DefaultConfiguration config = createModuleConfig(NoEmptyLineSeparatorCheck.class); @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/noEmptyLineSeparatorCheck"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NullAnnotationsCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NullAnnotationsCheckTest.java index 4188e4e5..1656b27e 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NullAnnotationsCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NullAnnotationsCheckTest.java @@ -34,7 +34,7 @@ public class NullAnnotationsCheckTest extends AbstractStaticCheckTest { private DefaultConfiguration configuration = createModuleConfig(NullAnnotationsCheck.class); @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/nullAnnotationsCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlLabelCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlLabelCheckTest.java index ac130d07..397632cd 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlLabelCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlLabelCheckTest.java @@ -19,8 +19,8 @@ import java.util.ArrayList; import java.util.stream.Stream; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.openhab.tools.analysis.checkstyle.OhInfXmlLabelCheck; import org.openhab.tools.analysis.checkstyle.OhInfXmlValidationCheck; import org.openhab.tools.analysis.checkstyle.api.AbstractStaticCheckTest; @@ -41,14 +41,14 @@ public class OhInfXmlLabelCheckTest extends AbstractStaticCheckTest { private DefaultConfiguration configuration; - @Before + @BeforeEach public void before() { configuration = createModuleConfig(OhInfXmlLabelCheck.class); configuration.addProperty("checkWordCasing", "true"); } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/ohInfXmlLabelCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlUsageCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlUsageCheckTest.java index 3f99d09e..48c2dabd 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlUsageCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlUsageCheckTest.java @@ -47,7 +47,7 @@ public class OhInfXmlUsageCheckTest extends AbstractStaticCheckTest { private static final DefaultConfiguration CONFIGURATION = createModuleConfig(OhInfXmlUsageCheck.class); @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/ohInfXmlUsageCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlValidationCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlValidationCheckTest.java index e142e7b2..f95d3bba 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlValidationCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OhInfXmlValidationCheckTest.java @@ -87,7 +87,7 @@ public static void tearDownClass() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/ohInfXmlValidationCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OnlyTabIndentationCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OnlyTabIndentationCheckTest.java index 4272d09b..7fc28210 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OnlyTabIndentationCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OnlyTabIndentationCheckTest.java @@ -40,7 +40,7 @@ public void setUpClass() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/onlyTabIndentationInXmlFilesCheck"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OptionalFieldCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OptionalFieldCheckTest.java index 36146740..d6a7c392 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OptionalFieldCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OptionalFieldCheckTest.java @@ -26,7 +26,7 @@ public class OptionalFieldCheckTest extends AbstractStaticCheckTest { @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/optionalFieldCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OverridingParentPomConfigurationCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OverridingParentPomConfigurationCheckTest.java index 28c544b2..af4e7348 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OverridingParentPomConfigurationCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/OverridingParentPomConfigurationCheckTest.java @@ -38,7 +38,7 @@ public static void createConfiguration() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/overridingParentPomConfigurationCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/ParameterizedRegexpHeaderCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/ParameterizedRegexpHeaderCheckTest.java index 14146009..7fde4d4b 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/ParameterizedRegexpHeaderCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/ParameterizedRegexpHeaderCheckTest.java @@ -43,7 +43,7 @@ public void createConfiguration() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/parameterizedRegexpHeaderCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/PomXmlCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/PomXmlCheckTest.java index 1f087e68..946ac77f 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/PomXmlCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/PomXmlCheckTest.java @@ -50,7 +50,7 @@ public static void setUpClass() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/pomXmlCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/RequiredFilesCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/RequiredFilesCheckTest.java index 52347b1a..ed345810 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/RequiredFilesCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/RequiredFilesCheckTest.java @@ -55,7 +55,7 @@ public static void setUpClass() { } @Override - protected String getPackageLocation() { + public String getPackageLocation() { return "checkstyle/requiredFilesCheckTest"; } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/utils/CachingHttpClientTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/utils/CachingHttpClientTest.java index 7ab9456a..f0c4b487 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/utils/CachingHttpClientTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/utils/CachingHttpClientTest.java @@ -15,42 +15,37 @@ import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; import java.io.FileNotFoundException; import java.io.IOException; import java.net.MalformedURLException; +import java.net.URI; import java.net.URL; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.concurrent.atomic.AtomicInteger; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - +import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpMethod; import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.io.Content; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; +import org.eclipse.jetty.server.Response; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.util.Callback; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.stubbing.Answer; /** * Tests for {@link CachingHttpClient} * * @author Svilen Valkanov - Initial contribution */ -@ExtendWith(MockitoExtension.class) public class CachingHttpClientTest { private static final String PATH_TO_RESOURCE = "/found"; @@ -61,10 +56,35 @@ public class CachingHttpClientTest { private static final String SERVER_RESPONSE = "content"; private static Server server; + private static TestHandler handler = new TestHandler(); private ContentReceivedCallback testCallback = String::new; private CachingHttpClient testClient = new CachingHttpClient<>(testCallback); + /** + * Serves {@link #SERVER_RESPONSE} for {@link #PATH_TO_RESOURCE} and counts the received requests. + * Requests that are not handled are answered with 404 by the server. + */ + private static class TestHandler extends Handler.Abstract { + private final AtomicInteger requestCount = new AtomicInteger(); + private volatile boolean responding = true; + + @Override + public boolean handle(Request request, Response response, Callback callback) { + requestCount.incrementAndGet(); + + assertThat(request.getMethod(), is(HttpMethod.GET.asString())); + + if (!responding || !Request.getPathInContext(request).startsWith(PATH_TO_RESOURCE)) { + return false; + } + response.setStatus(HttpStatus.OK_200); + response.getHeaders().put(HttpHeader.CONTENT_TYPE, "text/html"); + Content.Sink.write(response, true, SERVER_RESPONSE + System.lineSeparator(), callback); + return true; + } + } + @BeforeAll public static void setUp() throws Exception { server = new Server(); @@ -75,7 +95,6 @@ public static void setUp() throws Exception { http.setIdleTimeout(TEST_TIMEOUT); server.addConnector(http); - Handler handler = Mockito.mock(Handler.class); server.setHandler(handler); try { @@ -93,33 +112,9 @@ public static void tearDown() throws Exception { } @BeforeEach - public void clearInteractionsWithServer() throws Exception { - Handler handler = server.getHandler(); - Mockito.reset(handler); - mockHandler(handler); - } - - private void mockHandler(Handler handler) throws IOException, ServletException { - Mockito.doAnswer((Answer) invocation -> { - Object[] arguments = invocation.getArguments(); - - Request baseRequest = (Request) arguments[2]; - HttpServletRequest request = (HttpServletRequest) arguments[2]; - HttpServletResponse response = (HttpServletResponse) arguments[3]; - - baseRequest.setHandled(true); - - assertThat(request.getMethod(), is(HttpMethod.GET.asString())); - - if (request.getPathInfo().startsWith(PATH_TO_RESOURCE)) { - response.setStatus(HttpStatus.OK_200); - response.setContentType("text/html"); - response.getWriter().println(SERVER_RESPONSE); - } else { - response.setStatus(HttpStatus.NOT_FOUND_404); - } - return null; - }).when(handler).handle(any(), any(), any(), any()); + public void resetHandler() { + handler.requestCount.set(0); + handler.responding = true; } @Test @@ -139,7 +134,7 @@ public void testMultipleUnsuccessfulRequests() throws Exception { assertNull(testClient.get(unreachableURL)); assertNull(testClient.get(unreachableURL)); - verify(server.getHandler(), times(1)).handle(any(), any(), any(), any()); + assertEquals(1, handler.requestCount.get()); } @Test @@ -150,7 +145,7 @@ public void testMultipleSuccessfulRequests() throws Exception { assertNotNull(testClient.get(reachableURL)); assertNotNull(testClient.get(reachableURL)); - verify(server.getHandler(), times(1)).handle(any(), any(), any(), any()); + assertEquals(1, handler.requestCount.get()); } @Test @@ -159,10 +154,10 @@ public void testSuccessAndFailure() throws Exception { assertNotNull(testClient.get(url)); // The server stops responding - Mockito.doNothing().when(server.getHandler()).handle(any(), any(), any(), any()); + handler.responding = false; assertNotNull(testClient.get(url)); - verify(server.getHandler(), times(1)).handle(any(), any(), any(), any()); + assertEquals(1, handler.requestCount.get()); } @Test @@ -170,7 +165,7 @@ public void testFailureAndSuccess() throws Exception { URL url = getUniqueURL(PATH_TO_RESOURCE); // The server stops responding - Mockito.doNothing().when(server.getHandler()).handle(any(), any(), any(), any()); + handler.responding = false; // First request throws exception, because a get request is sent try { @@ -181,17 +176,17 @@ public void testFailureAndSuccess() throws Exception { assertThat(e.getCause(), instanceOf(FileNotFoundException.class)); } - mockHandler(server.getHandler()); + handler.responding = true; // Next requests do not throw exception assertNull(testClient.get(url)); assertNull(testClient.get(url)); - verify(server.getHandler(), times(1)).handle(any(), any(), any(), any()); + assertEquals(1, handler.requestCount.get()); } private URL getUniqueURL(String path) throws MalformedURLException { String fileName = new SimpleDateFormat("mmssSSS'.txt'").format(new Date()); - return new URL("http", TEST_HOST, TEST_PORT, path + "/" + fileName); + return URI.create("http://" + TEST_HOST + ":" + TEST_PORT + path + "/" + fileName).toURL(); } } diff --git a/docs/maven-plugin.md b/docs/maven-plugin.md index d901e27a..c0bf0f06 100644 --- a/docs/maven-plugin.md +++ b/docs/maven-plugin.md @@ -118,7 +118,7 @@ Parameters: | **spotbugsInclude** | String | Relative path to the XML that specifies the bug instances that will be included in the report. If not set the default file will be used| | **spotbugsExclude** | String | Relative path to the XML that specifies the bug instances that will be excluded from the report. If not set the default file will be used| | **maven.spotbugs.version** | String | The version of the spotbugs-maven-plugin that will be used (default value is **4.9.8.2**) | -| **spotbugs.version** | String | The version of SpotBugs that will be used (default value is **4.9.8**) | +| **spotbugs.version** | String | The version of SpotBugs that will be used (default value is **4.10.4**) | | **spotbugsPlugins** | List | A list with artifacts that contain additional detectors/patterns for SpotBugs | | **findbugs.slf4j.version** | String | The version of the findbugs-slf4j plugin that will be used (default value is **1.5.0**)| diff --git a/pom.xml b/pom.xml index b99bac72..1751d9ae 100644 --- a/pom.xml +++ b/pom.xml @@ -59,33 +59,33 @@ 21 ${oh.java.version} 2.10 - 6.0.1 - 2.21.0 - 3.20.0 - 5.21.0 + 6.1.3 + 2.22.0 + 3.21.0 + 5.24.0 3.5.0 - 7.19.0 - 12.3.0 - 4.9.8 - 3.9.12 + 7.28.0 + 14.3.0 + 4.10.4 + 3.10.0 3.10.0 3.16.0 3.16.0 3.16.0 2.4.1 - 1.19.1 + 1.23.2 0.18.0 2.4.100 0.64.8 3.6.0 - 9.4.50.v20221201 - 9.1.0.8 - 3.10.3 + 12.1.14 + 12.10 + 3.10.4 4.25 4.21.0 - 2.0.17 - 1.5.23 + 2.0.20 + 1.6.5 2.4.0 target/dependency 2.2.0 @@ -95,24 +95,19 @@ jakarta.xml.bind jakarta.xml.bind-api - 4.0.4 + 4.0.5 org.glassfish.jaxb jaxb-runtime - 4.0.6 + 4.0.9 org.hamcrest - hamcrest-library + hamcrest 3.0 test - - com.sun.activation - javax.activation - 1.2.0 - org.junit.jupiter junit-jupiter-api @@ -131,6 +126,13 @@ truth 1.4.5 test + + + + junit + junit + + org.mockito @@ -403,7 +405,12 @@ org.codehaus.plexus plexus-compiler-eclipse - 2.16.1 + 2.17.1 + + + org.codehaus.plexus + plexus-compiler-api + 2.17.1 org.eclipse.jdt diff --git a/sat-extension/pom.xml b/sat-extension/pom.xml index 5f5803bc..0d141eef 100644 --- a/sat-extension/pom.xml +++ b/sat-extension/pom.xml @@ -33,8 +33,8 @@ - net.sourceforge.saxon - saxon + net.sf.saxon + Saxon-HE ${saxon.version} diff --git a/sat-plugin/pom.xml b/sat-plugin/pom.xml index 12bb3fd4..167ed8d9 100644 --- a/sat-plugin/pom.xml +++ b/sat-plugin/pom.xml @@ -64,8 +64,8 @@ - net.sourceforge.saxon - saxon + net.sf.saxon + Saxon-HE ${saxon.version} diff --git a/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/CheckstyleChecker.java b/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/CheckstyleChecker.java index c7ce56b0..ff0adda7 100644 --- a/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/CheckstyleChecker.java +++ b/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/CheckstyleChecker.java @@ -117,8 +117,9 @@ public void execute() throws MojoExecutionException { } checkstylePlugins.add(dependency("org.openhab.tools.sat.custom-checks", "checkstyle", plugin.getVersion())); - // Maven may load an older version, if no version is specified - checkstylePlugins.add(dependency("com.puppycrawl.tools", "checkstyle", "12.3.0")); + // Maven may load an older version, if no version is specified. + // Must match ${checkstyle.version} in the root pom.xml, which the custom checks are compiled against. + checkstylePlugins.add(dependency("com.puppycrawl.tools", "checkstyle", "14.3.0")); checkstylePlugins.forEach(logDependency()); String baseDir = mavenProject.getBasedir().toString(); diff --git a/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/PmdChecker.java b/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/PmdChecker.java index 03b9ea18..aa22c0ea 100644 --- a/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/PmdChecker.java +++ b/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/PmdChecker.java @@ -69,7 +69,7 @@ public class PmdChecker extends AbstractChecker { @Parameter private List pmdPlugins = new ArrayList<>(); - private static final String PMD_VERSION = "7.19.0"; + private static final String PMD_VERSION = "7.28.0"; /** * Location of the properties files that contains configuration options for the maven-pmd-plugin */ diff --git a/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/SpotBugsChecker.java b/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/SpotBugsChecker.java index 044ea1a7..acdf5462 100644 --- a/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/SpotBugsChecker.java +++ b/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/SpotBugsChecker.java @@ -95,7 +95,7 @@ public class SpotBugsChecker extends AbstractChecker { /** * The version of the spotbugs that will be used */ - @Parameter(property = "spotbugs.version", defaultValue = "4.9.8") + @Parameter(property = "spotbugs.version", defaultValue = "4.10.4") private String spotBugsVersion; /** diff --git a/sat-plugin/src/main/resources/rulesets/checkstyle/rules.xml b/sat-plugin/src/main/resources/rulesets/checkstyle/rules.xml index f94b5b50..e91f3cbc 100644 --- a/sat-plugin/src/main/resources/rulesets/checkstyle/rules.xml +++ b/sat-plugin/src/main/resources/rulesets/checkstyle/rules.xml @@ -161,8 +161,7 @@ - - + From c6f6e2653663825d4cf8996382cd83201080dd12 Mon Sep 17 00:00:00 2001 From: Holger Friedrich Date: Mon, 12 Oct 2026 19:48:01 +0200 Subject: [PATCH 2/3] review Signed-off-by: Holger Friedrich --- .../tools/analysis/checkstyle/MissingJavadocFilterCheck.java | 2 ++ docs/maven-plugin.md | 4 ++-- pom.xml | 2 +- .../org/openhab/tools/analysis/tools/SpotBugsChecker.java | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/MissingJavadocFilterCheck.java b/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/MissingJavadocFilterCheck.java index e28a5405..1a75f0b1 100644 --- a/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/MissingJavadocFilterCheck.java +++ b/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/MissingJavadocFilterCheck.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Set; +import com.puppycrawl.tools.checkstyle.FileStatefulCheck; import com.puppycrawl.tools.checkstyle.api.AbstractCheck; import com.puppycrawl.tools.checkstyle.api.DetailAST; import com.puppycrawl.tools.checkstyle.api.Scope; @@ -34,6 +35,7 @@ * * @author Petar Valchev - Initial contribution */ +@FileStatefulCheck public class MissingJavadocFilterCheck extends AbstractCheck { public static final String MSG_JAVADOC_MISSING = "javadoc.missing"; diff --git a/docs/maven-plugin.md b/docs/maven-plugin.md index c0bf0f06..7c3f2190 100644 --- a/docs/maven-plugin.md +++ b/docs/maven-plugin.md @@ -117,8 +117,8 @@ Parameters: | **spotbugsRuleset** | String | Relative path to the XML that specifies the bug detectors which should be run. If not set the default file will be used| | **spotbugsInclude** | String | Relative path to the XML that specifies the bug instances that will be included in the report. If not set the default file will be used| | **spotbugsExclude** | String | Relative path to the XML that specifies the bug instances that will be excluded from the report. If not set the default file will be used| -| **maven.spotbugs.version** | String | The version of the spotbugs-maven-plugin that will be used (default value is **4.9.8.2**) | -| **spotbugs.version** | String | The version of SpotBugs that will be used (default value is **4.10.4**) | +| **maven.spotbugs.version** | String | The version of the spotbugs-maven-plugin that will be used (default value is **4.10.5.0**) | +| **spotbugs.version** | String | The version of SpotBugs that will be used (default value is **4.10.5**) | | **spotbugsPlugins** | List | A list with artifacts that contain additional detectors/patterns for SpotBugs | | **findbugs.slf4j.version** | String | The version of the findbugs-slf4j plugin that will be used (default value is **1.5.0**)| diff --git a/pom.xml b/pom.xml index 1751d9ae..fac88136 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ 3.5.0 7.28.0 14.3.0 - 4.10.4 + 4.10.5 3.10.0 3.10.0 3.16.0 diff --git a/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/SpotBugsChecker.java b/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/SpotBugsChecker.java index acdf5462..d1449c8b 100644 --- a/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/SpotBugsChecker.java +++ b/sat-plugin/src/main/java/org/openhab/tools/analysis/tools/SpotBugsChecker.java @@ -83,7 +83,7 @@ public class SpotBugsChecker extends AbstractChecker { /** * The version of the spotbugs-maven-plugin that will be used */ - @Parameter(property = "maven.spotbugs.version", defaultValue = "4.9.8.2") + @Parameter(property = "maven.spotbugs.version", defaultValue = "4.10.5.0") private String spotbugsMavenPluginVersion; /** @@ -95,7 +95,7 @@ public class SpotBugsChecker extends AbstractChecker { /** * The version of the spotbugs that will be used */ - @Parameter(property = "spotbugs.version", defaultValue = "4.10.4") + @Parameter(property = "spotbugs.version", defaultValue = "4.10.5") private String spotBugsVersion; /** From e865b5b3c14da87ffb5e0175c46d85c09886b0f6 Mon Sep 17 00:00:00 2001 From: Holger Friedrich Date: Mon, 12 Oct 2026 21:01:33 +0200 Subject: [PATCH 3/3] Fix NoEmptyLineSeparatorCheck depending on file order The case group flags were never reset, so after a case without braces, empty lines in later blocks (also in other files) were missed or misreported. Reset them per token and add a regression test. Signed-off-by: Holger Friedrich --- .../checkstyle/NoEmptyLineSeparatorCheck.java | 11 ++++++++++ .../test/NoEmptyLineSeparatorCheckTest.java | 8 +++++++ ...yLineInMethodAfterSwitchWithoutBraces.java | 21 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 custom-checks/checkstyle/src/test/resources/checkstyle/noEmptyLineSeparatorCheck/EmptyLineInMethodAfterSwitchWithoutBraces.java diff --git a/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/NoEmptyLineSeparatorCheck.java b/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/NoEmptyLineSeparatorCheck.java index 7aa6ff32..cfb2c356 100644 --- a/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/NoEmptyLineSeparatorCheck.java +++ b/custom-checks/checkstyle/src/main/java/org/openhab/tools/analysis/checkstyle/NoEmptyLineSeparatorCheck.java @@ -12,6 +12,7 @@ */ package org.openhab.tools.analysis.checkstyle; +import com.puppycrawl.tools.checkstyle.FileStatefulCheck; import com.puppycrawl.tools.checkstyle.api.AbstractCheck; import com.puppycrawl.tools.checkstyle.api.DetailAST; import com.puppycrawl.tools.checkstyle.api.TokenTypes; @@ -68,6 +69,7 @@ * @author Svilen Valkanov - Initial contribution * @author Tanya Georgieva - Added check for switch statement without braces */ +@FileStatefulCheck public class NoEmptyLineSeparatorCheck extends AbstractCheck { private static final String MSG_LINE_AFTER_OPENING_BRACE_EMPTY = "Remove empty line after opening brace"; @@ -117,6 +119,14 @@ public int[] getRequiredTokens() { @Override public void visitToken(DetailAST ast) { + // the case group flags are set in findRightCurly when visiting a case group, and are reused by its case and + // default labels, which are visited right after it. They must not leak into any other block. + if (ast.getType() != TokenTypes.LITERAL_CASE && ast.getType() != TokenTypes.LITERAL_DEFAULT) { + isCaseGroupWithoutBraces = false; + isCaseGroupWithoutListOfStatements = false; + isCaseGroupWithBraces = false; + } + DetailAST leftCurly = findLeftCurly(ast); DetailAST rightCurly = findRightCurly(ast); @@ -275,6 +285,7 @@ private DetailAST findRightCurly(DetailAST ast) { * } */ isCaseGroupWithoutListOfStatements = true; + isCaseGroupWithoutBraces = true; return findRightCurlyInBlock(ast); } } diff --git a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NoEmptyLineSeparatorCheckTest.java b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NoEmptyLineSeparatorCheckTest.java index dbf808e9..3bd2e051 100644 --- a/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NoEmptyLineSeparatorCheckTest.java +++ b/custom-checks/checkstyle/src/test/java/org/openhab/tools/analysis/checkstyle/test/NoEmptyLineSeparatorCheckTest.java @@ -245,6 +245,14 @@ public void verifyValidEmptyDefault() throws Exception { verifyJavaFileNoErrors("ValidEmptyDefaultDefinition.java"); } + @Test + public void verifyEmptyLineInMethodAfterSwitchWithoutBraces() throws Exception { + // the state of a case group without braces must not leak into the following blocks + String[] expectedMessages = generateExpectedMessages(13, MSG_LINE_AFTER_OPENING_BRACE_EMPTY, 15, + MSG_LINE_BEFORE_CLOSING_BRACE_EMPTY); + verifyJavaFile("EmptyLineInMethodAfterSwitchWithoutBraces.java", expectedMessages); + } + private void verifyJavaFile(String testFileName, String[] expectedMessages) throws Exception { String absolutePathToTestFile = getPath(testFileName); verify(config, absolutePathToTestFile, expectedMessages); diff --git a/custom-checks/checkstyle/src/test/resources/checkstyle/noEmptyLineSeparatorCheck/EmptyLineInMethodAfterSwitchWithoutBraces.java b/custom-checks/checkstyle/src/test/resources/checkstyle/noEmptyLineSeparatorCheck/EmptyLineInMethodAfterSwitchWithoutBraces.java new file mode 100644 index 00000000..40921ed4 --- /dev/null +++ b/custom-checks/checkstyle/src/test/resources/checkstyle/noEmptyLineSeparatorCheck/EmptyLineInMethodAfterSwitchWithoutBraces.java @@ -0,0 +1,21 @@ +public class TestExample { + + public int switchWithoutBraces(int x) { + switch (x) { + case 1: + return 1; + default: + return 0; + } + } + + public void methodAfterSwitch() { + + other(); + + } + + public void other() { + System.out.println("other"); + } +}