]> source.dussan.org Git - sonarqube.git/commitdiff
Improve routines for patterns, add unit tests
authorGodin <mandrikov@gmail.com>
Wed, 3 Nov 2010 16:34:10 +0000 (16:34 +0000)
committerGodin <mandrikov@gmail.com>
Wed, 3 Nov 2010 16:34:10 +0000 (16:34 +0000)
plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/PatternUtils.java
plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/ast/check/UndocumentedApiCheck.java
plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java
plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/PatternUtilsTest.java [new file with mode: 0644]
sonar-plugin-api/src/main/java/org/sonar/api/utils/WildcardPattern.java
sonar-plugin-api/src/test/java/org/sonar/api/utils/WildcardPatternTest.java

index 9f2d927677f72f69d0a91f34bdbaa5eef6ca1ebf..54ec9ed07bd96ebcb620f28ea0cf39cbea19d749 100644 (file)
@@ -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<WildcardPattern> 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, ".", "/"), ','));
   }
 
 }
index 2661a204dd24efc1de46a28d7dbac90b940e559c..0440e6f11230cfc726e2f2e2f4edc9c368ac1e06 100644 (file)
@@ -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<Integer> 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() {
index c4a165d07ed90e99e2002869c4fbf50e79580126..58b8e60bf09c65c2e4a67801d3458722adf30633 100644 (file)
@@ -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<String, CheckMessage> 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 (file)
index 0000000..ce506cc
--- /dev/null
@@ -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));
+  }
+}
index 2045b92faa2bedde6564faea4ff23703cbce631c..572d2c1d01bbc789a7beddb2f5170186284488a7 100644 (file)
@@ -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, "/");
   }
index 1b0d6b80a2b4c3f3c1632c0df1be397b55532375..f57aff8f6e25d16aeeb277fb0f38a55e2fa20f4d 100644 (file)
  */
 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"));
+  }
 }