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.measures;
021
022import java.util.ArrayList;
023import java.util.Collection;
024import java.util.List;
025import org.sonar.api.rule.RuleKey;
026import org.sonar.api.rules.Rule;
027
028/**
029 * @since 1.10
030 * @deprecated since 5.6. Sensor should only save measures and not read them.
031 */
032@Deprecated
033public final class MeasuresFilters {
034
035  private MeasuresFilters() {
036  }
037
038  public static MeasuresFilter<Collection<Measure>> all() {
039    return new MeasuresFilter<Collection<Measure>>() {
040      @Override
041      public Collection<Measure> filter(Collection<Measure> measures) {
042        Collection<Measure> all = new ArrayList<>();
043        for (Measure measure : measures) {
044          if (measure != null) {
045            all.add(measure);
046          }
047        }
048        return all;
049      }
050    };
051  }
052
053  public static MeasuresFilter<Measure> metric(final org.sonar.api.batch.measure.Metric<?> metric) {
054    return metric(metric.key());
055  }
056
057  public static MeasuresFilter<Measure> metric(final String metricKey) {
058    return new MetricFilter<Measure>(metricKey) {
059      @Override
060      public Measure filter(Collection<Measure> measures) {
061        if (measures == null) {
062          return null;
063        }
064        for (Measure measure : measures) {
065          if (measure.getClass().equals(Measure.class) &&
066            measure.getMetricKey().equals(metricKey) &&
067            measure.getPersonId() == null) {
068            return measure;
069          }
070        }
071        return null;
072      }
073    };
074  }
075
076  /**
077   * @since 2.0
078   */
079  public static MeasuresFilter<Measure> measure(final Measure measure) {
080    return new MeasuresFilter<Measure>() {
081      @Override
082      public Measure filter(Collection<Measure> measures) {
083        if (measures == null) {
084          return null;
085        }
086        for (Measure m : measures) {
087          if (m.equals(measure)) {
088            return m;
089          }
090        }
091        return null;
092      }
093    };
094  }
095
096  public static MeasuresFilter<RuleMeasure> rule(final Metric metric, final RuleKey ruleKey) {
097    return new RuleFilter(metric, ruleKey);
098  }
099
100  public static MeasuresFilter<RuleMeasure> rule(final Metric metric, final Rule rule) {
101    return rule(metric, rule.ruleKey());
102  }
103
104  public static MeasuresFilter<Collection<RuleMeasure>> rules(final Metric metric) {
105    return new MetricFilter<Collection<RuleMeasure>>(metric) {
106
107      private boolean apply(Measure measure) {
108        return measure instanceof RuleMeasure && metric.equals(measure.getMetric())
109          && measure.getPersonId() == null && ((RuleMeasure) measure).ruleKey() != null;
110      }
111
112      @Override
113      public Collection<RuleMeasure> filter(Collection<Measure> measures) {
114        if (measures == null) {
115          return null;
116        }
117        List<RuleMeasure> result = new ArrayList<>();
118        for (Measure measure : measures) {
119          if (apply(measure)) {
120            result.add((RuleMeasure) measure);
121          }
122        }
123        return result;
124      }
125    };
126  }
127
128  /**
129   * Used for internal optimizations.
130   */
131  public abstract static class MetricFilter<M> implements MeasuresFilter<M> {
132    private final String metricKey;
133
134    protected MetricFilter(Metric metric) {
135      this.metricKey = metric.getKey();
136    }
137
138    protected MetricFilter(String metricKey) {
139      this.metricKey = metricKey;
140    }
141
142    public String filterOnMetricKey() {
143      return metricKey;
144    }
145  }
146
147  /**
148   * @deprecated since 5.2. The measures related to rules are computed on server side by Compute Engine.
149   */
150  @Deprecated
151  private abstract static class AbstractRuleMeasureFilter<M> extends MetricFilter<M> {
152    protected AbstractRuleMeasureFilter(Metric metric) {
153      super(metric);
154    }
155
156    private boolean apply(Measure measure) {
157      return measure instanceof RuleMeasure
158        && filterOnMetricKey().equals(measure.getMetricKey())
159        && measure.getPersonId() == null
160        && doApply((RuleMeasure) measure);
161    }
162
163    abstract boolean doApply(RuleMeasure ruleMeasure);
164
165    @Override
166    public M filter(Collection<Measure> measures) {
167      if (measures == null) {
168        return null;
169      }
170      for (Measure measure : measures) {
171        if (apply(measure)) {
172          return (M) measure;
173        }
174      }
175      return null;
176    }
177  }
178
179  /**
180   * @deprecated since 5.2. Useless by design because of Compute Engine
181   */
182  @Deprecated
183  private static class RuleFilter extends AbstractRuleMeasureFilter<RuleMeasure> {
184    private RuleKey ruleKey;
185
186    protected RuleFilter(Metric metric, RuleKey ruleKey) {
187      super(metric);
188      this.ruleKey = ruleKey;
189    }
190
191    @Override
192    boolean doApply(RuleMeasure measure) {
193      return measure.ruleKey() != null
194        && ruleKey.equals(measure.ruleKey());
195    }
196  }
197}