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}