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.measures;
021
022import java.util.Collection;
023import javax.annotation.Nullable;
024import org.apache.commons.lang.StringUtils;
025
026/**
027 * An utility class to manipulate measures
028 *
029 * @since 1.10
030 * @deprecated since 5.6. {@link Measure} is deprecated.
031 */
032@Deprecated
033public final class MeasureUtils {
034
035  /**
036   * Class cannot be instantiated, it should only be access through static methods
037   */
038  private MeasureUtils() {
039  }
040
041  /**
042   * Return true if all measures have numeric value
043   *
044   * @param measures the measures
045   * @return true if all measures numeric values
046   */
047  public static boolean haveValues(Measure... measures) {
048    if (measures.length == 0) {
049      return false;
050    }
051    for (Measure measure : measures) {
052      if (!hasValue(measure)) {
053        return false;
054      }
055    }
056    return true;
057  }
058
059  /**
060   * Get the value of a measure, or alternatively a default value
061   *
062   * @param measure      the measure
063   * @param defaultValue the default value
064   * @return <code>defaultValue</code> if measure is null or has no values.
065   */
066
067  public static Double getValue(Measure measure, @Nullable Double defaultValue) {
068    if (MeasureUtils.hasValue(measure)) {
069      return measure.getValue();
070    }
071    return defaultValue;
072  }
073
074  public static Long getValueAsLong(Measure measure, Long defaultValue) {
075    if (MeasureUtils.hasValue(measure)) {
076      return measure.getValue().longValue();
077    }
078    return defaultValue;
079  }
080
081  public static Double getVariation(@Nullable Measure measure, int periodIndex) {
082    return getVariation(measure, periodIndex, null);
083  }
084
085  public static Double getVariation(@Nullable Measure measure, int periodIndex, @Nullable Double defaultValue) {
086    Double result = null;
087    if (measure != null) {
088      result = measure.getVariation(periodIndex);
089    }
090    return result != null ? result : defaultValue;
091  }
092
093  public static Long getVariationAsLong(@Nullable Measure measure, int periodIndex) {
094    return getVariationAsLong(measure, periodIndex, null);
095  }
096
097  public static Long getVariationAsLong(@Nullable Measure measure, int periodIndex, @Nullable Long defaultValue) {
098    Double result = null;
099    if (measure != null) {
100      result = measure.getVariation(periodIndex);
101    }
102    return result == null ? defaultValue : Long.valueOf(result.longValue());
103  }
104
105  /**
106   * Tests if a measure has a value
107   *
108   * @param measure the measure
109   * @return whether the measure has a value
110   */
111  public static boolean hasValue(@Nullable Measure measure) {
112    return measure != null && measure.getValue() != null;
113  }
114
115  /**
116   * Tests if a measure has a data field
117   *
118   * @param measure the measure
119   * @return whether the measure has a data field
120   */
121  public static boolean hasData(@Nullable Measure measure) {
122    return measure != null && StringUtils.isNotBlank(measure.getData());
123  }
124
125  /**
126   * Sums a series of measures
127   *
128   * @param zeroIfNone whether to return 0 or null in case measures is null
129   * @param measures   the series of measures
130   * @return the sum of the measure series
131   */
132  public static Double sum(boolean zeroIfNone, @Nullable Collection<Measure> measures) {
133    if (measures != null) {
134      return sum(zeroIfNone, measures.toArray(new Measure[measures.size()]));
135    }
136    return zeroIfNone(zeroIfNone);
137  }
138
139  /**
140   * Sums a series of measures
141   *
142   * @param zeroIfNone whether to return 0 or null in case measures is null
143   * @param measures   the series of measures
144   * @return the sum of the measure series
145   */
146  public static Double sum(boolean zeroIfNone, Measure... measures) {
147    Double sum = 0d;
148    boolean hasValue = false;
149    for (Measure measure : measures) {
150      if (measure != null && measure.getValue() != null) {
151        hasValue = true;
152        sum += measure.getValue();
153      }
154    }
155
156    if (hasValue) {
157      return sum;
158    }
159    return zeroIfNone(zeroIfNone);
160  }
161
162  /**
163   * Sums a series of measures for the given variation index
164   *
165   * @param zeroIfNone whether to return 0 or null in case measures is null
166   * @param variationIndex the index of the variation to use
167   * @param measures   the series of measures
168   * @return the sum of the variations for the measure series
169   */
170  public static Double sumOnVariation(boolean zeroIfNone, int variationIndex, @Nullable Collection<Measure> measures) {
171    if (measures == null) {
172      return zeroIfNone(zeroIfNone);
173    }
174    Double sum = 0d;
175    for (Measure measure : measures) {
176      Double var = measure.getVariation(variationIndex);
177      if (var != null) {
178        sum += var;
179      }
180    }
181    return sum;
182  }
183
184  private static Double zeroIfNone(boolean zeroIfNone) {
185    return zeroIfNone ? 0d : null;
186  }
187}