001/*
002 * SonarQube
003 * Copyright (C) 2009-2017 SonarSource SA
004 * mailto:info AT sonarsource DOT com
005 *
006 * This program is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * This program is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
019 */
020package org.sonar.api.ce.measure.test;
021
022import com.google.common.collect.ArrayListMultimap;
023import com.google.common.collect.Multimap;
024import java.util.ArrayList;
025import java.util.HashMap;
026import java.util.HashSet;
027import java.util.List;
028import java.util.Map;
029import java.util.Set;
030import javax.annotation.CheckForNull;
031import org.sonar.api.ce.measure.Component;
032import org.sonar.api.ce.measure.Issue;
033import org.sonar.api.ce.measure.Measure;
034import org.sonar.api.ce.measure.Settings;
035
036import static com.google.common.base.Preconditions.checkArgument;
037import static org.sonar.api.ce.measure.MeasureComputer.MeasureComputerContext;
038import static org.sonar.api.ce.measure.MeasureComputer.MeasureComputerDefinition;
039
040public class TestMeasureComputerContext implements MeasureComputerContext {
041
042  private final Component component;
043  private final MeasureComputerDefinition definition;
044  private final Settings settings;
045
046  private Map<String, Measure> componentMeasureByMetricKey = new HashMap<>();
047  private Multimap<String, Measure> childrenComponentMeasureByMetricKey = ArrayListMultimap.create();
048  private List<Issue> issues = new ArrayList<>();
049
050  public TestMeasureComputerContext(Component component, Settings settings, MeasureComputerDefinition definition) {
051    this.settings = settings;
052    this.component = component;
053    this.definition = definition;
054  }
055
056  @Override
057  public Component getComponent() {
058    return component;
059  }
060
061  @Override
062  public Settings getSettings() {
063    return settings;
064  }
065
066  @Override
067  @CheckForNull
068  public Measure getMeasure(String metric) {
069    validateInputMetric(metric);
070    return componentMeasureByMetricKey.get(metric);
071  }
072
073  @Override
074  public Iterable<Measure> getChildrenMeasures(String metric) {
075    validateInputMetric(metric);
076    return childrenComponentMeasureByMetricKey.get(metric);
077  }
078
079  @Override
080  public void addMeasure(String metricKey, int value) {
081    validateAddMeasure(metricKey);
082    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
083  }
084
085  public void addInputMeasure(String metricKey, int value) {
086    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
087  }
088
089  public void addChildrenMeasures(String metricKey, Integer... values) {
090    for (Integer value : values) {
091      childrenComponentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
092    }
093  }
094
095  @Override
096  public void addMeasure(String metricKey, double value) {
097    validateAddMeasure(metricKey);
098    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
099  }
100
101  public void addInputMeasure(String metricKey, double value) {
102    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
103  }
104
105  public void addChildrenMeasures(String metricKey, Double... values) {
106    for (Double value : values) {
107      childrenComponentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
108    }
109  }
110
111  @Override
112  public void addMeasure(String metricKey, long value) {
113    validateAddMeasure(metricKey);
114    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
115  }
116
117  public void addInputMeasure(String metricKey, long value) {
118    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
119  }
120
121  public void addChildrenMeasures(String metricKey, Long... values) {
122    for (Long value : values) {
123      childrenComponentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
124    }
125  }
126
127  @Override
128  public void addMeasure(String metricKey, String value) {
129    validateAddMeasure(metricKey);
130    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
131  }
132
133  @Override
134  public void addMeasure(String metricKey, boolean value) {
135    validateAddMeasure(metricKey);
136    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
137  }
138
139
140  public void addInputMeasure(String metricKey, boolean value) {
141    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
142  }
143
144  public void addInputMeasure(String metricKey, String value) {
145    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
146  }
147
148  public void addChildrenMeasures(String metricKey, String... values) {
149    for (String value : values) {
150      childrenComponentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
151    }
152  }
153
154  @Override
155  public List<Issue> getIssues() {
156    return issues;
157  }
158
159  public void setIssues(List<Issue> issues) {
160    this.issues = issues;
161  }
162
163  private void validateInputMetric(String metric) {
164    Set<String> allowedMetrics = new HashSet<>();
165    allowedMetrics.addAll(definition.getInputMetrics());
166    allowedMetrics.addAll(definition.getOutputMetrics());
167    checkArgument(allowedMetrics.contains(metric), "Only metrics in %s can be used to load measures", definition.getInputMetrics());
168  }
169
170  private void validateAddMeasure(String metricKey) {
171    checkArgument(definition.getOutputMetrics().contains(metricKey), "Only metrics in %s can be used to add measures. Metric '%s' is not allowed.",
172      definition.getOutputMetrics(), metricKey);
173    if (componentMeasureByMetricKey.get(metricKey) != null) {
174      throw new UnsupportedOperationException(String.format("A measure on metric '%s' already exists", metricKey));
175    }
176  }
177}