diff options
author | Simon Brandhof <simon.brandhof@gmail.com> | 2011-09-20 11:00:48 +0200 |
---|---|---|
committer | Simon Brandhof <simon.brandhof@gmail.com> | 2011-09-20 11:00:48 +0200 |
commit | 8e6de3bf5745eff093ee71f58232a0557a3ad1c3 (patch) | |
tree | 7daade5f55759a3fd245902af4af6df45d7fca3c | |
parent | 2953b754d25118a9e065683c39faa4e5dc1dcca0 (diff) | |
download | sonarqube-8e6de3bf5745eff093ee71f58232a0557a3ad1c3.tar.gz sonarqube-8e6de3bf5745eff093ee71f58232a0557a3ad1c3.zip |
SONAR-2812 The creation date of violation should not be reinitialized when the hash of the line hasn't been changed
2 files changed, 31 insertions, 0 deletions
diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java index 81e93fe6f1b..67ca1ec63c5 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecorator.java @@ -116,6 +116,16 @@ public class ViolationTrackingDecorator implements Decorator { pastViolationsByRule, referenceViolationsMap); } } + + // Last check: match violation if same rule and same checksum but different line and different message + // See https://jira.codehaus.org/browse/SONAR-2812 + for (Violation newViolation : newViolations) { + if (isNotAlreadyMapped(newViolation, referenceViolationsMap)) { + mapViolation(newViolation, + findPastViolationWithSameChecksum(newViolation, pastViolationsByRule.get(newViolation.getRule().getId())), + pastViolationsByRule, referenceViolationsMap); + } + } } return referenceViolationsMap; } @@ -124,6 +134,15 @@ public class ViolationTrackingDecorator implements Decorator { return !violationMap.containsKey(newViolation); } + private RuleFailureModel findPastViolationWithSameChecksum(Violation newViolation, Collection<RuleFailureModel> pastViolations) { + for (RuleFailureModel pastViolation : pastViolations) { + if (isSameChecksum(newViolation, pastViolation)) { + return pastViolation; + } + } + return null; + } + private RuleFailureModel findPastViolationWithSameLineAndMessage(Violation newViolation, Collection<RuleFailureModel> pastViolations) { for (RuleFailureModel pastViolation : pastViolations) { if (isSameLine(newViolation, pastViolation) && isSameMessage(newViolation, pastViolation)) { diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecoratorTest.java index ba798f14b24..1da2991ece6 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecoratorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/ViolationTrackingDecoratorTest.java @@ -102,6 +102,18 @@ public class ViolationTrackingDecoratorTest { assertThat(mapping.get(newViolation), equalTo(referenceViolation)); } + /** + * See https://jira.codehaus.org/browse/SONAR-2812 + */ + @Test + public void sameChecksumAndRuleButDifferentLineAndDifferentMessage() { + Violation newViolation = newViolation("new message", 1, 50, "checksum1"); + RuleFailureModel referenceViolation = newReferenceViolation("old message", 2, 50, "checksum1"); + + Map<Violation, RuleFailureModel> mapping = decorator.mapViolations(Lists.newArrayList(newViolation), Lists.newArrayList(referenceViolation)); + assertThat(mapping.get(newViolation), equalTo(referenceViolation)); + } + @Test public void shouldCreateNewViolationWhenSameRuleSameMessageButDifferentLineAndChecksum() { Violation newViolation = newViolation("message", 1, 50, "checksum1"); |