aboutsummaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorGodin <mandrikov@gmail.com>2010-10-23 23:39:40 +0000
committerGodin <mandrikov@gmail.com>2010-10-23 23:39:40 +0000
commite072b1fe98c72f12363f27edf9b70023cb4845a0 (patch)
tree8ee7a390db7d9fd605d7142bd568d0f2dec9377a /plugins
parent69538e36cbd39c0dc522a20811d689c93013ef04 (diff)
downloadsonarqube-e072b1fe98c72f12363f27edf9b70023cb4845a0.tar.gz
sonarqube-e072b1fe98c72f12363f27edf9b70023cb4845a0.zip
SONAR-1832: Improve detection of line numbers
Diffstat (limited to 'plugins')
-rw-r--r--plugins/sonar-squid-java-plugin/src/main/java/org/sonar/java/bytecode/check/ArchitectureCheck.java40
-rw-r--r--plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java4
2 files changed, 31 insertions, 13 deletions
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 0420c6985c3..5f92c0b4bd2 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
@@ -32,10 +32,10 @@ import org.sonar.squid.api.CheckMessage;
import org.sonar.squid.api.SourceFile;
import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import com.google.common.collect.Maps;
import java.util.List;
-import java.util.Set;
+import java.util.Map;
@Rule(key = "ArchitecturalConstraint", name = "Architectural constraint", cardinality = Cardinality.MULTIPLE, isoCategory = IsoCategory.Portability, priority = Priority.MAJOR, description = "<p>A source code comply to an architectural model when it fully adheres to a set of architectural constraints. " +
"A constraint allows to deny references between classes by pattern.</p>" +
@@ -54,7 +54,7 @@ public class ArchitectureCheck extends BytecodeCheck {
private List<WildcardPattern> fromMatchers;
private List<WildcardPattern> toMatchers;
private AsmClass asmClass;
- private Set<String> internalNames;
+ private Map<String, CheckMessage> internalNames;
public String getFromClasses() {
return fromClasses;
@@ -75,26 +75,40 @@ public class ArchitectureCheck extends BytecodeCheck {
@Override
public void visitClass(AsmClass asmClass) {
this.asmClass = asmClass;
- this.internalNames = Sets.newHashSet();
+ this.internalNames = Maps.newHashMap();
+ }
+
+ @Override
+ public void leaveClass(AsmClass asmClass) {
+ for (CheckMessage message : internalNames.values()) {
+ SourceFile sourceFile = getSourceFile(asmClass);
+ sourceFile.log(message);
+ }
}
@Override
public void visitEdge(AsmEdge edge) {
if (edge != null) {
String internalNameTargetClass = edge.getTargetAsmClass().getInternalName();
- if ( !internalNames.contains(internalNameTargetClass)) {
+ if ( !internalNames.containsKey(internalNameTargetClass)) {
String nameAsmClass = asmClass.getInternalName();
if (matches(nameAsmClass, getFromMatchers()) && matches(internalNameTargetClass, getToMatchers())) {
- SourceFile sourceFile = getSourceFile(asmClass);
- CheckMessage message = new CheckMessage(this, "Architecture constraint : " + nameAsmClass + " must not use " + internalNameTargetClass);
- message.setLine(edge.getSourceLineNumber());
- sourceFile.log(message);
- internalNames.add(internalNameTargetClass);
+ logMessage(edge);
}
+ } else if (internalNames.get(internalNameTargetClass).getLine() == 0 && edge.getSourceLineNumber() != 0) {
+ logMessage(edge);
}
}
}
+ private void logMessage(AsmEdge edge) {
+ String fromClass = asmClass.getInternalName();
+ String toClass = edge.getTargetAsmClass().getInternalName();
+ CheckMessage message = new CheckMessage(this, "Architecture constraint : " + fromClass + " must not use " + toClass);
+ message.setLine(edge.getSourceLineNumber());
+ internalNames.put(toClass, message);
+ }
+
private boolean matches(String className, List<WildcardPattern> matchers) {
for (WildcardPattern matcher : matchers) {
if (matcher.match(className)) {
@@ -118,7 +132,11 @@ public class ArchitectureCheck extends BytecodeCheck {
private List<WildcardPattern> getFromMatchers() {
if (fromMatchers == null) {
- fromMatchers = createMatchers(fromClasses);
+ if (StringUtils.isBlank(fromClasses)) {
+ fromMatchers = createMatchers("**");
+ } else {
+ fromMatchers = createMatchers(fromClasses);
+ }
}
return fromMatchers;
}
diff --git a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java
index 3e7b250da3e..e9464bca524 100644
--- a/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java
+++ b/plugins/sonar-squid-java-plugin/src/test/java/org/sonar/java/bytecode/check/ArchitectureCheckTest.java
@@ -37,7 +37,7 @@ public class ArchitectureCheckTest {
@Test
public void testDependencyCheckOneErrorMessage() {
- check("*", "java.**.Pattern");
+ check("", "java.**.Pattern");
SourceFile file = (SourceFile) squid.search("ArchitectureCheckOneErrorMessage.java");
assertThat(file.getCheckMessages().size(), is(1));
@@ -48,7 +48,7 @@ public class ArchitectureCheckTest {
@Test
public void testDependencyCheckDateForbidden() {
- check("*", "**.Date");
+ check("", "**.Date");
SourceFile file = (SourceFile) squid.search("ArchitectureCheckDateForbidden.java");
assertThat(file.getCheckMessages().size(), is(2));