001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 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 */
020 package org.sonar.api.batch;
021
022 import com.google.common.collect.Lists;
023 import org.apache.commons.lang.builder.ToStringBuilder;
024 import org.sonar.api.measures.Metric;
025 import org.sonar.api.resources.Resource;
026
027 import java.util.Arrays;
028 import java.util.Date;
029 import 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 */
039 public 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 }