From c7e4d821bc6d6a5a3617e332a159488bac80d0c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 5 Mar 2022 14:11:43 +0100 Subject: [PATCH 1/8] Fix ConfigurationTest --- .../net/sourceforge/pmd/PMDConfiguration.java | 3 +++ .../sourceforge/pmd/ConfigurationTest.java | 21 +++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/PMDConfiguration.java b/pmd-core/src/main/java/net/sourceforge/pmd/PMDConfiguration.java index 343881f91d..88bad86b68 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/PMDConfiguration.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/PMDConfiguration.java @@ -342,6 +342,9 @@ public class PMDConfiguration extends AbstractConfiguration { */ @Deprecated public String getRuleSets() { + if (ruleSets.isEmpty()) { + return null; + } return StringUtils.join(ruleSets, ","); } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/ConfigurationTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/ConfigurationTest.java index fd15441fa6..d00cf923ce 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/ConfigurationTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/ConfigurationTest.java @@ -4,9 +4,13 @@ package net.sourceforge.pmd; +import static net.sourceforge.pmd.util.CollectionUtil.listOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; @@ -16,6 +20,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.util.Collections; import java.util.Properties; import org.junit.Assert; @@ -112,13 +117,25 @@ public class ConfigurationTest { } @Test - public void testRuleSets() { + public void testRuleSetsLegacy() { PMDConfiguration configuration = new PMDConfiguration(); - assertEquals("Default RuleSets", null, configuration.getRuleSets()); + assertNull("Default RuleSets", configuration.getRuleSets()); configuration.setRuleSets("/rulesets/basic.xml"); assertEquals("Changed RuleSets", "/rulesets/basic.xml", configuration.getRuleSets()); } + @Test + public void testRuleSets() { + PMDConfiguration configuration = new PMDConfiguration(); + assertThat(configuration.getRuleSetPaths(), empty()); + configuration.setRuleSets(listOf("/rulesets/basic.xml")); + assertEquals(listOf("/rulesets/basic.xml"), configuration.getRuleSetPaths()); + configuration.addRuleSet("foo.xml"); + assertEquals(listOf("/rulesets/basic.xml", "foo.xml"), configuration.getRuleSetPaths()); + configuration.setRuleSets(Collections.emptyList()); + assertThat(configuration.getRuleSetPaths(), empty()); + } + @Test public void testMinimumPriority() { PMDConfiguration configuration = new PMDConfiguration(); From b806954d8856c77ef78b5c1acfba931450aeb0a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 5 Mar 2022 14:28:25 +0100 Subject: [PATCH 2/8] Add deprecations --- docs/pages/release_notes.md | 1 + .../pmd/cli/PMDCommandLineInterface.java | 33 ++++++++++++++- .../java/net/sourceforge/pmd/cli/CLITest.java | 14 ++++--- .../net/sourceforge/pmd/cli/BaseCLITest.java | 41 +++++++++++++++++-- .../sourceforge/pmd/lang/xml/XmlCliTest.java | 7 ++-- 5 files changed, 83 insertions(+), 13 deletions(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 2835228f20..c5e1fe39d1 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -70,6 +70,7 @@ The CLI itself remains compatible, if you run PMD via command-line, no action is {% jdoc core::PMDConfiguration#setRuleSets(java.util.List) %}, {% jdoc core::PMDConfiguration#addRuleSet(java.lang.String) %}, and {% jdoc core::PMDConfiguration#getRuleSetPaths() %}. +* Several members of {% jdoc test::cli.BaseCLITest %} have been deprecated with replacements. #### Experimental APIs diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cli/PMDCommandLineInterface.java b/pmd-core/src/main/java/net/sourceforge/pmd/cli/PMDCommandLineInterface.java index 08b7641f5e..78152be9e5 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cli/PMDCommandLineInterface.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cli/PMDCommandLineInterface.java @@ -7,6 +7,7 @@ package net.sourceforge.pmd.cli; import java.util.Properties; import net.sourceforge.pmd.PMD; +import net.sourceforge.pmd.PMD.StatusCode; import net.sourceforge.pmd.PMDVersion; import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.lang.LanguageRegistry; @@ -26,13 +27,39 @@ import com.beust.jcommander.ParameterException; @InternalApi public final class PMDCommandLineInterface { + @Deprecated public static final String PROG_NAME = "pmd"; + /** + * @deprecated This is used for testing, but support for it will be removed in PMD 7. + * Use {@link PMD#runPmd(String...)} or an overload to avoid exiting the VM. In PMD 7, + * {@link PMD#main(String[])} will call {@link System#exit(int)} always. + */ + @Deprecated public static final String NO_EXIT_AFTER_RUN = "net.sourceforge.pmd.cli.noExit"; + + /** + * @deprecated This is used for testing, but support for it will be removed in PMD 7. + * Use {@link PMD#runPmd(String...)} or an overload to avoid exiting the VM. In PMD 7, + * {@link PMD#main(String[])} will call {@link System#exit(int)} always. + */ + @Deprecated public static final String STATUS_CODE_PROPERTY = "net.sourceforge.pmd.cli.status"; + /** + * @deprecated Use {@link StatusCode#OK} + */ + @Deprecated public static final int NO_ERRORS_STATUS = 0; + /** + * @deprecated Use {@link StatusCode#ERROR} + */ + @Deprecated public static final int ERROR_STATUS = 1; + /** + * @deprecated Use {@link StatusCode#VIOLATIONS_FOUND} + */ + @Deprecated public static final int VIOLATIONS_FOUND = 4; private PMDCommandLineInterface() { } @@ -124,7 +151,10 @@ public final class PMDCommandLineInterface { * For testing purpose only... * * @param args + * + * @deprecated Use {@link PMD#runPmd(String...)} */ + @Deprecated public static void main(String[] args) { System.out.println(PMDCommandLineInterface.buildUsageText()); } @@ -159,13 +189,14 @@ public final class PMDCommandLineInterface { } /** - * @deprecated Use {@link PMD#main(String[])} + * @deprecated Use {@link PMD#runPmd(String...)} */ @Deprecated public static void run(String[] args) { setStatusCodeOrExit(PMD.run(args)); } + @Deprecated public static void setStatusCodeOrExit(int status) { if (isExitAfterRunSet()) { System.exit(status); diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java b/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java index 601542675a..3ddaa56643 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java @@ -9,6 +9,8 @@ import static org.hamcrest.Matchers.containsString; import org.junit.Test; +import net.sourceforge.pmd.PMD.StatusCode; + /** * @author Romain Pelisse <belaran@gmail.com> * @@ -51,21 +53,21 @@ public class CLITest extends BaseCLITest { @Test public void exitStatusWithViolations() { String[] args = { "-d", SOURCE_FOLDER, "-f", "text", "-R", "category/java/errorprone.xml", }; - String log = runTest(4, args); + String log = runTest(StatusCode.VIOLATIONS_FOUND, args); assertThat(log, containsString("Avoid empty if")); } @Test public void exitStatusWithViolationsAndWithoutFailOnViolations() { String[] args = { "-d", SOURCE_FOLDER, "-f", "text", "-R", "category/java/errorprone.xml", "-failOnViolation", "false", }; - String log = runTest(0, args); + String log = runTest(StatusCode.OK, args); assertThat(log, containsString("Avoid empty if")); } @Test public void exitStatusWithViolationsAndWithoutFailOnViolationsLongOption() { String[] args = { "-d", SOURCE_FOLDER, "-f", "text", "-R", "category/java/errorprone.xml", "--fail-on-violation", "false", }; - String log = runTest(0, args); + String log = runTest(StatusCode.OK, args); assertThat(log, containsString("Avoid empty if")); } @@ -75,7 +77,7 @@ public class CLITest extends BaseCLITest { @Test public void testWrongRuleset() { String[] args = { "-d", SOURCE_FOLDER, "-f", "text", "-R", "category/java/designn.xml", }; - String log = runTest(1, args); + String log = runTest(StatusCode.ERROR, args); assertThat(log, containsString("Can't find resource 'category/java/designn.xml' for rule 'null'." + " Make sure the resource is a valid file")); } @@ -86,7 +88,7 @@ public class CLITest extends BaseCLITest { @Test public void testWrongRulesetWithRulename() { String[] args = { "-d", SOURCE_FOLDER, "-f", "text", "-R", "category/java/designn.xml/UseCollectionIsEmpty", }; - String log = runTest(1, args); + String log = runTest(StatusCode.ERROR, args); assertThat(log, containsString("Can't find resource 'category/java/designn.xml' for rule " + "'UseCollectionIsEmpty'.")); } @@ -97,7 +99,7 @@ public class CLITest extends BaseCLITest { @Test public void testWrongRulename() { String[] args = { "-d", SOURCE_FOLDER, "-f", "text", "-R", "category/java/design.xml/ThisRuleDoesNotExist", }; - String log = runTest(1, args); + String log = runTest(StatusCode.OK, args); assertThat(log, containsString("No rules found. Maybe you misspelled a rule name?" + " (category/java/design.xml/ThisRuleDoesNotExist)")); } diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCLITest.java b/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCLITest.java index b18808fd02..54e9739159 100644 --- a/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCLITest.java +++ b/pmd-test/src/main/java/net/sourceforge/pmd/cli/BaseCLITest.java @@ -25,6 +25,7 @@ import org.junit.BeforeClass; import net.sourceforge.pmd.PMD; import net.sourceforge.pmd.PMD.StatusCode; +import net.sourceforge.pmd.internal.util.AssertionUtil; /** * @author Romain Pelisse <belaran@gmail.com> @@ -79,11 +80,19 @@ public abstract class BaseCLITest { } } + /** + * @deprecated Use {@link #runTest(String...)}, note that + * it returns the log while this returns the name of a file containing the log. + */ @Deprecated protected String runTest(String[] args, String testname) { - return runTest(args); + return runTest(args, testname, 0); } + /** + * @deprecated Use {@link #runTest(StatusCode, String...)}, note that + * it returns the log while this returns the name of a file containing the log. + */ @Deprecated protected String runTest(String[] args, String testname, int expectedExitCode) { String filename = TEST_OUPUT_DIRECTORY + testname + ".txt"; @@ -100,27 +109,49 @@ public abstract class BaseCLITest { * Returns the log output. */ protected String runTest(String... args) { - return runTest(0, args); + return runTest(StatusCode.OK, args); } /** * Returns the log output. + * + * @deprecated Use {@link #runTest(StatusCode, String...)} */ + @Deprecated protected String runTest(int expectedExitCode, String... args) { + switch (expectedExitCode) { + case 0: + return runTest(StatusCode.OK, args); + case 1: + return runTest(StatusCode.ERROR, args); + case 4: + return runTest(StatusCode.VIOLATIONS_FOUND, args); + default: + throw AssertionUtil.shouldNotReachHere("unknown status code " + expectedExitCode); + } + } + + protected String runTest(StatusCode expectedExitCode, String... args) { ByteArrayOutputStream console = new ByteArrayOutputStream(); PrintStream out = new PrintStream(console); System.setOut(out); System.setErr(out); StatusCode statusCode = PMD.runPmd(args); - assertEquals(expectedExitCode, statusCode.toInt()); + assertEquals(expectedExitCode, statusCode); return console.toString(); } + /** + * @deprecated Use {@link #runTest(StatusCode, String...)} + */ @Deprecated protected void runPMDWith(String[] args) { PMD.main(args); } + /** + * @deprecated Use {@link #runTest(StatusCode, String...)} instead of checking the return code manually + */ @Deprecated protected void checkStatusCode(int expectedExitCode) { int statusCode = getStatusCode(); @@ -129,6 +160,10 @@ public abstract class BaseCLITest { } } + /** + * @deprecated Use {@link #runTest(StatusCode, String...)} instead + * of checking the return code manually + */ @Deprecated protected int getStatusCode() { return Integer.parseInt(System.getProperty(PMDCommandLineInterface.STATUS_CODE_PROPERTY)); diff --git a/pmd-xml/src/test/java/net/sourceforge/pmd/lang/xml/XmlCliTest.java b/pmd-xml/src/test/java/net/sourceforge/pmd/lang/xml/XmlCliTest.java index 2c9af24104..14e717b237 100644 --- a/pmd-xml/src/test/java/net/sourceforge/pmd/lang/xml/XmlCliTest.java +++ b/pmd-xml/src/test/java/net/sourceforge/pmd/lang/xml/XmlCliTest.java @@ -14,6 +14,7 @@ import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; +import net.sourceforge.pmd.PMD.StatusCode; import net.sourceforge.pmd.cli.BaseCLITest; public class XmlCliTest extends BaseCLITest { @@ -36,19 +37,19 @@ public class XmlCliTest extends BaseCLITest { @Test public void analyzeSingleXmlWithoutForceLanguage() { - String log = runTest(0, createArgs("/src/file1.ext")); + String log = runTest(StatusCode.OK, createArgs("/src/file1.ext")); assertRuleMessage(0, log); } @Test public void analyzeSingleXmlWithForceLanguage() { - String log = runTest(4, createArgs("/src/file1.ext", "-force-language", "xml")); + String log = runTest(StatusCode.VIOLATIONS_FOUND, createArgs("/src/file1.ext", "-force-language", "xml")); assertRuleMessage(1, log); } @Test public void analyzeDirectoryWithForceLanguage() { - String log = runTest(4, createArgs("/src/", "-force-language", "xml")); + String log = runTest(StatusCode.VIOLATIONS_FOUND, createArgs("/src/", "-force-language", "xml")); assertRuleMessage(3, log); } From ef617442925f9a9fc3b6ffa25809539dec4a5951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 5 Mar 2022 14:41:40 +0100 Subject: [PATCH 3/8] Fix message escaping with MessageFormat --- .../src/main/java/net/sourceforge/pmd/PMD.java | 14 +++++++++----- .../java/net/sourceforge/pmd/RuleSetLoader.java | 7 ++++++- .../java/net/sourceforge/pmd/util/StringUtil.java | 9 +++++++++ .../sourceforge/pmd/util/log/PmdLoggerBase.java | 12 ++++++++++-- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java b/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java index abd98f5d06..253b1447e7 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java @@ -233,16 +233,18 @@ public class PMD { * * @param configuration the configuration to use * - * @return number of violations found. + * @return number of violations found. Returns -1 in case of error. * - * @deprecated Use {@link #runPmd(PMDConfiguration)}. + * @deprecated Use {@link #runPmd(PMDConfiguration)}. Note that the return + * value of doPMD changed in PMD 6.44.0 to return -1 in case of error. + * Previously zero was returned in that case. */ @Deprecated @InternalApi public static int doPMD(PMDConfiguration configuration) { try (PmdAnalysis pmd = PmdAnalysis.create(configuration)) { if (pmd.getRulesets().isEmpty()) { - return PMDCommandLineInterface.NO_ERRORS_STATUS; + return pmd.getLog().numErrors() > 0 ? -1 : 0; } try { Report report = pmd.performAnalysisAndCollectReport(); @@ -255,7 +257,7 @@ public class PMD { } catch (Exception e) { pmd.getLog().errorEx("Exception during processing", e); printErrorDetected(1); - return PMDCommandLineInterface.NO_ERRORS_STATUS; // fixme? + return -1; } } } @@ -504,7 +506,9 @@ public class PMD { StatusCode status; try { int violations = PMD.doPMD(configuration); - if (violations > 0 && configuration.isFailOnViolation()) { + if (violations < 0) { + status = StatusCode.ERROR; + } else if (violations > 0 && configuration.isFailOnViolation()) { status = StatusCode.VIOLATIONS_FOUND; } else { status = StatusCode.OK; diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java index a4d1aed732..3371c94466 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java @@ -200,7 +200,12 @@ public final class RuleSetLoader { printRulesInDebug(path, ruleset); ruleSets.add(ruleset); } catch (RuleSetLoadException e) { - reporter.errorEx("Cannot load ruleset {0}", new Object[] { path }, e); + if (e.getCause() != null) { + // eg RuleSetNotFoundException + reporter.errorEx("Cannot load ruleset {0}", new Object[] { path }, e.getCause()); + } else { + reporter.errorEx("Cannot load ruleset {0}", new Object[] { path }, e); + } } } if (!anyRules) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/StringUtil.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/StringUtil.java index 7d8a36fcf5..dc7459fa7c 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/StringUtil.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/StringUtil.java @@ -4,6 +4,7 @@ package net.sourceforge.pmd.util; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; @@ -868,4 +869,12 @@ public final class StringUtil { } return retval.toString(); } + + /** + * Escape the string so that it appears literally when interpreted + * by a {@link MessageFormat}. + */ + public static String quoteMessageFormat(String str) { + return str.replaceAll("'", "''"); + } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLoggerBase.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLoggerBase.java index c1af32b07b..e0f32c4a15 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLoggerBase.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLoggerBase.java @@ -9,6 +9,8 @@ import java.util.logging.Logger; import org.apache.commons.lang3.exception.ExceptionUtils; +import net.sourceforge.pmd.util.StringUtil; + /** * A logger based on a {@link Logger}. * @@ -41,9 +43,15 @@ abstract class PmdLoggerBase implements PmdLogger { public void logEx(Level level, String message, Object[] formatArgs, Throwable error) { if (isLoggable(level)) { message = MessageFormat.format(message, formatArgs); - log(level, message + ": " + error.getMessage()); + String errorMessage = error.getMessage(); + if (errorMessage == null) { + errorMessage = error.getClass().getSimpleName(); + } + errorMessage = StringUtil.quoteMessageFormat(errorMessage); + log(level, message + ": " + errorMessage); if (isLoggable(Level.DEBUG)) { - log(Level.DEBUG, ExceptionUtils.getStackTrace(error)); + String stackTrace = StringUtil.quoteMessageFormat(ExceptionUtils.getStackTrace(error)); + log(Level.DEBUG, stackTrace); } } } From 5dc2774c0a53810717358cc850b69c6e7fe0a463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 5 Mar 2022 15:02:24 +0100 Subject: [PATCH 4/8] Make PMDTaskImpl use PmdAnalysis --- .../net/sourceforge/pmd/RuleSetLoader.java | 7 +- .../net/sourceforge/pmd/ant/Formatter.java | 10 + .../pmd/ant/internal/PMDTaskImpl.java | 171 ++++++++---------- .../java/net/sourceforge/pmd/cli/CLITest.java | 2 +- 4 files changed, 91 insertions(+), 99 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java index 3371c94466..261b4559ee 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java @@ -18,6 +18,7 @@ import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; +import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.lang.Language; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.util.CollectionUtil; @@ -189,8 +190,12 @@ public final class RuleSetLoader { /** * Loads a list of rulesets, if any has an error, report it on the contextual * error reporter instead of aborting, and continue loading the rest. + * + *

Internal API: might be published later, or maybe in PMD 7 this + * will be the default behaviour of every method of this class. */ - List loadRuleSetsWithoutException(List rulesetPaths) { + @InternalApi + public List loadRuleSetsWithoutException(List rulesetPaths) { List ruleSets = new ArrayList<>(rulesetPaths.size()); boolean anyRules = false; for (String path : rulesetPaths) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/ant/Formatter.java b/pmd-core/src/main/java/net/sourceforge/pmd/ant/Formatter.java index e32eaf4dec..7995508c26 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/ant/Formatter.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/ant/Formatter.java @@ -23,9 +23,11 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.MethodUtils; import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Parameter; import net.sourceforge.pmd.Report; +import net.sourceforge.pmd.annotation.InternalApi; import net.sourceforge.pmd.renderers.Renderer; import net.sourceforge.pmd.renderers.RendererFactory; @@ -231,4 +233,12 @@ public class Formatter { } return null; } + + @InternalApi + public Renderer toRenderer(final Project project, List inputPaths) { + this.start(project.getBaseDir().toString()); + Renderer renderer = getRenderer(); + renderer.setUseShortNames(inputPaths); + return renderer; + } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java b/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java index 3cc2778c36..04bea82de5 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java @@ -4,17 +4,14 @@ package net.sourceforge.pmd.ant.internal; -import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; +import java.util.Collections; import java.util.List; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.exception.ContextedRuntimeException; import org.apache.tools.ant.AntClassLoader; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; @@ -22,26 +19,23 @@ import org.apache.tools.ant.Project; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.Path; -import net.sourceforge.pmd.PMD; import net.sourceforge.pmd.PMDConfiguration; +import net.sourceforge.pmd.PmdAnalysis; import net.sourceforge.pmd.Report; import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RulePriority; import net.sourceforge.pmd.RuleSet; import net.sourceforge.pmd.RuleSetLoader; import net.sourceforge.pmd.RuleSets; -import net.sourceforge.pmd.RulesetsFactoryUtils; import net.sourceforge.pmd.ant.Formatter; import net.sourceforge.pmd.ant.PMDTask; import net.sourceforge.pmd.ant.SourceLanguage; import net.sourceforge.pmd.lang.LanguageRegistry; import net.sourceforge.pmd.lang.LanguageVersion; import net.sourceforge.pmd.renderers.AbstractRenderer; -import net.sourceforge.pmd.renderers.Renderer; import net.sourceforge.pmd.util.ClasspathClassLoader; import net.sourceforge.pmd.util.IOUtil; import net.sourceforge.pmd.util.datasource.DataSource; -import net.sourceforge.pmd.util.datasource.FileDataSource; import net.sourceforge.pmd.util.log.AntLogHandler; import net.sourceforge.pmd.util.log.ScopedLogHandlersManager; @@ -100,110 +94,50 @@ public class PMDTaskImpl { private void doTask() { setupClassLoader(); - // Setup RuleSetFactory and validate RuleSets - RuleSetLoader rulesetLoader = RuleSetLoader.fromPmdConfig(configuration) - .loadResourcesWith(setupResourceLoader()); - - // This is just used to validate and display rules. Each thread will create its own ruleset - String ruleSetString = configuration.getRuleSets(); - if (StringUtils.isNotBlank(ruleSetString)) { - // Substitute env variables/properties - configuration.setRuleSets(project.replaceProperties(ruleSetString)); - } - - final RuleSets ruleSets = RulesetsFactoryUtils.getRuleSets(configuration.getRuleSets(), rulesetLoader.toFactory()); - List rulesetList = Arrays.asList(ruleSets.getAllRuleSets()); - logRulesUsed(ruleSets); - if (configuration.getSuppressMarker() != null) { project.log("Setting suppress marker to be " + configuration.getSuppressMarker(), Project.MSG_VERBOSE); } - // Start the Formatters - for (Formatter formatter : formatters) { - project.log("Sending a report to " + formatter, Project.MSG_VERBOSE); - formatter.start(project.getBaseDir().toString()); - } - // log("Setting Language Version " + languageVersion.getShortName(), - // Project.MSG_VERBOSE); + @SuppressWarnings("PMD.CloseResource") final List reportShortNamesPaths = new ArrayList<>(); + List fullInputPath = new ArrayList<>(); - // TODO Do we really need all this in a loop over each FileSet? Seems - // like a lot of redundancy - Report errorReport = new Report(); - int problemCount = 0; - final String separator = System.getProperty("file.separator"); + List ruleSetPaths = expandRuleSetPaths(); + // don't let PmdAnalysis.create create rulesets itself. + configuration.setRuleSets(Collections.emptyList()); - for (FileSet fs : filesets) { - List files = new LinkedList<>(); - DirectoryScanner ds = fs.getDirectoryScanner(project); - String[] srcFiles = ds.getIncludedFiles(); - for (String srcFile : srcFiles) { - File file = new File(ds.getBasedir() + separator + srcFile); - files.add(new FileDataSource(file)); + Report report; + try (PmdAnalysis pmd = PmdAnalysis.create(configuration)) { + RuleSetLoader rulesetLoader = + pmd.newRuleSetLoader().loadResourcesWith(setupResourceLoader()); + pmd.addRuleSets(rulesetLoader.loadRuleSetsWithoutException(ruleSetPaths)); + + for (FileSet fileset : filesets) { + DirectoryScanner ds = fileset.getDirectoryScanner(project); + for (String srcFile : ds.getIncludedFiles()) { + pmd.files().addFile(ds.getBasedir().toPath().resolve(srcFile)); + } + + final String commonInputPath = ds.getBasedir().getPath(); + fullInputPath.add(commonInputPath); + if (configuration.isReportShortNames()) { + reportShortNamesPaths.add(commonInputPath); + } } - final String commonInputPath = ds.getBasedir().getPath(); - configuration.setInputPaths(commonInputPath); - final List reportShortNamesPaths = new ArrayList<>(); - if (configuration.isReportShortNames()) { - reportShortNamesPaths.add(commonInputPath); - } - - Renderer logRenderer = new AbstractRenderer("log", "Logging renderer") { - @Override - public void start() { - // Nothing to do - } - - @Override - public void startFileAnalysis(DataSource dataSource) { - project.log("Processing file " + dataSource.getNiceFileName(false, commonInputPath), - Project.MSG_VERBOSE); - } - - @Override - public void renderFileReport(Report r) { - // Nothing to do - } - - @Override - public void end() { - // Nothing to do - } - - @Override - public String defaultFileExtension() { - return null; - } // not relevant - }; - List renderers = new ArrayList<>(formatters.size() + 1); - renderers.add(logRenderer); for (Formatter formatter : formatters) { - Renderer renderer = formatter.getRenderer(); - renderer.setUseShortNames(reportShortNamesPaths); - renderers.add(renderer); - } - try { - Report report = PMD.processFiles(configuration, rulesetList, files, renderers); - problemCount += report.getViolations().size(); - } catch (ContextedRuntimeException e) { - if (e.getFirstContextValue("filename") instanceof String) { - handleError((String) e.getFirstContextValue("filename"), errorReport, e); - } else { - handleError("(unknown file)", errorReport, e); - } - } catch (RuntimeException pmde) { - handleError("(unknown file)", errorReport, pmde); + project.log("Sending a report to " + formatter, Project.MSG_VERBOSE); + pmd.addRenderer(formatter.toRenderer(project, reportShortNamesPaths)); } + + pmd.addRenderer(getLogRenderer(StringUtils.join(fullInputPath, ","))); + + report = pmd.performAnalysisAndCollectReport(); } + int problemCount = report.getViolations().size(); project.log(problemCount + " problems found", Project.MSG_VERBOSE); - for (Formatter formatter : formatters) { - formatter.end(errorReport); - } - if (failuresPropertyName != null && problemCount > 0) { project.setProperty(failuresPropertyName, String.valueOf(problemCount)); project.log("Setting property " + failuresPropertyName + " to " + problemCount, Project.MSG_VERBOSE); @@ -214,6 +148,49 @@ public class PMDTaskImpl { } } + private List expandRuleSetPaths() { + List paths = new ArrayList<>(configuration.getRuleSetPaths()); + for (int i = 0; i < paths.size(); i++) { + paths.set(i, project.replaceProperties(paths.get(i))); + } + return paths; + } + + private AbstractRenderer getLogRenderer(final String commonInputPath) { + return new AbstractRenderer("log", "Logging renderer") { + @Override + public void start() { + // Nothing to do + } + + @Override + public void startFileAnalysis(DataSource dataSource) { + project.log("Processing file " + dataSource.getNiceFileName(false, commonInputPath), + Project.MSG_VERBOSE); + } + + @Override + public void renderFileReport(Report r) { + // Nothing to do + } + + @Override + public void end() { + // Nothing to do + } + + @Override + public void flush() { + // Nothing to do + } + + @Override + public String defaultFileExtension() { + return null; + } // not relevant + }; + } + private ClassLoader setupResourceLoader() { if (classpath == null) { classpath = new Path(project); diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java b/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java index 3ddaa56643..5e03b0ba63 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java @@ -99,7 +99,7 @@ public class CLITest extends BaseCLITest { @Test public void testWrongRulename() { String[] args = { "-d", SOURCE_FOLDER, "-f", "text", "-R", "category/java/design.xml/ThisRuleDoesNotExist", }; - String log = runTest(StatusCode.OK, args); + String log = runTest(StatusCode.ERROR, args); assertThat(log, containsString("No rules found. Maybe you misspelled a rule name?" + " (category/java/design.xml/ThisRuleDoesNotExist)")); } From 51a9566753dc730cde89db7dd41601a6dd007296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 5 Mar 2022 15:05:43 +0100 Subject: [PATCH 5/8] More cleanups --- .../main/java/net/sourceforge/pmd/PMD.java | 17 +++----- .../java/net/sourceforge/pmd/PmdAnalysis.java | 6 +++ .../pmd/ant/internal/PMDTaskImpl.java | 42 ------------------- .../pmd/processor/AbstractPMDProcessor.java | 4 ++ 4 files changed, 16 insertions(+), 53 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java b/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java index 253b1447e7..09fbfc360c 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/PMD.java @@ -337,18 +337,13 @@ public class PMD { final List rulesets, final Collection files, final List renderers) { - @SuppressWarnings("PMD.CloseResource") - PmdAnalysis builder = PmdAnalysis.createWithoutCollectingFiles(configuration); - for (RuleSet ruleset : rulesets) { - builder.addRuleSet(ruleset); + try (PmdAnalysis builder = PmdAnalysis.createWithoutCollectingFiles(configuration)) { + builder.addRuleSets(rulesets); + builder.addRenderers(renderers); + List sortedFiles = new ArrayList<>(files); + sortFiles(configuration, sortedFiles); + return builder.performAnalysisImpl(sortedFiles); } - for (Renderer renderer : renderers) { - builder.addRenderer(renderer); - } - List sortedFiles = new ArrayList<>(files); - sortFiles(configuration, sortedFiles); - - return builder.performAnalysisImpl(sortedFiles); } private static void sortFiles(final PMDConfiguration configuration, final List files) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java b/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java index 9b4683e661..91f3f66c38 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java @@ -72,6 +72,8 @@ public final class PmdAnalysis implements AutoCloseable { private final PMDConfiguration configuration; private final SimplePmdLogger reporter = new SimplePmdLogger(Logger.getLogger("net.sourceforge.pmd")); + private boolean closed; + /** * Constructs a new instance. The files paths (input files, filelist, * exclude list, etc) given in the configuration are collected into @@ -308,6 +310,10 @@ public final class PmdAnalysis implements AutoCloseable { @Override public void close() { + if (closed) { + return; + } + closed = true; collector.close(); /* diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java b/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java index 04bea82de5..601107e0f3 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java @@ -4,9 +4,6 @@ package net.sourceforge.pmd.ant.internal; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -22,11 +19,8 @@ import org.apache.tools.ant.types.Path; import net.sourceforge.pmd.PMDConfiguration; import net.sourceforge.pmd.PmdAnalysis; import net.sourceforge.pmd.Report; -import net.sourceforge.pmd.Rule; import net.sourceforge.pmd.RulePriority; -import net.sourceforge.pmd.RuleSet; import net.sourceforge.pmd.RuleSetLoader; -import net.sourceforge.pmd.RuleSets; import net.sourceforge.pmd.ant.Formatter; import net.sourceforge.pmd.ant.PMDTask; import net.sourceforge.pmd.ant.SourceLanguage; @@ -212,32 +206,6 @@ public class PMDTaskImpl { project, classpath, parentFirst); } - private void handleError(String filename, Report errorReport, RuntimeException pmde) { - - pmde.printStackTrace(); - project.log(pmde.toString(), Project.MSG_VERBOSE); - - Throwable cause = pmde.getCause(); - - if (cause != null) { - try (StringWriter strWriter = new StringWriter(); - PrintWriter printWriter = new PrintWriter(strWriter)) { - cause.printStackTrace(printWriter); - project.log(strWriter.toString(), Project.MSG_VERBOSE); - } catch (IOException e) { - project.log("Error while closing stream", e, Project.MSG_ERR); - } - if (StringUtils.isNotBlank(cause.getMessage())) { - project.log(cause.getMessage(), Project.MSG_VERBOSE); - } - } - - if (failOnError) { - throw new BuildException(pmde); - } - errorReport.addError(new Report.ProcessingError(pmde, filename)); - } - private void setupClassLoader() { try { if (auxClasspath != null) { @@ -268,14 +236,4 @@ public class PMDTaskImpl { } } - private void logRulesUsed(RuleSets rules) { - project.log("Using these rulesets: " + configuration.getRuleSets(), Project.MSG_VERBOSE); - - RuleSet[] ruleSets = rules.getAllRuleSets(); - for (RuleSet ruleSet : ruleSets) { - for (Rule rule : ruleSet.getRules()) { - project.log("Using rule " + rule.getName(), Project.MSG_VERBOSE); - } - } - } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/processor/AbstractPMDProcessor.java b/pmd-core/src/main/java/net/sourceforge/pmd/processor/AbstractPMDProcessor.java index 5bcf538f21..8da879721f 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/processor/AbstractPMDProcessor.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/processor/AbstractPMDProcessor.java @@ -77,13 +77,17 @@ public abstract class AbstractPMDProcessor { * @param factory The factory used to create the configured rule sets * @param report The base report on which to report any configuration errors * @return the rules within a rulesets + * + * @deprecated Rulesets are created upstream of the PMDProcessor now. */ + @Deprecated protected RuleSets createRuleSets(RuleSetFactory factory, Report report) { final RuleSets rs = RulesetsFactoryUtils.getRuleSets(configuration.getRuleSets(), factory); reportBrokenRules(report, rs); return rs; } + @Deprecated public static void reportBrokenRules(Report report, RuleSets rs) { final Set brokenRules = removeBrokenRules(rs); for (final Rule rule : brokenRules) { From 16e26b5cc4b91c23ea76043248b4ac2f2cf9d0d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 5 Mar 2022 15:15:47 +0100 Subject: [PATCH 6/8] Restore failOnError --- pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java | 6 ++++-- pmd-core/src/main/java/net/sourceforge/pmd/Report.java | 3 +-- .../java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java | 4 ++++ .../main/java/net/sourceforge/pmd/util/log/PmdLogger.java | 6 ++++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java b/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java index 91f3f66c38..a3a04a86a5 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/PmdAnalysis.java @@ -215,7 +215,8 @@ public final class PmdAnalysis implements AutoCloseable { * Run PMD with the current state of this instance. This will start * and finish the registered renderers. All files collected in the * {@linkplain #files() file collector} are processed. This does not - * return a report, for compatibility with PMD 7. + * return a report, for compatibility with PMD 7. Note that this does + * not throw, errors are instead accumulated into a {@link PmdLogger}. */ public void performAnalysis() { performAnalysisAndCollectReport(); @@ -225,7 +226,8 @@ public final class PmdAnalysis implements AutoCloseable { * Run PMD with the current state of this instance. This will start * and finish the registered renderers. All files collected in the * {@linkplain #files() file collector} are processed. Returns the - * output report. + * output report. Note that this does not throw, errors are instead + * accumulated into a {@link PmdLogger}. */ // TODO PMD 7 @DeprecatedUntil700 public Report performAnalysisAndCollectReport() { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/Report.java b/pmd-core/src/main/java/net/sourceforge/pmd/Report.java index e93e2272fb..cd4c3c5b96 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/Report.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/Report.java @@ -9,7 +9,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -32,7 +31,7 @@ import net.sourceforge.pmd.util.NumericConstants; * A {@link Report} is the output of a PMD execution. This * includes violations, suppressed violations, metrics, error * during processing and configuration errors. PMD's entry point creates - * a report (see {@link PMD#processFiles(PMDConfiguration, List, Collection, List)}). + * a report (see {@link PmdAnalysis#performAnalysisAndCollectReport()}) * The mutation methods on this class are deprecated, as they will be * internalized in PMD 7. */ diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java b/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java index 601107e0f3..bbff7bf591 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/ant/internal/PMDTaskImpl.java @@ -127,6 +127,10 @@ public class PMDTaskImpl { pmd.addRenderer(getLogRenderer(StringUtils.join(fullInputPath, ","))); report = pmd.performAnalysisAndCollectReport(); + if (failOnError && pmd.getLog().numErrors() > 0) { + throw new BuildException("Some errors occurred while running PMD"); + } + } int problemCount = report.getViolations().size(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLogger.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLogger.java index dc1c1977b9..8014a04dac 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLogger.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLogger.java @@ -39,6 +39,12 @@ public interface PmdLogger { void errorEx(String message, Object[] formatArgs, Throwable error); + /** + * Returns the number of errors reported on this instance. + * Any call to {@link #log(Level, String, Object...)} or + * {@link #logEx(Level, String, Object[], Throwable)} with a level + * of {@link Level#ERROR} should increment this number. + */ int numErrors(); // levels, in sync with SLF4J levels From 04b05e208f000a41ed345e867dfff0ab935ec144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 5 Mar 2022 15:17:53 +0100 Subject: [PATCH 7/8] Make PmdLogger more similar to slf4j logger --- .../java/net/sourceforge/pmd/RuleSetLoader.java | 6 +++--- .../pmd/internal/util/FileCollectionUtil.java | 6 +++--- .../net/sourceforge/pmd/util/log/PmdLogger.java | 16 +++++++++------- .../sourceforge/pmd/util/log/PmdLoggerBase.java | 10 +++++----- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java index 261b4559ee..b0ec97f675 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetLoader.java @@ -214,8 +214,8 @@ public final class RuleSetLoader { } } if (!anyRules) { - reporter.warning("No rules found. Maybe you misspelled a rule name? ({0})", - StringUtils.join(rulesetPaths, ',')); + reporter.warn("No rules found. Maybe you misspelled a rule name? ({0})", + StringUtils.join(rulesetPaths, ',')); } return ruleSets; } @@ -228,7 +228,7 @@ public final class RuleSetLoader { } } if (ruleset.getRules().isEmpty()) { - reporter.warning("No rules found in ruleset {0}", path); + reporter.warn("No rules found in ruleset {0}", path); } } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/internal/util/FileCollectionUtil.java b/pmd-core/src/main/java/net/sourceforge/pmd/internal/util/FileCollectionUtil.java index 3235be1819..a0093279f8 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/internal/util/FileCollectionUtil.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/internal/util/FileCollectionUtil.java @@ -160,9 +160,9 @@ public final class FileCollectionUtil { String source = IOUtils.toString(sourceCode); collector.addSourceFile(source, falseFilePath); } catch (SQLException ex) { - collector.getLog().warningEx("Cannot get SourceCode for {0} - skipping ...", - new Object[] { falseFilePath}, - ex); + collector.getLog().warnEx("Cannot get SourceCode for {0} - skipping ...", + new Object[] { falseFilePath}, + ex); } } } catch (ClassNotFoundException e) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLogger.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLogger.java index 8014a04dac..0b0625b5a9 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLogger.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLogger.java @@ -23,15 +23,17 @@ public interface PmdLogger { void info(String message, Object... formatArgs); + @Deprecated void trace(String message, Object... formatArgs); + @Deprecated void debug(String message, Object... formatArgs); - void warning(String message, Object... formatArgs); + void warn(String message, Object... formatArgs); - void warningEx(String message, Throwable error); + void warnEx(String message, Throwable error); - void warningEx(String message, Object[] formatArgs, Throwable error); + void warnEx(String message, Object[] formatArgs, Throwable error); void error(String message, Object... formatArgs); @@ -49,11 +51,11 @@ public interface PmdLogger { // levels, in sync with SLF4J levels enum Level { - TRACE, - DEBUG, - INFO, + ERROR, WARN, - ERROR; + INFO, + DEBUG, + TRACE; java.util.logging.Level toJutilLevel() { switch (this) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLoggerBase.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLoggerBase.java index e0f32c4a15..6c1db56022 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLoggerBase.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/log/PmdLoggerBase.java @@ -31,7 +31,7 @@ abstract class PmdLoggerBase implements PmdLogger { @Override public final boolean isLoggable(Level level) { return minLevel != null - && minLevel.compareTo(level) <= 0 + && minLevel.compareTo(level) >= 0 && isLoggableImpl(level); } @@ -87,17 +87,17 @@ abstract class PmdLoggerBase implements PmdLogger { } @Override - public void warning(String message, Object... formatArgs) { + public void warn(String message, Object... formatArgs) { log(Level.WARN, message, formatArgs); } @Override - public final void warningEx(String message, Throwable error) { - warningEx(message, new Object[0], error); + public final void warnEx(String message, Throwable error) { + warnEx(message, new Object[0], error); } @Override - public void warningEx(String message, Object[] formatArgs, Throwable error) { + public void warnEx(String message, Object[] formatArgs, Throwable error) { logEx(Level.WARN, message, formatArgs, error); } From 80e1265fa1cd12f00aca61de3a050294675828a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Sat, 5 Mar 2022 15:22:25 +0100 Subject: [PATCH 8/8] Misspelling rule name only causes warning now --- pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java b/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java index 5e03b0ba63..3ddaa56643 100644 --- a/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java +++ b/pmd-java/src/test/java/net/sourceforge/pmd/cli/CLITest.java @@ -99,7 +99,7 @@ public class CLITest extends BaseCLITest { @Test public void testWrongRulename() { String[] args = { "-d", SOURCE_FOLDER, "-f", "text", "-R", "category/java/design.xml/ThisRuleDoesNotExist", }; - String log = runTest(StatusCode.ERROR, args); + String log = runTest(StatusCode.OK, args); assertThat(log, containsString("No rules found. Maybe you misspelled a rule name?" + " (category/java/design.xml/ThisRuleDoesNotExist)")); }