// Path: src/main/com/sailthru/client/SailthruUtil.java
// public class SailthruUtil {
// 
//     public static final String SAILTHRU_API_DATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z";
// 
//     /**
//      * generates MD5 Hash
//      * @param data parameter data
//      * @return MD5 hashed string 
//      */
//     public static String md5(String data) {
//         try {
//             return DigestUtils.md5Hex(data.toString().getBytes("UTF-8"));
//         }
//         catch (UnsupportedEncodingException e) {
//             return DigestUtils.md5Hex(data.toString());
//         }
//     }
// 
//     /**
//      * Converts String ArrayList to CSV string
//      * @param list List of String to create a CSV string
//      * @return CSV string
//      */
//     public static String arrayListToCSV(List<String> list) {
//         StringBuilder csv = new StringBuilder();
//         for (String str : list) {
//             csv.append(str);
//             csv.append(",");
//         }
//         int lastIndex = csv.length() - 1;
//         char last = csv.charAt(lastIndex);
//         if (last == ',') {
//             return csv.substring(0, lastIndex);
//         }
//         return csv.toString();
//     }
// 
//     public static Gson createGson() {
//         return new GsonBuilder().setDateFormat(SAILTHRU_API_DATE_FORMAT)
//                 .registerTypeHierarchyAdapter(Map.class, new NullSerializingMapTypeAdapter())
//                 .create();
//     }
// 
//     /**
//      * Add a new image entry to the images map.
//      *
//      * @param images map containing the references of images. Can be null, in that case the returned map will be a new instance with the entry
//      * @param key key for the map, either "full" or "thumb"
//      * @param url url for the image to use
//      * @return a new map instance of the images parameter was null otherwise the updated map.
//      */
//     public static Map<String, Map<String, String>> putImage(Map<String, Map<String, String>> images, String key, String url) {
//         if (images == null) {
//             images = new HashMap<String, Map<String, String>>();
//         }
//         Map<String, String> urlMap = new HashMap<String, String>();
//         urlMap.put("url", url);
//         images.put(key, urlMap);
//         return images;
//     }
// 
// }
// 
// Path: src/main/com/sailthru/client/handler/JsonHandler.java
// public class JsonHandler implements SailthruResponseHandler {
// 
//     public static final String format = "json";
// 
//     
//     public Object parseResponse(String response) {
//         GsonBuilder builder = new GsonBuilder();
//         builder.setDateFormat(SailthruUtil.SAILTHRU_API_DATE_FORMAT);
//         builder.registerTypeAdapter(Object.class, new NaturalDeserializer());
//         Gson gson = builder.create();
//         return gson.fromJson(response, Object.class);
//     }
// 
//     
//     public String getFormat() {
//         return format;
//     }
// 
//     // http://stackoverflow.com/questions/2779251/convert-json-to-hashmap-using-gson-in-java/4799594#4799594
//     //Will get rid of this at some point
//     class NaturalDeserializer implements JsonDeserializer<Object>  {
// 
//         public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
//             if (json.isJsonNull()) {
//                 return null;
//             }
//             else if (json.isJsonPrimitive()) {
//                 return handlePrimitive(json.getAsJsonPrimitive());
//             }
//             else if (json.isJsonArray()) {
//                 return handleArray(json.getAsJsonArray(), context);
//             }
//             else {
//                 return handleObject(json.getAsJsonObject(), context);
//             }
//         }
// 
//         private Object handlePrimitive(JsonPrimitive json) {
//             if (json.isString()) {
//                 return json.getAsString();
//             }
//             else if (json.isBoolean()) {
//                 return json.getAsBoolean();
//             }
//             else {
//                 BigDecimal bigDec = json.getAsBigDecimal();
//                 // Find out if it is an int type
//                 try {
//                     bigDec.toBigIntegerExact();
//                     try {
//                         return bigDec.intValueExact();
//                     }
//                     catch (ArithmeticException e) {}
//                     return bigDec.longValue();
//                 }
//                 catch (ArithmeticException e) {}
//                 return bigDec.doubleValue();
//             }
//         }
// 
//         private Object handleArray(JsonArray json, JsonDeserializationContext context) {            
//             Object[] array = new Object[json.size()];
//             for (int i = 0; i < array.length; i++) {
//                 if (json.get(i).isJsonObject()) {
//                     array[i] = handleObject((JsonObject)json.get(i), context);
//                 }
//                 else {
//                     array[i] = context.deserialize(json.get(i), Object.class);
//                 }                                
//             }
//             return array;
//         }
// 
//         private Object handleObject(JsonObject json, JsonDeserializationContext context) {
//             Map<String, Object> map = new HashMap<String, Object>();
//             for (Map.Entry<String, JsonElement> entry : json.entrySet()) {                
//                 map.put(entry.getKey(), context.deserialize(entry.getValue(), Object.class));
//             }
//             return map;
//         }
//     }
// }


import com.google.gson.Gson;
import com.sailthru.client.SailthruUtil;
import com.sailthru.client.handler.JsonHandler;
import java.util.HashMap;
import java.util.Map;
package com.sailthru.client.params;


/**
 *
 * @author Prajwal Tuladhar <praj@sailthru.com>
 */
public abstract class AbstractApiParams {
    public Map<String, Object> toHashMap() {
        Gson gson = SailthruUtil.createGson();
        String json = gson.toJson(this);
// Path: src/main/com/sailthru/client/SailthruUtil.java
// public class SailthruUtil {
// 
//     public static final String SAILTHRU_API_DATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z";
// 
//     /**
//      * generates MD5 Hash
//      * @param data parameter data
//      * @return MD5 hashed string 
//      */
//     public static String md5(String data) {
//         try {
//             return DigestUtils.md5Hex(data.toString().getBytes("UTF-8"));
//         }
//         catch (UnsupportedEncodingException e) {
//             return DigestUtils.md5Hex(data.toString());
//         }
//     }
// 
//     /**
//      * Converts String ArrayList to CSV string
//      * @param list List of String to create a CSV string
//      * @return CSV string
//      */
//     public static String arrayListToCSV(List<String> list) {
//         StringBuilder csv = new StringBuilder();
//         for (String str : list) {
//             csv.append(str);
//             csv.append(",");
//         }
//         int lastIndex = csv.length() - 1;
//         char last = csv.charAt(lastIndex);
//         if (last == ',') {
//             return csv.substring(0, lastIndex);
//         }
//         return csv.toString();
//     }
// 
//     public static Gson createGson() {
//         return new GsonBuilder().setDateFormat(SAILTHRU_API_DATE_FORMAT)
//                 .registerTypeHierarchyAdapter(Map.class, new NullSerializingMapTypeAdapter())
//                 .create();
//     }
// 
//     /**
//      * Add a new image entry to the images map.
//      *
//      * @param images map containing the references of images. Can be null, in that case the returned map will be a new instance with the entry
//      * @param key key for the map, either "full" or "thumb"
//      * @param url url for the image to use
//      * @return a new map instance of the images parameter was null otherwise the updated map.
//      */
//     public static Map<String, Map<String, String>> putImage(Map<String, Map<String, String>> images, String key, String url) {
//         if (images == null) {
//             images = new HashMap<String, Map<String, String>>();
//         }
//         Map<String, String> urlMap = new HashMap<String, String>();
//         urlMap.put("url", url);
//         images.put(key, urlMap);
//         return images;
//     }
// 
// }
// 
// Path: src/main/com/sailthru/client/handler/JsonHandler.java
// public class JsonHandler implements SailthruResponseHandler {
// 
//     public static final String format = "json";
// 
//     
//     public Object parseResponse(String response) {
//         GsonBuilder builder = new GsonBuilder();
//         builder.setDateFormat(SailthruUtil.SAILTHRU_API_DATE_FORMAT);
//         builder.registerTypeAdapter(Object.class, new NaturalDeserializer());
//         Gson gson = builder.create();
//         return gson.fromJson(response, Object.class);
//     }
// 
//     
//     public String getFormat() {
//         return format;
//     }
// 
//     // http://stackoverflow.com/questions/2779251/convert-json-to-hashmap-using-gson-in-java/4799594#4799594
//     //Will get rid of this at some point
//     class NaturalDeserializer implements JsonDeserializer<Object>  {
// 
//         public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
//             if (json.isJsonNull()) {
//                 return null;
//             }
//             else if (json.isJsonPrimitive()) {
//                 return handlePrimitive(json.getAsJsonPrimitive());
//             }
//             else if (json.isJsonArray()) {
//                 return handleArray(json.getAsJsonArray(), context);
//             }
//             else {
//                 return handleObject(json.getAsJsonObject(), context);
//             }
//         }
// 
//         private Object handlePrimitive(JsonPrimitive json) {
//             if (json.isString()) {
//                 return json.getAsString();
//             }
//             else if (json.isBoolean()) {
//                 return json.getAsBoolean();
//             }
//             else {
//                 BigDecimal bigDec = json.getAsBigDecimal();
//                 // Find out if it is an int type
//                 try {
//                     bigDec.toBigIntegerExact();
//                     try {
//                         return bigDec.intValueExact();
//                     }
//                     catch (ArithmeticException e) {}
//                     return bigDec.longValue();
//                 }
//                 catch (ArithmeticException e) {}
//                 return bigDec.doubleValue();
//             }
//         }
// 
//         private Object handleArray(JsonArray json, JsonDeserializationContext context) {            
//             Object[] array = new Object[json.size()];
//             for (int i = 0; i < array.length; i++) {
//                 if (json.get(i).isJsonObject()) {
//                     array[i] = handleObject((JsonObject)json.get(i), context);
//                 }
//                 else {
//                     array[i] = context.deserialize(json.get(i), Object.class);
//                 }                                
//             }
//             return array;
//         }
// 
//         private Object handleObject(JsonObject json, JsonDeserializationContext context) {
//             Map<String, Object> map = new HashMap<String, Object>();
//             for (Map.Entry<String, JsonElement> entry : json.entrySet()) {                
//                 map.put(entry.getKey(), context.deserialize(entry.getValue(), Object.class));
//             }
//             return map;
//         }
//     }
// }


// Path: src/main/com/sailthru/client/params/AbstractApiParams.java
import com.google.gson.Gson;
import com.sailthru.client.SailthruUtil;
import com.sailthru.client.handler.JsonHandler;
import java.util.HashMap;
import java.util.Map;

package com.sailthru.client.params;


/**
 *
 * @author Prajwal Tuladhar <praj@sailthru.com>
 */
public abstract class AbstractApiParams {
    public Map<String, Object> toHashMap() {
        Gson gson = SailthruUtil.createGson();
        String json = gson.toJson(this);
        JsonHandler handler = new JsonHandler();