/* * SonarQube * Copyright (C) 2009-2017 SonarSource SA * mailto:info AT sonarsource DOT com * * This program 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. * * This program 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.core.metric; import com.google.common.collect.ImmutableSet; import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Stream; import org.sonar.api.batch.ScannerSide; import org.sonar.api.ce.ComputeEngineSide; import org.sonar.api.measures.Metric; import org.sonar.api.measures.Metrics; import static org.sonar.api.measures.CoreMetrics.ACCESSORS; import static org.sonar.api.measures.CoreMetrics.CLASSES; import static org.sonar.api.measures.CoreMetrics.COGNITIVE_COMPLEXITY; import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES; import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES_DATA; import static org.sonar.api.measures.CoreMetrics.COMPLEXITY; import static org.sonar.api.measures.CoreMetrics.COMPLEXITY_IN_CLASSES; import static org.sonar.api.measures.CoreMetrics.COMPLEXITY_IN_FUNCTIONS; import static org.sonar.api.measures.CoreMetrics.CONDITIONS_BY_LINE; import static org.sonar.api.measures.CoreMetrics.CONDITIONS_TO_COVER; import static org.sonar.api.measures.CoreMetrics.COVERAGE_LINE_HITS_DATA; import static org.sonar.api.measures.CoreMetrics.COVERED_CONDITIONS_BY_LINE; import static org.sonar.api.measures.CoreMetrics.DIRECTORIES; import static org.sonar.api.measures.CoreMetrics.EXECUTABLE_LINES_DATA; import static org.sonar.api.measures.CoreMetrics.FILES; import static org.sonar.api.measures.CoreMetrics.FILE_COMPLEXITY_DISTRIBUTION; import static org.sonar.api.measures.CoreMetrics.FUNCTIONS; import static org.sonar.api.measures.CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION; import static org.sonar.api.measures.CoreMetrics.GENERATED_LINES; import static org.sonar.api.measures.CoreMetrics.GENERATED_NCLOC; import static org.sonar.api.measures.CoreMetrics.LINES_TO_COVER; import static org.sonar.api.measures.CoreMetrics.NCLOC; import static org.sonar.api.measures.CoreMetrics.NCLOC_DATA; import static org.sonar.api.measures.CoreMetrics.NCLOC_LANGUAGE_DISTRIBUTION; import static org.sonar.api.measures.CoreMetrics.PUBLIC_API; import static org.sonar.api.measures.CoreMetrics.PUBLIC_UNDOCUMENTED_API; import static org.sonar.api.measures.CoreMetrics.SKIPPED_TESTS; import static org.sonar.api.measures.CoreMetrics.STATEMENTS; import static org.sonar.api.measures.CoreMetrics.TESTS; import static org.sonar.api.measures.CoreMetrics.TEST_ERRORS; import static org.sonar.api.measures.CoreMetrics.TEST_EXECUTION_TIME; import static org.sonar.api.measures.CoreMetrics.TEST_FAILURES; import static org.sonar.api.measures.CoreMetrics.UNCOVERED_CONDITIONS; import static org.sonar.api.measures.CoreMetrics.UNCOVERED_LINES; import static org.sonar.core.util.stream.MoreCollectors.toSet; /** * This class is used to know the list of metrics that can be sent in the analysis report. * <p/> * Scanners should not send other metrics, and the Compute Engine should not allow other metrics. */ @ComputeEngineSide @ScannerSide public class ScannerMetrics { private static final Set<Metric> ALLOWED_CORE_METRICS = ImmutableSet.of( GENERATED_LINES, NCLOC, NCLOC_DATA, GENERATED_NCLOC, COMMENT_LINES, COMMENT_LINES_DATA, NCLOC_LANGUAGE_DISTRIBUTION, PUBLIC_API, PUBLIC_UNDOCUMENTED_API, FILES, DIRECTORIES, CLASSES, FUNCTIONS, STATEMENTS, ACCESSORS, COMPLEXITY, COMPLEXITY_IN_CLASSES, COMPLEXITY_IN_FUNCTIONS, COGNITIVE_COMPLEXITY, FILE_COMPLEXITY_DISTRIBUTION, FUNCTION_COMPLEXITY_DISTRIBUTION, TESTS, SKIPPED_TESTS, TEST_ERRORS, TEST_FAILURES, TEST_EXECUTION_TIME, LINES_TO_COVER, UNCOVERED_LINES, COVERAGE_LINE_HITS_DATA, CONDITIONS_TO_COVER, UNCOVERED_CONDITIONS, COVERED_CONDITIONS_BY_LINE, CONDITIONS_BY_LINE, EXECUTABLE_LINES_DATA); private final Set<Metric> metrics; public ScannerMetrics() { this.metrics = ALLOWED_CORE_METRICS; } public ScannerMetrics(Metrics[] metricsRepositories) { this.metrics = Stream.concat(getPluginMetrics(metricsRepositories), ALLOWED_CORE_METRICS.stream()).collect(toSet()); } public Set<Metric> getMetrics() { return metrics; } private static Stream<Metric> getPluginMetrics(Metrics[] metricsRepositories) { return Arrays.stream(metricsRepositories) .map(Metrics::getMetrics) .flatMap(List::stream); } }