//@include lib_Class.js

/**
 * Helper functions for JSON processing
 *
 * @author Michael Weiler, ELO Digital Office GmbH
 * @version 1.0
 *
 * @eloall
 * @requires sol
 */
sol.define("sol.common.JsonUtils", {

  singleton: true,

  /**
   * Stringify JavaScript objects and handles Java objects
   * @param {Object} obj Object to stringify
   * @param {Object} objFormat Object formatting stringify e.g. objFormat = {tabStop: 2}
   * @return {String} string value of object
   */
  stringifyAll: function (obj, objFormat) {
    var tabStop = null;
    if (objFormat) {
      if (objFormat.tabStop) {
        tabStop = objFormat.tabStop;
      }
    }
    return JSON.stringify(obj, function (key, value) {
      if (typeof value === "boolean") {
        return value;
      }
      if (value instanceof java.lang.String) {
        return String(value);
      }
      if (value && value.getClass) {
        return String(value.toString());
      }
      return value;
    }, tabStop);
  },

  stringifyQuick: function (obj) {
    return JSON.stringify(obj, function (_, val) {
      return (val && val.getClass) ? String(val) : val;
    });
  },

  /**
   * Serializes a Java object
   * @param {java.lang.Object} javaObject Java object
   * @return {String}
   */
  serialize: function (javaObject) {
    var gsonBuilder, gson,
        json = "";

    if (!javaObject) {
      return "";
    }
    gsonBuilder = new Packages.com.google.gson.GsonBuilder();
    gsonBuilder.disableHtmlEscaping();
    gsonBuilder.setPrettyPrinting();
    gson = gsonBuilder.create();
    json = gson.toJson(javaObject) + "";

    return json;
  },

  /**
   * Deserializes a Java object
   * @param {String} json JSON
   * @param {String} className Class name
   * @return {java.lang.Object} javaObject Java object
   */
  deserialize: function (json, className) {
    var javaObject, gsonBuilder, gson, clazz;

    if (!json) {
      return;
    }

    if (!className) {
      throw "Java class name is empty";
    }

    clazz = java.lang.Class.forName(className);

    gsonBuilder = new Packages.com.google.gson.GsonBuilder();
    gsonBuilder.disableHtmlEscaping();
    gsonBuilder.setPrettyPrinting();
    gson = gsonBuilder.create();
    javaObject = gson.fromJson(json, clazz);

    return javaObject;
  }
});