/** * Creates a FormulaDecorator * * @param metric the metric should have an associated formula * * @throws IllegalArgumentException if no formula is associated to the metric */ public FormulaDecorator(Metric metric, Set<Decorator> executeAfterDecorators) { if (metric.getFormula() == null) { throw new IllegalArgumentException("No formula defined on metric"); } this.metric = metric; this.formulaContext = new DefaultFormulaContext(metric); this.executeAfterDecorators = executeAfterDecorators; }
/** * @return metric the decorator depends upon */ @DependsUpon public List<Metric> dependsUponMetrics() { return metric.getFormula().dependsUponMetrics(); }
public Collection<Decorator> select(Project project) { List<Decorator> decorators = new ArrayList<Decorator>(batchExtDictionnary.select(Decorator.class, project, false, null)); SetMultimap<Metric, Decorator> decoratorsByGeneratedMetric = getDecoratorsByMetric(decorators); for (Metric metric : batchExtDictionnary.select(Metric.class, null, false, null)) { if (metric.getFormula() != null) { decorators.add(new FormulaDecorator(metric, decoratorsByGeneratedMetric.get(metric))); } } return batchExtDictionnary.sort(decorators); }
/** * {@inheritDoc} */ @Override public void decorate(Resource resource, DecoratorContext context) { if (context.getMeasure(metric) != null) { return; } formulaContext.setDecoratorContext(context); FormulaData data = new DefaultFormulaData(context); Measure measure = metric.getFormula().calculate(data, formulaContext); if (measure != null) { context.saveMeasure(measure); } }
@Override public void store(Measure newMeasure) { DefaultMeasure measure = (DefaultMeasure) newMeasure; org.sonar.api.measures.Metric m = findMetricOrFail(measure.metric().key()); org.sonar.api.measures.Measure measureToSave = new org.sonar.api.measures.Measure(m); setValueAccordingToMetricType(newMeasure, m, measureToSave); measureToSave.setFromCore(measure.isFromCore()); InputFile inputFile = newMeasure.inputFile(); if (inputFile != null) { Formula formula = newMeasure.metric() instanceof org.sonar.api.measures.Metric ? ((org.sonar.api.measures.Metric) newMeasure.metric()).getFormula() : null; if (formula instanceof SumChildDistributionFormula && !Scopes.isHigherThanOrEquals(Scopes.FILE, ((SumChildDistributionFormula) formula).getMinimumScopeToPersist())) { measureToSave.setPersistenceMode(PersistenceMode.MEMORY); } File sonarFile = getFile(inputFile); if (coverageExclusions.accept(sonarFile, measureToSave)) { sonarIndex.addMeasure(sonarFile, measureToSave); } } else { sonarIndex.addMeasure(project, measureToSave); } }