From bc9e9721ca7a94b08d9699ea596f849ecf2f7ffc Mon Sep 17 00:00:00 2001 From: Nick Mancuso Date: Tue, 22 Nov 2022 23:52:10 -0500 Subject: [PATCH] Issue #12443: Fix null pointer exception on config value with trailing whitespace --- pom.xml | 4 +++ .../tools/checkstyle/api/AutomaticBean.java | 4 +-- .../checks/coding/IllegalTypeCheckTest.java | 8 ++++++ .../checks/naming/ParameterNameCheckTest.java | 7 +++++ .../InputIllegalTypeWhitespaceInConfig.java | 28 +++++++++++++++++++ .../InputParameterNameWhitespaceInConfig.java | 14 ++++++++++ 6 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/illegaltype/InputIllegalTypeWhitespaceInConfig.java create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/parametername/InputParameterNameWhitespaceInConfig.java diff --git a/pom.xml b/pom.xml index 9ed1a97b476..409bfdd5f3a 100644 --- a/pom.xml +++ b/pom.xml @@ -4574,6 +4574,10 @@ com.puppycrawl.tools.checkstyle.filters.SuppressWithPlainTextCommentFilterTest com.puppycrawl.tools.checkstyle.checks.whitespace.FileTabCharacterCheckTest com.puppycrawl.tools.checkstyle.checks.NewlineAtEndOfFileCheckTest + + com.puppycrawl.tools.checkstyle.checks.naming.ParameterNameCheckTest + + com.puppycrawl.tools.checkstyle.checks.coding.IllegalTypeCheckTest *.Input* diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/api/AutomaticBean.java b/src/main/java/com/puppycrawl/tools/checkstyle/api/AutomaticBean.java index c9a23ef4b33..31df6e3eddb 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/api/AutomaticBean.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/api/AutomaticBean.java @@ -361,7 +361,7 @@ private static class RelaxedStringArrayConverter implements Converter { @Override public Object convert(Class type, Object value) { final StringTokenizer tokenizer = new StringTokenizer( - value.toString(), COMMA_SEPARATOR); + value.toString().trim(), COMMA_SEPARATOR); final List result = new ArrayList<>(); while (tokenizer.hasMoreTokens()) { @@ -390,7 +390,7 @@ private static class RelaxedAccessModifierArrayConverter implements Converter { public Object convert(Class type, Object value) { // Converts to a String and trims it for the tokenizer. final StringTokenizer tokenizer = new StringTokenizer( - value.toString(), COMMA_SEPARATOR); + value.toString().trim(), COMMA_SEPARATOR); final List result = new ArrayList<>(); while (tokenizer.hasMoreTokens()) { diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheckTest.java index 7951296047d..f006b0e72ce 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/coding/IllegalTypeCheckTest.java @@ -389,6 +389,14 @@ public void testRecordComponentsPublicProtectedStatic() throws Exception { expected); } + @Test + public void testTrailingWhitespaceInConfig() throws Exception { + final String[] expected = CommonUtil.EMPTY_STRING_ARRAY; + verifyWithInlineConfigParser( + getPath("InputIllegalTypeWhitespaceInConfig.java"), + expected); + } + @Test public void testTokensNotNull() { final IllegalTypeCheck check = new IllegalTypeCheck(); diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheckTest.java index 6fe90652948..e25547ebb05 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/naming/ParameterNameCheckTest.java @@ -167,4 +167,11 @@ public void testLambdaParameterNoViolationAtAll() throws Exception { getPath("InputParameterNameLambda.java"), expected); } + @Test + public void testWhitespaceInConfig() throws Exception { + final String[] expected = CommonUtil.EMPTY_STRING_ARRAY; + verifyWithInlineConfigParser( + getPath("InputParameterNameWhitespaceInConfig.java"), expected); + } + } diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/illegaltype/InputIllegalTypeWhitespaceInConfig.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/illegaltype/InputIllegalTypeWhitespaceInConfig.java new file mode 100644 index 00000000000..b1479a50f40 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/coding/illegaltype/InputIllegalTypeWhitespaceInConfig.java @@ -0,0 +1,28 @@ +/* +IllegalType +validateAbstractClassNames = (default)false +illegalClassNames = java.lang.StringBuffer,\t +legalAbstractClassNames = (default) +ignoredMethodNames = foo1 +illegalAbstractClassNameFormat = (default)^(.*[.])?Abstract.*$ +memberModifiers = (default) +tokens = (default)ANNOTATION_FIELD_DEF, CLASS_DEF, INTERFACE_DEF, METHOD_CALL, METHOD_DEF, \ + METHOD_REF, PARAMETER_DEF, VARIABLE_DEF, PATTERN_VARIABLE_DEF, RECORD_DEF, \ + RECORD_COMPONENT_DEF + + +*/ +package com.puppycrawl.tools.checkstyle.checks.coding.illegaltype; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.util.List; + +public class InputIllegalTypeWhitespaceInConfig { + public void example(List<@MyPattern String> strings) { // ok + } + + @Target(ElementType.TYPE_USE) + public @interface MyPattern {} +} + diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/parametername/InputParameterNameWhitespaceInConfig.java b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/parametername/InputParameterNameWhitespaceInConfig.java new file mode 100644 index 00000000000..946e076b3cc --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/checks/naming/parametername/InputParameterNameWhitespaceInConfig.java @@ -0,0 +1,14 @@ +/* +ParameterName +format = (default)^[a-z][a-zA-Z0-9]*$ +ignoreOverridden = (default)false +accessModifiers = public,\t + + +*/ + +package com.puppycrawl.tools.checkstyle.checks.naming.parametername; + +public class InputParameterNameWhitespaceInConfig { + int method(){return 1;} // ok +}