From c161e57c1daec2ddaf37dda71dcc73711113ace6 Mon Sep 17 00:00:00 2001 From: Mateusz Stefanski Date: Sun, 23 Aug 2020 19:20:17 +0200 Subject: [PATCH 01/18] [doc] [java] SimplifyStartsWith: update description and example, fixes #1868 --- pmd-java/src/main/resources/category/java/performance.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pmd-java/src/main/resources/category/java/performance.xml b/pmd-java/src/main/resources/category/java/performance.xml index a4c4dffc31..92f6d98e74 100644 --- a/pmd-java/src/main/resources/category/java/performance.xml +++ b/pmd-java/src/main/resources/category/java/performance.xml @@ -699,7 +699,8 @@ public class C { externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_performance.html#simplifystartswith"> Since it passes in a literal of length 1, calls to (string).startsWith can be rewritten using (string).charAt(0) -at the expense of some readability. +at the expense of some readability. To prevent IndexOutOfBoundsException being thrown by the charAt method, +ensure that the (string) is not empty by making an additional check first. 3 @@ -730,7 +731,7 @@ public class Foo { } boolean fasterCheckIt(String x) { - return x.charAt(0) == 'a'; // faster approach + return !x.isEmpty() && x.charAt(0) == 'a'; // faster approach } } ]]> From af6969a29a407f7765c97f05e8b64a69db217d6e Mon Sep 17 00:00:00 2001 From: Mateusz Stefanski Date: Sun, 23 Aug 2020 20:54:35 +0200 Subject: [PATCH 02/18] [doc] [java] SuspiciousEqualsMethodName: update description, fixes #2264 --- pmd-java/src/main/resources/category/java/errorprone.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pmd-java/src/main/resources/category/java/errorprone.xml b/pmd-java/src/main/resources/category/java/errorprone.xml index 65979fcc61..e2983797e7 100644 --- a/pmd-java/src/main/resources/category/java/errorprone.xml +++ b/pmd-java/src/main/resources/category/java/errorprone.xml @@ -3052,8 +3052,12 @@ StringBuilder sb4 = new StringBuilder("c"); class="net.sourceforge.pmd.lang.rule.XPathRule" externalInfoUrl="${pmd.website.baseurl}/pmd_rules_java_errorprone.html#suspiciousequalsmethodname"> -The method name and parameter number are suspiciously close to equals(Object), which can denote an -intention to override the equals(Object) method. +The method name and parameter number are suspiciously close to Object.equals, which can denote an +intention to override it. However, the method does not override Object.equals, but overloads it instead. +Overloading Object.equals method is confusing for other programmers, error-prone and hard to main, +especially when using inheritance, because @Override annotations used in subclasses can provide a false +sense of security. For more information on Object.equals method, see Effective Java, 3rd Edition, +Item 10: Obey the general contract when overriding equals. 2 From d9d4b31a3ab9ee27615fa96b19d4481860ac356d Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 16:22:33 +0800 Subject: [PATCH 03/18] avoid compiling patterns times to times --- .../pmd/lang/vm/rule/design/NoInlineJavaScriptRule.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/design/NoInlineJavaScriptRule.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/design/NoInlineJavaScriptRule.java index b52831e8c4..37b84db61b 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/design/NoInlineJavaScriptRule.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/rule/design/NoInlineJavaScriptRule.java @@ -11,14 +11,15 @@ import net.sourceforge.pmd.lang.vm.ast.ASTText; import net.sourceforge.pmd.lang.vm.rule.AbstractVmRule; public class NoInlineJavaScriptRule extends AbstractVmRule { + private static final Pattern SCRIPT_PATTERN = Pattern.compile("]*>", Pattern.CASE_INSENSITIVE); + private static final Pattern SRC_PATTERN = Pattern.compile("\\ssrc\\s*=", Pattern.CASE_INSENSITIVE); + @Override public Object visit(final ASTText node, final Object data) { - final Pattern scriptPattern = Pattern.compile("]*>", Pattern.CASE_INSENSITIVE); - final Pattern srcPattern = Pattern.compile("\\ssrc\\s*=", Pattern.CASE_INSENSITIVE); - final Matcher matcher = scriptPattern.matcher(node.literal()); + final Matcher matcher = SCRIPT_PATTERN.matcher(node.literal()); while (matcher.find()) { final String currentMatch = matcher.group(); - if (!srcPattern.matcher(currentMatch).find()) { + if (!SRC_PATTERN.matcher(currentMatch).find()) { addViolation(data, node); } } From 327eaaedf69922f21f382093a46c3e8b30ceb7d6 Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 16:30:04 +0800 Subject: [PATCH 04/18] use StandardCharsets --- .../pmd/RuleSetFactoryCompatibility.java | 5 +++-- .../pmd/RuleSetFactoryCompatibilityTest.java | 18 ++++++++---------- .../sourceforge/pmd/RuleSetFactoryTest.java | 8 ++------ .../processor/MultiThreadProcessorTest.java | 3 ++- .../sourceforge/pmd/docs/DeadLinksChecker.java | 4 ++-- .../pmd/AbstractRuleSetFactoryTest.java | 8 ++------ 6 files changed, 19 insertions(+), 27 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java index 122a368d14..e1b70e541e 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java @@ -9,6 +9,7 @@ import java.io.InputStream; import java.io.Reader; import java.io.StringReader; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; @@ -138,9 +139,9 @@ public class RuleSetFactoryCompatibility { */ String determineEncoding(byte[] bytes) { String firstBytes = new String(bytes, 0, bytes.length > 1024 ? 1024 : bytes.length, - Charset.forName("ISO-8859-1")); + StandardCharsets.ISO_8859_1); Matcher matcher = ENCODING_PATTERN.matcher(firstBytes); - String encoding = Charset.forName("UTF-8").name(); + String encoding = StandardCharsets.UTF_8.name(); if (matcher.find()) { encoding = matcher.group(1); } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java index 6acaf22971..0123c38b84 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java @@ -7,8 +7,8 @@ package net.sourceforge.pmd; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Reader; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Test; @@ -16,8 +16,6 @@ import org.junit.Test; import net.sourceforge.pmd.util.ResourceLoader; public class RuleSetFactoryCompatibilityTest { - private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); - private static final Charset UTF_8 = Charset.forName("UTF-8"); @Test public void testCorrectOldReference() throws Exception { @@ -48,7 +46,7 @@ public class RuleSetFactoryCompatibilityTest { rsfc.addFilterRuleMoved("dummy", "notexisting", "basic", "OldDummyBasicMockRule"); rsfc.addFilterRuleRenamed("dummy", "basic", "OldDummyBasicMockRule", "NewNameForDummyBasicMockRule"); - InputStream stream = new ByteArrayInputStream(ruleset.getBytes(ISO_8859_1)); + InputStream stream = new ByteArrayInputStream(ruleset.getBytes(StandardCharsets.ISO_8859_1)); Reader filtered = rsfc.filterRuleSetFile(stream); String out = IOUtils.toString(filtered); @@ -90,7 +88,7 @@ public class RuleSetFactoryCompatibilityTest { RuleSetFactoryCompatibility rsfc = new RuleSetFactoryCompatibility(); rsfc.addFilterRuleMovedAndRenamed("dummy", "oldbasic", "OldDummyBasicMockRule", "basic", "NewNameForDummyBasicMockRule"); - InputStream stream = new ByteArrayInputStream(ruleset.getBytes(ISO_8859_1)); + InputStream stream = new ByteArrayInputStream(ruleset.getBytes(StandardCharsets.ISO_8859_1)); Reader filtered = rsfc.filterRuleSetFile(stream); String out = IOUtils.toString(filtered); @@ -112,7 +110,7 @@ public class RuleSetFactoryCompatibilityTest { + " \n" + " \n" + " \n" + "\n"; - InputStream stream = new ByteArrayInputStream(in.getBytes(ISO_8859_1)); + InputStream stream = new ByteArrayInputStream(in.getBytes(StandardCharsets.ISO_8859_1)); Reader filtered = rsfc.filterRuleSetFile(stream); String out = IOUtils.toString(filtered); @@ -136,7 +134,7 @@ public class RuleSetFactoryCompatibilityTest { + " xsi:schemaLocation=\"http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd\">\n" + " Test\n" + "\n" + " \n" + " \n" + " \n" + "\n"; - InputStream stream = new ByteArrayInputStream(in.getBytes(ISO_8859_1)); + InputStream stream = new ByteArrayInputStream(in.getBytes(StandardCharsets.ISO_8859_1)); Reader filtered = rsfc.filterRuleSetFile(stream); String out = IOUtils.toString(filtered); @@ -150,10 +148,10 @@ public class RuleSetFactoryCompatibilityTest { String testString; testString = ""; - Assert.assertEquals("ISO-8859-1", rsfc.determineEncoding(testString.getBytes(ISO_8859_1))); + Assert.assertEquals("ISO-8859-1", rsfc.determineEncoding(testString.getBytes(StandardCharsets.ISO_8859_1))); testString = ""; - Assert.assertEquals("UTF-8", rsfc.determineEncoding(testString.getBytes(ISO_8859_1))); + Assert.assertEquals("UTF-8", rsfc.determineEncoding(testString.getBytes(StandardCharsets.ISO_8859_1))); } private RuleSet createRulesetFromString(final String ruleset, RuleSetFactory factory) @@ -161,7 +159,7 @@ public class RuleSetFactoryCompatibilityTest { return factory.createRuleSet(new RuleSetReferenceId(null) { @Override public InputStream getInputStream(ResourceLoader resourceLoader) throws RuleSetNotFoundException { - return new ByteArrayInputStream(ruleset.getBytes(UTF_8)); + return new ByteArrayInputStream(ruleset.getBytes(StandardCharsets.UTF_8)); } }); } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryTest.java index f5b26ec49f..08c983529f 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryTest.java @@ -13,7 +13,7 @@ import static org.junit.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.InputStream; -import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -1269,11 +1269,7 @@ public class RuleSetFactoryTest { return new RuleSetReferenceId(null) { @Override public InputStream getInputStream(ResourceLoader resourceLoader) throws RuleSetNotFoundException { - try { - return new ByteArrayInputStream(ruleSetXml.getBytes("UTF-8")); - } catch (UnsupportedEncodingException e) { - return null; - } + return new ByteArrayInputStream(ruleSetXml.getBytes(StandardCharsets.UTF_8)); } }; } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/processor/MultiThreadProcessorTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/processor/MultiThreadProcessorTest.java index 3aa711568a..837cbf2ca6 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/processor/MultiThreadProcessorTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/processor/MultiThreadProcessorTest.java @@ -7,6 +7,7 @@ package net.sourceforge.pmd.processor; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -98,7 +99,7 @@ public class MultiThreadProcessorTest { @Override public InputStream getInputStream() throws IOException { - return new ByteArrayInputStream(data.getBytes("UTF-8")); + return new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8)); } @Override diff --git a/pmd-doc/src/main/java/net/sourceforge/pmd/docs/DeadLinksChecker.java b/pmd-doc/src/main/java/net/sourceforge/pmd/docs/DeadLinksChecker.java index 66d8c45a7e..f6c0ae2383 100644 --- a/pmd-doc/src/main/java/net/sourceforge/pmd/docs/DeadLinksChecker.java +++ b/pmd-doc/src/main/java/net/sourceforge/pmd/docs/DeadLinksChecker.java @@ -8,7 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; -import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -297,7 +297,7 @@ public class DeadLinksChecker { private String fileToString(Path mdFile) { try (InputStream inputStream = Files.newInputStream(mdFile)) { - return IOUtils.toString(inputStream, Charset.forName("UTF-8")); + return IOUtils.toString(inputStream, StandardCharsets.UTF_8); } catch (IOException ex) { throw new RuntimeException("error reading " + mdFile, ex); } diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java b/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java index 164e0590a3..98cb968a5d 100644 --- a/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java +++ b/pmd-test/src/main/java/net/sourceforge/pmd/AbstractRuleSetFactoryTest.java @@ -15,7 +15,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -483,11 +483,7 @@ public abstract class AbstractRuleSetFactoryTest { return new RuleSetReferenceId(null) { @Override public InputStream getInputStream(ResourceLoader resourceLoader) throws RuleSetNotFoundException { - try { - return new ByteArrayInputStream(ruleSetXml.getBytes("UTF-8")); - } catch (UnsupportedEncodingException e) { - return null; - } + return new ByteArrayInputStream(ruleSetXml.getBytes(StandardCharsets.UTF_8)); } }; } From b9e62fb4ebd748d7712b9f5e78927669bafe9bd0 Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 16:43:23 +0800 Subject: [PATCH 05/18] indexOf to contains --- .../pmd/lang/rule/ParametricRuleViolation.java | 2 +- .../pmd/util/database/SourceObject.java | 16 ++++++++-------- .../lang/java/rule/AbstractPoorMethodCall.java | 2 +- .../JUnitTestsShouldIncludeAssertRule.java | 2 +- .../java/rule/design/PositionalIteratorRule.java | 4 ++-- .../SignatureDeclareThrowsExceptionRule.java | 2 +- .../InefficientEmptyStringCheckRule.java | 2 +- .../InefficientStringBufferingRule.java | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/ParametricRuleViolation.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/ParametricRuleViolation.java index 1e8e4c68f5..2936a05b78 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/ParametricRuleViolation.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/rule/ParametricRuleViolation.java @@ -79,7 +79,7 @@ public class ParametricRuleViolation implements RuleViolation { protected String expandVariables(String message) { - if (message.indexOf("${") < 0) { + if (!message.contains("${")) { return message; } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/database/SourceObject.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/database/SourceObject.java index 5f73974de8..3c9135fec9 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/database/SourceObject.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/database/SourceObject.java @@ -131,21 +131,21 @@ public class SourceObject { LOG.entering(CLASS_NAME, "getSuffixFromType", this); if (null == type || type.isEmpty()) { return ""; - } else if (type.toUpperCase(Locale.ROOT).indexOf("JAVA") >= 0) { + } else if (type.toUpperCase(Locale.ROOT).contains("JAVA")) { return ".java"; - } else if (type.toUpperCase(Locale.ROOT).indexOf("TRIGGER") >= 0) { + } else if (type.toUpperCase(Locale.ROOT).contains("TRIGGER")) { return ".trg"; - } else if (type.toUpperCase(Locale.ROOT).indexOf("FUNCTION") >= 0) { + } else if (type.toUpperCase(Locale.ROOT).contains("FUNCTION")) { return ".fnc"; - } else if (type.toUpperCase(Locale.ROOT).indexOf("PROCEDURE") >= 0) { + } else if (type.toUpperCase(Locale.ROOT).contains("PROCEDURE")) { return ".prc"; - } else if (type.toUpperCase(Locale.ROOT).indexOf("PACKAGE_BODY") >= 0) { + } else if (type.toUpperCase(Locale.ROOT).contains("PACKAGE_BODY")) { return ".pkb"; - } else if (type.toUpperCase(Locale.ROOT).indexOf("PACKAGE") >= 0) { + } else if (type.toUpperCase(Locale.ROOT).contains("PACKAGE")) { return ".pks"; - } else if (type.toUpperCase(Locale.ROOT).indexOf("TYPE_BODY") >= 0) { + } else if (type.toUpperCase(Locale.ROOT).contains("TYPE_BODY")) { return ".tpb"; - } else if (type.toUpperCase(Locale.ROOT).indexOf("TYPE") >= 0) { + } else if (type.toUpperCase(Locale.ROOT).contains("TYPE")) { return ".tps"; } else { return ""; diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractPoorMethodCall.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractPoorMethodCall.java index 32321dc766..b869265b19 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractPoorMethodCall.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/AbstractPoorMethodCall.java @@ -75,7 +75,7 @@ public abstract class AbstractPoorMethodCall extends AbstractJavaRule { String[] methodNames = methodNames(); for (String element : methodNames) { - if (methodCall.indexOf(element) != -1) { + if (methodCall.contains(element)) { return true; } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestsShouldIncludeAssertRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestsShouldIncludeAssertRule.java index aac15c9d87..52807c1119 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestsShouldIncludeAssertRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/bestpractices/JUnitTestsShouldIncludeAssertRule.java @@ -210,7 +210,7 @@ public class JUnitTestsShouldIncludeAssertRule extends AbstractJUnitRule { Node name = pe.getFirstDescendantOfType(ASTName.class); if (name != null) { String img = name.getImage(); - if (img.indexOf(".") == -1) { + if (!img.contains(".")) { return false; } String[] tokens = img.split("\\."); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/PositionalIteratorRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/PositionalIteratorRule.java index 945f95f8b9..c5b4a4b461 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/PositionalIteratorRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/PositionalIteratorRule.java @@ -18,14 +18,14 @@ public class PositionalIteratorRule extends AbstractJavaRule { public Object visit(ASTWhileStatement node, Object data) { if (hasNameAsChild(node.getChild(0))) { String exprName = getName(node.getChild(0)); - if (exprName.indexOf(".hasNext") != -1 && node.getNumChildren() > 1) { + if (exprName.contains(".hasNext") && node.getNumChildren() > 1) { Node loopBody = node.getChild(1); List names = new ArrayList<>(); collectNames(getVariableName(exprName), names, loopBody); int nextCount = 0; for (String name : names) { - if (name.indexOf(".next") != -1) { + if (name.contains(".next")) { nextCount++; } } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SignatureDeclareThrowsExceptionRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SignatureDeclareThrowsExceptionRule.java index 489fb4a8c6..ad4a01a476 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SignatureDeclareThrowsExceptionRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SignatureDeclareThrowsExceptionRule.java @@ -103,7 +103,7 @@ public class SignatureDeclareThrowsExceptionRule extends AbstractJavaRule { @Override public Object visit(ASTImportDeclaration node, Object o) { - if (node.getImportedName().indexOf("junit") != -1) { + if (node.getImportedName().contains("junit")) { junitImported = true; } return super.visit(node, o); diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InefficientEmptyStringCheckRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InefficientEmptyStringCheckRule.java index f7ae7eeb75..63ad694116 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InefficientEmptyStringCheckRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InefficientEmptyStringCheckRule.java @@ -46,7 +46,7 @@ public class InefficientEmptyStringCheckRule extends AbstractInefficientZeroChec @Override public boolean isTargetMethod(JavaNameOccurrence occ) { if (occ.getNameForWhichThisIsAQualifier() != null - && occ.getNameForWhichThisIsAQualifier().getImage().indexOf("trim") != -1) { + && occ.getNameForWhichThisIsAQualifier().getImage().contains("trim")) { Node pExpression = occ.getLocation().getParent().getParent(); if (pExpression.getNumChildren() > 2 && "length".equals(pExpression.getChild(2).getImage())) { return true; diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InefficientStringBufferingRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InefficientStringBufferingRule.java index cf832d2882..9cf762af10 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InefficientStringBufferingRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/performance/InefficientStringBufferingRule.java @@ -181,7 +181,7 @@ public class InefficientStringBufferingRule extends AbstractJavaRule { return false; } ASTName n = s.getFirstDescendantOfType(ASTName.class); - if (n == null || n.getImage().indexOf(methodName) == -1 + if (n == null || !n.getImage().contains(methodName) || !(n.getNameDeclaration() instanceof VariableNameDeclaration)) { return false; } From 33e4f98274b8845cbf2785ec52d3bd185789be3d Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 16:45:11 +0800 Subject: [PATCH 06/18] StringBuffer to StringBuilder --- .../main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java | 2 +- .../java/net/sourceforge/pmd/renderers/TextPadRenderer.java | 2 +- .../main/java/net/sourceforge/pmd/util/designer/DFAPanel.java | 2 +- .../main/java/net/sourceforge/pmd/util/designer/Designer.java | 2 +- .../sourceforge/pmd/util/viewer/gui/menu/SimpleNodeSubMenu.java | 2 +- .../src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java | 2 +- .../main/java/net/sourceforge/pmd/testframework/RuleTst.java | 2 +- .../net/sourceforge/pmd/lang/vm/ast/TemplateParseException.java | 2 +- .../java/net/sourceforge/pmd/lang/vm/ast/TokenMgrError.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java index 5be922ea56..4dae8b745d 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java @@ -173,7 +173,7 @@ public class HTMLRenderer extends AbstractIncrementingRenderer { writer.write("" + PMD.EOL + "" + PMD.EOL); - StringBuffer buf = new StringBuffer(500); + StringBuilder buf = new StringBuilder(500); boolean colorize = true; for (Report.ProcessingError pe : errors) { buf.setLength(0); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextPadRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextPadRenderer.java index f4aeb0dbac..d58226fbcd 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextPadRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextPadRenderer.java @@ -50,7 +50,7 @@ public class TextPadRenderer extends AbstractIncrementingRenderer { @Override public void renderFileViolations(Iterator violations) throws IOException { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); while (violations.hasNext()) { RuleViolation rv = violations.next(); buf.setLength(0); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/designer/DFAPanel.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/designer/DFAPanel.java index 2e7dec8bf9..05be24140b 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/designer/DFAPanel.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/designer/DFAPanel.java @@ -66,7 +66,7 @@ public class DFAPanel extends JComponent implements ListSelectionListener { return ""; } - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(kids.get(0).getIndex()); for (int j = 1; j < node.getChildren().size(); j++) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/designer/Designer.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/designer/Designer.java index d54493a68e..a12cc8000a 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/designer/Designer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/designer/Designer.java @@ -710,7 +710,7 @@ public class Designer implements ClipboardOwner { String text; if (value instanceof Node) { Node node = (Node) value; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); String name = node.getClass().getName().substring(node.getClass().getName().lastIndexOf('.') + 1); if (Proxy.isProxyClass(value.getClass())) { name = value.toString(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/viewer/gui/menu/SimpleNodeSubMenu.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/viewer/gui/menu/SimpleNodeSubMenu.java index d8f2d32689..9654312292 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/viewer/gui/menu/SimpleNodeSubMenu.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/viewer/gui/menu/SimpleNodeSubMenu.java @@ -38,7 +38,7 @@ public class SimpleNodeSubMenu extends JMenu { } private void init() { - StringBuffer buf = new StringBuffer(200); + StringBuilder buf = new StringBuilder(200); for (Node temp = node; temp != null; temp = temp.getParent()) { buf.insert(0, "/" + temp.toString()); } diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java index 97c7aade2b..62286962d0 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java @@ -57,7 +57,7 @@ public class FileReporterTest { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(file)); - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); String line = reader.readLine(); while (line != null) { buffer.append(line); diff --git a/pmd-test/src/main/java/net/sourceforge/pmd/testframework/RuleTst.java b/pmd-test/src/main/java/net/sourceforge/pmd/testframework/RuleTst.java index 1c9529b0e5..2b0d6ef46a 100644 --- a/pmd-test/src/main/java/net/sourceforge/pmd/testframework/RuleTst.java +++ b/pmd-test/src/main/java/net/sourceforge/pmd/testframework/RuleTst.java @@ -510,7 +510,7 @@ public abstract class RuleTst { } private static String parseTextNode(Node exampleNode) { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); for (int i = 0; i < exampleNode.getChildNodes().getLength(); i++) { Node node = exampleNode.getChildNodes().item(i); if (node.getNodeType() == Node.CDATA_SECTION_NODE || node.getNodeType() == Node.TEXT_NODE) { diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/TemplateParseException.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/TemplateParseException.java index 1913c84cee..d549c50cde 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/TemplateParseException.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/TemplateParseException.java @@ -162,7 +162,7 @@ public class TemplateParseException extends ParseException { int maxSize = 0; - final StringBuffer expected = new StringBuffer(); + final StringBuilder expected = new StringBuilder(); for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { diff --git a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/TokenMgrError.java b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/TokenMgrError.java index 898ad8dfec..c4a7ca67d0 100644 --- a/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/TokenMgrError.java +++ b/pmd-vm/src/main/java/net/sourceforge/pmd/lang/vm/ast/TokenMgrError.java @@ -67,7 +67,7 @@ public class TokenMgrError extends RuntimeException { * equivalents in the given string */ protected static final String addEscapes(final String str) { - final StringBuffer retval = new StringBuffer(); + final StringBuilder retval = new StringBuilder(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { From 135d17b4aedb644cbc18f9500b973c5b84dfb78d Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 16:48:50 +0800 Subject: [PATCH 07/18] valueOf to parse when we need primitive return value. --- .../java/net/sourceforge/pmd/properties/BooleanProperty.java | 2 +- .../pmd/lang/java/rule/design/GenericClassCounterRule.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/properties/BooleanProperty.java b/pmd-core/src/main/java/net/sourceforge/pmd/properties/BooleanProperty.java index 0f3ef45b96..7614a2fa15 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/properties/BooleanProperty.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/properties/BooleanProperty.java @@ -33,7 +33,7 @@ public final class BooleanProperty extends AbstractSingleValueProperty */ @Deprecated public BooleanProperty(String theName, String theDescription, String defaultBoolStr, float theUIOrder) { - this(theName, theDescription, Boolean.valueOf(defaultBoolStr), theUIOrder, false); + this(theName, theDescription, Boolean.parseBoolean(defaultBoolStr), theUIOrder, false); } diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/GenericClassCounterRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/GenericClassCounterRule.java index 44849f2132..5ed182a38f 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/GenericClassCounterRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/GenericClassCounterRule.java @@ -93,7 +93,7 @@ public class GenericClassCounterRule extends AbstractJavaRule { this.operand = getProperty(OPERAND_DESCRIPTOR); this.typesMatch = RegexHelper.compilePatternsFromList(getProperty(TYPE_MATCH_DESCRIPTOR)); String thresholdAsString = getProperty(THRESHOLD_DESCRIPTOR); - this.threshold = Integer.valueOf(thresholdAsString); + this.threshold = Integer.parseInt(thresholdAsString); // Initializing list of match this.matches = new ArrayList<>(); From c5e223476398855dfd89f85d05301a2f1a3c9333 Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 16:50:41 +0800 Subject: [PATCH 08/18] use try with resource --- .../java/net/sourceforge/pmd/cpd/FileReporterTest.java | 8 +------- .../java/net/sourceforge/pmd/it/ZipFileExtractor.java | 10 ++-------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java index 97c7aade2b..9420578b58 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/cpd/FileReporterTest.java @@ -54,9 +54,7 @@ public class FileReporterTest { } private String readFile(File file) throws IOException { - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader(file)); + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { StringBuffer buffer = new StringBuffer(); String line = reader.readLine(); while (line != null) { @@ -67,10 +65,6 @@ public class FileReporterTest { } } return buffer.toString(); - } finally { - if (reader != null) { - reader.close(); - } } } diff --git a/pmd-dist/src/test/java/net/sourceforge/pmd/it/ZipFileExtractor.java b/pmd-dist/src/test/java/net/sourceforge/pmd/it/ZipFileExtractor.java index d31051fd04..27a8b325d6 100644 --- a/pmd-dist/src/test/java/net/sourceforge/pmd/it/ZipFileExtractor.java +++ b/pmd-dist/src/test/java/net/sourceforge/pmd/it/ZipFileExtractor.java @@ -39,8 +39,7 @@ public class ZipFileExtractor { * @throws Exception if any error happens during extraction */ public static void extractZipFile(Path zipPath, Path tempDir) throws Exception { - ZipFile zip = new ZipFile(zipPath.toFile()); - try { + try (ZipFile zip = new ZipFile(zipPath.toFile())) { Enumeration entries = zip.getEntries(); while (entries.hasMoreElements()) { ZipArchiveEntry entry = entries.nextElement(); @@ -57,8 +56,6 @@ public class ZipFileExtractor { } } } - } finally { - zip.close(); } } @@ -70,15 +67,12 @@ public class ZipFileExtractor { */ public static List readZipFile(Path zipPath) throws Exception { List result = new ArrayList<>(); - ZipFile zip = new ZipFile(zipPath.toFile()); - try { + try (ZipFile zip = new ZipFile(zipPath.toFile())) { Enumeration entries = zip.getEntries(); while (entries.hasMoreElements()) { ZipArchiveEntry entry = entries.nextElement(); result.add(entry.getName()); } - } finally { - zip.close(); } return result; } From 3e0a7df72defa64a5d228433e58f322df8e72fac Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 16:59:00 +0800 Subject: [PATCH 09/18] use print instead of printf as no format exist. --- .../net/sourceforge/pmd/util/database/DBMSMetadataTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/util/database/DBMSMetadataTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/util/database/DBMSMetadataTest.java index 6a644e470c..bf12ee5d3c 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/util/database/DBMSMetadataTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/util/database/DBMSMetadataTest.java @@ -279,7 +279,7 @@ public class DBMSMetadataTest { "testURI=%s,\ngetSchemasList()=%s\n,getSourceCodeTypesList()=%s\n,getSourceCodeNmesList()=%s\n", testURI, testURI.getSchemasList(), testURI.getSourceCodeTypesList(), testURI.getSourceCodeNamesList()); - System.out.printf("sourceObjectList ...\n"); + System.out.print("sourceObjectList ...\n"); for (SourceObject sourceObject : sourceObjectList) { System.out.printf("sourceObject=%s\n", sourceObject); System.out.printf("sourceCode=[%s]\n", getStringFromReader(instance.getSourceCode(sourceObject))); From fc198615090b913c76450c4038db59c773fe2eca Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 19:08:32 +0800 Subject: [PATCH 10/18] fix checkstyle --- .../java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java | 1 - .../net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java index e1b70e541e..cd933218fd 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/RuleSetFactoryCompatibility.java @@ -8,7 +8,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.io.StringReader; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.LinkedList; import java.util.List; diff --git a/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java b/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java index 0123c38b84..7dfb6e1f09 100644 --- a/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java +++ b/pmd-core/src/test/java/net/sourceforge/pmd/RuleSetFactoryCompatibilityTest.java @@ -7,8 +7,8 @@ package net.sourceforge.pmd; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.Reader; - import java.nio.charset.StandardCharsets; + import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Test; From 13af7b530de871137be8b8e9de1ea64d8ce954c1 Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 16:41:26 +0800 Subject: [PATCH 11/18] fix javadoc --- .../java/net/sourceforge/pmd/util/database/DBMSMetadata.java | 2 +- .../main/java/net/sourceforge/pmd/lang/java/ast/Comment.java | 1 - .../net/sourceforge/pmd/lang/java/multifile/ClassStats.java | 4 ++-- .../pmd/lang/java/rule/design/SimplifyBooleanReturnsRule.java | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/util/database/DBMSMetadata.java b/pmd-core/src/main/java/net/sourceforge/pmd/util/database/DBMSMetadata.java index cd3b28e5f5..e89dd83ef1 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/util/database/DBMSMetadata.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/util/database/DBMSMetadata.java @@ -88,7 +88,7 @@ public class DBMSMetadata { /** * {@link java.sql.Types} value representing the type returned by - * {@link callableStatement} + * {@link #callableStatement} * * Currently only java.sql.Types.String and java.sql.Types.Clob are * supported diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/Comment.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/Comment.java index da668e6d2f..44848174dd 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/Comment.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/ast/Comment.java @@ -53,7 +53,6 @@ public abstract class Comment extends AbstractNode { * of the comment as well as the start marker ({@code //}, {@code /*} or {@code /**} * and the end markers (*/). * - * @param comment the raw comment * @return List of lines of the comments */ private List multiLinesIn() { diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/multifile/ClassStats.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/multifile/ClassStats.java index b7aba0d141..589dcdcf49 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/multifile/ClassStats.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/multifile/ClassStats.java @@ -10,18 +10,18 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import net.sourceforge.pmd.lang.java.ast.JavaQualifiedName; import net.sourceforge.pmd.lang.java.multifile.signature.JavaFieldSigMask; import net.sourceforge.pmd.lang.java.multifile.signature.JavaFieldSignature; import net.sourceforge.pmd.lang.java.multifile.signature.JavaOperationSigMask; import net.sourceforge.pmd.lang.java.multifile.signature.JavaOperationSignature; +import net.sourceforge.pmd.lang.java.qname.JavaTypeQualifiedName; /** * Statistics about a class, enum, interface, or annotation. Stores information about the contained members and their * signatures, and memoizes the results of the class metrics computed on the corresponding node. * *

This class does not provide methods to operate directly on its nested classes, but only on itself. To operate on a - * nested class, retrieve the correct ClassStats with {@link PackageStats#getClassStats(JavaQualifiedName, boolean)} + * nested class, retrieve the correct ClassStats with {@link PackageStats#getClassStats(JavaTypeQualifiedName, boolean)} * then use the methods of ClassStats. Note that at this level, entities of the data structure do not manipulate * QualifiedNames anymore, only Strings. * diff --git a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SimplifyBooleanReturnsRule.java b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SimplifyBooleanReturnsRule.java index f73c4f96a8..74f7591cd0 100644 --- a/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SimplifyBooleanReturnsRule.java +++ b/pmd-java/src/main/java/net/sourceforge/pmd/lang/java/rule/design/SimplifyBooleanReturnsRule.java @@ -157,7 +157,7 @@ public class SimplifyBooleanReturnsRule extends AbstractJavaRule { * Checks, whether there is a statement after the given if statement, and if * so, whether this is just a return boolean statement. * - * @param node + * @param ifNode * the if statement * @return */ @@ -176,7 +176,7 @@ public class SimplifyBooleanReturnsRule extends AbstractJavaRule { * Checks whether the given ifstatement just returns a boolean in the if * clause. * - * @param node + * @param ifNode * the if statement * @return */ From 98e4114745bbecc0cc74e518867cc7c04c50604d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Fournier?= Date: Mon, 24 Aug 2020 20:42:48 +0200 Subject: [PATCH 12/18] Update release notes --- docs/pages/release_notes.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 472047cab8..8da3976396 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -176,6 +176,14 @@ are deprecated as internal API. * [#2699](https://github.com/pmd/pmd/pull/2699): \[java] ProperCloneImplementation not valid for final class - [Mykhailo Palahuta](https://github.com/Drofff) * [#2700](https://github.com/pmd/pmd/pull/2700): \[java] Fix OnlyOneReturn code example - [Jan-Lukas Else](https://github.com/jlelse) * [#2722](https://github.com/pmd/pmd/pull/2722): \[doc] \[java] ImmutableField: extend description, fixes #2108 - [Mateusz Stefanski](https://github.com/mateusz-stefanski) +* [#2725](https://github.com/pmd/pmd/pull/2725): Cleanup: change valueOf to parse when we need primitive return value. - [XenoAmess](https://github.com/XenoAmess) +* [#2726](https://github.com/pmd/pmd/pull/2726): Cleanup: replace StringBuffer with StringBuilder - [XenoAmess](https://github.com/XenoAmess) +* [#2727](https://github.com/pmd/pmd/pull/2727): Cleanup: replace indexOf() < 0 with contains - [XenoAmess](https://github.com/XenoAmess) +* [#2728](https://github.com/pmd/pmd/pull/2728): Cleanup: javadoc issues - [XenoAmess](https://github.com/XenoAmess) +* [#2729](https://github.com/pmd/pmd/pull/2729): Cleanup: use print instead of printf if no format exists - [XenoAmess](https://github.com/XenoAmess) +* [#2731](https://github.com/pmd/pmd/pull/2731): Cleanup: avoid compiling Patterns repeatedly - [XenoAmess](https://github.com/XenoAmess) +* [#2732](https://github.com/pmd/pmd/pull/2732): Cleanup: use StandardCharsets instead of Charset.forName - [XenoAmess](https://github.com/XenoAmess) +* [#2734](https://github.com/pmd/pmd/pull/2734): Cleanup: use try with resources - [XenoAmess](https://github.com/XenoAmess) {% endtocmaker %} From 90f53f892f6f6fd1f54a206147bc48018285d46d Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Mon, 24 Aug 2020 17:17:39 +0800 Subject: [PATCH 13/18] StringBuilder issues --- .../pmd/cli/PMDCommandLineInterface.java | 6 +- .../net/sourceforge/pmd/cpd/VSRenderer.java | 5 +- .../dfa/report/ReportHTMLPrintVisitor.java | 3 +- .../pmd/renderers/CodeClimateRenderer.java | 37 +++++--- .../pmd/renderers/HTMLRenderer.java | 48 +++++------ .../pmd/renderers/IDEAJRenderer.java | 2 +- .../pmd/renderers/TextColorRenderer.java | 85 +++++++++++++++---- .../pmd/renderers/TextPadRenderer.java | 2 +- .../pmd/renderers/VBHTMLRenderer.java | 7 +- .../lang/plsql/symboltable/ClassScope.java | 14 +-- .../pmd/AbstractRuleSetFactoryTest.java | 55 ++++++++---- 11 files changed, 174 insertions(+), 90 deletions(-) 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 58af4c1bd2..8642562b11 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 @@ -60,10 +60,10 @@ public final class PMDCommandLineInterface { public static String buildUsageText(JCommander jcommander) { StringBuilder usage = new StringBuilder(); - String allCommandsDescription = null; + StringBuilder allCommandsDescription = null; if (jcommander != null && jcommander.getCommands() != null) { for (String command : jcommander.getCommands().keySet()) { - allCommandsDescription += jcommander.getCommandDescription(command) + PMD.EOL; + allCommandsDescription.append(jcommander.getCommandDescription(command)).append(PMD.EOL); } } @@ -143,7 +143,7 @@ public final class PMDCommandLineInterface { Renderer renderer = RendererFactory.createRenderer(reportName, new Properties()); buf.append(" ").append(reportName).append(": "); if (!reportName.equals(renderer.getName())) { - buf.append(" Deprecated alias for '" + renderer.getName()).append(PMD.EOL); + buf.append(" Deprecated alias for '").append(renderer.getName()).append(PMD.EOL); continue; } buf.append(renderer.getDescription()).append(PMD.EOL); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/VSRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/VSRenderer.java index f34622e2f0..cc3af3f2d2 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/cpd/VSRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/cpd/VSRenderer.java @@ -33,9 +33,8 @@ public class VSRenderer implements Renderer, CPDRenderer { for (Iterator iterator = match.iterator(); iterator.hasNext();) { mark = iterator.next(); writer.append(mark.getFilename()) - .append('(').append(String.valueOf(mark.getBeginLine())).append("):") - .append(" Between lines " + mark.getBeginLine() + " and " - + (mark.getBeginLine() + match.getLineCount()) + PMD.EOL); + .append('(').append(String.valueOf(mark.getBeginLine())).append("):") + .append(" Between lines ").append(String.valueOf(mark.getBeginLine())).append(" and ").append(String.valueOf(mark.getBeginLine() + match.getLineCount())).append(PMD.EOL); } } writer.flush(); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/lang/dfa/report/ReportHTMLPrintVisitor.java b/pmd-core/src/main/java/net/sourceforge/pmd/lang/dfa/report/ReportHTMLPrintVisitor.java index 682dbbc587..af06618833 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/lang/dfa/report/ReportHTMLPrintVisitor.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/lang/dfa/report/ReportHTMLPrintVisitor.java @@ -131,8 +131,7 @@ public class ReportHTMLPrintVisitor extends ReportVisitor { vnode.getParent().addNumberOfViolation(1); RuleViolation vio = vnode.getRuleViolation(); - classBuf.append("

" + " " + " " + ""); + classBuf.append("" + " ").append(" ").append(""); } private void renderPackage(PackageNode pnode) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/CodeClimateRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/CodeClimateRenderer.java index 67a27d783a..c738fac851 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/CodeClimateRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/CodeClimateRenderer.java @@ -145,27 +145,38 @@ public class CodeClimateRenderer extends AbstractIncrementingRenderer { } private String getBody() { - String result = "## " + rule.getName() + "\\n\\n" + "Since: PMD " + rule.getSince() + "\\n\\n" + "Priority: " - + rule.getPriority() + "\\n\\n" - + "[Categories](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#categories): " - + Arrays.toString(getCategories()).replaceAll("[\\[\\]]", "") + "\\n\\n" - + "[Remediation Points](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#remediation-points): " - + getRemediationPoints() + "\\n\\n" + cleaned(rule.getDescription()); + StringBuilder result = new StringBuilder(); + result.append("## ") + .append(rule.getName()) + .append("\\n\\n") + .append("Since: PMD ") + .append(rule.getSince()) + .append("\\n\\n") + .append("Priority: ") + .append(rule.getPriority()) + .append("\\n\\n") + .append("[Categories](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#categories): ") + .append(Arrays.toString(getCategories()).replaceAll("[\\[\\]]", "")) + .append("\\n\\n") + .append("[Remediation Points](https://github.com/codeclimate/platform/blob/master/spec/analyzers/SPEC.md#remediation-points): ") + .append(getRemediationPoints()) + .append("\\n\\n") + .append(cleaned(rule.getDescription())); if (!rule.getExamples().isEmpty()) { - result += "\\n\\n### Example:\\n\\n"; + result.append("\\n\\n### Example:\\n\\n"); for (String snippet : rule.getExamples()) { String exampleSnippet = snippet.replaceAll("\\n", "\\\\n"); exampleSnippet = exampleSnippet.replaceAll("\\t", "\\\\t"); - result += "```java\\n" + exampleSnippet + "\\n``` "; + result.append("```java\\n").append(exampleSnippet).append("\\n``` "); } } if (!rule.getPropertyDescriptors().isEmpty()) { - result += "\\n\\n### [PMD properties](" + PMD_PROPERTIES_URL + ")\\n\\n"; - result += "Name | Value | Description\\n"; - result += "--- | --- | ---\\n"; + result.append("\\n\\n### [PMD properties](").append(PMD_PROPERTIES_URL).append(")\\n\\n"); + result.append("Name | Value | Description\\n"); + result.append("--- | --- | ---\\n"); for (PropertyDescriptor property : rule.getPropertyDescriptors()) { String propertyName = property.name().replaceAll("\\_", "\\\\_"); @@ -182,10 +193,10 @@ public class CodeClimateRenderer extends AbstractIncrementingRenderer { } propertyValue = propertyValue.replaceAll("(\n|\r\n|\r)", "\\\\n"); - result += propertyName + " | " + propertyValue + " | " + property.description() + "\\n"; + result.append(propertyName).append(" | ").append(propertyValue).append(" | ").append(property.description()).append("\\n"); } } - return cleaned(result); + return cleaned(result.toString()); } private String cleaned(String original) { diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java index 5be922ea56..ed0d92a51e 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/HTMLRenderer.java @@ -128,12 +128,13 @@ public class HTMLRenderer extends AbstractIncrementingRenderer { buf.append(" bgcolor=\"lightgrey\""); } colorize = !colorize; - buf.append("> " + PMD.EOL); - buf.append("" + PMD.EOL); - buf.append("" + PMD.EOL); - buf.append("" + PMD.EOL); + buf.append("> ").append(PMD.EOL); + buf.append("").append(PMD.EOL); + buf.append("") + .append(PMD.EOL); + buf.append("").append(PMD.EOL); String d = StringEscapeUtils.escapeHtml4(rv.getDescription()); @@ -141,8 +142,8 @@ public class HTMLRenderer extends AbstractIncrementingRenderer { if (StringUtils.isNotBlank(infoUrl)) { d = "" + d + ""; } - buf.append("" + PMD.EOL); - buf.append("" + PMD.EOL); + buf.append("").append(PMD.EOL); + buf.append("").append(PMD.EOL); writer.write(buf.toString()); violationCount++; } @@ -182,10 +183,10 @@ public class HTMLRenderer extends AbstractIncrementingRenderer { buf.append(" bgcolor=\"lightgrey\""); } colorize = !colorize; - buf.append("> " + PMD.EOL); - buf.append("" + PMD.EOL); - buf.append("" + PMD.EOL); - buf.append("" + PMD.EOL); + buf.append("> ").append(PMD.EOL); + buf.append("").append(PMD.EOL); + buf.append("").append(PMD.EOL); + buf.append("").append(PMD.EOL); writer.write(buf.toString()); } writer.write("
FileProblem
" + vio.getMethodName() + "" + this.displayRuleViolation(vio) - + "
").append(vio.getMethodName()).append("").append(this.displayRuleViolation(vio)).append("
" + violationCount + "" - + renderFileName(rv.getFilename(), rv.getBeginLine()) - + "" + Integer.toString(rv.getBeginLine()) + "").append(violationCount).append("") + .append(renderFileName(rv.getFilename(), rv.getBeginLine())) + .append("").append(rv.getBeginLine()).append("" + d + "
").append(d).append("
" + renderFileName(pe.getFile(), -1) + "
" + pe.getDetail() + "
").append(renderFileName(pe.getFile(), -1)).append("
").append(pe.getDetail()).append("
"); @@ -210,15 +211,14 @@ public class HTMLRenderer extends AbstractIncrementingRenderer { buf.append(" bgcolor=\"lightgrey\""); } colorize = !colorize; - buf.append("> " + PMD.EOL); + buf.append("> ").append(PMD.EOL); RuleViolation rv = sv.getRuleViolation(); - buf.append("" + renderFileName(rv.getFilename(), rv.getBeginLine()) + "" + PMD.EOL); - buf.append("" + rv.getBeginLine() + "" + PMD.EOL); - buf.append("" + renderRuleName(rv.getRule()) + "" + PMD.EOL); - buf.append("" + (sv.suppressedByNOPMD() ? "NOPMD" : "Annotation") + "" + PMD.EOL); - buf.append("" + (sv.getUserMessage() == null ? "" : sv.getUserMessage()) + "" - + PMD.EOL); - buf.append("" + PMD.EOL); + buf.append("").append(renderFileName(rv.getFilename(), rv.getBeginLine())).append("").append(PMD.EOL); + buf.append("").append(rv.getBeginLine()).append("").append(PMD.EOL); + buf.append("").append(renderRuleName(rv.getRule())).append("").append(PMD.EOL); + buf.append("").append(sv.suppressedByNOPMD() ? "NOPMD" : "Annotation").append("").append(PMD.EOL); + buf.append("").append(sv.getUserMessage() == null ? "" : sv.getUserMessage()).append("").append(PMD.EOL); + buf.append("").append(PMD.EOL); writer.write(buf.toString()); } writer.write(""); @@ -243,10 +243,10 @@ public class HTMLRenderer extends AbstractIncrementingRenderer { buf.append(" bgcolor=\"lightgrey\""); } colorize = !colorize; - buf.append("> " + PMD.EOL); - buf.append("" + renderRuleName(ce.rule()) + "" + PMD.EOL); - buf.append("" + ce.issue() + "" + PMD.EOL); - buf.append("" + PMD.EOL); + buf.append("> ").append(PMD.EOL); + buf.append("").append(renderRuleName(ce.rule())).append("").append(PMD.EOL); + buf.append("").append(ce.issue()).append("").append(PMD.EOL); + buf.append("").append(PMD.EOL); writer.write(buf.toString()); } writer.write(""); diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/IDEAJRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/IDEAJRenderer.java index 4147ef0404..0cc16dc8d9 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/IDEAJRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/IDEAJRenderer.java @@ -66,7 +66,7 @@ public class IDEAJRenderer extends AbstractIncrementingRenderer { while (violations.hasNext()) { buf.setLength(0); RuleViolation rv = violations.next(); - buf.append(rv.getDescription() + PMD.EOL); + buf.append(rv.getDescription()).append(PMD.EOL); buf.append(" at ").append(getFullyQualifiedClassName(rv.getFilename(), sourcePath)).append(".method("); buf.append(getSimpleFileName(rv.getFilename())).append(':').append(rv.getBeginLine()).append(')') .append(PMD.EOL); 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 bc2c95c706..c4a960c464 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 @@ -125,17 +125,41 @@ public class TextColorRenderer extends AbstractAccumulatingRenderer { String nextFile = determineFileName(rv.getFilename()); if (!nextFile.equals(lastFile)) { lastFile = nextFile; - buf.append(this.yellowBold + "*" + this.colorReset + " file: " + this.whiteBold - + this.getRelativePath(lastFile) + this.colorReset + PMD.EOL); + buf.append(this.yellowBold) + .append("*") + .append(this.colorReset) + .append(" file: ") + .append(this.whiteBold) + .append(this.getRelativePath(lastFile)) + .append(this.colorReset) + .append(PMD.EOL); } - buf.append( - this.green + " src: " + this.cyan + lastFile.substring(lastFile.lastIndexOf(File.separator) + 1) - + this.colorReset + ":" + this.cyan + rv.getBeginLine() - + (rv.getEndLine() == -1 ? "" : ":" + rv.getEndLine()) + this.colorReset + PMD.EOL); - buf.append(this.green + " rule: " + this.colorReset + rv.getRule().getName() + PMD.EOL); - buf.append(this.green + " msg: " + this.colorReset + rv.getDescription() + PMD.EOL); - buf.append(this.green + " code: " + this.colorReset + this.getLine(lastFile, rv.getBeginLine()) + PMD.EOL - + PMD.EOL); + buf.append(this.green) + .append(" src: ") + .append(this.cyan) + .append(lastFile.substring(lastFile.lastIndexOf(File.separator) + 1)) + .append(this.colorReset).append(":") + .append(this.cyan) + .append(rv.getBeginLine()) + .append(rv.getEndLine() == -1 ? "" : ":" + rv.getEndLine()) + .append(this.colorReset) + .append(PMD.EOL); + buf.append(this.green) + .append(" rule: ") + .append(this.colorReset) + .append(rv.getRule().getName()) + .append(PMD.EOL); + buf.append(this.green) + .append(" msg: ") + .append(this.colorReset) + .append(rv.getDescription()) + .append(PMD.EOL); + buf.append(this.green) + .append(" code: ") + .append(this.colorReset) + .append(this.getLine(lastFile, rv.getBeginLine())) + .append(PMD.EOL) + .append(PMD.EOL); writer.write(buf.toString()); } writer.write(PMD.EOL + PMD.EOL); @@ -155,11 +179,26 @@ public class TextColorRenderer extends AbstractAccumulatingRenderer { String nextFile = determineFileName(error.getFile()); if (!nextFile.equals(lastFile)) { lastFile = nextFile; - buf.append(this.redBold + "*" + this.colorReset + " file: " + this.whiteBold - + this.getRelativePath(lastFile) + this.colorReset + PMD.EOL); + buf.append(this.redBold) + .append("*") + .append(this.colorReset) + .append(" file: ") + .append(this.whiteBold) + .append(this.getRelativePath(lastFile)) + .append(this.colorReset) + .append(PMD.EOL); } - buf.append(this.green + " err: " + this.cyan + error.getMsg() + this.colorReset + PMD.EOL) - .append(this.red).append(error.getDetail()).append(colorReset).append(PMD.EOL).append(PMD.EOL); + buf.append(this.green) + .append(" err: ") + .append(this.cyan) + .append(error.getMsg()) + .append(this.colorReset) + .append(PMD.EOL) + .append(this.red) + .append(error.getDetail()) + .append(colorReset) + .append(PMD.EOL) + .append(PMD.EOL); writer.write(buf.toString()); } @@ -167,9 +206,21 @@ public class TextColorRenderer extends AbstractAccumulatingRenderer { buf.setLength(0); numberOfErrors++; Report.ConfigurationError error = i.next(); - buf.append(this.redBold + "*" + this.colorReset + " rule: " + this.whiteBold - + error.rule().getName() + this.colorReset + PMD.EOL); - buf.append(this.green + " err: " + this.cyan + error.issue() + this.colorReset + PMD.EOL + PMD.EOL); + buf.append(this.redBold) + .append("*") + .append(this.colorReset) + .append(" rule: ") + .append(this.whiteBold) + .append(error.rule().getName()) + .append(this.colorReset) + .append(PMD.EOL); + buf.append(this.green) + .append(" err: ") + .append(this.cyan) + .append(error.issue()) + .append(this.colorReset) + .append(PMD.EOL) + .append(PMD.EOL); writer.write(buf.toString()); } diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextPadRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextPadRenderer.java index f4aeb0dbac..4fa30a0695 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextPadRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/TextPadRenderer.java @@ -55,7 +55,7 @@ public class TextPadRenderer extends AbstractIncrementingRenderer { RuleViolation rv = violations.next(); buf.setLength(0); // Filename - buf.append(determineFileName(rv.getFilename()) + "("); + buf.append(determineFileName(rv.getFilename())).append("("); // Line number buf.append(Integer.toString(rv.getBeginLine())).append(", "); // Name of violated rule diff --git a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/VBHTMLRenderer.java b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/VBHTMLRenderer.java index 9b050cbdc7..1af81231dc 100644 --- a/pmd-core/src/main/java/net/sourceforge/pmd/renderers/VBHTMLRenderer.java +++ b/pmd-core/src/main/java/net/sourceforge/pmd/renderers/VBHTMLRenderer.java @@ -68,9 +68,8 @@ public class VBHTMLRenderer extends AbstractIncrementingRenderer { } colorize = !colorize; - sb.append("" + rv.getBeginLine() - + "   "); - sb.append("" + rv.getDescription() + ""); + sb.append("").append(rv.getBeginLine()).append("   "); + sb.append("").append(rv.getDescription()).append(""); sb.append(""); sb.append(lineSep); writer.write(sb.toString()); @@ -130,7 +129,7 @@ public class VBHTMLRenderer extends AbstractIncrementingRenderer { private String header() { StringBuilder sb = new StringBuilder(600).append("PMD") - .append("