diff options
author | Godin <mandrikov@gmail.com> | 2010-10-23 23:39:40 +0000 |
---|---|---|
committer | Godin <mandrikov@gmail.com> | 2010-10-23 23:39:40 +0000 |
commit | e072b1fe98c72f12363f27edf9b70023cb4845a0 (patch) | |
tree | 8ee7a390db7d9fd605d7142bd568d0f2dec9377a /plugins | |
parent | 69538e36cbd39c0dc522a20811d689c93013ef04 (diff) | |
download | sonarqube-e072b1fe98c72f12363f27edf9b70023cb4845a0.tar.gz sonarqube-e072b1fe98c72f12363f27edf9b70023cb4845a0.zip |
SONAR-1832: Improve detection of line numbers
Diffstat (limited to 'plugins')
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)); |