001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2009 SonarSource SA
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     */
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 final static 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[] ruleCategories;
035      private String[] rulePriorities;
036      private String[] characteristicKeys;
037      private String model;
038      private boolean excludeRules = true;
039      private boolean excludeRuleCategories = true;
040      private boolean excludeRulePriorities = true;
041      private Boolean includeTrends = null;
042      private Boolean verbose = Boolean.FALSE;
043    
044      public ResourceQuery() {
045      }
046    
047      public ResourceQuery(String resourceKeyOrId) {
048        this.resourceKeyOrId = resourceKeyOrId;
049      }
050    
051      public ResourceQuery(long resourceId) {
052        this.resourceKeyOrId = String.valueOf(resourceId);
053      }
054    
055      public Integer getDepth() {
056        return depth;
057      }
058    
059      public ResourceQuery setDepth(Integer depth) {
060        this.depth = depth;
061        return this;
062      }
063    
064      public ResourceQuery setAllDepths() {
065        return setDepth(DEPTH_UNLIMITED);
066      }
067    
068      public String getResourceKeyOrId() {
069        return resourceKeyOrId;
070      }
071    
072      public ResourceQuery setResourceKeyOrId(String resourceKeyOrId) {
073        this.resourceKeyOrId = resourceKeyOrId;
074        return this;
075      }
076    
077      public ResourceQuery setResourceId(int resourceId) {
078        this.resourceKeyOrId = Integer.toString(resourceId);
079        return this;
080      }
081    
082      public ResourceQuery setCharacteristicKeys(String model, String... keys) {
083        this.model=model;
084        this.characteristicKeys = keys;
085        return this;
086      }
087      
088    
089      public Integer getLimit() {
090        return limit;
091      }
092    
093      public ResourceQuery setLimit(Integer limit) {
094        this.limit = limit;
095        return this;
096      }
097    
098      public String[] getScopes() {
099        return scopes;
100      }
101    
102      public ResourceQuery setScopes(String... scopes) {
103        this.scopes = scopes;
104        return this;
105      }
106    
107      public String[] getQualifiers() {
108        return qualifiers;
109      }
110    
111      public ResourceQuery setQualifiers(String... qualifiers) {
112        this.qualifiers = qualifiers;
113        return this;
114      }
115    
116      public String[] getMetrics() {
117        return metrics;
118      }
119    
120      public ResourceQuery setMetrics(String... metrics) {
121        this.metrics = metrics;
122        return this;
123      }
124    
125      public String[] getRules() {
126        return rules;
127      }
128    
129      public ResourceQuery setRules(String... rules) {
130        this.rules = rules;
131        this.excludeRules = false;
132        return this;
133      }
134    
135      public String[] getRuleCategories() {
136        return ruleCategories;
137      }
138    
139      /**
140       * @param ruleCategories values: Maintainability, Usability, Reliability, Efficiency, Portability
141       */
142      public ResourceQuery setRuleCategories(String... ruleCategories) {
143        this.ruleCategories = ruleCategories;
144        this.excludeRuleCategories = false;
145        return this;
146      }
147    
148      public String[] getRulePriorities() {
149        return rulePriorities;
150      }
151    
152      /**
153       * @param rulePriorities values: BLOCKER, CRITICAL, MAJOR, MINOR, INFO
154       */
155      public ResourceQuery setRulePriorities(String... rulePriorities) {
156        this.rulePriorities = rulePriorities;
157        this.excludeRulePriorities = false;
158        return this;
159      }
160    
161      public boolean isExcludeRules() {
162        return excludeRules;
163      }
164    
165      public ResourceQuery setExcludeRules(boolean excludeRules) {
166        this.excludeRules = excludeRules;
167        return this;
168      }
169    
170      public boolean isExcludeRuleCategories() {
171        return excludeRuleCategories;
172      }
173    
174      public ResourceQuery setExcludeRuleCategories(boolean excludeRuleCategories) {
175        this.excludeRuleCategories = excludeRuleCategories;
176        return this;
177      }
178    
179      public boolean isExcludeRulePriorities() {
180        return excludeRulePriorities;
181      }
182    
183      public ResourceQuery setExcludeRulePriorities(boolean excludeRulePriorities) {
184        this.excludeRulePriorities = excludeRulePriorities;
185        return this;
186      }
187    
188      public Boolean isVerbose() {
189        return verbose;
190      }
191    
192      public ResourceQuery setVerbose(Boolean verbose) {
193        this.verbose = verbose;
194        return this;
195      }
196    
197      public Boolean isIncludeTrends() {
198        return includeTrends;
199      }
200    
201      public ResourceQuery setIncludeTrends(Boolean includeTrends) {
202        this.includeTrends = includeTrends;
203        return this;
204      }
205    
206      @Override
207      public String getUrl() {
208        StringBuilder url = new StringBuilder(BASE_URL);
209        url.append('?');
210        appendUrlParameter(url, "resource", resourceKeyOrId);
211        appendUrlParameter(url, "metrics", metrics);
212        appendUrlParameter(url, "scopes", scopes);
213        appendUrlParameter(url, "qualifiers", qualifiers);
214        appendUrlParameter(url, "depth", depth);
215        appendUrlParameter(url, "limit", limit);
216        appendRuleField(url, "rules", excludeRules, rules);
217        appendRuleField(url, "rule_categories", excludeRuleCategories, ruleCategories);
218        appendRuleField(url, "rule_priorities", excludeRulePriorities, rulePriorities);
219        appendUrlParameter(url, "includetrends", includeTrends);
220        appendUrlParameter(url, "model", model);
221        appendUrlParameter(url, "characteristics", characteristicKeys);
222        appendUrlParameter(url, "verbose", verbose);
223        return url.toString();
224      }
225    
226      private void appendRuleField(StringBuilder url, String field, boolean excludeField, String[] list) {
227        if (!excludeField) {
228          if (list == null || list.length == 0) {
229            appendUrlParameter(url, field, true);
230          } else {
231            appendUrlParameter(url, field, list);
232          }
233        }
234      }
235    
236      @Override
237      public final Class<Resource> getModelClass() {
238        return Resource.class;
239      }
240    
241      public static ResourceQuery createForMetrics(String resourceKeyOrId, String... metricKeys) {
242        return new ResourceQuery(resourceKeyOrId)
243            .setMetrics(metricKeys);
244      }
245    
246      public static ResourceQuery createForResource(Resource resource, String... metricKeys) {
247        return new ResourceQuery(resource.getId().toString())
248            .setMetrics(metricKeys);
249      }
250    }