001/* 002 * SonarQube 003 * Copyright (C) 2009-2016 SonarSource SA 004 * mailto:contact 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}