2 * Sonar, open source software quality management tool.
3 * Copyright (C) 2008-2011 SonarSource
4 * mailto:contact AT sonarsource DOT com
6 * Sonar is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 3 of the License, or (at your option) any later version.
11 * Sonar is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Sonar; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
20 package org.sonar.plugins.squid.bridges;
22 import org.sonar.api.measures.CoreMetrics;
23 import org.sonar.api.measures.Measure;
24 import org.sonar.api.resources.Resource;
25 import org.sonar.squid.api.SourceCode;
26 import org.sonar.squid.api.SourceMethod;
27 import org.sonar.squid.api.SourcePackage;
28 import org.sonar.squid.indexer.QueryByMeasure;
29 import org.sonar.squid.indexer.QueryByParent;
30 import org.sonar.squid.indexer.QueryByType;
31 import org.sonar.squid.math.MeasuresDistribution;
32 import org.sonar.squid.measures.Metric;
36 public class FunctionComplexityDistributionBridge extends Bridge {
38 public static final int[] LIMITS = {1, 2, 4, 6, 8, 10, 12};
40 protected FunctionComplexityDistributionBridge() {
45 public final void onPackage(SourcePackage squidPackage, Resource sonarPackage) {
46 if (squidPackage.getDouble(Metric.METHODS) > 0) {
47 context.saveMeasure(sonarPackage, new Measure(CoreMetrics.FUNCTION_COMPLEXITY_DISTRIBUTION, getFunctionComplexityDistribution(squidPackage)));
51 private String getFunctionComplexityDistribution(SourceCode unit) {
52 MeasuresDistribution distribution = new MeasuresDistribution(squid.search(new QueryByParent(unit), new QueryByType(SourceMethod.class),
53 new QueryByMeasure(Metric.ACCESSORS, QueryByMeasure.Operator.EQUALS, 0)));
54 Map<Integer, Integer> distrib = distribution.distributeAccordingTo(Metric.COMPLEXITY, LIMITS);
55 StringBuilder distribString = new StringBuilder(32);
56 for (Map.Entry<Integer, Integer> entry : distrib.entrySet()) {
57 distribString.append(entry.getKey()).append("=").append(entry.getValue().toString()).append(";");
59 distribString.setLength(distribString.length() - 1);
60 return distribString.toString();