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