001/*
002 * SonarQube
003 * Copyright (C) 2009-2018 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.ArrayList;
023import java.util.Collection;
024import java.util.List;
025import javax.annotation.Nullable;
026import org.sonar.api.rule.RuleKey;
027import org.sonar.api.rules.Rule;
028
029/**
030 * @since 1.10
031 * @deprecated since 5.6. Sensor should only save measures and not read them.
032 */
033@Deprecated
034public final class MeasuresFilters {
035
036  private MeasuresFilters() {
037  }
038
039  public static MeasuresFilter<Collection<Measure>> all() {
040    return new MeasuresFilter<Collection<Measure>>() {
041      @Override
042      public Collection<Measure> filter(Collection<Measure> measures) {
043        Collection<Measure> all = new ArrayList<>();
044        for (Measure measure : measures) {
045          if (measure != null) {
046            all.add(measure);
047          }
048        }
049        return all;
050      }
051    };
052  }
053
054  public static MeasuresFilter<Measure> metric(final org.sonar.api.batch.measure.Metric<?> metric) {
055    return metric(metric.key());
056  }
057
058  public static MeasuresFilter<Measure> metric(final String metricKey) {
059    return new MetricFilter<Measure>(metricKey) {
060      @Override
061      public Measure filter(@Nullable Collection<Measure> measures) {
062        if (measures == null) {
063          return null;
064        }
065        for (Measure measure : measures) {
066          if (measure.getClass().equals(Measure.class) &&
067            measure.getMetricKey().equals(metricKey)) {
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(@Nullable 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          && ((RuleMeasure) measure).ruleKey() != null;
110      }
111
112      @Override
113      public Collection<RuleMeasure> filter(@Nullable 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        && doApply((RuleMeasure) measure);
160    }
161
162    abstract boolean doApply(RuleMeasure ruleMeasure);
163
164    @Override
165    public M filter(@Nullable Collection<Measure> measures) {
166      if (measures == null) {
167        return null;
168      }
169      for (Measure measure : measures) {
170        if (apply(measure)) {
171          return (M) measure;
172        }
173      }
174      return null;
175    }
176  }
177
178  /**
179   * @deprecated since 5.2. Useless by design because of Compute Engine
180   */
181  @Deprecated
182  private static class RuleFilter extends AbstractRuleMeasureFilter<RuleMeasure> {
183    private RuleKey ruleKey;
184
185    protected RuleFilter(Metric metric, RuleKey ruleKey) {
186      super(metric);
187      this.ruleKey = ruleKey;
188    }
189
190    @Override
191    boolean doApply(RuleMeasure measure) {
192      return measure.ruleKey() != null
193        && ruleKey.equals(measure.ruleKey());
194    }
195  }
196}