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.gwt.unmarshallers;
021    
022    import com.google.gwt.json.client.JSONObject;
023    import com.google.gwt.json.client.JSONValue;
024    import org.sonar.gwt.JsonUtils;
025    import org.sonar.wsclient.services.Measure;
026    import org.sonar.wsclient.services.Resource;
027    
028    import java.util.ArrayList;
029    import java.util.List;
030    
031    public class ResourceUnmarshaller extends AbstractUnmarshaller<Resource> {
032    
033      private static final ResourceUnmarshaller INSTANCE = new ResourceUnmarshaller();
034    
035      private ResourceUnmarshaller() {
036      }
037    
038      public static ResourceUnmarshaller getInstance() {
039        return INSTANCE;
040      }
041    
042      protected Resource parse(JSONObject json) {
043        Resource resource = new Resource();
044        parseResourceFields(json, resource);
045        parseMeasures(json, resource);
046        return resource;
047      }
048    
049      private void parseResourceFields(JSONObject json, Resource resource) {
050        resource.setId(JsonUtils.getInteger(json, "id"))
051            .setKey(JsonUtils.getString(json, "key"))
052            .setName(JsonUtils.getString(json, "name"))
053            .setLongName(JsonUtils.getString(json, "lname"))
054            .setScope(JsonUtils.getString(json, "scope"))
055            .setQualifier(JsonUtils.getString(json, "qualifier"))
056            .setLanguage(JsonUtils.getString(json, "lang"))
057            .setVersion(JsonUtils.getString(json, "version"))
058            .setCopy(JsonUtils.getInteger(json, "copy"));
059      }
060    
061      private void parseMeasures(JSONObject json, Resource resource) {
062        JSONValue measuresJson = json.get("msr");
063        if (measuresJson != null) {
064          resource.setMeasures(parseMeasures(measuresJson));
065        }
066      }
067    
068      private List<Measure> parseMeasures(JSONValue measuresJson) {
069        List<Measure> projectMeasures = new ArrayList<Measure>();
070        int len = JsonUtils.getArraySize(measuresJson);
071        for (int i = 0; i < len; i++) {
072          JSONObject measureJson = JsonUtils.getArray(measuresJson, i);
073          if (measureJson != null) {
074            Measure measure = parseMeasure(measureJson);
075            projectMeasures.add(measure);
076          }
077        }
078        return projectMeasures;
079      }
080    
081      private Measure parseMeasure(JSONObject json) {
082        Measure measure = new Measure();
083        measure
084            .setMetricKey(JsonUtils.getString(json, "key"))
085            .setMetricName(JsonUtils.getString(json, "name"))
086            .setValue(JsonUtils.getDouble(json, "val"))
087            .setFormattedValue(JsonUtils.getString(json, "frmt_val"))
088            .setData(JsonUtils.getString(json, "data"))
089            .setTrend(JsonUtils.getInteger(json, "trend"))
090            .setVar(JsonUtils.getInteger(json, "var"))
091            .setRuleKey(JsonUtils.getString(json, "rule_key"))
092            .setRuleName(JsonUtils.getString(json, "rule_name"))
093            .setRuleCategory(JsonUtils.getString(json, "rule_category"))
094            .setRulePriority(JsonUtils.getString(json, "rule_priority"));
095        return measure;
096      }
097    }