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.wsclient.services;
021    
022    public class ResourceQuery extends Query<Resource> {
023    
024      public static final String BASE_URL = "/api/resources";
025    
026      public static final int DEPTH_UNLIMITED = -1;
027    
028      private Integer depth;
029      private String resourceKeyOrId;
030      private Integer limit;
031      private String[] scopes;
032      private String[] qualifiers;
033      private String[] metrics;
034      private String[] rules;
035      private String[] ruleSeverities;
036      private String[] characteristicKeys;
037      private boolean excludeRules = true;
038      private boolean excludeRuleSeverities = true;
039      private Boolean includeTrends = null;
040      private Boolean includeAlerts = 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 setCharacteristics(String... keys) {
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      public Boolean isIncludeAlerts() {
255        return includeAlerts;
256      }
257    
258      public ResourceQuery setIncludeAlerts(Boolean includeAlerts) {
259        this.includeAlerts = includeAlerts;
260        return this;
261      }
262    
263      @Override
264      public String getUrl() {
265        StringBuilder url = new StringBuilder(BASE_URL);
266        url.append('?');
267        appendUrlParameter(url, "resource", resourceKeyOrId);
268        appendUrlParameter(url, "metrics", metrics);
269        appendUrlParameter(url, "scopes", scopes);
270        appendUrlParameter(url, "qualifiers", qualifiers);
271        appendUrlParameter(url, "depth", depth);
272        appendUrlParameter(url, "limit", limit);
273        appendRuleField(url, "rules", excludeRules, rules);
274        appendRuleField(url, "rule_priorities", excludeRuleSeverities, ruleSeverities);
275        appendUrlParameter(url, "includetrends", includeTrends);
276        appendUrlParameter(url, "characteristics", characteristicKeys);
277        appendUrlParameter(url, "includealerts", includeAlerts);
278        appendUrlParameter(url, "verbose", verbose);
279        return url.toString();
280      }
281    
282      private void appendRuleField(StringBuilder url, String field, boolean excludeField, String[] list) {
283        if (!excludeField) {
284          if (list == null || list.length == 0) {
285            appendUrlParameter(url, field, true);
286          } else {
287            appendUrlParameter(url, field, list);
288          }
289        }
290      }
291    
292      @Override
293      public final Class<Resource> getModelClass() {
294        return Resource.class;
295      }
296    
297      public static ResourceQuery createForMetrics(String resourceKeyOrId, String... metricKeys) {
298        return new ResourceQuery(resourceKeyOrId)
299            .setMetrics(metricKeys);
300      }
301    
302      public static ResourceQuery createForResource(Resource resource, String... metricKeys) {
303        Integer id = resource.getId();
304        if (id == null) {
305          throw new IllegalArgumentException("id must be set");
306        }
307        return new ResourceQuery(id.toString())
308            .setMetrics(metricKeys);
309      }
310    
311      /**
312       * @since 2.10
313       */
314      public static ResourceQuery create(String resourceKey) {
315        return new ResourceQuery(resourceKey);
316      }
317    }