001/*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2013 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 */
020package org.sonar.api.batch;
021
022import com.google.common.collect.Lists;
023import org.apache.commons.lang.builder.ToStringBuilder;
024import org.sonar.api.measures.Metric;
025import org.sonar.api.resources.Resource;
026
027import java.util.Arrays;
028import java.util.Date;
029import java.util.List;
030
031/**
032 * A class to query TimeMachine on a given resource
033 * <p/>
034 * <p>The query is constructed by setting filters on metrics and on dates</p>
035 * <p>It is to be noted that all filters will be applied regardless of their coherence</p>
036 *
037 * @since 1.10
038 */
039public class TimeMachineQuery {
040
041  private Resource resource;
042  private List<Metric> metrics;
043  private List<String> metricKeys;
044  private Date from;
045  private Date to;
046  private boolean onlyLastAnalysis = false;
047  private boolean fromCurrentAnalysis = false;
048  private boolean toCurrentAnalysis = false;
049
050  /**
051   * <p>Create a TimeMachine query for a given resource
052   * </p>
053   * Apart from the resource the query is empty, i.e. will return all data for the resource
054   *
055   * @param resource the resource
056   */
057  public TimeMachineQuery(Resource resource) {
058    this.resource = resource;
059  }
060
061  /**
062   * @return the resource of the Query
063   */
064  public Resource getResource() {
065    return resource;
066  }
067
068  /**
069   * Sets the resource of the query
070   *
071   * @param resource the resource
072   * @return this
073   */
074  public TimeMachineQuery setResource(Resource resource) {
075    this.resource = resource;
076    return this;
077  }
078
079  /**
080   * @return the metrics beloging to the query
081   */
082  public List<Metric> getMetrics() {
083    return metrics;
084  }
085
086  /**
087   * Sets the metrics to return
088   *
089   * @param metrics the list of metrics
090   * @return this
091   */
092  public TimeMachineQuery setMetrics(List<Metric> metrics) {
093    this.metrics = metrics;
094    this.metricKeys = Lists.newLinkedList();
095    for (Metric metric : this.metrics) {
096      this.metricKeys.add(metric.getKey());
097    }
098    return this;
099  }
100
101  public TimeMachineQuery setMetricKeys(String... metricKeys) {
102    this.metricKeys = Arrays.asList(metricKeys);
103    return this;
104  }
105
106  public List<String> getMetricKeys() {
107    return metricKeys;
108  }
109
110  public TimeMachineQuery setMetricKeys(List<String> metricKeys) {
111    this.metricKeys = metricKeys;
112    return this;
113  }
114
115  /**
116   * Sets the metrics to return
117   *
118   * @param metrics the list of metrics
119   * @return this
120   */
121  public TimeMachineQuery setMetrics(Metric... metrics) {
122    this.metrics = Arrays.asList(metrics);
123    this.metricKeys = Lists.newLinkedList();
124    for (Metric metric : this.metrics) {
125      this.metricKeys.add(metric.getKey());
126    }
127    return this;
128  }
129
130  /**
131   * Unsets the metrics
132   *
133   * @return this
134   */
135  public TimeMachineQuery unsetMetrics() {
136    this.metrics = null;
137    return this;
138  }
139
140  /**
141   * @return the from date of the query
142   */
143  public Date getFrom() {
144    return from;
145  }
146
147  /**
148   * Sets the from date to be used in the query
149   *
150   * @param from the from date
151   * @return this
152   */
153  public TimeMachineQuery setFrom(Date from) {
154    this.from = from;
155    return this;
156  }
157
158  /**
159   * @param b whether to use the latest analysis as a from date
160   * @return this
161   */
162  public TimeMachineQuery setFromCurrentAnalysis(boolean b) {
163    this.fromCurrentAnalysis = b;
164    return this;
165  }
166
167  /**
168   * @param b whether to use the latest analysis as a to date
169   * @return this
170   */
171  public TimeMachineQuery setToCurrentAnalysis(boolean b) {
172    this.toCurrentAnalysis = b;
173    return this;
174  }
175
176  /**
177   * @return whether the latest analysis is used as a from date
178   */
179  public boolean isFromCurrentAnalysis() {
180    return fromCurrentAnalysis;
181  }
182
183  /**
184   * @return whether the latest analysis is used as a to date
185   */
186  public boolean isToCurrentAnalysis() {
187    return toCurrentAnalysis;
188  }
189
190  /**
191   * @return the to date of the query
192   */
193  public Date getTo() {
194    return to;
195  }
196
197  /**
198   * Sets the to date to be used in the query
199   *
200   * @param to the to date
201   * @return this
202   */
203  public TimeMachineQuery setTo(Date to) {
204    this.to = to;
205    return this;
206  }
207
208  /**
209   * @return whether to return only the latest analysis
210   */
211  public boolean isOnlyLastAnalysis() {
212    return onlyLastAnalysis;
213  }
214
215  /**
216   *
217   * @param onlyLastAnalysis whether to only return the latest analysis
218   * @return this
219   */
220  public TimeMachineQuery setOnlyLastAnalysis(boolean onlyLastAnalysis) {
221    this.onlyLastAnalysis = onlyLastAnalysis;
222    return this;
223  }
224
225  @Override
226  public String toString() {
227    return new ToStringBuilder(this)
228        .append("resource", resource)
229        .append("metrics", metrics)
230        .append("from", from)
231        .append("to", to)
232        .toString();
233  }
234}