diff options
author | Godin <mandrikov@gmail.com> | 2010-11-30 23:34:59 +0000 |
---|---|---|
committer | Godin <mandrikov@gmail.com> | 2010-11-30 23:34:59 +0000 |
commit | 4e10bd0c5beb97e398e80747d26f6b85f8a9f930 (patch) | |
tree | 87bee5178c0a93f7f0f474fe12f02f44fa2a4ba1 /plugins | |
parent | d62af18bac3cce04fe4a50980a49f36fee17408c (diff) | |
download | sonarqube-4e10bd0c5beb97e398e80747d26f6b85f8a9f930.tar.gz sonarqube-4e10bd0c5beb97e398e80747d26f6b85f8a9f930.zip |
SONAR-1450: Add first implementation of NewViolationsDecorator
Diffstat (limited to 'plugins')
4 files changed, 125 insertions, 6 deletions
diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java index a3495af0c0b..f1e767eec96 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java @@ -19,6 +19,8 @@ */ package org.sonar.plugins.core; +import org.sonar.plugins.core.timemachine.NewViolationsDecorator; + import com.google.common.collect.Lists; import org.sonar.api.CoreProperties; import org.sonar.api.Plugin; @@ -196,6 +198,7 @@ public class CorePlugin implements Plugin { extensions.add(TendencyDecorator.class); extensions.add(PeriodLocator.class); extensions.add(VariationDecorator.class); + extensions.add(NewViolationsDecorator.class); extensions.add(TimeMachineConfiguration.class); return extensions; diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java new file mode 100644 index 00000000000..4e6dc6276f7 --- /dev/null +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java @@ -0,0 +1,73 @@ +package org.sonar.plugins.core.timemachine; + +import org.apache.commons.lang.time.DateUtils; +import org.sonar.api.batch.Decorator; +import org.sonar.api.batch.DecoratorBarriers; +import org.sonar.api.batch.DecoratorContext; +import org.sonar.api.batch.DependedUpon; +import org.sonar.api.measures.CoreMetrics; +import org.sonar.api.measures.Measure; +import org.sonar.api.resources.Project; +import org.sonar.api.resources.Resource; +import org.sonar.api.rules.Violation; + +import java.util.Date; + +@DependedUpon(DecoratorBarriers.END_OF_VIOLATIONS_GENERATION) +public class NewViolationsDecorator implements Decorator { + + private TimeMachineConfiguration timeMachineConfiguration; + + public NewViolationsDecorator(TimeMachineConfiguration timeMachineConfiguration) { + this.timeMachineConfiguration = timeMachineConfiguration; + } + + public boolean shouldExecuteOnProject(Project project) { + return true; + } + + public void decorate(Resource resource, DecoratorContext context) { + Measure measure = new Measure(CoreMetrics.NEW_VIOLATIONS); + for (int index = 0; index < 3; index++) { + int days = timeMachineConfiguration.getDiffPeriodInDays(index); + setDiffValue(measure, index, calculate(context, days)); + } + context.saveMeasure(measure); + } + + int calculate(DecoratorContext context, int days) { + Date targetDate = getTargetDate(context.getProject(), days); + int newViolations = 0; + for (Violation violation : context.getViolations()) { + if (!violation.getCreatedAt().before(targetDate)) { + newViolations++; + } + } + return newViolations; + } + + private Date getTargetDate(Project project, int distanceInDays) { + return DateUtils.addDays(project.getAnalysisDate(), -distanceInDays); + } + + private void setDiffValue(Measure measure, int index, double value) { + switch (index) { + case 0: + measure.setDiffValue1(value); + break; + case 1: + measure.setDiffValue2(value); + break; + case 2: + measure.setDiffValue2(value); + break; + default: + break; + } + } + + @Override + public String toString() { + return getClass().toString(); + } +} diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java index 0a4efdff2d1..4e219294a09 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java @@ -42,12 +42,13 @@ public final class TimeMachineConfiguration implements BatchExtension { return configuration.getInt(CoreProperties.CORE_TENDENCY_DEPTH_PROPERTY, CoreProperties.CORE_TENDENCY_DEPTH_DEFAULT_VALUE); } - Snapshot getProjectSnapshotForDiffValues(int index) { + Integer getDiffPeriodInDays(int index) { String property = configuration.getString("sonar.timemachine.diff" + index); - Snapshot projectSnapshot = null; - if (property!=null) { - projectSnapshot = periodLocator.locate(Integer.valueOf(property)); - } - return projectSnapshot; + return property == null ? null : Integer.valueOf(property); + } + + Snapshot getProjectSnapshotForDiffValues(int index) { + Integer days = getDiffPeriodInDays(index); + return days == null ? null : periodLocator.locate(days); } } diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java new file mode 100644 index 00000000000..b4c82280518 --- /dev/null +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java @@ -0,0 +1,42 @@ +package org.sonar.plugins.core.timemachine; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.apache.commons.lang.time.DateUtils; +import org.junit.Before; +import org.junit.Test; +import org.sonar.api.batch.DecoratorContext; +import org.sonar.api.resources.Project; +import org.sonar.api.rules.Violation; + +import java.util.Arrays; +import java.util.Date; + +public class NewViolationsDecoratorTest { + + private NewViolationsDecorator decorator; + + @Before + public void setUp() { + decorator = new NewViolationsDecorator(null); + } + + @Test + public void test() { + DecoratorContext context = mock(DecoratorContext.class); + Date date1 = new Date(); + Date date2 = DateUtils.addDays(date1, -20); + Project project = new Project("project"); + project.setAnalysisDate(date1); + Violation violation1 = new Violation(null).setCreatedAt(date1); + Violation violation2 = new Violation(null).setCreatedAt(date2); + when(context.getViolations()).thenReturn(Arrays.asList(violation1, violation2)); + when(context.getProject()).thenReturn(project); + + assertThat(decorator.calculate(context, 10), is(1)); + assertThat(decorator.calculate(context, 30), is(2)); + } +} |