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