@@ -42,6 +42,7 @@ import org.sonar.server.computation.component.ProjectSettingsRepository; | |||
import org.sonar.server.computation.component.TreeRootHolderImpl; | |||
import org.sonar.server.computation.debt.DebtModelHolderImpl; | |||
import org.sonar.server.computation.event.EventRepositoryImpl; | |||
import org.sonar.server.computation.formula.CoreFormulaRepositoryImpl; | |||
import org.sonar.server.computation.issue.IssueCache; | |||
import org.sonar.server.computation.issue.IssueComputation; | |||
import org.sonar.server.computation.issue.RuleCache; | |||
@@ -146,6 +147,7 @@ public class ComputeEngineContainerImpl extends ComponentContainer implements Co | |||
EventRepositoryImpl.class, | |||
ProjectSettingsRepository.class, | |||
DbIdsRepository.class, | |||
CoreFormulaRepositoryImpl.class, | |||
QualityGateServiceImpl.class, | |||
EvaluationResultTextConverterImpl.class, |
@@ -0,0 +1,123 @@ | |||
/* | |||
* SonarQube, open source software quality management tool. | |||
* Copyright (C) 2008-2014 SonarSource | |||
* mailto:contact AT sonarsource DOT com | |||
* | |||
* SonarQube is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 3 of the License, or (at your option) any later version. | |||
* | |||
* SonarQube is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software Foundation, | |||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
*/ | |||
package org.sonar.server.computation.formula; | |||
import com.google.common.collect.ImmutableList; | |||
import java.util.List; | |||
import static org.sonar.api.measures.CoreMetrics.CLASSES_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.CLASS_COMPLEXITY_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.COMPLEXITY_IN_CLASSES_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.COMPLEXITY_IN_FUNCTIONS_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.COMPLEXITY_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.FILES_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.FILE_COMPLEXITY_DISTRIBUTION_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.FILE_COMPLEXITY_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.FUNCTIONS_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.FUNCTION_COMPLEXITY_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.GENERATED_LINES_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.GENERATED_NCLOC_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.PUBLIC_API_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.PUBLIC_UNDOCUMENTED_API_KEY; | |||
import static org.sonar.api.measures.CoreMetrics.STATEMENTS_KEY; | |||
public class CoreFormulaRepositoryImpl implements FormulaRepository { | |||
private static final List<Formula> FORMULAS; | |||
static { | |||
ImmutableList.Builder<Formula> formulaList = ImmutableList.builder(); | |||
formulaList.add( | |||
// Sum formulas | |||
// new SumFormula(LINES_KEY), | |||
new SumFormula(GENERATED_LINES_KEY), | |||
// new SumFormula(NCLOC_KEY), | |||
new SumFormula(GENERATED_NCLOC_KEY), | |||
new SumFormula(CLASSES_KEY), | |||
new SumFormula(FUNCTIONS_KEY), | |||
new SumFormula(STATEMENTS_KEY), | |||
new SumFormula(PUBLIC_API_KEY), | |||
new SumFormula(COMMENT_LINES_KEY), | |||
new SumFormula(PUBLIC_UNDOCUMENTED_API_KEY), | |||
new SumFormula(COMPLEXITY_KEY), | |||
new SumFormula(COMPLEXITY_IN_CLASSES_KEY), | |||
new SumFormula(COMPLEXITY_IN_FUNCTIONS_KEY), | |||
// new SumFormula(LINES_TO_COVER_KEY), | |||
// new SumFormula(NEW_LINES_TO_COVER_KEY), | |||
// new SumFormula(UNCOVERED_LINES_KEY), | |||
// new SumFormula(NEW_UNCOVERED_LINES_KEY), | |||
// new SumFormula(CONDITIONS_TO_COVER_KEY), | |||
// new SumFormula(NEW_CONDITIONS_TO_COVER_KEY), | |||
// new SumFormula(UNCOVERED_CONDITIONS_KEY), | |||
// new SumFormula(NEW_UNCOVERED_CONDITIONS_KEY), | |||
// new SumFormula(IT_LINES_TO_COVER_KEY), | |||
// new SumFormula(NEW_IT_LINES_TO_COVER_KEY), | |||
// new SumFormula(IT_UNCOVERED_LINES_KEY), | |||
// new SumFormula(NEW_IT_UNCOVERED_LINES_KEY), | |||
// new SumFormula(IT_CONDITIONS_TO_COVER_KEY), | |||
// new SumFormula(NEW_IT_CONDITIONS_TO_COVER_KEY), | |||
// new SumFormula(IT_UNCOVERED_CONDITIONS_KEY), | |||
// new SumFormula(NEW_IT_UNCOVERED_CONDITIONS_KEY), | |||
// new SumFormula(OVERALL_LINES_TO_COVER_KEY), | |||
// new SumFormula(NEW_OVERALL_LINES_TO_COVER_KEY), | |||
// new SumFormula(OVERALL_UNCOVERED_LINES_KEY), | |||
// new SumFormula(NEW_OVERALL_UNCOVERED_LINES_KEY), | |||
// new SumFormula(OVERALL_CONDITIONS_TO_COVER_KEY), | |||
// new SumFormula(NEW_OVERALL_CONDITIONS_TO_COVER_KEY), | |||
// new SumFormula(OVERALL_UNCOVERED_CONDITIONS_KEY), | |||
// new SumFormula(NEW_OVERALL_UNCOVERED_CONDITIONS_KEY), | |||
// Distribution formulas | |||
new DistributionFormula(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY), | |||
new DistributionFormula(FILE_COMPLEXITY_DISTRIBUTION_KEY), | |||
// Average formulas, must be executed after all sum formulas as they depend on their measures | |||
AverageFormula.Builder.newBuilder().setOutputMetricKey(FILE_COMPLEXITY_KEY) | |||
.setMainMetricKey(COMPLEXITY_KEY) | |||
.setByMetricKey(FILES_KEY) | |||
.build(), | |||
AverageFormula.Builder.newBuilder().setOutputMetricKey(CLASS_COMPLEXITY_KEY) | |||
.setMainMetricKey(COMPLEXITY_IN_CLASSES_KEY) | |||
.setByMetricKey(CLASSES_KEY) | |||
.setFallbackMetricKey(COMPLEXITY_KEY) | |||
.build(), | |||
AverageFormula.Builder.newBuilder().setOutputMetricKey(FUNCTION_COMPLEXITY_KEY) | |||
.setMainMetricKey(COMPLEXITY_IN_FUNCTIONS_KEY) | |||
.setByMetricKey(FUNCTIONS_KEY) | |||
.setFallbackMetricKey(COMPLEXITY_KEY) | |||
.build() | |||
); | |||
FORMULAS = formulaList.build(); | |||
} | |||
/** | |||
* Return list of formulas that was previously provided by CoreMetrics | |||
* | |||
* TODO When all decorators will be moved to CE, uncomment commented lines to activate all formulas and remove formulas declaration in {@link org.sonar.api.measures.CoreMetrics} | |||
*/ | |||
@Override | |||
public List<Formula> getFormulas() { | |||
return FORMULAS; | |||
} | |||
} |
@@ -0,0 +1,34 @@ | |||
/* | |||
* SonarQube, open source software quality management tool. | |||
* Copyright (C) 2008-2014 SonarSource | |||
* mailto:contact AT sonarsource DOT com | |||
* | |||
* SonarQube is free software; you can redistribute it and/or | |||
* modify it under the terms of the GNU Lesser General Public | |||
* License as published by the Free Software Foundation; either | |||
* version 3 of the License, or (at your option) any later version. | |||
* | |||
* SonarQube is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
* Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software Foundation, | |||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | |||
*/ | |||
package org.sonar.server.computation.formula; | |||
import org.junit.Test; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
public class CoreFormulaRepositoryImplTest { | |||
@Test | |||
public void check_formulas_are_not_empty() throws Exception { | |||
assertThat(new CoreFormulaRepositoryImpl().getFormulas()).isNotEmpty(); | |||
} | |||
} |
@@ -65,7 +65,7 @@ public class MeasuresMediumTest { | |||
.newScanTask(new File(projectDir, "sonar-project.properties")) | |||
.start(); | |||
assertThat(result.allMeasures()).hasSize(69); | |||
assertThat(result.allMeasures()).hasSize(63); | |||
} | |||
@Test |
@@ -39,14 +39,13 @@ import org.sonar.api.batch.sensor.measure.internal.DefaultMeasure; | |||
import org.sonar.api.config.Settings; | |||
import org.sonar.api.measures.CoreMetrics; | |||
import org.sonar.api.measures.Measure; | |||
import org.sonar.api.measures.PersistenceMode; | |||
import org.sonar.api.resources.File; | |||
import org.sonar.api.resources.Project; | |||
import org.sonar.api.resources.Resource; | |||
import org.sonar.api.rule.RuleKey; | |||
import org.sonar.batch.duplication.DuplicationCache; | |||
import org.sonar.batch.index.DefaultIndex; | |||
import org.sonar.batch.index.BatchComponentCache; | |||
import org.sonar.batch.index.DefaultIndex; | |||
import org.sonar.batch.issue.ModuleIssues; | |||
import org.sonar.batch.report.ReportPublisher; | |||
import org.sonar.batch.sensor.coverage.CoverageExclusions; | |||
@@ -125,30 +124,6 @@ public class DefaultSensorStorageTest { | |||
assertThat(m.getMetric()).isEqualTo(CoreMetrics.NCLOC); | |||
} | |||
@Test | |||
public void shouldSetAppropriatePersistenceMode() { | |||
// Metric FUNCTION_COMPLEXITY_DISTRIBUTION is only persisted on directories. | |||
InputFile file = new DefaultInputFile("foo", "src/Foo.php"); | |||
ArgumentCaptor<org.sonar.api.measures.Measure> argumentCaptor = ArgumentCaptor.forClass(org.sonar.api.measures.Measure.class); | |||
Resource sonarFile = File.create("src/Foo.php").setEffectiveKey("foo:src/Foo.php"); | |||
resourceCache.add(sonarFile, null).setInputPath(file); | |||
when(sonarIndex.addMeasure(eq(sonarFile), argumentCaptor.capture())).thenReturn(null); | |||
sensorStorage.store(new DefaultMeasure() | |||
.onFile(file) | |||
.forMetric(CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION) | |||
.withValue("foo")); | |||
org.sonar.api.measures.Measure m = argumentCaptor.getValue(); | |||
assertThat(m.getData()).isEqualTo("foo"); | |||
assertThat(m.getMetric()).isEqualTo(CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION); | |||
assertThat(m.getPersistenceMode()).isEqualTo(PersistenceMode.MEMORY); | |||
} | |||
@Test | |||
public void shouldSaveProjectMeasureToSensorContext() { | |||
@@ -22,16 +22,14 @@ package org.sonar.api.measures; | |||
import com.google.common.annotations.Beta; | |||
import com.google.common.base.Predicate; | |||
import com.google.common.collect.Iterables; | |||
import org.sonar.api.resources.Scopes; | |||
import org.sonar.api.test.MutableTestPlan; | |||
import org.sonar.api.utils.SonarException; | |||
import javax.annotation.Nullable; | |||
import java.lang.reflect.Field; | |||
import java.lang.reflect.Modifier; | |||
import java.util.LinkedList; | |||
import java.util.List; | |||
import javax.annotation.Nullable; | |||
import org.sonar.api.resources.Scopes; | |||
import org.sonar.api.test.MutableTestPlan; | |||
import org.sonar.api.utils.SonarException; | |||
/** | |||
* @since 1.10 | |||
@@ -77,7 +75,6 @@ public final class CoreMetrics { | |||
.setDomain(DOMAIN_SIZE) | |||
.setBestValue(0.0) | |||
.setOptimizedBestValue(true) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
public static final String NCLOC_KEY = "ncloc"; | |||
@@ -112,7 +109,6 @@ public final class CoreMetrics { | |||
.setDomain(DOMAIN_SIZE) | |||
.setBestValue(0.0) | |||
.setOptimizedBestValue(true) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
public static final String CLASSES_KEY = "classes"; | |||
@@ -121,7 +117,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(false) | |||
.setDomain(DOMAIN_SIZE) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
public static final String FILES_KEY = "files"; | |||
@@ -164,7 +159,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(false) | |||
.setDomain(DOMAIN_SIZE) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
/** | |||
@@ -194,7 +188,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(false) | |||
.setDomain(DOMAIN_SIZE) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
public static final String PUBLIC_API_KEY = "public_api"; | |||
@@ -203,7 +196,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(false) | |||
.setDomain(DOMAIN_SIZE) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
/** | |||
@@ -233,7 +225,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_BETTER) | |||
.setQualitative(false) | |||
.setDomain(DOMAIN_DOCUMENTATION) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
public static final String COMMENT_LINES_DENSITY_KEY = "comment_lines_density"; | |||
@@ -264,7 +255,6 @@ public final class CoreMetrics { | |||
.setBestValue(0.0) | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setOptimizedBestValue(true) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
/** | |||
@@ -300,7 +290,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(false) | |||
.setDomain(DOMAIN_COMPLEXITY) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.create(); | |||
public static final String FILE_COMPLEXITY_KEY = "file_complexity"; | |||
@@ -309,7 +298,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(true) | |||
.setDomain(DOMAIN_COMPLEXITY) | |||
.setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY, CoreMetrics.FILES)) | |||
.create(); | |||
/** | |||
@@ -326,7 +314,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(false) | |||
.setDomain(DOMAIN_COMPLEXITY) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.setDeleteHistoricalData(true) | |||
.create(); | |||
@@ -341,7 +328,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(true) | |||
.setDomain(DOMAIN_COMPLEXITY) | |||
.setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY_IN_CLASSES, CoreMetrics.CLASSES).setFallbackForMainMetric(CoreMetrics.COMPLEXITY)) | |||
.create(); | |||
/** | |||
@@ -358,7 +344,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(false) | |||
.setDomain(DOMAIN_COMPLEXITY) | |||
.setFormula(new SumChildValuesFormula(false)) | |||
.setDeleteHistoricalData(true) | |||
.create(); | |||
@@ -373,7 +358,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_WORST) | |||
.setQualitative(true) | |||
.setDomain(DOMAIN_COMPLEXITY) | |||
.setFormula(AverageFormula.create(CoreMetrics.COMPLEXITY_IN_FUNCTIONS, CoreMetrics.FUNCTIONS).setFallbackForMainMetric(CoreMetrics.COMPLEXITY)) | |||
.create(); | |||
/** | |||
@@ -403,7 +387,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_NONE) | |||
.setQualitative(true) | |||
.setDomain(DOMAIN_COMPLEXITY) | |||
.setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY)) | |||
.create(); | |||
public static final String FILE_COMPLEXITY_DISTRIBUTION_KEY = "file_complexity_distribution"; | |||
@@ -412,7 +395,6 @@ public final class CoreMetrics { | |||
.setDirection(Metric.DIRECTION_NONE) | |||
.setQualitative(true) | |||
.setDomain(DOMAIN_COMPLEXITY) | |||
.setFormula(new SumChildDistributionFormula().setMinimumScopeToPersist(Scopes.DIRECTORY)) | |||
.create(); | |||
// -------------------------------------------------------------------------------------------------------------------- |
@@ -699,7 +699,11 @@ public class Metric<G extends Serializable> implements Serializable, org.sonar.a | |||
* | |||
* @param f the formula | |||
* @return the builder | |||
* | |||
* @deprecated since 5.2, it's no more possible to define a formula on a metric | |||
* TODO add a link to the new API to declare formulas | |||
*/ | |||
@Deprecated | |||
public Builder setFormula(Formula f) { | |||
this.formula = f; | |||
return this; |