package de.swm.gwt.client.testhelper; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONException; import com.google.gwt.json.client.JSONObject; import com.thoughtworks.xstream.XStream; import name.pehl.piriti.commons.client.ModelReadHandler; import name.pehl.piriti.commons.client.ModelWriteHandler; import name.pehl.piriti.json.client.JsonReader; import name.pehl.piriti.json.client.JsonWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.List; /** * Hilfsklasse um Json serialisierung / deserialisierung zu simulieren. * * @author wiese.daniel * <br> * copyright (C) 2012, Stadtwerke München GmbH */ public class SwmJsonWriterReader<T> implements JsonReader<T>, JsonWriter<T> { private final XStream xstream = new XStream(); private Class<?>[] ift; /** * Erzeugt einen JSON Writer fuer das Testen. * * @param forClass der zu testende JsonWriter * @param <T> der type des DTO'S * @return der writer */ public static <T extends JsonWriter> T createWriter(Class<T> forClass) { final SwmJsonWriterReader<Object> instance = new SwmJsonWriterReader<Object>(); InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("toJson")) { return instance.toJson(args[0]); } return null; } }; Class<?>[] ift = { forClass }; T result = (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), ift, handler); return result; } /** * Erzeugt einen JSON reader fuer das Testen. * * @param forClass der zu testende JsonReader * @param <T> der type des DTO'S * @return der reader */ public static <T extends JsonReader> T createReader(Class<T> forClass) { final SwmJsonWriterReader<Object> instance = new SwmJsonWriterReader<Object>(); InvocationHandler handler = new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("read")) { return instance.read((String) args[0]); } return null; } }; Class<?>[] ift = { forClass }; T result = (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), ift, handler); return result; } @Override public T read(String s) throws JSONException { return deSerialize(s); } @Override public T read(JSONObject jsonObject) throws JSONException { return deSerialize(jsonObject.toString()); } @Override public String toJson(T t) { return serialize(t); } @Override public List<T> readList(String s) throws JSONException { throw new IllegalArgumentException("Not supported"); } @Override public List<T> readList(String s, String s1) throws JSONException { throw new IllegalArgumentException("Not supported"); } @Override public List<T> readList(JSONObject jsonObject) throws JSONException { throw new IllegalArgumentException("Not supported"); } @Override public List<T> readList(JSONObject jsonObject, String s) throws JSONException { throw new IllegalArgumentException("Not supported"); } @Override public List<T> readList(JSONArray jsonArray) throws JSONException { throw new IllegalArgumentException("Not supported"); } @Override public String toJson(List<T> ts, String s) { throw new IllegalArgumentException("Not supported"); } @Override public HandlerRegistration addModelReadHandler(ModelReadHandler<T, JSONObject> tjsonObjectModelReadHandler) { return null; } @Override public HandlerRegistration addModelWriteHandler(ModelWriteHandler<T> tModelWriteHandler) { return null; } @Override public void fireEvent(GwtEvent<?> event) { } @Override public T idRef(String s) { return null; } private String serialize(Object toSerialize) { final String xml = xstream.toXML(toSerialize); return xml; } private T deSerialize(String toDeSerialize) { final T result = (T) xstream.fromXML(toDeSerialize); return result; } }