diff --git a/docs/pages/pmd/userdocs/pmd_report_formats.md b/docs/pages/pmd/userdocs/pmd_report_formats.md
index 05dafb2253..33961afabc 100644
--- a/docs/pages/pmd/userdocs/pmd_report_formats.md
+++ b/docs/pages/pmd/userdocs/pmd_report_formats.md
@@ -254,10 +254,6 @@ Was expecting one of:
* warnings: 2
-**Properties:**
-
-* color: Enables colors with anything other than `false` or `0`. Default: yes.
-
## textpad
TextPad integration.
diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md
index 9082e46f31..c2cc288dfd 100644
--- a/docs/pages/release_notes.md
+++ b/docs/pages/release_notes.md
@@ -105,6 +105,7 @@ in the Migration Guide.
* [#4723](https://github.com/pmd/pmd/issues/4723): \[cli] Launch fails for "bash pmd"
* core
* [#1027](https://github.com/pmd/pmd/issues/1027): \[core] Apply the new PropertyDescriptor<Pattern> type where applicable
+ * [#4312](https://github.com/pmd/pmd/issues/4312): \[core] Remove unnecessary property `color` and system property `pmd.color` in `TextColorRenderer`
* [#4674](https://github.com/pmd/pmd/issues/4674): \[core] WARNING: Illegal reflective access by org.codehaus.groovy.reflection.CachedClass
* [#4694](https://github.com/pmd/pmd/pull/4694): \[core] Fix line/col numbers in TokenMgrError
* [#4717](https://github.com/pmd/pmd/issues/4717): \[core] XSLTRenderer doesn't close report file
@@ -159,6 +160,12 @@ The following previously deprecated classes have been removed:
If the current version is needed, then `Node.getTextDocument().getLanguageVersion()` can be used. This
is the version that has been selected via CLI `--use-version` parameter.
+**Renderers**
+
+* `textcolor` renderer ({%jdoc core::renderers.TextColorRenderer %}) now renders always in color.
+ The property `color` has been removed. The possibility to override this with the system property `pmd.color`
+ has been removed as well. If you don't want colors, use `text` renderer ({%jdoc core::renderers.TextRenderer %}).
+
#### External Contributions
* [#4640](https://github.com/pmd/pmd/pull/4640): \[cli] Launch script fails if run via "bash pmd" - [Shai Bennathan](https://github.com/shai-bennathan) (@shai-bennathan)
* [#4673](https://github.com/pmd/pmd/pull/4673): \[javascript] CPD: Added support for decorator notation - [Wener](https://github.com/wener-tiobe) (@wener-tiobe)
@@ -566,6 +573,7 @@ See also [Detailed Release Notes for PMD 7]({{ baseurl }}pmd_release_notes_pmd7.
* [#4204](https://github.com/pmd/pmd/issues/4204): \[core] Provide a CpdAnalysis class as a programmatic entry point into CPD
* [#4301](https://github.com/pmd/pmd/issues/4301): \[core] Remove deprecated property concrete classes
* [#4302](https://github.com/pmd/pmd/issues/4302): \[core] Migrate Property Framework API to Java 8
+ * [#4312](https://github.com/pmd/pmd/issues/4312): \[core] Remove unnecessary property `color` and system property `pmd.color` in `TextColorRenderer`
* [#4323](https://github.com/pmd/pmd/issues/4323): \[core] Refactor CPD integration
* [#4353](https://github.com/pmd/pmd/pull/4353): \[core] Micro optimizations for Node API
* [#4365](https://github.com/pmd/pmd/pull/4365): \[core] Improve benchmarking
diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextColorRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextColorRenderer.java
index cb78a79871..4fb751df11 100644
--- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextColorRenderer.java
+++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextColorRenderer.java
@@ -20,12 +20,10 @@ import net.sourceforge.pmd.Report;
import net.sourceforge.pmd.Report.ConfigurationError;
import net.sourceforge.pmd.Report.ProcessingError;
import net.sourceforge.pmd.RuleViolation;
-import net.sourceforge.pmd.properties.PropertyDescriptor;
-import net.sourceforge.pmd.properties.PropertyFactory;
/**
*
- * A console renderer with optional color support under *nix systems.
+ * A console renderer with color support for terminal supporting ansi color codes.
*
*
*
@@ -47,45 +45,29 @@ import net.sourceforge.pmd.properties.PropertyFactory;
* code: logger.error( "missing attribute 'app_arg' in rule '" + ((Element)element.getParent()).getAttributeValue( "name" ) + "'" );
* * warnings: 3
*
- *
- * Colorization is turned on by supplying -Dpmd.color - any value other
- * than '0' or 'false', enables color - including an empty value (''). Nota
- * Bene: colorization is atm only supported under *nix terminals accepting
- * ansi escape sequences, such as xterm, rxvt et cetera.
- *
*/
public class TextColorRenderer extends AbstractAccumulatingRenderer {
public static final String NAME = "textcolor";
- // What? TODO 7.0.0 Use a boolean property
- // TODO should the "textcolor" renderer really support "optional" colors?
- // either use text or textcolor...
- // This property is really weird, the standard boolean properties
- // are false unless value is exactly "true", this one is true unless
- // "false" or "0"...
- public static final PropertyDescriptor COLOR = PropertyFactory.stringProperty("color").desc("Enables colors with anything other than 'false' or '0'.").defaultValue("yes").build();
- private static final String SYSTEM_PROPERTY_PMD_COLOR = "pmd.color";
-
/**
* Directory from where java was invoked.
*/
private String pwd;
- private String yellowBold = "";
- private String whiteBold = "";
- private String redBold = "";
- private String red = "";
- private String cyan = "";
- private String green = "";
+ private String yellowBold = "\u001B[1;33m";
+ private String whiteBold = "\u001B[1;37m";
+ private String redBold = "\u001B[1;31m";
+ private String red = "\u001B[0;31m";
+ private String green = "\u001B[0;32m";
+ private String cyan = "\u001B[0;36m";
- private String colorReset = "";
+ private String colorReset = "\u001B[0m";
public TextColorRenderer() {
// This Renderer was originally submitted by Adrian Papari and was
// called the "PapariTextRenderer" pre-PMD 5.0.
super(NAME, "Text format, with color support (requires ANSI console support, e.g. xterm, rxvt, etc.).");
- definePropertyDescriptor(COLOR);
}
@Override
@@ -93,36 +75,10 @@ public class TextColorRenderer extends AbstractAccumulatingRenderer {
return "txt";
}
- /**
- * Enables colors on *nix systems - not windows. Color support depends on
- * the pmd.color property, which should be set with the -D option during
- * execution - a set value other than 'false' or '0' enables color.
- *
- * btw, is it possible to do this on windows (ie; console colors)?
- */
- private void initializeColorsIfSupported() {
- if (isPropertyEnabled(getProperty(COLOR)) || isPropertyEnabled(System.getProperty(SYSTEM_PROPERTY_PMD_COLOR))) {
- this.yellowBold = "\u001B[1;33m";
- this.whiteBold = "\u001B[1;37m";
- this.redBold = "\u001B[1;31m";
- this.red = "\u001B[0;31m";
- this.green = "\u001B[0;32m";
- this.cyan = "\u001B[0;36m";
-
- this.colorReset = "\u001B[0m";
- }
- }
-
- private boolean isPropertyEnabled(String property) {
- return property != null && !("0".equals(property) || "false".equalsIgnoreCase(property));
- }
-
-
@Override
public void outputReport(Report report) throws IOException {
StringBuilder buf = new StringBuilder(500);
buf.append(System.lineSeparator());
- initializeColorsIfSupported();
String lastFile = null;
int numberOfErrors = 0;
int numberOfWarnings = 0;
diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/PapariTextRendererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/PapariTextRendererTest.java
deleted file mode 100644
index 626e01427c..0000000000
--- a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/PapariTextRendererTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
- */
-
-package net.sourceforge.pmd.renderers;
-
-import java.io.FileNotFoundException;
-import java.io.Reader;
-import java.io.StringReader;
-
-import net.sourceforge.pmd.Report.ConfigurationError;
-import net.sourceforge.pmd.Report.ProcessingError;
-
-class PapariTextRendererTest extends AbstractRendererTest {
-
- @Override
- Renderer getRenderer() {
- TextColorRenderer result = new TextColorRenderer() {
- @Override
- protected Reader getReader(String sourceFile) throws FileNotFoundException {
- return new StringReader("public class Foo {}");
- }
- };
- result.setProperty(TextColorRenderer.COLOR, "false");
- return result;
- }
-
- @Override
- String getExpected() {
- return "* file: " + getSourceCodeFilename() + EOL + " src: " + getSourceCodeFilename() + ":1:1" + EOL + " rule: Foo" + EOL
- + " msg: blah" + EOL + " code: public class Foo {}" + EOL + EOL + EOL + EOL
- + "Summary:" + EOL + EOL + "* warnings: 1" + EOL;
- }
-
- @Override
- String getExpectedEmpty() {
- return EOL + EOL + "Summary:" + EOL + EOL + "* warnings: 0" + EOL;
- }
-
- @Override
- String getExpectedMultiple() {
- return "* file: " + getSourceCodeFilename() + EOL + " src: " + getSourceCodeFilename() + ":1:1" + EOL + " rule: Foo" + EOL
- + " msg: blah" + EOL + " code: public class Foo {}" + EOL + EOL + " src: "
- + getSourceCodeFilename() + ":1:1" + EOL + " rule: Boo" + EOL + " msg: blah" + EOL
- + " code: public class Foo {}" + EOL + EOL + EOL + EOL + "Summary:" + EOL
- + EOL + "* warnings: 2" + EOL;
- }
-
- @Override
- String getExpectedError(ProcessingError error) {
- return EOL + EOL + "Summary:" + EOL + EOL + "* file: file" + EOL + " err: RuntimeException: Error" + EOL
- + error.getDetail() + EOL + EOL
- + "* errors: 1" + EOL + "* warnings: 0" + EOL;
- }
-
- @Override
- String getExpectedErrorWithoutMessage(ProcessingError error) {
- return EOL + EOL + "Summary:" + EOL + EOL + "* file: file" + EOL + " err: NullPointerException: null" + EOL
- + error.getDetail() + EOL + EOL
- + "* errors: 1" + EOL + "* warnings: 0" + EOL;
- }
-
- @Override
- String getExpectedError(ConfigurationError error) {
- return EOL + EOL + "Summary:" + EOL + EOL + "* rule: Foo" + EOL
- + " err: a configuration error" + EOL + EOL
- + "* errors: 1" + EOL + "* warnings: 0" + EOL;
- }
-}
diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/RenderersTests.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/RenderersTests.java
index 071dcef8ee..46443e82eb 100644
--- a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/RenderersTests.java
+++ b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/RenderersTests.java
@@ -20,7 +20,7 @@ import org.junit.platform.suite.api.Suite;
HTMLRendererTest.class,
IDEAJRendererTest.class,
JsonRendererTest.class,
- PapariTextRendererTest.class,
+ TextColorRendererTest.class,
SarifRendererTest.class,
SummaryHTMLRendererTest.class,
TextPadRendererTest.class,
diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/renderers/TextColorRendererTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/TextColorRendererTest.java
new file mode 100644
index 0000000000..362bf196ce
--- /dev/null
+++ b/pmd-core/src/test/java/net/sourceforge/pmd/renderers/TextColorRendererTest.java
@@ -0,0 +1,96 @@
+/**
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+package net.sourceforge.pmd.renderers;
+
+import java.io.FileNotFoundException;
+import java.io.Reader;
+import java.io.StringReader;
+
+import net.sourceforge.pmd.Report.ConfigurationError;
+import net.sourceforge.pmd.Report.ProcessingError;
+
+class TextColorRendererTest extends AbstractRendererTest {
+
+ @Override
+ Renderer getRenderer() {
+ TextColorRenderer result = new TextColorRenderer() {
+ @Override
+ protected Reader getReader(String sourceFile) throws FileNotFoundException {
+ return new StringReader("public class Foo {}");
+ }
+ };
+ return result;
+ }
+
+ @Override
+ String getExpected() {
+ return "\u001B[1;33m*\u001B[0m file: \u001B[1;37m" + getSourceCodeFilename() + "\u001B[0m" + EOL
+ + "\u001B[0;32m src: \u001B[0;36m" + getSourceCodeFilename() + "\u001B[0m:\u001B[0;36m1:1\u001B[0m" + EOL
+ + "\u001B[0;32m rule: \u001B[0mFoo" + EOL
+ + "\u001B[0;32m msg: \u001B[0mblah" + EOL
+ + "\u001B[0;32m code: \u001B[0mpublic class Foo {}" + EOL
+ + EOL
+ + EOL
+ + EOL
+ + "Summary:" + EOL
+ + EOL
+ + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m1\u001B[0m" + EOL;
+ }
+
+ @Override
+ String getExpectedEmpty() {
+ return EOL + EOL + "Summary:" + EOL + EOL + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m0\u001B[0m" + EOL;
+ }
+
+ @Override
+ String getExpectedMultiple() {
+ return "\u001B[1;33m*\u001B[0m file: \u001B[1;37m" + getSourceCodeFilename() + "\u001B[0m" + EOL
+ + "\u001B[0;32m src: \u001B[0;36m" + getSourceCodeFilename() + "\u001B[0m:\u001B[0;36m1:1\u001B[0m" + EOL
+ + "\u001B[0;32m rule: \u001B[0mFoo" + EOL
+ + "\u001B[0;32m msg: \u001B[0mblah" + EOL
+ + "\u001B[0;32m code: \u001B[0mpublic class Foo {}" + EOL
+ + "" + EOL
+ + "\u001B[0;32m src: \u001B[0;36m" + getSourceCodeFilename() + "\u001B[0m:\u001B[0;36m1:1\u001B[0m" + EOL
+ + "\u001B[0;32m rule: \u001B[0mBoo" + EOL
+ + "\u001B[0;32m msg: \u001B[0mblah" + EOL
+ + "\u001B[0;32m code: \u001B[0mpublic class Foo {}" + EOL
+ + EOL
+ + EOL
+ + EOL
+ + "Summary:" + EOL
+ + EOL
+ + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m2\u001B[0m" + EOL;
+ }
+
+ @Override
+ String getExpectedError(ProcessingError error) {
+ return EOL + EOL + "Summary:" + EOL + EOL + "\u001B[1;31m*\u001B[0m file: \u001B[1;37mfile\u001B[0m" + EOL
+ + "\u001B[0;32m err: \u001B[0;36mRuntimeException: Error\u001B[0m" + EOL
+ + "\u001B[0;31m" + error.getDetail() + "\u001B[0m" + EOL + EOL
+ + "\u001B[1;31m*\u001B[0m errors: \u001B[1;37m1\u001B[0m" + EOL
+ + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m0\u001B[0m" + EOL;
+ }
+
+ @Override
+ String getExpectedErrorWithoutMessage(ProcessingError error) {
+ return EOL + EOL + "Summary:" + EOL + EOL + "\u001B[1;31m*\u001B[0m file: \u001B[1;37mfile\u001B[0m" + EOL
+ + "\u001B[0;32m err: \u001B[0;36mNullPointerException: null\u001B[0m" + EOL
+ + "\u001B[0;31m" + error.getDetail() + "\u001B[0m" + EOL + EOL
+ + "\u001B[1;31m*\u001B[0m errors: \u001B[1;37m1\u001B[0m" + EOL
+ + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m0\u001B[0m" + EOL;
+ }
+
+ @Override
+ String getExpectedError(ConfigurationError error) {
+ return EOL + EOL
+ + "Summary:" + EOL
+ + EOL
+ + "\u001B[1;31m*\u001B[0m rule: \u001B[1;37mFoo\u001B[0m" + EOL
+ + "\u001B[0;32m err: \u001B[0;36ma configuration error\u001B[0m" + EOL
+ + EOL
+ + "\u001B[1;31m*\u001B[0m errors: \u001B[1;37m1\u001B[0m" + EOL
+ + "\u001B[1;33m*\u001B[0m warnings: \u001B[1;37m0\u001B[0m" + EOL;
+ }
+}