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 }