From 72864ce12eeb02dc9d199ee0edb4d62a4bb33240 Mon Sep 17 00:00:00 2001 From: Godin Date: Wed, 3 Nov 2010 16:34:10 +0000 Subject: [PATCH] Improve routines for patterns, add unit tests --- .../java/org/sonar/java/PatternUtils.java | 25 ++----------------- .../java/ast/check/UndocumentedApiCheck.java | 12 ++++----- .../bytecode/check/ArchitectureCheck.java | 24 +++++++++--------- .../java/org/sonar/java/PatternUtilsTest.java | 19 ++++++++++++++ .../org/sonar/api/utils/WildcardPattern.java | 12 +++++++++ .../sonar/api/utils/WildcardPatternTest.java | 12 +++++++-- 6 files changed, 61 insertions(+), 43 deletions(-) create mode 100644 plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java index 9f2d927677f..54ec9ed07bd 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java @@ -3,34 +3,13 @@ package org.sonar.java; import org.apache.commons.lang.StringUtils; import org.sonar.api.utils.WildcardPattern; -import com.google.common.collect.Lists; - -import java.util.List; - public final class PatternUtils { private PatternUtils() { } - public static WildcardPattern[] createMatchers(String pattern) { - List matchers = Lists.newArrayList(); - if (StringUtils.isNotEmpty(pattern)) { - String[] patterns = pattern.split(","); - for (String p : patterns) { - p = StringUtils.replace(p, ".", "/"); - matchers.add(WildcardPattern.create(p)); - } - } - return matchers.toArray(new WildcardPattern[matchers.size()]); - } - - public static boolean matches(String text, WildcardPattern[] matchers) { - for (WildcardPattern matcher : matchers) { - if (matcher.match(text)) { - return true; - } - } - return false; + public static WildcardPattern[] createPatterns(String patterns) { + return WildcardPattern.create(StringUtils.split(StringUtils.replace(patterns, ".", "/"), ',')); } } diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java index 2661a204dd2..0440e6f1123 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java @@ -27,7 +27,7 @@ public class UndocumentedApiCheck extends JavaAstCheck { @RuleProperty(description = "Optional. If this property is not defined, all classes should adhere to this constraint. Ex : **.api.**") private String forClasses = new String(); - private WildcardPattern[] matchers; + private WildcardPattern[] patterns; @Override public List getWantedTokens() { @@ -38,7 +38,7 @@ public class UndocumentedApiCheck extends JavaAstCheck { public void visitToken(DetailAST ast) { SourceCode currentResource = peekSourceCode(); SourceClass sourceClass = peekParentClass(); - if (PatternUtils.matches(sourceClass.getKey(), getMatchers())) { + if (WildcardPattern.match(getPatterns(), sourceClass.getKey())) { if (PublicApiVisitor.isPublicApi(ast) && !PublicApiVisitor.isDocumentedApi(ast, getFileContents())) { SourceFile sourceFile = currentResource.getParent(SourceFile.class); CheckMessage message = new CheckMessage(this, "Avoid undocumented API"); @@ -48,11 +48,11 @@ public class UndocumentedApiCheck extends JavaAstCheck { } } - private WildcardPattern[] getMatchers() { - if (matchers == null) { - matchers = PatternUtils.createMatchers(StringUtils.defaultIfEmpty(forClasses, "**")); + private WildcardPattern[] getPatterns() { + if (patterns == null) { + patterns = PatternUtils.createPatterns(StringUtils.defaultIfEmpty(forClasses, "**")); } - return matchers; + return patterns; } public String getForClasses() { diff --git a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java index c4a165d07ed..58b8e60bf09 100644 --- a/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java +++ b/plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java @@ -48,8 +48,8 @@ public class ArchitectureCheck extends BytecodeCheck { @RuleProperty(description = "Mandatory. Ex : java.util.Vector, java.util.Hashtable, java.util.Enumeration") private String toClasses = new String(); - private WildcardPattern[] fromMatchers; - private WildcardPattern[] toMatchers; + private WildcardPattern[] fromPatterns; + private WildcardPattern[] toPatterns; private AsmClass asmClass; private Map internalNames; @@ -72,7 +72,7 @@ public class ArchitectureCheck extends BytecodeCheck { @Override public void visitClass(AsmClass asmClass) { String nameAsmClass = asmClass.getInternalName(); - if (PatternUtils.matches(nameAsmClass, getFromMatchers())) { + if (WildcardPattern.match(getFromPatterns(), nameAsmClass)) { this.asmClass = asmClass; this.internalNames = Maps.newHashMap(); } else { @@ -95,7 +95,7 @@ public class ArchitectureCheck extends BytecodeCheck { if (asmClass != null && edge != null) { String internalNameTargetClass = edge.getTargetAsmClass().getInternalName(); if ( !internalNames.containsKey(internalNameTargetClass)) { - if (PatternUtils.matches(internalNameTargetClass, getToMatchers())) { + if (WildcardPattern.match(getToPatterns(), internalNameTargetClass)) { int sourceLineNumber = getSourceLineNumber(edge); logMessage(asmClass.getInternalName(), internalNameTargetClass, sourceLineNumber); } @@ -127,18 +127,18 @@ public class ArchitectureCheck extends BytecodeCheck { internalNames.put(toClass, message); } - private WildcardPattern[] getFromMatchers() { - if (fromMatchers == null) { - fromMatchers = PatternUtils.createMatchers(StringUtils.defaultIfEmpty(fromClasses, "**")); + private WildcardPattern[] getFromPatterns() { + if (fromPatterns == null) { + fromPatterns = PatternUtils.createPatterns(StringUtils.defaultIfEmpty(fromClasses, "**")); } - return fromMatchers; + return fromPatterns; } - private WildcardPattern[] getToMatchers() { - if (toMatchers == null) { - toMatchers = PatternUtils.createMatchers(toClasses); + private WildcardPattern[] getToPatterns() { + if (toPatterns == null) { + toPatterns = PatternUtils.createPatterns(toClasses); } - return toMatchers; + return toPatterns; } } diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java new file mode 100644 index 00000000000..ce506cc909a --- /dev/null +++ b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java @@ -0,0 +1,19 @@ +package org.sonar.java; + +import org.junit.Test; +import org.sonar.api.utils.WildcardPattern; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class PatternUtilsTest { + + @Test + public void shouldConvertJavaPackagesToPatterns() { + WildcardPattern[] patterns = PatternUtils.createPatterns("org.sonar.Foo,javax.**"); + + assertThat(patterns.length, is(2)); + assertThat(patterns[0].match("org/sonar/Foo"), is(true)); + assertThat(patterns[1].match("javax.Bar"), is(true)); + } +} diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/utils/WildcardPattern.java b/sonar-plugin-api/src/main/java/org/sonar/api/utils/WildcardPattern.java index 2045b92faa2..572d2c1d01b 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/utils/WildcardPattern.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/utils/WildcardPattern.java @@ -80,6 +80,18 @@ public class WildcardPattern { return StringUtils.removeEnd(patternStr, "/"); } + /** + * @since 2.4 + */ + public static boolean match(WildcardPattern[] patterns, String value) { + for (WildcardPattern pattern : patterns) { + if (pattern.match(value)) { + return true; + } + } + return false; + } + public static WildcardPattern create(String pattern) { return create(pattern, "/"); } diff --git a/sonar-plugin-api/src/test/java/org/sonar/api/utils/WildcardPatternTest.java b/sonar-plugin-api/src/test/java/org/sonar/api/utils/WildcardPatternTest.java index 1b0d6b80a2b..f57aff8f6e2 100644 --- a/sonar-plugin-api/src/test/java/org/sonar/api/utils/WildcardPatternTest.java +++ b/sonar-plugin-api/src/test/java/org/sonar/api/utils/WildcardPatternTest.java @@ -19,11 +19,11 @@ */ package org.sonar.api.utils; +import org.junit.Test; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import org.junit.Test; - public class WildcardPatternTest { private boolean match(String pattern, String value, String separator) { @@ -99,4 +99,12 @@ public class WildcardPatternTest { assertTrue(match("**", "java/io/Reader")); } + + @Test + public void multiplePatterns() { + WildcardPattern[] patterns = new WildcardPattern[] { WildcardPattern.create("Foo"), WildcardPattern.create("Bar") }; + assertTrue(WildcardPattern.match(patterns, "Foo")); + assertTrue(WildcardPattern.match(patterns, "Bar")); + assertFalse(WildcardPattern.match(patterns, "Other")); + } } -- 2.39.5