Skip to content

Commit

Permalink
SONAR-5931 Publish new measure API
Browse files Browse the repository at this point in the history
  • Loading branch information
henryju committed Jan 15, 2015
1 parent 1e6facc commit 12c4a20
Show file tree
Hide file tree
Showing 50 changed files with 426 additions and 1,235 deletions.
Expand Up @@ -52,7 +52,6 @@
import org.sonar.plugins.core.sensors.BranchCoverageDecorator; import org.sonar.plugins.core.sensors.BranchCoverageDecorator;
import org.sonar.plugins.core.sensors.CommentDensityDecorator; import org.sonar.plugins.core.sensors.CommentDensityDecorator;
import org.sonar.plugins.core.sensors.CoverageDecorator; import org.sonar.plugins.core.sensors.CoverageDecorator;
import org.sonar.plugins.core.sensors.CoverageMeasurementFilter;
import org.sonar.plugins.core.sensors.DirectoriesDecorator; import org.sonar.plugins.core.sensors.DirectoriesDecorator;
import org.sonar.plugins.core.sensors.FileHashSensor; import org.sonar.plugins.core.sensors.FileHashSensor;
import org.sonar.plugins.core.sensors.FilesDecorator; import org.sonar.plugins.core.sensors.FilesDecorator;
Expand Down Expand Up @@ -369,7 +368,6 @@ public List getExtensions() {
OverallLineCoverageDecorator.class, OverallLineCoverageDecorator.class,
OverallCoverageDecorator.class, OverallCoverageDecorator.class,
OverallBranchCoverageDecorator.class, OverallBranchCoverageDecorator.class,
CoverageMeasurementFilter.class,
ApplyProjectRolesDecorator.class, ApplyProjectRolesDecorator.class,
CommentDensityDecorator.class, CommentDensityDecorator.class,
DirectoriesDecorator.class, DirectoriesDecorator.class,
Expand Down
Expand Up @@ -19,20 +19,19 @@
*/ */
package org.sonar.plugins.core.sensors; package org.sonar.plugins.core.sensors;


import com.google.common.collect.ImmutableList;
import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.DecoratorContext;
import org.sonar.api.batch.DependsUpon; import org.sonar.api.batch.DependsUpon;
import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.MeasureUtils; import org.sonar.api.measures.MeasureUtils;
import org.sonar.api.measures.Metric; import org.sonar.api.measures.Metric;
import org.sonar.batch.sensor.coverage.CoverageConstants;


import java.util.List; import java.util.Collection;


public final class BranchCoverageDecorator extends AbstractCoverageDecorator { public final class BranchCoverageDecorator extends AbstractCoverageDecorator {
@DependsUpon @DependsUpon
public List<Metric> dependsUponMetrics() { public Collection<Metric> dependsUponMetrics() {
return ImmutableList.<Metric>of(CoreMetrics.UNCOVERED_CONDITIONS, CoreMetrics.CONDITIONS_TO_COVER, return CoverageConstants.BRANCH_COVERAGE_METRICS;
CoreMetrics.NEW_UNCOVERED_CONDITIONS, CoreMetrics.NEW_CONDITIONS_TO_COVER);
} }


@Override @Override
Expand Down
Expand Up @@ -19,21 +19,19 @@
*/ */
package org.sonar.plugins.core.sensors; package org.sonar.plugins.core.sensors;


import com.google.common.collect.ImmutableList;
import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.DecoratorContext;
import org.sonar.api.batch.DependsUpon; import org.sonar.api.batch.DependsUpon;
import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.MeasureUtils; import org.sonar.api.measures.MeasureUtils;
import org.sonar.api.measures.Metric; import org.sonar.api.measures.Metric;
import org.sonar.batch.sensor.coverage.CoverageConstants;


import java.util.Collection; import java.util.Collection;


public final class CoverageDecorator extends AbstractCoverageDecorator { public final class CoverageDecorator extends AbstractCoverageDecorator {
@DependsUpon @DependsUpon
public Collection<Metric> usedMetrics() { public Collection<Metric> usedMetrics() {
return ImmutableList.<Metric>of(CoreMetrics.LINES_TO_COVER, CoreMetrics.UNCOVERED_LINES, CoreMetrics.NEW_LINES_TO_COVER, return CoverageConstants.COVERAGE_METRICS;
CoreMetrics.NEW_UNCOVERED_LINES, CoreMetrics.CONDITIONS_TO_COVER, CoreMetrics.UNCOVERED_CONDITIONS,
CoreMetrics.NEW_CONDITIONS_TO_COVER, CoreMetrics.NEW_UNCOVERED_CONDITIONS);
} }


@Override @Override
Expand Down
Expand Up @@ -19,20 +19,19 @@
*/ */
package org.sonar.plugins.core.sensors; package org.sonar.plugins.core.sensors;


import com.google.common.collect.ImmutableList;
import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.DecoratorContext;
import org.sonar.api.batch.DependsUpon; import org.sonar.api.batch.DependsUpon;
import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.MeasureUtils; import org.sonar.api.measures.MeasureUtils;
import org.sonar.api.measures.Metric; import org.sonar.api.measures.Metric;
import org.sonar.batch.sensor.coverage.CoverageConstants;


import java.util.List; import java.util.Collection;


public final class LineCoverageDecorator extends AbstractCoverageDecorator { public final class LineCoverageDecorator extends AbstractCoverageDecorator {
@DependsUpon @DependsUpon
public List<Metric> dependsUponMetrics() { public Collection<Metric> dependsUponMetrics() {
return ImmutableList.<Metric>of(CoreMetrics.UNCOVERED_LINES, CoreMetrics.LINES_TO_COVER, CoreMetrics.NEW_UNCOVERED_LINES, return CoverageConstants.LINE_COVERAGE_METRICS;
CoreMetrics.NEW_LINES_TO_COVER);
} }


@Override @Override
Expand Down
Expand Up @@ -24,15 +24,12 @@
import org.sonar.api.batch.DecoratorContext; import org.sonar.api.batch.DecoratorContext;
import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.Measure; import org.sonar.api.measures.Measure;
import org.sonar.api.measures.Metric;
import org.sonar.api.resources.Project; import org.sonar.api.resources.Project;
import org.sonar.api.resources.Scopes; import org.sonar.api.resources.Scopes;


import java.util.List;

import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.anyDouble; import static org.mockito.Matchers.anyDouble;
import static org.mockito.Mockito.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
Expand All @@ -49,9 +46,8 @@ public void before() {


@Test @Test
public void should_depend_on_coverage_metrics() { public void should_depend_on_coverage_metrics() {
List<Metric> metrics = decorator.dependsUponMetrics(); assertThat(decorator.dependsUponMetrics()).containsOnly(CoreMetrics.UNCOVERED_LINES, CoreMetrics.LINES_TO_COVER, CoreMetrics.NEW_UNCOVERED_LINES,

CoreMetrics.NEW_LINES_TO_COVER);
assertThat(metrics).containsOnly(CoreMetrics.UNCOVERED_LINES, CoreMetrics.LINES_TO_COVER, CoreMetrics.NEW_UNCOVERED_LINES, CoreMetrics.NEW_LINES_TO_COVER);
} }


@Test @Test
Expand Down
Expand Up @@ -28,8 +28,7 @@
import org.sonar.api.batch.sensor.Sensor; import org.sonar.api.batch.sensor.Sensor;
import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.api.batch.sensor.SensorDescriptor; import org.sonar.api.batch.sensor.SensorDescriptor;
import org.sonar.api.batch.sensor.measure.Measure; import org.sonar.api.batch.sensor.measure.NewMeasure;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.xoo.Xoo; import org.sonar.xoo.Xoo;


import java.io.File; import java.io.File;
Expand Down Expand Up @@ -88,7 +87,7 @@ private void saveMeasure(SensorContext context, InputFile xooFile, String metric
if (metric == null) { if (metric == null) {
throw new IllegalStateException("Unknow metric with key: " + metricKey); throw new IllegalStateException("Unknow metric with key: " + metricKey);
} }
Measure<Serializable> newMeasure = context.newMeasure() NewMeasure<Serializable> newMeasure = context.newMeasure()
.forMetric(metric) .forMetric(metric)
.onFile(xooFile); .onFile(xooFile);
if (Boolean.class.equals(metric.valueType())) { if (Boolean.class.equals(metric.valueType())) {
Expand All @@ -111,9 +110,7 @@ private void saveMeasure(SensorContext context, InputFile xooFile, String metric
public void describe(SensorDescriptor descriptor) { public void describe(SensorDescriptor descriptor) {
descriptor descriptor
.name("Xoo Measure Sensor") .name("Xoo Measure Sensor")
.provides(CoreMetrics.LINES) .onlyOnLanguages(Xoo.KEY);
.onlyOnLanguages(Xoo.KEY)
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
} }


@Override @Override
Expand Down
Expand Up @@ -87,8 +87,7 @@ private void processLine(File symbolFile, int lineNumber, SymbolTableBuilder sym
public void describe(SensorDescriptor descriptor) { public void describe(SensorDescriptor descriptor) {
descriptor descriptor
.name("Xoo Symbol Reference Sensor") .name("Xoo Symbol Reference Sensor")
.onlyOnLanguages(Xoo.KEY) .onlyOnLanguages(Xoo.KEY);
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
} }


@Override @Override
Expand Down
Expand Up @@ -85,8 +85,7 @@ private void processLine(File highlightingFile, int lineNumber, HighlightingBuil
public void describe(SensorDescriptor descriptor) { public void describe(SensorDescriptor descriptor) {
descriptor descriptor
.name("Xoo Highlighting Sensor") .name("Xoo Highlighting Sensor")
.onlyOnLanguages(Xoo.KEY) .onlyOnLanguages(Xoo.KEY);
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
} }


@Override @Override
Expand Down
Expand Up @@ -35,8 +35,7 @@ public void describe(SensorDescriptor descriptor) {
descriptor descriptor
.name("CreateIssueByInternalKeySensor") .name("CreateIssueByInternalKeySensor")
.onlyOnLanguages(Xoo.KEY) .onlyOnLanguages(Xoo.KEY)
.createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY) .createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY);
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
} }


@Override @Override
Expand Down
Expand Up @@ -36,8 +36,7 @@ public void describe(SensorDescriptor descriptor) {
descriptor descriptor
.name("One Issue On Dir Per File") .name("One Issue On Dir Per File")
.onlyOnLanguages(Xoo.KEY) .onlyOnLanguages(Xoo.KEY)
.createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY) .createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY);
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
} }


@Override @Override
Expand Down
Expand Up @@ -24,7 +24,6 @@
import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.batch.sensor.SensorContext;
import org.sonar.api.batch.sensor.SensorDescriptor; import org.sonar.api.batch.sensor.SensorDescriptor;
import org.sonar.api.batch.sensor.issue.Issue.Severity; import org.sonar.api.batch.sensor.issue.Issue.Severity;
import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleKey;
import org.sonar.xoo.Xoo; import org.sonar.xoo.Xoo;


Expand All @@ -38,10 +37,8 @@ public class OneIssuePerLineSensor implements Sensor {
public void describe(SensorDescriptor descriptor) { public void describe(SensorDescriptor descriptor) {
descriptor descriptor
.name("One Issue Per Line") .name("One Issue Per Line")
.dependsOn(CoreMetrics.LINES)
.onlyOnLanguages(Xoo.KEY) .onlyOnLanguages(Xoo.KEY)
.createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY) .createIssuesForRuleRepositories(XooRulesDefinition.XOO_REPOSITORY);
.onOnFileType(InputFile.Type.MAIN, InputFile.Type.TEST);
} }


@Override @Override
Expand Down
Expand Up @@ -40,7 +40,7 @@
import org.sonar.batch.duplication.DuplicationCache; import org.sonar.batch.duplication.DuplicationCache;
import org.sonar.batch.duplication.DuplicationUtils; import org.sonar.batch.duplication.DuplicationUtils;
import org.sonar.batch.scan.measure.MeasureCache; import org.sonar.batch.scan.measure.MeasureCache;
import org.sonar.core.measure.MeasurementFilters; import org.sonar.batch.sensor.coverage.CoverageExclusions;


import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
Expand All @@ -54,7 +54,6 @@ public class DefaultDecoratorContext implements DecoratorContext {
private static final String SAVE_MEASURE_METHOD = "saveMeasure"; private static final String SAVE_MEASURE_METHOD = "saveMeasure";
private SonarIndex sonarIndex; private SonarIndex sonarIndex;
private Resource resource; private Resource resource;
private MeasurementFilters measurementFilters;
private boolean readOnly = false; private boolean readOnly = false;


private List<DecoratorContext> childrenContexts; private List<DecoratorContext> childrenContexts;
Expand All @@ -63,18 +62,19 @@ public class DefaultDecoratorContext implements DecoratorContext {
private MeasureCache measureCache; private MeasureCache measureCache;
private MetricFinder metricFinder; private MetricFinder metricFinder;
private final DuplicationCache duplicationCache; private final DuplicationCache duplicationCache;
private final CoverageExclusions coverageFilter;


public DefaultDecoratorContext(Resource resource, public DefaultDecoratorContext(Resource resource,
SonarIndex index, SonarIndex index,
List<DecoratorContext> childrenContexts, List<DecoratorContext> childrenContexts,
MeasurementFilters measurementFilters, MeasureCache measureCache, MetricFinder metricFinder, DuplicationCache duplicationCache) { MeasureCache measureCache, MetricFinder metricFinder, DuplicationCache duplicationCache, CoverageExclusions coverageFilter) {
this.sonarIndex = index; this.sonarIndex = index;
this.resource = resource; this.resource = resource;
this.childrenContexts = childrenContexts; this.childrenContexts = childrenContexts;
this.measurementFilters = measurementFilters;
this.measureCache = measureCache; this.measureCache = measureCache;
this.metricFinder = metricFinder; this.metricFinder = metricFinder;
this.duplicationCache = duplicationCache; this.duplicationCache = duplicationCache;
this.coverageFilter = coverageFilter;
} }


public void init() { public void init() {
Expand Down Expand Up @@ -178,7 +178,7 @@ public DecoratorContext saveMeasure(Measure measure) {
throw new SonarException("Unknown metric: " + measure.getMetricKey()); throw new SonarException("Unknown metric: " + measure.getMetricKey());
} }
measure.setMetric(metric); measure.setMetric(metric);
if (measurementFilters.accept(resource, measure)) { if (coverageFilter.accept(resource, measure)) {
List<Measure> metricMeasures = measuresByMetric.get(measure.getMetricKey()); List<Measure> metricMeasures = measuresByMetric.get(measure.getMetricKey());


boolean add = true; boolean add = true;
Expand Down
Expand Up @@ -25,9 +25,13 @@
import org.sonar.api.batch.Event; import org.sonar.api.batch.Event;
import org.sonar.api.batch.SensorContext; import org.sonar.api.batch.SensorContext;
import org.sonar.api.batch.SonarIndex; import org.sonar.api.batch.SonarIndex;
import org.sonar.api.batch.fs.FileSystem;
import org.sonar.api.batch.fs.InputDir; import org.sonar.api.batch.fs.InputDir;
import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.InputPath; import org.sonar.api.batch.fs.InputPath;
import org.sonar.api.batch.rule.ActiveRules;
import org.sonar.api.batch.sensor.SensorStorage;
import org.sonar.api.config.Settings;
import org.sonar.api.design.Dependency; import org.sonar.api.design.Dependency;
import org.sonar.api.measures.Measure; import org.sonar.api.measures.Measure;
import org.sonar.api.measures.MeasuresFilter; import org.sonar.api.measures.MeasuresFilter;
Expand All @@ -40,26 +44,33 @@
import org.sonar.api.resources.Resource; import org.sonar.api.resources.Resource;
import org.sonar.api.rules.Violation; import org.sonar.api.rules.Violation;
import org.sonar.api.utils.SonarException; import org.sonar.api.utils.SonarException;
import org.sonar.core.measure.MeasurementFilters; import org.sonar.batch.duplication.BlockCache;
import org.sonar.batch.duplication.DuplicationCache;
import org.sonar.batch.index.ComponentDataCache;
import org.sonar.batch.sensor.DefaultSensorContext;
import org.sonar.batch.sensor.coverage.CoverageExclusions;


import java.io.Serializable; import java.io.Serializable;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;


public class DefaultSensorContext implements SensorContext { public class DeprecatedSensorContext extends DefaultSensorContext implements SensorContext {


private static final Logger LOG = LoggerFactory.getLogger(DefaultSensorContext.class); private static final Logger LOG = LoggerFactory.getLogger(DeprecatedSensorContext.class);


private SonarIndex index; private final SonarIndex index;
private Project project; private final Project project;
private MeasurementFilters filters; private final CoverageExclusions coverageFilter;


public DefaultSensorContext(SonarIndex index, Project project, MeasurementFilters filters) { public DeprecatedSensorContext(SonarIndex index, Project project, Settings settings, FileSystem fs, ActiveRules activeRules,
ComponentDataCache componentDataCache, CoverageExclusions coverageFilter,
BlockCache blockCache, DuplicationCache duplicationCache, SensorStorage sensorStorage) {
super(settings, fs, activeRules, componentDataCache, blockCache, duplicationCache, sensorStorage);
this.index = index; this.index = index;
this.project = project; this.project = project;
this.filters = filters; this.coverageFilter = coverageFilter;
} }


public Project getProject() { public Project getProject() {
Expand Down Expand Up @@ -173,8 +184,9 @@ public Measure saveMeasure(Resource resource, Metric metric, Double value) {


@Override @Override
public Measure saveMeasure(Resource resource, Measure measure) { public Measure saveMeasure(Resource resource, Measure measure) {
if (filters.accept(resource, measure)) { Resource resourceOrProject = resourceOrProject(resource);
return index.addMeasure(resourceOrProject(resource), measure); if (coverageFilter.accept(resourceOrProject, measure)) {
return index.addMeasure(resourceOrProject, measure);
} else { } else {
return measure; return measure;
} }
Expand Down
Expand Up @@ -29,6 +29,7 @@
import org.sonar.api.resources.Project; import org.sonar.api.resources.Project;
import org.sonar.batch.scan.SensorWrapper; import org.sonar.batch.scan.SensorWrapper;
import org.sonar.batch.scan2.AnalyzerOptimizer; import org.sonar.batch.scan2.AnalyzerOptimizer;
import org.sonar.batch.sensor.DefaultSensorContext;


import javax.annotation.Nullable; import javax.annotation.Nullable;


Expand All @@ -43,7 +44,7 @@ public class BatchExtensionDictionnary extends org.sonar.api.batch.BatchExtensio
private SensorContext context; private SensorContext context;
private AnalyzerOptimizer analyzerOptimizer; private AnalyzerOptimizer analyzerOptimizer;


public BatchExtensionDictionnary(ComponentContainer componentContainer, SensorContext context, AnalyzerOptimizer analyzerOptimizer) { public BatchExtensionDictionnary(ComponentContainer componentContainer, DefaultSensorContext context, AnalyzerOptimizer analyzerOptimizer) {
super(componentContainer); super(componentContainer);
this.context = context; this.context = context;
this.analyzerOptimizer = analyzerOptimizer; this.analyzerOptimizer = analyzerOptimizer;
Expand Down

0 comments on commit 12c4a20

Please sign in to comment.