001/*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube 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 * SonarQube 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 */
020
021package org.sonar.api.ce.measure.test;
022
023import com.google.common.collect.ArrayListMultimap;
024import com.google.common.collect.Multimap;
025import java.util.ArrayList;
026import java.util.HashMap;
027import java.util.HashSet;
028import java.util.List;
029import java.util.Map;
030import java.util.Set;
031import javax.annotation.CheckForNull;
032import org.sonar.api.ce.measure.Component;
033import org.sonar.api.ce.measure.Issue;
034import org.sonar.api.ce.measure.Measure;
035import org.sonar.api.ce.measure.Settings;
036
037import static com.google.common.base.Preconditions.checkArgument;
038import static org.sonar.api.ce.measure.MeasureComputer.MeasureComputerContext;
039import static org.sonar.api.ce.measure.MeasureComputer.MeasureComputerDefinition;
040
041public class TestMeasureComputerContext implements MeasureComputerContext {
042
043  private final Component component;
044  private final MeasureComputerDefinition definition;
045  private final Settings settings;
046
047  private Map<String, Measure> componentMeasureByMetricKey = new HashMap<>();
048  private Multimap<String, Measure> childrenComponentMeasureByMetricKey = ArrayListMultimap.create();
049  private List<Issue> issues = new ArrayList<>();
050
051  public TestMeasureComputerContext(Component component, Settings settings, MeasureComputerDefinition definition) {
052    this.settings = settings;
053    this.component = component;
054    this.definition = definition;
055  }
056
057  @Override
058  public Component getComponent() {
059    return component;
060  }
061
062  @Override
063  public Settings getSettings() {
064    return settings;
065  }
066
067  @Override
068  @CheckForNull
069  public Measure getMeasure(String metric) {
070    validateInputMetric(metric);
071    return componentMeasureByMetricKey.get(metric);
072  }
073
074  @Override
075  public Iterable<Measure> getChildrenMeasures(String metric) {
076    validateInputMetric(metric);
077    return childrenComponentMeasureByMetricKey.get(metric);
078  }
079
080  @Override
081  public void addMeasure(String metricKey, int value) {
082    validateAddMeasure(metricKey);
083    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
084  }
085
086  public void addInputMeasure(String metricKey, int value) {
087    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
088  }
089
090  public void addChildrenMeasures(String metricKey, Integer... values) {
091    for (Integer value : values) {
092      childrenComponentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
093    }
094  }
095
096  @Override
097  public void addMeasure(String metricKey, double value) {
098    validateAddMeasure(metricKey);
099    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
100  }
101
102  public void addInputMeasure(String metricKey, double value) {
103    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
104  }
105
106  public void addChildrenMeasures(String metricKey, Double... values) {
107    for (Double value : values) {
108      childrenComponentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
109    }
110  }
111
112  @Override
113  public void addMeasure(String metricKey, long value) {
114    validateAddMeasure(metricKey);
115    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
116  }
117
118  public void addInputMeasure(String metricKey, long value) {
119    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
120  }
121
122  public void addChildrenMeasures(String metricKey, Long... values) {
123    for (Long value : values) {
124      childrenComponentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
125    }
126  }
127
128  @Override
129  public void addMeasure(String metricKey, String value) {
130    validateAddMeasure(metricKey);
131    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
132  }
133
134  @Override
135  public void addMeasure(String metricKey, boolean value) {
136    validateAddMeasure(metricKey);
137    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
138  }
139
140
141  public void addInputMeasure(String metricKey, boolean value) {
142    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
143  }
144
145  public void addInputMeasure(String metricKey, String value) {
146    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
147  }
148
149  public void addChildrenMeasures(String metricKey, String... values) {
150    for (String value : values) {
151      childrenComponentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
152    }
153  }
154
155  @Override
156  public List<Issue> getIssues() {
157    return issues;
158  }
159
160  public void setIssues(List<Issue> issues) {
161    this.issues = issues;
162  }
163
164  private void validateInputMetric(String metric) {
165    Set<String> allowedMetrics = new HashSet<>();
166    allowedMetrics.addAll(definition.getInputMetrics());
167    allowedMetrics.addAll(definition.getOutputMetrics());
168    checkArgument(allowedMetrics.contains(metric), "Only metrics in %s can be used to load measures", definition.getInputMetrics());
169  }
170
171  private void validateAddMeasure(String metricKey) {
172    checkArgument(definition.getOutputMetrics().contains(metricKey), "Only metrics in %s can be used to add measures. Metric '%s' is not allowed.",
173      definition.getOutputMetrics(), metricKey);
174    if (componentMeasureByMetricKey.get(metricKey) != null) {
175      throw new UnsupportedOperationException(String.format("A measure on metric '%s' already exists", metricKey));
176    }
177  }
178}