]> source.dussan.org Git - sonarqube.git/commitdiff
Revert "SONAR-5189 Reintroduce a memory cache for measure in decorators"
authorJulien HENRY <julien.henry@sonarsource.com>
Wed, 7 May 2014 09:38:54 +0000 (11:38 +0200)
committerJulien HENRY <julien.henry@sonarsource.com>
Wed, 7 May 2014 09:38:54 +0000 (11:38 +0200)
This reverts commit c70e47fb30545a9059d3470c2e086a76e2a6e605.

plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/TendencyDecorator.java
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/TendencyDecoratorTest.java
plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/VariationDecoratorTest.java
sonar-batch/src/main/java/org/sonar/batch/DefaultDecoratorContext.java
sonar-batch/src/main/java/org/sonar/batch/index/DefaultIndex.java
sonar-batch/src/main/java/org/sonar/batch/phases/DecoratorsExecutor.java
sonar-batch/src/main/java/org/sonar/batch/qualitygate/QualityGateVerifier.java
sonar-batch/src/test/java/org/sonar/batch/phases/DecoratorsExecutorTest.java
sonar-batch/src/test/java/org/sonar/batch/qualitygate/QualityGateVerifierTest.java
sonar-plugin-api/src/main/java/org/sonar/api/batch/DecoratorContext.java

index 81e06451e24669f521f94a77e27ee5f3850f7895..1e20c12f99431be39311d9418c6480a2f5b7707c 100644 (file)
@@ -38,6 +38,7 @@ import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.resources.Scopes;
 import org.sonar.batch.components.PeriodsDefinition;
+import org.sonar.batch.index.DefaultIndex;
 import org.sonar.core.DryRunIncompatible;
 
 import java.util.List;
@@ -52,9 +53,11 @@ public class TendencyDecorator implements Decorator {
   private TimeMachineQuery query;
   private TendencyAnalyser analyser;
   private List<Metric> metrics;
+  private final DefaultIndex index;
 
-  public TendencyDecorator(TimeMachine timeMachine, MetricFinder metricFinder) {
+  public TendencyDecorator(TimeMachine timeMachine, MetricFinder metricFinder, DefaultIndex index) {
     this.timeMachine = timeMachine;
+    this.index = index;
     this.analyser = new TendencyAnalyser();
     this.metrics = Lists.newLinkedList();
     for (Metric metric : metricFinder.findAll()) {
@@ -64,10 +67,11 @@ public class TendencyDecorator implements Decorator {
     }
   }
 
-  TendencyDecorator(TimeMachine timeMachine, TimeMachineQuery query, TendencyAnalyser analyser) {
+  TendencyDecorator(TimeMachine timeMachine, TimeMachineQuery query, TendencyAnalyser analyser, DefaultIndex index) {
     this.timeMachine = timeMachine;
     this.query = query;
     this.analyser = analyser;
+    this.index = index;
   }
 
   @DependsUpon
@@ -114,7 +118,7 @@ public class TendencyDecorator implements Decorator {
           values.add(measure.getValue());
 
           measure.setTendency(analyser.analyseLevel(valuesPerMetric.get(metric)));
-          context.saveMeasure(measure);
+          index.updateMeasure(resource, measure);
         }
       }
     }
index 46f8f9d93e8f8eab0cb1109b64e90039e7366460..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) {
@@ -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 8713c66537b226a8555c62cd984100d5cf60f61e..a60dfbb5e9e2f76621ddc3cd3e69b0ddd5acdb26 100644 (file)
@@ -28,6 +28,7 @@ import org.sonar.api.measures.Measure;
 import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.resources.Directory;
 import org.sonar.api.resources.Project;
+import org.sonar.batch.index.DefaultIndex;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -53,7 +54,7 @@ public class TendencyDecoratorTest {
     MetricFinder metricFinder = mock(MetricFinder.class);
     when(metricFinder.findAll()).thenReturn(Arrays.asList(CoreMetrics.LINES, CoreMetrics.COVERAGE, CoreMetrics.COVERAGE_LINE_HITS_DATA, CoreMetrics.PROFILE));
 
-    TendencyDecorator decorator = new TendencyDecorator(null, metricFinder);
+    TendencyDecorator decorator = new TendencyDecorator(null, metricFinder, mock(DefaultIndex.class));
 
     TimeMachineQuery query = decorator.initQuery(project);
     assertThat(query.getMetrics().size(), is(2));
@@ -80,7 +81,7 @@ public class TendencyDecoratorTest {
     when(context.getMeasure(CoreMetrics.LINES)).thenReturn(new Measure(CoreMetrics.LINES, 1400.0));
     when(context.getMeasure(CoreMetrics.COVERAGE)).thenReturn(new Measure(CoreMetrics.LINES, 90.0));
 
-    TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser);
+    TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser, mock(DefaultIndex.class));
     decorator.decorate(new Directory("org/foo"), context);
 
     verify(analyser).analyseLevel(Arrays.asList(1200.0, 1300.0, 1150.0, 1400.0));
@@ -99,7 +100,7 @@ public class TendencyDecoratorTest {
       ));
 
     DecoratorContext context = mock(DecoratorContext.class);
-    TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser);
+    TendencyDecorator decorator = new TendencyDecorator(timeMachine, query, analyser, mock(DefaultIndex.class));
     decorator.decorate(new Directory("org/foo"), context);
 
     verify(analyser, never()).analyseLevel(anyList());
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 923c23568066a20e614948bcc369a2c86e8f7eef..d33647ee5f387c889107c431ccb8ba453e0e8e19 100644 (file)
  */
 package org.sonar.batch;
 
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ListMultimap;
+import org.sonar.core.measure.MeasurementFilters;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
 import com.google.common.collect.Lists;
 import org.sonar.api.batch.DecoratorContext;
 import org.sonar.api.batch.Event;
 import org.sonar.api.batch.SonarIndex;
 import org.sonar.api.design.Dependency;
-import org.sonar.api.measures.CoreMetrics;
 import org.sonar.api.measures.Measure;
 import org.sonar.api.measures.MeasuresFilter;
 import org.sonar.api.measures.MeasuresFilters;
 import org.sonar.api.measures.Metric;
-import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.rules.Violation;
-import org.sonar.api.utils.SonarException;
 import org.sonar.api.violations.ViolationQuery;
-import org.sonar.batch.scan.measure.MeasureCache;
-import org.sonar.core.measure.MeasurementFilters;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
 
 public class DefaultDecoratorContext implements DecoratorContext {
 
@@ -55,35 +50,19 @@ public class DefaultDecoratorContext implements DecoratorContext {
 
   private List<DecoratorContext> childrenContexts;
 
-  private ListMultimap<String, Measure> measuresByMetric = ArrayListMultimap.create();
-  private MeasureCache measureCache;
-  private MetricFinder metricFinder;
-
   public DefaultDecoratorContext(Resource resource,
-    SonarIndex index,
-    List<DecoratorContext> childrenContexts,
-    MeasurementFilters measurementFilters, MeasureCache measureCache, MetricFinder metricFinder) {
+                                 SonarIndex index,
+                                 List<DecoratorContext> childrenContexts,
+                                 MeasurementFilters measurementFilters) {
     this.index = index;
     this.resource = resource;
     this.childrenContexts = childrenContexts;
     this.measurementFilters = measurementFilters;
-    this.measureCache = measureCache;
-    this.metricFinder = metricFinder;
-  }
-
-  public void init() {
-    Iterable<Measure> unfiltered = measureCache.byResource(resource);
-    for (Measure measure : unfiltered) {
-      measuresByMetric.put(measure.getMetricKey(), measure);
-    }
   }
 
-  public DefaultDecoratorContext lock() {
-    readOnly = true;
+  public DefaultDecoratorContext setReadOnly(boolean b) {
+    readOnly = b;
     childrenContexts = null;
-    for (Measure measure : measuresByMetric.values()) {
-      measureCache.put(resource, measure);
-    }
     return this;
   }
 
@@ -103,18 +82,11 @@ public class DefaultDecoratorContext implements DecoratorContext {
   }
 
   public <M> M getMeasures(MeasuresFilter<M> filter) {
-    Collection<Measure> unfiltered;
-    if (filter instanceof MeasuresFilters.MetricFilter) {
-      // optimization
-      unfiltered = measuresByMetric.get(((MeasuresFilters.MetricFilter<M>) filter).filterOnMetricKey());
-    } else {
-      unfiltered = measuresByMetric.values();
-    }
-    return filter.filter(unfiltered);
+    return index.getMeasures(resource, filter);
   }
 
   public Measure getMeasure(Metric metric) {
-    return getMeasures(MeasuresFilters.metric(metric));
+    return index.getMeasure(resource, metric);
   }
 
   public Collection<Measure> getChildrenMeasures(MeasuresFilter filter) {
@@ -142,31 +114,8 @@ public class DefaultDecoratorContext implements DecoratorContext {
 
   public DecoratorContext saveMeasure(Measure measure) {
     checkReadOnly(SAVE_MEASURE_METHOD);
-    Metric metric = metricFinder.findByKey(measure.getMetricKey());
-    if (metric == null) {
-      throw new SonarException("Unknown metric: " + measure.getMetricKey());
-    }
-    measure.setMetric(metric);
-    if (measurementFilters.accept(resource, measure)) {
-      List<Measure> metricMeasures = measuresByMetric.get(measure.getMetricKey());
-
-      boolean add = true;
-      if (metricMeasures != null) {
-        int index = metricMeasures.indexOf(measure);
-        if (index > -1) {
-          if (metricMeasures.get(index) == measure) {
-            add = false;
-          } else if (measure.getMetric().equals(CoreMetrics.TESTS)) {
-            // Hack for SONAR-5212
-            measuresByMetric.remove(measure.getMetric().getKey(), metricMeasures.get(index));
-          } else {
-            throw new SonarException("Can not add twice the same measure on " + resource + ": " + measure);
-          }
-        }
-      }
-      if (add) {
-        measuresByMetric.put(measure.getMetricKey(), measure);
-      }
+    if(measurementFilters.accept(resource, measure)) {
+      index.addMeasure(resource, measure);
     }
     return this;
   }
index 44db4e53f733dbb074ef2088ca7e2a2cdf5f9cdf..ad5516879f1e89a3253792d1ba5a5c843a88e060 100644 (file)
@@ -31,20 +31,8 @@ import org.sonar.api.batch.SonarIndex;
 import org.sonar.api.batch.bootstrap.ProjectDefinition;
 import org.sonar.api.database.model.Snapshot;
 import org.sonar.api.design.Dependency;
-import org.sonar.api.measures.CoreMetrics;
-import org.sonar.api.measures.Measure;
-import org.sonar.api.measures.MeasuresFilter;
-import org.sonar.api.measures.MeasuresFilters;
-import org.sonar.api.measures.Metric;
-import org.sonar.api.measures.MetricFinder;
-import org.sonar.api.resources.Directory;
-import org.sonar.api.resources.File;
-import org.sonar.api.resources.Project;
-import org.sonar.api.resources.ProjectLink;
-import org.sonar.api.resources.Qualifiers;
-import org.sonar.api.resources.Resource;
-import org.sonar.api.resources.ResourceUtils;
-import org.sonar.api.resources.Scopes;
+import org.sonar.api.measures.*;
+import org.sonar.api.resources.*;
 import org.sonar.api.rules.Rule;
 import org.sonar.api.rules.Violation;
 import org.sonar.api.scan.filesystem.PathResolver;
@@ -53,6 +41,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;
@@ -60,15 +49,7 @@ import org.sonar.core.component.ScanGraph;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 public class DefaultIndex extends SonarIndex {
 
@@ -221,6 +202,17 @@ public class DefaultIndex extends SonarIndex {
     return measure;
   }
 
+  /**
+   * 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)) {
+      throw new SonarException("Can't update measure on " + resource + ": " + measure);
+    }
+    measureCache.put(resource, measure);
+  }
+
   //
   //
   //
index 9c82bcf42c9ef3919d50c4c515762fd58a51afca..dc4d0b35049747bc3b8aa0feed34ce9bb42b0571 100644 (file)
  */
 package org.sonar.batch.phases;
 
+import org.sonar.core.measure.MeasurementFilters;
+
 import com.google.common.collect.Lists;
 import org.sonar.api.BatchComponent;
 import org.sonar.api.batch.BatchExtensionDictionnary;
 import org.sonar.api.batch.Decorator;
 import org.sonar.api.batch.DecoratorContext;
 import org.sonar.api.batch.SonarIndex;
-import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.utils.MessageException;
@@ -33,8 +34,6 @@ import org.sonar.api.utils.SonarException;
 import org.sonar.batch.DecoratorsSelector;
 import org.sonar.batch.DefaultDecoratorContext;
 import org.sonar.batch.events.EventBus;
-import org.sonar.batch.scan.measure.MeasureCache;
-import org.sonar.core.measure.MeasurementFilters;
 
 import java.util.Collection;
 import java.util.List;
@@ -46,13 +45,9 @@ public class DecoratorsExecutor implements BatchComponent {
   private EventBus eventBus;
   private Project project;
   private MeasurementFilters measurementFilters;
-  private MeasureCache measureCache;
-  private MetricFinder metricFinder;
 
   public DecoratorsExecutor(BatchExtensionDictionnary batchExtDictionnary,
-    Project project, SonarIndex index, EventBus eventBus, MeasurementFilters measurementFilters, MeasureCache measureCache, MetricFinder metricFinder) {
-    this.measureCache = measureCache;
-    this.metricFinder = metricFinder;
+      Project project, SonarIndex index, EventBus eventBus, MeasurementFilters measurementFilters) {
     this.decoratorsSelector = new DecoratorsSelector(batchExtDictionnary);
     this.index = index;
     this.eventBus = eventBus;
@@ -72,12 +67,11 @@ public class DecoratorsExecutor implements BatchComponent {
     for (Resource child : index.getChildren(resource)) {
       boolean isModule = child instanceof Project;
       DefaultDecoratorContext childContext = (DefaultDecoratorContext) decorateResource(child, decorators, !isModule);
-      childrenContexts.add(childContext.lock());
+      childrenContexts.add(childContext.setReadOnly(true));
     }
 
-    DefaultDecoratorContext context = new DefaultDecoratorContext(resource, index, childrenContexts, measurementFilters, measureCache, metricFinder);
+    DefaultDecoratorContext context = new DefaultDecoratorContext(resource, index, childrenContexts, measurementFilters);
     if (executeDecorators) {
-      context.init();
       for (Decorator decorator : decorators) {
         executeDecorator(decorator, context, resource);
       }
index 872381d6f5fa548466f4a9c1dcee581a235fa6e1..ac18daadf95ba6708d6f6e829e34bb773d83b1e8 100644 (file)
@@ -38,6 +38,7 @@ import org.sonar.api.resources.Resource;
 import org.sonar.api.resources.ResourceUtils;
 import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.Durations;
+import org.sonar.batch.index.DefaultIndex;
 import org.sonar.core.qualitygate.db.QualityGateConditionDto;
 import org.sonar.core.timemachine.Periods;
 
@@ -63,13 +64,15 @@ public class QualityGateVerifier implements Decorator {
   private Periods periods;
   private I18n i18n;
   private Durations durations;
+  private final DefaultIndex index;
 
-  public QualityGateVerifier(QualityGate qualityGate, Snapshot snapshot, Periods periods, I18n i18n, Durations durations) {
+  public QualityGateVerifier(QualityGate qualityGate, Snapshot snapshot, Periods periods, I18n i18n, Durations durations, DefaultIndex index) {
     this.qualityGate = qualityGate;
     this.snapshot = snapshot;
     this.periods = periods;
     this.i18n = i18n;
     this.durations = durations;
+    this.index = index;
   }
 
   @DependedUpon
@@ -120,7 +123,7 @@ public class QualityGateVerifier implements Decorator {
           labels.add(text);
         }
 
-        context.saveMeasure(measure);
+        index.updateMeasure(resource, measure);
 
         if (Metric.Level.WARN == level && globalLevel != Metric.Level.ERROR) {
           globalLevel = Metric.Level.WARN;
index 12d35f08b4d62f9d645c475e24fc7c2877284a54..3534236e5036cfb7ab83ec962e66261d625250db 100644 (file)
@@ -24,14 +24,12 @@ import org.sonar.api.batch.BatchExtensionDictionnary;
 import org.sonar.api.batch.Decorator;
 import org.sonar.api.batch.DecoratorContext;
 import org.sonar.api.batch.SonarIndex;
-import org.sonar.api.measures.MetricFinder;
 import org.sonar.api.resources.File;
 import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.utils.SonarException;
 import org.sonar.batch.DefaultDecoratorContext;
 import org.sonar.batch.events.EventBus;
-import org.sonar.batch.scan.measure.MeasureCache;
 import org.sonar.core.measure.MeasurementFilters;
 
 import static org.fest.assertions.Assertions.assertThat;
@@ -66,7 +64,7 @@ public class DecoratorsExecutorTest {
     doThrow(new SonarException()).when(decorator).decorate(any(Resource.class), any(DecoratorContext.class));
 
     DecoratorsExecutor executor = new DecoratorsExecutor(mock(BatchExtensionDictionnary.class), new Project("key"), mock(SonarIndex.class),
-      mock(EventBus.class), mock(MeasurementFilters.class), mock(MeasureCache.class), mock(MetricFinder.class));
+      mock(EventBus.class), mock(MeasurementFilters.class));
     try {
       executor.executeDecorator(decorator, mock(DefaultDecoratorContext.class), File.create("src/org/foo/Bar.java", "org/foo/Bar.java", null, false));
       fail("Exception has not been thrown");
index 9dd6a731f12ef9c82da982910873f45df47f5594..28339d61c9cd8d6cdb68703f6101ce71a923acb9 100644 (file)
@@ -39,6 +39,7 @@ import org.sonar.api.resources.Resource;
 import org.sonar.api.test.IsMeasure;
 import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.Durations;
+import org.sonar.batch.index.DefaultIndex;
 import org.sonar.core.qualitygate.db.QualityGateConditionDto;
 import org.sonar.core.timemachine.Periods;
 
@@ -69,6 +70,7 @@ public class QualityGateVerifierTest {
   Periods periods;
   I18n i18n;
   Durations durations;
+  private DefaultIndex index;
 
   @Before
   public void before() {
@@ -89,7 +91,8 @@ public class QualityGateVerifierTest {
     snapshot = mock(Snapshot.class);
     qualityGate = mock(QualityGate.class);
     when(qualityGate.isEnabled()).thenReturn(true);
-    verifier = new QualityGateVerifier(qualityGate, snapshot, periods, i18n, durations);
+    index = mock(DefaultIndex.class);
+    verifier = new QualityGateVerifier(qualityGate, snapshot, periods, i18n, durations, index);
     project = new Project("foo");
   }
 
@@ -130,8 +133,8 @@ public class QualityGateVerifierTest {
 
     verifier.decorate(project, context);
 
-    verify(context).saveMeasure(argThat(hasLevel(measureClasses, Metric.Level.OK)));
-    verify(context).saveMeasure(argThat(hasLevel(measureCoverage, Metric.Level.OK)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureClasses, Metric.Level.OK)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureCoverage, Metric.Level.OK)));
     verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.ALERT_STATUS, Metric.Level.OK.toString())));
     verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.QUALITY_GATE_DETAILS, "{\"level\":\"OK\","
       + "\"conditions\":"
@@ -166,8 +169,8 @@ public class QualityGateVerifierTest {
 
     verify(context).saveMeasure(argThat(matchesMetric(CoreMetrics.ALERT_STATUS, Metric.Level.WARN, null)));
 
-    verify(context).saveMeasure(argThat(hasLevel(measureClasses, Metric.Level.OK)));
-    verify(context).saveMeasure(argThat(hasLevel(measureCoverage, Metric.Level.WARN)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureClasses, Metric.Level.OK)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureCoverage, Metric.Level.WARN)));
 
   }
 
@@ -184,8 +187,8 @@ public class QualityGateVerifierTest {
 
     verify(context).saveMeasure(argThat(matchesMetric(CoreMetrics.ALERT_STATUS, Metric.Level.ERROR, null)));
 
-    verify(context).saveMeasure(argThat(hasLevel(measureClasses, Metric.Level.WARN)));
-    verify(context).saveMeasure(argThat(hasLevel(measureCoverage, Metric.Level.ERROR)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureClasses, Metric.Level.WARN)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureCoverage, Metric.Level.ERROR)));
   }
 
   @Test
@@ -255,9 +258,9 @@ public class QualityGateVerifierTest {
 
     verify(context).saveMeasure(argThat(matchesMetric(CoreMetrics.ALERT_STATUS, Metric.Level.OK, null)));
 
-    verify(context).saveMeasure(argThat(hasLevel(measureClasses, Metric.Level.OK)));
-    verify(context).saveMeasure(argThat(hasLevel(measureCoverage, Metric.Level.OK)));
-    verify(context).saveMeasure(argThat(hasLevel(measureComplexity, Metric.Level.OK)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureClasses, Metric.Level.OK)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureCoverage, Metric.Level.OK)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureComplexity, Metric.Level.OK)));
   }
 
   @Test
@@ -283,9 +286,9 @@ public class QualityGateVerifierTest {
 
     verify(context).saveMeasure(argThat(matchesMetric(CoreMetrics.ALERT_STATUS, Metric.Level.WARN, null)));
 
-    verify(context).saveMeasure(argThat(hasLevel(measureClasses, Metric.Level.WARN)));
-    verify(context).saveMeasure(argThat(hasLevel(measureCoverage, Metric.Level.WARN)));
-    verify(context).saveMeasure(argThat(hasLevel(measureComplexity, Metric.Level.WARN)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureClasses, Metric.Level.WARN)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureCoverage, Metric.Level.WARN)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureComplexity, Metric.Level.WARN)));
   }
 
   @Test
@@ -299,7 +302,7 @@ public class QualityGateVerifierTest {
     verifier.decorate(project, context);
 
     verify(context).saveMeasure(argThat(matchesMetric(CoreMetrics.ALERT_STATUS, Metric.Level.OK, null)));
-    verify(context).saveMeasure(argThat(hasLevel(measureClasses, Metric.Level.OK)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureClasses, Metric.Level.OK)));
   }
 
   @Test
@@ -317,7 +320,7 @@ public class QualityGateVerifierTest {
     verifier.decorate(project, context);
 
     verify(context).saveMeasure(argThat(matchesMetric(CoreMetrics.ALERT_STATUS, Metric.Level.OK, null)));
-    verify(context).saveMeasure(argThat(hasLevel(measureRatingMetric, Metric.Level.OK)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureRatingMetric, Metric.Level.OK)));
   }
 
   @Test
@@ -332,7 +335,7 @@ public class QualityGateVerifierTest {
     verifier.decorate(project, context);
 
     verify(context).saveMeasure(argThat(matchesMetric(CoreMetrics.ALERT_STATUS, Metric.Level.WARN, null)));
-    verify(context).saveMeasure(argThat(hasLevel(measureClasses, Metric.Level.WARN)));
+    verify(index).updateMeasure(eq(project), argThat(hasLevel(measureClasses, Metric.Level.WARN)));
   }
 
   @Test(expected = NotImplementedException.class)
@@ -405,7 +408,7 @@ public class QualityGateVerifierTest {
     verifier.decorate(project, context);
 
     // First call to saveMeasure is for the update of debt
-    verify(context).saveMeasure(argThat(matchesMetric(metric, Level.ERROR, "The Debt > 1h")));
+    verify(index).updateMeasure(eq(project), argThat(matchesMetric(metric, Level.ERROR, "The Debt > 1h")));
     verify(context).saveMeasure(argThat(matchesMetric(CoreMetrics.ALERT_STATUS, Metric.Level.ERROR, "The Debt > 1h")));
     verify(context).saveMeasure(argThat(new IsMeasure(CoreMetrics.QUALITY_GATE_DETAILS, "{\"level\":\"ERROR\","
       + "\"conditions\":"
index 5d13d0ac7daa8da1e49fff9d4702e7a12901dbe0..3cf8b4dee89059a1cc6a8470b47fbaf912a7e24e 100644 (file)
@@ -76,14 +76,14 @@ public interface DecoratorContext {
   Collection<Measure> getChildrenMeasures(Metric metric);
 
   /**
-   * Add a new measure on the current resource. It can not be executed from children contexts.
+   * Add a measure on the current resource. It can not be executed from children contexts.
    * 
    * @return the same context
    */
   DecoratorContext saveMeasure(Measure measure);
 
   /**
-   * Add a new measure on the current resource. It can not be executed from children contexts.
+   * Add a measure on the current resource. It can not be executed from children contexts.
    * 
    * @return the current object
    */