]> source.dussan.org Git - sonarqube.git/blob
d5a6e95c047d3c513008bc96722a84550c67ccf8
[sonarqube.git] /
1 /*
2  * Sonar, open source software quality management tool.
3  * Copyright (C) 2008-2011 SonarSource
4  * mailto:contact AT sonarsource DOT com
5  *
6  * Sonar is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 3 of the License, or (at your option) any later version.
10  *
11  * Sonar is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with Sonar; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
19  */
20 package org.sonar.plugins.core.sensors;
21
22 import org.sonar.api.batch.Decorator;
23 import org.sonar.api.batch.DecoratorContext;
24 import org.sonar.api.batch.DependedUpon;
25 import org.sonar.api.measures.Measure;
26 import org.sonar.api.measures.Metric;
27 import org.sonar.api.resources.Project;
28 import org.sonar.api.resources.Resource;
29 import org.sonar.api.resources.ResourceUtils;
30
31 import java.util.Arrays;
32 import java.util.Collection;
33
34 public abstract class AbstractCoverageDecorator implements Decorator {
35
36   public boolean shouldExecuteOnProject(Project project) {
37     return project.getAnalysisType().isDynamic(true);
38   }
39
40   @DependedUpon
41   public Collection<Metric> generatedMetrics() {
42     return Arrays.asList(getGeneratedMetric(), getGeneratedMetricForNewCode());
43   }
44
45   public void decorate(final Resource resource, final DecoratorContext context) {
46     if (shouldDecorate(resource, context)) {
47       computeMeasure(context);
48       computeMeasureForNewCode(context);
49     }
50   }
51
52   protected boolean shouldDecorate(final Resource resource, final DecoratorContext context) {
53     return context.getMeasure(getGeneratedMetric()) == null && !ResourceUtils.isUnitTestClass(resource);
54   }
55
56   private void computeMeasure(DecoratorContext context) {
57     Long elements = countElements(context);
58     if (elements != null && elements > 0L) {
59       Long coveredElements = countCoveredElements(context);
60       context.saveMeasure(getGeneratedMetric(), calculateCoverage(coveredElements, elements));
61     }
62   }
63
64   private void computeMeasureForNewCode(DecoratorContext context) {
65     Measure measure = new Measure(getGeneratedMetricForNewCode());
66     boolean hasValue = false;
67     /* TODO remove this magic number */
68     for (int periodIndex = 1; periodIndex <= 5; periodIndex++) {
69       Long elements = countElementsForNewCode(context, periodIndex);
70
71       if (elements != null && elements > 0L) {
72         long coveredElements = countCoveredElementsForNewCode(context, periodIndex);
73         measure.setVariation(periodIndex, calculateCoverage(coveredElements, elements));
74         hasValue = true;
75       }
76     }
77     if (hasValue) {
78       context.saveMeasure(measure);
79     }
80   }
81
82   private double calculateCoverage(final long coveredLines, final long lines) {
83     return (100.0 * coveredLines) / lines;
84   }
85
86   protected abstract Metric getGeneratedMetric();
87
88   protected abstract Long countElements(DecoratorContext context);
89
90   protected abstract long countCoveredElements(DecoratorContext context);
91
92   protected abstract Metric getGeneratedMetricForNewCode();
93
94   protected abstract Long countElementsForNewCode(DecoratorContext context, int periodIndex);
95
96   protected abstract long countCoveredElementsForNewCode(DecoratorContext context, int periodIndex);
97 }