001 package com.khubla.pragmatach.plugin.json;
002
003 import java.io.ByteArrayInputStream;
004 import java.io.ByteArrayOutputStream;
005 import java.io.InputStream;
006 import java.io.OutputStream;
007 import java.lang.reflect.Field;
008
009 import org.apache.commons.beanutils.PropertyUtils;
010 import org.apache.commons.io.IOUtils;
011 import org.json.JSONObject;
012
013 import com.google.gson.Gson;
014 import com.khubla.pragmatach.framework.api.PragmatachException;
015 import com.khubla.pragmatach.framework.controller.PragmatachController;
016
017 /**
018 * @author tome
019 */
020 public class PragmaticControllerSerializer {
021 public static void deserialize(PragmatachController pragmatachController, InputStream inputStream) throws PragmatachException {
022 try {
023 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
024 IOUtils.copy(inputStream, baos);
025 deserialize(pragmatachController, baos.toString());
026 } catch (final Exception e) {
027 throw new PragmatachException("Exception in deserialize", e);
028 }
029 }
030
031 public static void deserialize(PragmatachController pragmatachController, String json) throws PragmatachException {
032 try {
033 final JSONObject jSONObject = new JSONObject(json);
034 final String[] names = JSONObject.getNames(jSONObject);
035 if (null != names) {
036 for (final String name : names) {
037 /*
038 * get the data we need
039 */
040 final Class<?> type = PropertyUtils.getPropertyType(pragmatachController, name);
041 if (null != type) {
042 final String value = jSONObject.getString(name);
043 final Object fieldValue = deserializeField(value, type);
044 /*
045 * set the field data
046 */
047 PropertyUtils.setProperty(pragmatachController, name, fieldValue);
048 }
049 }
050 }
051 } catch (final Exception e) {
052 throw new PragmatachException("Exception in deserialize", e);
053 }
054 }
055
056 private static Object deserializeField(String json, Class<?> type) throws PragmatachException {
057 try {
058 final Gson gson = new Gson();
059 return gson.fromJson(json, type);
060 } catch (final Exception e) {
061 throw new PragmatachException("Exception in deserializeField", e);
062 }
063 }
064
065 public static String serialize(PragmatachController pragmatachController) throws PragmatachException {
066 try {
067 final JSONObject jSONObject = new JSONObject();
068 for (final Field field : pragmatachController.getClass().getDeclaredFields()) {
069 final String fieldValue = serializeField(PropertyUtils.getProperty(pragmatachController, field.getName()));
070 jSONObject.put(field.getName(), fieldValue);
071 }
072 return jSONObject.toString();
073 } catch (final Exception e) {
074 throw new PragmatachException("Exception in serialize", e);
075 }
076 }
077
078 public static void serialize(PragmatachController pragmatachController, OutputStream outputStream) throws PragmatachException {
079 try {
080 final ByteArrayInputStream bais = new ByteArrayInputStream(serialize(pragmatachController).getBytes());
081 IOUtils.copy(bais, outputStream);
082 } catch (final Exception e) {
083 throw new PragmatachException("Exception in serialize", e);
084 }
085 }
086
087 private static String serializeField(Object object) throws PragmatachException {
088 try {
089 final Gson gson = new Gson();
090 return gson.toJson(object);
091 } catch (final Exception e) {
092 throw new PragmatachException("Exception in serializeField", e);
093 }
094 }
095 }