diff options
author | simonbrandhof <simon.brandhof@gmail.com> | 2010-11-29 13:33:16 +0000 |
---|---|---|
committer | simonbrandhof <simon.brandhof@gmail.com> | 2010-11-29 13:33:16 +0000 |
commit | 984e1ff8d3c2c788fb4bcc85b24dc3b08270aace (patch) | |
tree | 4db20fa8bcf80f129753956ed9b329455d93bc48 | |
parent | 41fbb7e2bfcc9111719f6a3806a294b2a635512f (diff) | |
download | sonarqube-984e1ff8d3c2c788fb4bcc85b24dc3b08270aace.tar.gz sonarqube-984e1ff8d3c2c788fb4bcc85b24dc3b08270aace.zip |
SONAR-249 decrease complexity
3 files changed, 60 insertions, 35 deletions
diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/DifferentialValueDecorator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/DifferentialValueDecorator.java index 57c9c5619ed..8ba04b4e621 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/DifferentialValueDecorator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/DifferentialValueDecorator.java @@ -30,6 +30,7 @@ import org.sonar.api.measures.*; import org.sonar.api.qualitymodel.Characteristic; import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; +import org.sonar.api.resources.ResourceUtils; import org.sonar.api.rules.Rule; import org.sonar.api.rules.RulePriority; @@ -47,25 +48,25 @@ public class DifferentialValueDecorator implements Decorator { public DifferentialValueDecorator(DatabaseSession session, PeriodLocator periodLocator, Configuration configuration, MetricFinder metricFinder) { this.session = session; Snapshot snapshot = periodLocator.locate(5); - projectTargetSnapshots = new Snapshot[] {snapshot}; - - this.metricByIds = Maps.newHashMap(); - for (Metric metric : metricFinder.findAll()) { - if (metric.isNumericType()) { - metricByIds.put(metric.getId(), metric); - } - } + projectTargetSnapshots = new Snapshot[]{snapshot}; + initMetrics(metricFinder.findAll()); } /** * only for unit tests */ - DifferentialValueDecorator(DatabaseSession session, Snapshot[] projectTargetSnapshots, Metric[] metrics) { + DifferentialValueDecorator(DatabaseSession session, Snapshot[] projectTargetSnapshots, Collection<Metric> metrics) { this.session = session; this.projectTargetSnapshots = projectTargetSnapshots; + initMetrics(metrics); + } + + private void initMetrics(Collection<Metric> metrics) { this.metricByIds = Maps.newHashMap(); for (Metric metric : metrics) { - metricByIds.put(metric.getId(), metric); + if (metric.isNumericType()) { + metricByIds.put(metric.getId(), metric); + } } } @@ -78,31 +79,44 @@ public class DifferentialValueDecorator implements Decorator { return metricByIds.values(); } + static boolean shouldCalculateDiffValues(Resource resource) { + // measures on files are currently purged, so past measures are not available + return !ResourceUtils.isEntity(resource); + } + public void decorate(Resource resource, DecoratorContext context) { - for (int index = 0; index < projectTargetSnapshots.length; index++) { - Snapshot projectTargetSnapshot = projectTargetSnapshots[index]; - if (projectTargetSnapshot != null) { - // search past measures - List<MeasureModel> pastMeasures = selectPastMeasures(resource.getId(), projectTargetSnapshot); - - Map<MeasureKey, MeasureModel> pastMeasuresByKey = Maps.newHashMap(); - for (MeasureModel pastMeasure : pastMeasures) { - pastMeasuresByKey.put(new MeasureKey(pastMeasure), pastMeasure); + if (shouldCalculateDiffValues(resource)) { + for (int index = 0; index < projectTargetSnapshots.length; index++) { + Snapshot projectTargetSnapshot = projectTargetSnapshots[index]; + if (projectTargetSnapshot != null) { + calculateDiffValues(resource, context, index, projectTargetSnapshot); } + } + } + } - // for each measure, search equivalent past measure - for (Measure measure : context.getMeasures(MeasuresFilters.all())) { - // compare with past measure - MeasureModel pastMeasure = pastMeasuresByKey.get(new MeasureKey(measure)); - if (calculateDiffValue(measure, pastMeasure, index)) { - context.saveMeasure(measure); - } - } + private void calculateDiffValues(Resource resource, DecoratorContext context, int index, Snapshot projectTargetSnapshot) { + List<MeasureModel> pastMeasures = selectPastMeasures(resource.getId(), projectTargetSnapshot); + compareWithPastMeasures(context, index, pastMeasures); + } + + void compareWithPastMeasures(DecoratorContext context, int index, List<MeasureModel> pastMeasures) { + Map<MeasureKey, MeasureModel> pastMeasuresByKey = Maps.newHashMap(); + for (MeasureModel pastMeasure : pastMeasures) { + pastMeasuresByKey.put(new MeasureKey(pastMeasure), pastMeasure); + } + + // for each measure, search equivalent past measure + for (Measure measure : context.getMeasures(MeasuresFilters.all())) { + // compare with past measure + MeasureModel pastMeasure = pastMeasuresByKey.get(new MeasureKey(measure)); + if (updateDiffValue(measure, pastMeasure, index)) { + context.saveMeasure(measure); } } } - private boolean calculateDiffValue(Measure measure, MeasureModel pastMeasure, int index) { + boolean updateDiffValue(Measure measure, MeasureModel pastMeasure, int index) { boolean updated = false; if (pastMeasure != null && pastMeasure.getValue() != null && measure.getValue() != null) { double diff = (measure.getValue().doubleValue() - pastMeasure.getValue().doubleValue()); @@ -163,7 +177,7 @@ public class DifferentialValueDecorator implements Decorator { characteristic = measure.getCharacteristic(); // TODO merge RuleMeasure into Measure if (measure instanceof RuleMeasure) { - RuleMeasure rm = (RuleMeasure)measure; + RuleMeasure rm = (RuleMeasure) measure; categoryId = rm.getRuleCategory(); rule = rm.getRule(); priority = rm.getRulePriority(); diff --git a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java index 35e960023b1..cff7762d595 100644 --- a/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java +++ b/plugins/sonar-core-plugin/src/main/java/org/sonar/plugins/core/timemachine/PeriodLocator.java @@ -60,7 +60,7 @@ public final class PeriodLocator implements BatchExtension { Snapshot nearest = null; for (Snapshot snapshot : snapshots) { long distance = distance(snapshot.getCreatedAt(), targetDate); - if (distance<=bestDistance) { + if (distance <= bestDistance) { bestDistance = distance; nearest = snapshot; } diff --git a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/DifferentialValueDecoratorTest.java b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/DifferentialValueDecoratorTest.java index bf4691d01d1..fd4b7242a43 100644 --- a/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/DifferentialValueDecoratorTest.java +++ b/plugins/sonar-core-plugin/src/test/java/org/sonar/plugins/core/timemachine/DifferentialValueDecoratorTest.java @@ -23,6 +23,7 @@ import org.junit.Test; import org.sonar.api.database.model.MeasureModel; import org.sonar.api.database.model.Snapshot; import org.sonar.api.measures.Metric; +import org.sonar.api.resources.*; import org.sonar.jpa.test.AbstractDbUnitTestCase; import java.util.List; @@ -41,7 +42,7 @@ public class DifferentialValueDecoratorTest extends AbstractDbUnitTestCase { public void shouldSelectPastResourceMeasures() { setupData("shared"); - Metric[] metrics = selectMetrics(); + List<Metric> metrics = selectMetrics(); Snapshot projectSnapshot = getSession().getSingleResult(Snapshot.class, "id", PROJECT_SNAPSHOT_ID); DifferentialValueDecorator decorator = new DifferentialValueDecorator(getSession(), new Snapshot[0], metrics); @@ -58,7 +59,7 @@ public class DifferentialValueDecoratorTest extends AbstractDbUnitTestCase { public void shouldSelectPastProjectMeasures() { setupData("shared"); - Metric[] metrics = selectMetrics(); + List<Metric> metrics = selectMetrics(); Snapshot projectSnapshot = getSession().getSingleResult(Snapshot.class, "id", PROJECT_SNAPSHOT_ID); DifferentialValueDecorator decorator = new DifferentialValueDecorator(getSession(), new Snapshot[0], metrics); @@ -71,8 +72,18 @@ public class DifferentialValueDecoratorTest extends AbstractDbUnitTestCase { } } - private Metric[] selectMetrics() { - List<Metric> metrics = getSession().getResults(Metric.class); - return metrics.toArray(new Metric[metrics.size()]); + @Test + public void shouldNotCalculateDiffValuesOnFiles() { + assertThat(DifferentialValueDecorator.shouldCalculateDiffValues(new Project("foo")), is(true)); + assertThat(DifferentialValueDecorator.shouldCalculateDiffValues(new JavaPackage("org.foo")), is(true)); + assertThat(DifferentialValueDecorator.shouldCalculateDiffValues(new Directory("org/foo")), is(true)); + + assertThat(DifferentialValueDecorator.shouldCalculateDiffValues(new JavaFile("org.foo.Bar")), is(false)); + assertThat(DifferentialValueDecorator.shouldCalculateDiffValues(new JavaFile("org.foo.Bar", true)), is(false)); + assertThat(DifferentialValueDecorator.shouldCalculateDiffValues(new File("org/foo/Bar.php")), is(false)); + } + + private List<Metric> selectMetrics() { + return getSession().getResults(Metric.class); } } |