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, ".", "/"), ','));
}
}
@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() {
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");
}
}
- 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() {
@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;
@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 {
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);
}
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;
}
}
--- /dev/null
+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));
+ }
+}
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, "/");
}
*/
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) {
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"));
+ }
}