com.dawg6.web.dhcalc.client.JsonUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.dawg6.web.dhcalc.client.JsonUtil.java

Source

/*******************************************************************************
 * Copyright (c) 2014, 2015 Scott Clarke (scott@dawg6.com).
 *
 * This file is part of Dawg6's Demon Hunter DPS Calculator.
 *
 * Dawg6's Demon Hunter DPS Calculator is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Dawg6's Demon Hunter DPS Calculator is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *******************************************************************************/
package com.dawg6.web.dhcalc.client;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;

import com.dawg6.d3api.shared.CareerProfile;
import com.dawg6.d3api.shared.Hero;
import com.dawg6.d3api.shared.HeroProfile;
import com.dawg6.gwt.client.ApplicationPanel;
import com.dawg6.web.dhcalc.shared.calculator.FormData;
import com.dawg6.web.dhcalc.shared.calculator.GemAttributeData;
import com.dawg6.web.dhcalc.shared.calculator.GemSkill;
import com.dawg6.web.dhcalc.shared.calculator.ItemHolder;
import com.dawg6.web.dhcalc.shared.calculator.Slot;
import com.dawg6.web.dhcalc.shared.calculator.Util;
import com.dawg6.web.dhcalc.shared.calculator.Version;
import com.google.gwt.core.shared.GWT;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONBoolean;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;

public class JsonUtil {

    public static JSONObject toJSONObject(FormData data) {

        if (data == null)
            return null;

        JSONObject obj = new JSONObject();

        obj.put("version", JsonUtil.toJSONObject(data.version));
        obj.put("main", JsonUtil.toJSONObject(data.main));
        obj.put("calculator", JsonUtil.toJSONObject(data.calculator));
        obj.put("passives", JsonUtil.toJSONObject(data.passives));
        obj.put("gems", JsonUtil.toJSONObject(data.gems));
        obj.put("equipment", JsonUtil.toJSONObject(data.specialItems));
        obj.put("skills", JsonUtil.toJSONObject(data.skills));
        obj.put("elementalDamage", JsonUtil.toJSONObject(data.elementalDamage));
        obj.put("skillDamage", JsonUtil.toJSONObject(data.skillDamage));
        obj.put("items", JsonUtil.toJSONObject(data.items));
        obj.put("hero", JsonUtil.toJSONObject(data.hero));
        obj.put("career", JsonUtil.toJSONObject(data.career));

        return obj;
    }

    public static JSONArray toJSONObject(Hero[] heros) {

        JSONArray obj = new JSONArray();

        int i = 0;

        for (Hero h : heros)
            obj.set(i++, toJSONObject(h));

        return obj;

    }

    public static JSONObject toJSONObject(Hero hero) {

        JSONObject obj = new JSONObject();

        obj.put("name", new JSONString(hero.name));
        obj.put("id", new JSONNumber(hero.id));
        obj.put("level", new JSONNumber(hero.level));
        obj.put("paragonLevel", new JSONNumber(hero.paragonLevel));
        obj.put("lastUpdated", new JSONNumber(hero.lastUpdated));
        obj.put("hardcore", JSONBoolean.getInstance(hero.hardcore));
        obj.put("seasonal", JSONBoolean.getInstance(hero.seasonal));
        obj.put("dead", JSONBoolean.getInstance(hero.dead));
        obj.put("clazz", new JSONString(hero.clazz));

        return obj;

    }

    public static Hero toHero(JSONObject obj) {

        Hero hero = new Hero();

        hero.name = obj.get("name").isString().stringValue();
        hero.id = (int) obj.get("id").isNumber().doubleValue();
        hero.level = (int) obj.get("level").isNumber().doubleValue();
        hero.paragonLevel = (int) obj.get("paragonLevel").isNumber().doubleValue();
        hero.lastUpdated = (long) obj.get("lastUpdated").isNumber().doubleValue();
        hero.hardcore = obj.get("hardcore").isBoolean().booleanValue();
        hero.seasonal = obj.get("seasonal").isBoolean().booleanValue();
        hero.dead = obj.get("dead").isBoolean().booleanValue();
        hero.clazz = obj.get("clazz").isString().stringValue();

        return hero;

    }

    public static FormData parseFormData(String text) {
        FormData data = new FormData();

        if ((text != null) && (text.trim().length() > 0)) {

            try {
                JSONValue value = JSONParser.parseLenient(text);

                if (value != null) {
                    JSONObject obj = value.isObject();

                    if (obj != null) {
                        data.version = JsonUtil.parseVersion(obj.get("version"));
                        data.main = JsonUtil.parseMap(obj.get("main"));
                        data.calculator = JsonUtil.parseMap(obj.get("calculator"));
                        data.items = JsonUtil.parseMap(obj.get("items"));
                        data.passives = JsonUtil.parseMap(obj.get("passives"));
                        data.gems = JsonUtil.parseMap(obj.get("gems"));
                        data.specialItems = JsonUtil.parseMap(obj.get("equipment"));
                        data.skills = JsonUtil.parseMap(obj.get("skills"));
                        data.elementalDamage = JsonUtil.parseMap(obj.get("elementalDamage"));
                        data.skillDamage = JsonUtil.parseMap(obj.get("skillDamage"));
                        data.hero = null;
                        data.career = null;
                    }
                }
            } catch (Exception e) {
                ApplicationPanel.showErrorDialog("Error Parsing Form Data");
                GWT.log("Error Parsing JSON Data", e);
            }

        }

        return data;
    }

    public static <K extends Enum<K>, V extends Enum<V>> Map<String, String> createEnumStringMap(Map<K, V> map) {
        Map<String, String> smap = new TreeMap<String, String>();

        for (Map.Entry<K, V> e : map.entrySet()) {
            smap.put(e.getKey().name(), e.getValue().name());
        }

        return smap;
    }

    public static <K, V> Map<String, String> createStringMap(Map<K, V> map) {
        Map<String, String> smap = new TreeMap<String, String>();

        for (Map.Entry<K, V> e : map.entrySet()) {
            smap.put(e.getKey().toString(), e.getValue().toString());
        }

        return smap;
    }

    public static Map<String, String> parseMap(JSONValue jsonValue) {
        JSONObject obj = jsonValue.isObject();
        Map<String, String> map = new TreeMap<String, String>();

        if (obj != null) {

            for (String key : obj.keySet()) {
                JSONValue value = obj.get(key);

                if (value != null) {
                    JSONString str = value.isString();

                    if (str != null) {
                        map.put(key, str.stringValue());
                    }
                }
            }
        }

        return map;
    }

    public static Version parseVersion(JSONValue jsonValue) {
        JSONObject obj = jsonValue.isObject();

        Version version = new Version();

        if (obj != null) {
            JSONValue value = obj.get("version");

            if (value != null) {
                JSONString str = value.isString();

                if (str != null) {
                    version.version = str.stringValue();
                }
            }

        }

        return version;
    }

    public static JSONValue toJSONObject(CareerProfile career) {
        return null;
    }

    public static JSONValue toJSONObject(HeroProfile hero) {
        return null;
    }

    public static JSONObject toJSONObject(Map<String, String> map) {
        if (map == null)
            return null;

        JSONObject obj = new JSONObject();

        for (Map.Entry<String, String> e : map.entrySet()) {
            String key = e.getKey();
            String value = e.getValue();

            obj.put(key, new JSONString(value));
        }

        return obj;
    }

    public static <T extends Enum<T>> Set<T> parseSet(Class<T> clazz, String text) {
        if ((text == null) || (text.trim().length() == 0))
            return null;

        Set<T> set = new TreeSet<T>();

        JSONValue value = JSONParser.parseLenient(text);

        JSONArray array = value.isArray();

        if (array == null)
            return null;

        for (int i = 0; i < array.size(); i++) {
            JSONValue e = array.get(i);

            if (e != null) {
                JSONString str = e.isString();

                if (str != null) {
                    String name = str.stringValue();

                    if (name != null) {
                        T elem = Enum.valueOf(clazz, name);

                        if (elem != null) {
                            set.add(elem);
                        }
                    }
                }
            }
        }

        return set;
    }

    public static <T extends Enum<T>> JSONArray toJSONObject(Set<T> set) {
        if (set == null)
            return null;

        JSONArray obj = new JSONArray();

        int i = 0;

        for (T t : set) {
            obj.set(i++, new JSONString(t.name()));
        }

        return obj;
    }

    public static JSONObject toJSONObject(Version version) {

        if (version == null)
            return null;

        JSONObject obj = new JSONObject();

        obj.put("version", new JSONString(version.version));

        return obj;
    }

    public static native String formatJsonText(String text)
    /*-{
       var object = JSON.parse(text);
       return JSON.stringify(object, null, 4);
    }-*/;

    public static <T extends Enum<T>> Map<T, Double> parseMap(Class<T> clazz, String text) {

        if (text == null) {
            return new TreeMap<T, Double>();
        } else {

            JSONValue v = JSONParser.parseLenient(text);
            Map<String, String> smap = JsonUtil.parseMap(v);

            Map<T, Double> map = new TreeMap<T, Double>();

            for (Map.Entry<String, String> e : smap.entrySet()) {
                T type = Enum.valueOf(clazz, e.getKey());
                Double d = Double.parseDouble(e.getValue());

                map.put(type, d);
            }

            return map;
        }
    }

    public static <K extends Enum<K>, V extends Enum<V>> Map<K, V> parseMap(Class<K> keyClass, Class<V> valueClass,
            String text) {
        if (text == null) {
            return new TreeMap<K, V>();
        } else {

            JSONValue v = JSONParser.parseLenient(text);
            Map<String, String> smap = JsonUtil.parseMap(v);

            Map<K, V> map = new TreeMap<K, V>();

            for (Map.Entry<String, String> e : smap.entrySet()) {
                K key = Enum.valueOf(keyClass, e.getKey());
                V value = Enum.valueOf(valueClass, e.getValue());

                map.put(key, value);
            }

            return map;
        }
    }

    public static Object gemsToJSONObject(Map<GemSkill, GemAttributeData> gems) {
        return toJSONObject(Util.createGemsMap(gems));
    }

    public static Object specialItemsToJSONObject(Map<Slot, ItemHolder> items, Map<String, Integer> setCounts) {
        return toJSONObject(Util.createSpecialItemsMap(items, setCounts));
    }

    public static Map<GemSkill, GemAttributeData> parseGemsMap(String text) {
        if (text == null) {
            return new TreeMap<GemSkill, GemAttributeData>();
        } else {

            JSONValue v = JSONParser.parseLenient(text);
            Map<String, String> smap = JsonUtil.parseMap(v);

            return Util.createGems(smap);
        }
    }

    public static Map<Slot, ItemHolder> parseSpecialItemsMap(String text) {
        if (text == null) {
            return new TreeMap<Slot, ItemHolder>();
        } else {

            JSONValue v = JSONParser.parseLenient(text);
            Map<String, String> smap = JsonUtil.parseMap(v);

            return Util.createSpecialItems(smap);
        }
    }

    public static Map<String, Integer> parseSetCounts(String text) {
        if (text == null) {
            return new TreeMap<String, Integer>();
        } else {

            JSONValue v = JSONParser.parseLenient(text);
            Map<String, String> smap = JsonUtil.parseMap(v);

            return Util.createSetCounts(smap);
        }
    }

    public static Hero[] parseHeroList(String text) {

        if (text == null) {
            return new Hero[0];
        } else {

            try {
                JSONValue value = JSONParser.parseLenient(text);
                JSONArray array = value.isArray();

                if (array == null)
                    return null;

                List<Hero> list = new Vector<Hero>(array.size());

                for (int i = 0; i < array.size(); i++) {
                    JSONValue e = array.get(i);

                    if (e != null) {
                        JSONObject obj = e.isObject();

                        if (obj != null) {
                            Hero h = JsonUtil.toHero(obj);
                            list.add(h);
                        }
                    }
                }

                return list.toArray(new Hero[0]);
            } catch (Exception e) {
                return new Hero[0];
            }
        }
    }
}