summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorGodin <mandrikov@gmail.com>2010-11-30 23:34:59 +0000
committerGodin <mandrikov@gmail.com>2010-11-30 23:34:59 +0000
commit4e10bd0c5beb97e398e80747d26f6b85f8a9f930 (patch)
tree87bee5178c0a93f7f0f474fe12f02f44fa2a4ba1 /plugins
parentd62af18bac3cce04fe4a50980a49f36fee17408c (diff)
downloadsonarqube-4e10bd0c5beb97e398e80747d26f6b85f8a9f930.tar.gz
sonarqube-4e10bd0c5beb97e398e80747d26f6b85f8a9f930.zip
SONAR-1450: Add first implementation of NewViolationsDecorator
Diffstat (limited to 'plugins')
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/CorePlugin.java3
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/NewViolationsDecorator.java73
-rw-r--r--plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TimeMachineConfiguration.java13
-rw-r--r--plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/NewViolationsDecoratorTest.java42
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));
+ }
+}