]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-5189 Fix VariationDecorator to allow measure updates
authorJulien HENRY <julien.henry@sonarsource.com>
Thu, 24 Apr 2014 15:09:38 +0000 (17:09 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Thu, 24 Apr 2014 15:22:05 +0000 (17:22 +0200)
plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/VariationDecorator.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/VariationDecoratorTest.java
sonar-batch/src/main/java/org/sonar/batch/index/DefaultIndex.java

index 30f5edcd082014c50dbe4d35f7293f7cac56f150..be6d1a8f35edb31fd5040f8251559d5272442731 100644 (file)
@@ -40,6 +40,7 @@ import org.sonar.api.technicaldebt.batch.Characteristic;
 import org.sonar.batch.components.PastMeasuresLoader;
 import org.sonar.batch.components.PastSnapshot;
 import org.sonar.batch.components.TimeMachineConfiguration;
+import org.sonar.batch.index.DefaultIndex;
 
 import java.util.Collection;
 import java.util.List;
@@ -52,16 +53,19 @@ public class VariationDecorator implements Decorator {
   private MetricFinder metricFinder;
   private PastMeasuresLoader pastMeasuresLoader;
   private RuleFinder ruleFinder;
+  private final DefaultIndex sonarIndex;
 
-  public VariationDecorator(PastMeasuresLoader pastMeasuresLoader, MetricFinder metricFinder, TimeMachineConfiguration timeMachineConfiguration, RuleFinder ruleFinder) {
-    this(pastMeasuresLoader, metricFinder, timeMachineConfiguration.getProjectPastSnapshots(), ruleFinder);
+  public VariationDecorator(PastMeasuresLoader pastMeasuresLoader, MetricFinder metricFinder, TimeMachineConfiguration timeMachineConfiguration, RuleFinder ruleFinder,
+    DefaultIndex index) {
+    this(pastMeasuresLoader, metricFinder, timeMachineConfiguration.getProjectPastSnapshots(), ruleFinder, index);
   }
 
-  VariationDecorator(PastMeasuresLoader pastMeasuresLoader, MetricFinder metricFinder, List<PastSnapshot> projectPastSnapshots, RuleFinder ruleFinder) {
+  VariationDecorator(PastMeasuresLoader pastMeasuresLoader, MetricFinder metricFinder, List<PastSnapshot> projectPastSnapshots, RuleFinder ruleFinder, DefaultIndex index) {
     this.pastMeasuresLoader = pastMeasuresLoader;
     this.projectPastSnapshots = projectPastSnapshots;
     this.metricFinder = metricFinder;
     this.ruleFinder = ruleFinder;
+    this.sonarIndex = index;
   }
 
   public boolean shouldExecuteOnProject(Project project) {
@@ -92,10 +96,10 @@ public class VariationDecorator implements Decorator {
 
   private void computeVariation(Resource resource, DecoratorContext context, PastSnapshot pastSnapshot) {
     List<Object[]> pastMeasures = pastMeasuresLoader.getPastMeasures(resource, pastSnapshot);
-    compareWithPastMeasures(context, pastSnapshot.getIndex(), pastMeasures);
+    compareWithPastMeasures(resource, context, pastSnapshot.getIndex(), pastMeasures);
   }
 
-  void compareWithPastMeasures(DecoratorContext context, int index, List<Object[]> pastMeasures) {
+  void compareWithPastMeasures(Resource resource, DecoratorContext context, int index, List<Object[]> pastMeasures) {
     Map<MeasureKey, Object[]> pastMeasuresByKey = Maps.newHashMap();
     for (Object[] pastMeasure : pastMeasures) {
       pastMeasuresByKey.put(new MeasureKey(pastMeasure), pastMeasure);
@@ -112,7 +116,7 @@ public class VariationDecorator implements Decorator {
 
       Object[] pastMeasure = pastMeasuresByKey.get(new MeasureKey(metricId, characteristicId, personId, ruleId));
       if (updateVariation(measure, pastMeasure, index)) {
-        context.saveMeasure(measure);
+        sonarIndex.updateMeasure(resource, measure);
       }
     }
   }
index c7c1876bf6cdb0e21f2f5ba7761055dfd965185e..971d6d9f99fa43c5d4d0532602bbe6533ced8704 100644 (file)
@@ -36,12 +36,14 @@ import org.sonar.api.rules.RuleFinder;
 import org.sonar.batch.components.PastMeasuresLoader;
 import org.sonar.batch.components.PastSnapshot;
 import org.sonar.batch.components.TimeMachineConfiguration;
+import org.sonar.batch.index.DefaultIndex;
 import org.sonar.jpa.test.AbstractDbUnitTestCase;
 
 import java.util.Arrays;
 import java.util.Date;
 
 import static org.fest.assertions.Assertions.assertThat;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -61,7 +63,8 @@ public class VariationDecoratorTest extends AbstractDbUnitTestCase {
   @Test
   public void shouldComputeVariations() {
     TimeMachineConfiguration timeMachineConfiguration = mock(TimeMachineConfiguration.class);
-    VariationDecorator decorator = new VariationDecorator(mock(PastMeasuresLoader.class), mock(MetricFinder.class), timeMachineConfiguration, mock(RuleFinder.class));
+    VariationDecorator decorator = new VariationDecorator(mock(PastMeasuresLoader.class), mock(MetricFinder.class), timeMachineConfiguration, mock(RuleFinder.class),
+      mock(DefaultIndex.class));
 
     assertThat(decorator.shouldComputeVariation(new Project("foo"))).isTrue();
     assertThat(decorator.shouldComputeVariation(new File("foo/bar.c"))).isFalse();
@@ -90,11 +93,13 @@ public class VariationDecoratorTest extends AbstractDbUnitTestCase {
     Measure currentCoverage = newMeasure(COVERAGE, 80.0);
     when(context.getMeasures(Matchers.<MeasuresFilter>anyObject())).thenReturn(Arrays.asList(currentNcloc, currentCoverage));
 
-    VariationDecorator decorator = new VariationDecorator(pastMeasuresLoader, mock(MetricFinder.class), Arrays.asList(pastSnapshot1, pastSnapshot3), mock(RuleFinder.class));
+    DefaultIndex index = mock(DefaultIndex.class);
+    VariationDecorator decorator = new VariationDecorator(pastMeasuresLoader, mock(MetricFinder.class), Arrays.asList(pastSnapshot1, pastSnapshot3), mock(RuleFinder.class),
+      index);
     decorator.decorate(dir, context);
 
     // context updated for each variation : 2 times for ncloc and 1 time for coverage
-    verify(context, times(3)).saveMeasure(Matchers.<Measure>anyObject());
+    verify(index, times(3)).updateMeasure(eq(dir), Matchers.<Measure>anyObject());
 
     assertThat(currentNcloc.getVariation1()).isEqualTo(20.0);
     assertThat(currentNcloc.getVariation2()).isNull();
@@ -135,11 +140,13 @@ public class VariationDecoratorTest extends AbstractDbUnitTestCase {
     Measure violationsRule2 = RuleMeasure.createForRule(VIOLATIONS, rule2, 70.0);
     when(context.getMeasures(Matchers.<MeasuresFilter>anyObject())).thenReturn(Arrays.asList(violations, violationsRule1, violationsRule2));
 
-    VariationDecorator decorator = new VariationDecorator(pastMeasuresLoader, mock(MetricFinder.class), Arrays.asList(pastSnapshot1), ruleFinder);
+    DefaultIndex index = mock(DefaultIndex.class);
+    VariationDecorator decorator = new VariationDecorator(pastMeasuresLoader, mock(MetricFinder.class), Arrays.asList(pastSnapshot1), ruleFinder,
+      index);
     decorator.decorate(dir, context);
 
     // context updated for each variation
-    verify(context, times(3)).saveMeasure(Matchers.<Measure>anyObject());
+    verify(index, times(3)).updateMeasure(eq(dir), Matchers.<Measure>anyObject());
 
     assertThat(violations.getVariation1()).isEqualTo(20.0);
   }
index 6fc4c72eeb6741773652f319fb884b0c9cdd95b3..f95a5311c4e152415ec042c3bae80658f6480545 100644 (file)
@@ -53,6 +53,7 @@ import org.sonar.api.violations.ViolationQuery;
 import org.sonar.batch.ProjectTree;
 import org.sonar.batch.issue.DeprecatedViolations;
 import org.sonar.batch.issue.ModuleIssues;
+import org.sonar.batch.qualitygate.QualityGateVerifier;
 import org.sonar.batch.scan.measure.MeasureCache;
 import org.sonar.core.component.ComponentKeys;
 import org.sonar.core.component.ScanGraph;
@@ -209,7 +210,8 @@ public class DefaultIndex extends SonarIndex {
   }
 
   /**
-   * Used by some core features like TendencyDecorator, QualityGateVerifier that need to update some existing measures
+   * Used by some core features like TendencyDecorator, {@link QualityGateVerifier}, VariationDecorator 
+   * that need to update some existing measures
    */
   public void updateMeasure(Resource resource, Measure measure) {
     if (!measureCache.contains(resource, measure)) {