001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2008-2011 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     */
020    package org.sonar.api.web.gwt.client.webservices;
021    
022    import com.google.gwt.core.client.JavaScriptObject;
023    import com.google.gwt.json.client.JSONArray;
024    import com.google.gwt.json.client.JSONObject;
025    import com.google.gwt.json.client.JSONValue;
026    import org.sonar.api.web.gwt.client.Utils;
027    
028    import java.util.ArrayList;
029    import java.util.Date;
030    import java.util.List;
031    
032    /**
033     * @deprecated since 2.5, use {@link org.sonar.wsclient.services.ResourceQuery} instead
034     */
035    @Deprecated
036    public final class ResourcesQuery extends AbstractResourceQuery<Resources> {
037    
038      public final static int DEPTH_UNLIMITED = -1;
039    
040      private Integer depth;
041      private Integer limit;
042      private String scopes;
043      private String qualifiers;
044      private String metrics;
045      private String rules;
046      private String rulePriorities;
047      private boolean verbose = false;
048    
049      /**
050       * Alias for build()
051       */
052      public static ResourcesQuery get(String resourceKey) {
053        return new ResourcesQuery(resourceKey);
054      }
055    
056      public static ResourcesQuery build(String resourceKey) {
057        return new ResourcesQuery(resourceKey);
058      }
059    
060      public static ResourcesQuery build() {
061        return new ResourcesQuery(null);
062      }
063    
064      private ResourcesQuery(String resourceKey) {
065        super(resourceKey);
066      }
067    
068      public ResourcesQuery setDepth(Integer depth) {
069        this.depth = depth;
070        return this;
071      }
072    
073      public ResourcesQuery setRules(String s) {
074        this.rules = s;
075        return this;
076      }
077    
078      public ResourcesQuery filterOnRules(boolean b) {
079        return setRules(b ? "true" : "false");
080      }
081    
082      public ResourcesQuery filterOnRulePriorities(boolean b) {
083        return setRulePriorities(b ? "true" : "false");
084      }
085    
086      /**
087       * @deprecated since 2.5 See http://jira.codehaus.org/browse/SONAR-2007
088       */
089      @Deprecated
090      public ResourcesQuery filterOnRuleCategories(boolean b) {
091        return this;
092      }
093    
094      public ResourcesQuery setRulePriorities(String s) {
095        this.rulePriorities = s;
096        return this;
097      }
098    
099      /**
100       * @deprecated since 2.5 See http://jira.codehaus.org/browse/SONAR-2007
101       */
102      @Deprecated
103      public ResourcesQuery setRuleCategories(String s) {
104        return this;
105      }
106    
107      public ResourcesQuery setLimit(Integer limit) {
108        this.limit = limit;
109        return this;
110      }
111    
112      public ResourcesQuery setScopes(String scopes) {
113        this.scopes = scopes;
114        return this;
115      }
116    
117      public ResourcesQuery setVerbose(boolean verbose) {
118        this.verbose = verbose;
119        return this;
120      }
121    
122      public ResourcesQuery setQualifiers(String qualifiers) {
123        this.qualifiers = qualifiers;
124        return this;
125      }
126    
127      public ResourcesQuery setMetrics(List<WSMetrics.Metric> metrics) {
128        this.metrics = getMetricsWSRequest(metrics);
129        return this;
130      }
131    
132      public ResourcesQuery setMetric(WSMetrics.Metric m) {
133        this.metrics = m.getKey();
134        return this;
135      }
136    
137      public ResourcesQuery setMetric(String metricKey) {
138        this.metrics = metricKey;
139        return this;
140      }
141    
142      private String getMetricsWSRequest(List<WSMetrics.Metric> metrics) {
143        StringBuilder metricsDelimByComma = new StringBuilder(64);
144        for (WSMetrics.Metric metric : metrics) {
145          metricsDelimByComma.append(metric.getKey()).append(",");
146        }
147        return metricsDelimByComma.substring(0, metricsDelimByComma.length() - 1);
148      }
149    
150      @Override
151      public String toString() {
152        String url = Utils.getServerApiUrl() + "/resources?";
153        if (getResourceKey() != null) {
154          url += "resource=" + getResourceKey() + "&";
155        }
156        if (metrics != null) {
157          url += "metrics=" + metrics + "&";
158        }
159        if (scopes != null) {
160          url += "scopes=" + scopes + "&";
161        }
162        if (qualifiers != null) {
163          url += "qualifiers=" + qualifiers + "&";
164        }
165        if (depth != null) {
166          url += "depth=" + depth + "&";
167        }
168        if (limit != null) {
169          url += "limit=" + limit + "&";
170        }
171        if (rules != null) {
172          url += "rules=" + rules + "&";
173        }
174        if (rulePriorities != null) {
175          url += "rule_priorities=" + rulePriorities + "&";
176        }
177        if (verbose) {
178          url += "verbose=true&";
179        }
180        return url;
181      }
182    
183      @Override
184      public void execute(QueryCallBack<Resources> callback) {
185        JsonUtils.requestJson(this.toString(), new JSONHandlerDispatcher<Resources>(callback) {
186          @Override
187          public Resources parseResponse(JavaScriptObject obj) {
188            return new Resources(parseResources(obj));
189          }
190        });
191      }
192    
193      public static List<Resource> parseResources(JavaScriptObject json) {
194        JSONArray array = new JSONArray(json);
195        List<Resource> resources = new ArrayList<Resource>();
196        for (int i = 0; i < array.size(); i++) {
197          JSONObject jsStock = array.get(i).isObject();
198          if (jsStock != null) {
199            resources.add(parseResource(jsStock));
200          }
201        }
202        return resources;
203      }
204    
205      private static Resource parseResource(JSONObject json) {
206        Double id = JsonUtils.getDouble(json, "id");
207        String key = JsonUtils.getString(json, "key");
208        String name = JsonUtils.getString(json, "name");
209        String longName = JsonUtils.getString(json, "lname");
210        String qualifier = JsonUtils.getString(json, "qualifier");
211        String language = JsonUtils.getString(json, "lang");
212        String scope = JsonUtils.getString(json, "scope");
213        Integer copy = JsonUtils.getInteger(json, "copy");
214        Date date = JsonUtils.getDate(json, "date");
215    
216        List<Measure> measures = null;
217        JSONValue measuresJson;
218        if ((measuresJson = json.get("msr")) != null) {
219          measures = parseMeasures(measuresJson, date);
220        }
221    
222        final Resource resource = new Resource(id.intValue(), key, name, scope, qualifier, language, copy, measures);
223        resource.setLongName(longName);
224        return resource;
225      }
226    
227      private static List<Measure> parseMeasures(JSONValue measures, Date date) {
228        List<Measure> projectMeasures = new ArrayList<Measure>();
229        int len = JsonUtils.getArraySize(measures);
230        for (int i = 0; i < len; i++) {
231          JSONObject measure = JsonUtils.getArray(measures, i);
232          if (measure != null) {
233            Measure measureEntry = parseMeasure(measure, date);
234            if (measureEntry != null) {
235              projectMeasures.add(measureEntry);
236            }
237          }
238        }
239        return projectMeasures;
240      }
241    
242      private static Measure parseMeasure(JSONObject measure, Date date) {
243        String metric = JsonUtils.getString(measure, "key");
244        if (metric == null) {
245          return null;
246        }
247    
248        final Measure m = new Measure(metric, JsonUtils.getDouble(measure, "val"), JsonUtils.getString(measure, "frmt_val"));
249        m.setData(JsonUtils.getString(measure, "data"));
250        String metricName = JsonUtils.getString(measure, "name");
251        if (metricName != null) {
252          m.setMetricName(metricName);
253        }
254    
255        m.setRuleKey(JsonUtils.getString(measure, "rule_key"));
256        m.setRuleName(JsonUtils.getString(measure, "rule_name"));
257        m.setRulePriority(JsonUtils.getString(measure, "rule_priority"));
258        m.setDate(date);
259        return m;
260      }
261    
262    }