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      }
059    
060      private void parseMeasures(JSONObject json, Resource resource) {
061        JSONValue measuresJson = json.get("msr");
062        if (measuresJson != null) {
063          resource.setMeasures(parseMeasures(measuresJson));
064        }
065      }
066    
067      private List<Measure> parseMeasures(JSONValue measuresJson) {
068        List<Measure> projectMeasures = new ArrayList<Measure>();
069        int len = JsonUtils.getArraySize(measuresJson);
070        for (int i = 0; i < len; i++) {
071          JSONObject measureJson = JsonUtils.getArray(measuresJson, i);
072          if (measureJson != null) {
073            Measure measure = parseMeasure(measureJson);
074            projectMeasures.add(measure);
075          }
076        }
077        return projectMeasures;
078      }
079    
080      private Measure parseMeasure(JSONObject json) {
081        Measure measure = new Measure();
082        measure
083            .setMetricKey(JsonUtils.getString(json, "key"))
084            .setMetricName(JsonUtils.getString(json, "name"))
085            .setValue(JsonUtils.getDouble(json, "val"))
086            .setFormattedValue(JsonUtils.getString(json, "frmt_val"))
087            .setData(JsonUtils.getString(json, "data"))
088            .setTrend(JsonUtils.getInteger(json, "trend"))
089            .setVar(JsonUtils.getInteger(json, "var"))
090            .setRuleKey(JsonUtils.getString(json, "rule_key"))
091            .setRuleName(JsonUtils.getString(json, "rule_name"))
092            .setRuleCategory(JsonUtils.getString(json, "rule_category"))
093            .setRulePriority(JsonUtils.getString(json, "rule_priority"));
094        return measure;
095      }
096    }