001/*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar 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 * Sonar 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
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02
019 */
020package org.sonar.wsclient.services;
021
022public class ResourceQuery extends Query<Resource> {
023  public static final String BASE_URL = "/api/resources";
024
025  public static final int DEPTH_UNLIMITED = -1;
026
027  private Integer depth;
028  private String resourceKeyOrId;
029  private Integer limit;
030  private String[] scopes;
031  private String[] qualifiers;
032  private String[] metrics;
033  private String[] rules;
034  private String[] ruleSeverities;
035  private String[] characteristicKeys;
036  private String model;
037  private boolean excludeRules = true;
038  private boolean excludeRuleSeverities = true;
039  private Boolean includeTrends = null;
040  private Boolean verbose = Boolean.FALSE;
041
042  public ResourceQuery() {
043  }
044
045  public ResourceQuery(String resourceKeyOrId) {
046    this.resourceKeyOrId = resourceKeyOrId;
047  }
048
049  public ResourceQuery(long resourceId) {
050    this.resourceKeyOrId = String.valueOf(resourceId);
051  }
052
053  public Integer getDepth() {
054    return depth;
055  }
056
057  public ResourceQuery setDepth(Integer depth) {
058    this.depth = depth;
059    return this;
060  }
061
062  public ResourceQuery setAllDepths() {
063    return setDepth(DEPTH_UNLIMITED);
064  }
065
066  public String getResourceKeyOrId() {
067    return resourceKeyOrId;
068  }
069
070  public ResourceQuery setResourceKeyOrId(String resourceKeyOrId) {
071    this.resourceKeyOrId = resourceKeyOrId;
072    return this;
073  }
074
075  public ResourceQuery setResourceId(int resourceId) {
076    this.resourceKeyOrId = Integer.toString(resourceId);
077    return this;
078  }
079
080  public ResourceQuery setCharacteristicKeys(String model, String... keys) {
081    this.model = model;
082    this.characteristicKeys = keys;
083    return this;
084  }
085
086  public Integer getLimit() {
087    return limit;
088  }
089
090  public ResourceQuery setLimit(Integer limit) {
091    this.limit = limit;
092    return this;
093  }
094
095  public String[] getScopes() {
096    return scopes;
097  }
098
099  public ResourceQuery setScopes(String... scopes) {
100    this.scopes = scopes;
101    return this;
102  }
103
104  public String[] getQualifiers() {
105    return qualifiers;
106  }
107
108  public ResourceQuery setQualifiers(String... qualifiers) {
109    this.qualifiers = qualifiers;
110    return this;
111  }
112
113  public String[] getMetrics() {
114    return metrics;
115  }
116
117  public ResourceQuery setMetrics(String... metrics) {
118    this.metrics = metrics;
119    return this;
120  }
121
122  public String[] getRules() {
123    return rules;
124  }
125
126  public ResourceQuery setRules(String... rules) {
127    this.rules = rules;
128    this.excludeRules = false;
129    return this;
130  }
131
132  /**
133   * @deprecated since 2.5 See http://jira.codehaus.org/browse/SONAR-2007
134   */
135  @Deprecated
136  public String[] getRuleCategories() {
137    return null;
138  }
139
140  /**
141   * @param ruleCategories values: Maintainability, Usability, Reliability, Efficiency, Portability
142   * @deprecated since 2.5 See http://jira.codehaus.org/browse/SONAR-2007
143   */
144  @Deprecated
145  public ResourceQuery setRuleCategories(String... ruleCategories) {
146    return this;
147  }
148
149  /**
150   * @since 2.5
151   */
152  public String[] getRuleSeverities() {
153    return ruleSeverities;
154  }
155
156  /**
157   * @since 2.5
158   * @param ruleSeverities values: BLOCKER, CRITICAL, MAJOR, MINOR, INFO
159   */
160  public ResourceQuery setRuleSeverities(String... ruleSeverities) {
161    this.ruleSeverities = ruleSeverities;
162    this.excludeRuleSeverities = false;
163    return this;
164  }
165
166  /**
167   * @deprecated since 2.5 use {@link #getRuleSeverities()} instead. See http://jira.codehaus.org/browse/SONAR-1829
168   */
169  @Deprecated
170  public String[] getRulePriorities() {
171    return ruleSeverities;
172  }
173
174  /**
175   * @deprecated since 2.5 use {@link #setRuleSeverities(String...)} instead. See http://jira.codehaus.org/browse/SONAR-1829
176   */
177  @Deprecated
178  public ResourceQuery setRulePriorities(String... rulePriorities) {
179    return setRuleSeverities(rulePriorities);
180  }
181
182  public boolean isExcludeRules() {
183    return excludeRules;
184  }
185
186  public ResourceQuery setExcludeRules(boolean excludeRules) {
187    this.excludeRules = excludeRules;
188    return this;
189  }
190
191  /**
192   * @deprecated since 2.5 not used anymore
193   */
194  @Deprecated
195  public boolean isExcludeRuleCategories() {
196    return false;
197  }
198
199  /**
200   * @deprecated since 2.5 not used anymore
201   */
202  @Deprecated
203  public ResourceQuery setExcludeRuleCategories(boolean b) {
204    return this;
205  }
206
207  /**
208   * @since 2.5
209   */
210  public boolean isExcludeRuleSeverities() {
211    return excludeRuleSeverities;
212  }
213
214  public ResourceQuery setExcludeRuleSeverities(boolean excludeRuleSeverities) {
215    this.excludeRuleSeverities = excludeRuleSeverities;
216    return this;
217  }
218
219  /**
220   * @deprecated since 2.5 use {@link #isExcludeRuleSeverities()} instead. See http://jira.codehaus.org/browse/SONAR-1829
221   */
222  @Deprecated
223  public boolean isExcludeRulePriorities() {
224    return excludeRuleSeverities;
225  }
226
227  /**
228   * @deprecated since 2.5 use {@link #setExcludeRuleSeverities(boolean)} instead. See http://jira.codehaus.org/browse/SONAR-1829
229   */
230  @Deprecated
231  public ResourceQuery setExcludeRulePriorities(boolean b) {
232    this.excludeRuleSeverities = b;
233    return this;
234  }
235
236  public Boolean isVerbose() {
237    return verbose;
238  }
239
240  public ResourceQuery setVerbose(Boolean verbose) {
241    this.verbose = verbose;
242    return this;
243  }
244
245  public Boolean isIncludeTrends() {
246    return includeTrends;
247  }
248
249  public ResourceQuery setIncludeTrends(Boolean includeTrends) {
250    this.includeTrends = includeTrends;
251    return this;
252  }
253
254  @Override
255  public String getUrl() {
256    StringBuilder url = new StringBuilder(BASE_URL);
257    url.append('?');
258    appendUrlParameter(url, "resource", resourceKeyOrId);
259    appendUrlParameter(url, "metrics", metrics);
260    appendUrlParameter(url, "scopes", scopes);
261    appendUrlParameter(url, "qualifiers", qualifiers);
262    appendUrlParameter(url, "depth", depth);
263    appendUrlParameter(url, "limit", limit);
264    appendRuleField(url, "rules", excludeRules, rules);
265    appendRuleField(url, "rule_priorities", excludeRuleSeverities, ruleSeverities);
266    appendUrlParameter(url, "includetrends", includeTrends);
267    appendUrlParameter(url, "model", model);
268    appendUrlParameter(url, "characteristics", characteristicKeys);
269    appendUrlParameter(url, "verbose", verbose);
270    return url.toString();
271  }
272
273  private void appendRuleField(StringBuilder url, String field, boolean excludeField, String[] list) {
274    if (!excludeField) {
275      if (list == null || list.length == 0) {
276        appendUrlParameter(url, field, true);
277      } else {
278        appendUrlParameter(url, field, list);
279      }
280    }
281  }
282
283  @Override
284  public final Class<Resource> getModelClass() {
285    return Resource.class;
286  }
287
288  public static ResourceQuery createForMetrics(String resourceKeyOrId, String... metricKeys) {
289    return new ResourceQuery(resourceKeyOrId)
290        .setMetrics(metricKeys);
291  }
292
293  public static ResourceQuery createForResource(Resource resource, String... metricKeys) {
294    return new ResourceQuery(resource.getId().toString())
295        .setMetrics(metricKeys);
296  }
297
298  /**
299   * @since 2.10
300   */
301  public static ResourceQuery create(String resourceKey) {
302    return new ResourceQuery(resourceKey);
303  }
304}