Allows to return HTML from serializing views
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.json / src / main / java / org / argeo / server / json / JsonServerMapper.java
index 8fef8e6b2fa7772638bbcdae89280d0c218cc201..7a368f80c2d8efc9b1833e13eb383248338c7b76 100644 (file)
@@ -2,12 +2,15 @@ package org.argeo.server.json;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.io.StringReader;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.server.ArgeoServerException;
+import org.argeo.ArgeoException;
+import org.argeo.server.Deserializer;
 import org.argeo.server.ServerDeserializer;
 import org.codehaus.jackson.JsonProcessingException;
 import org.codehaus.jackson.map.DeserializationContext;
@@ -18,17 +21,20 @@ import org.codehaus.jackson.map.deser.StdDeserializerProvider;
 import org.springframework.beans.factory.InitializingBean;
 
 public class JsonServerMapper extends JsonServerSerializer implements
-               ServerDeserializer, InitializingBean {
+               ServerDeserializer, Deserializer, InitializingBean {
        private final static Log log = LogFactory.getLog(JsonServerMapper.class);
 
-       private Class targetClass;
+       private Class<?> targetClass;
 
-       private Map<Class, JsonDeserializer> deserializers = new HashMap<Class, JsonDeserializer>();
+       private Map<Class<?>, JsonDeserializer<?>> deserializers = new HashMap<Class<?>, JsonDeserializer<?>>();
 
+       @SuppressWarnings("unchecked")
        public void afterPropertiesSet() throws Exception {
                CustomDeserializerFactory dsf = new CustomDeserializerFactory();
                for (Class clss : deserializers.keySet()) {
                        dsf.addSpecificMapping(clss, deserializers.get(clss));
+                       if (log.isDebugEnabled())
+                               log.debug("Add JSON mapping for " + clss);
                }
                StdDeserializerProvider sdp = new StdDeserializerProvider(dsf);
                getObjectMapper().setDeserializerProvider(sdp);
@@ -40,8 +46,9 @@ public class JsonServerMapper extends JsonServerSerializer implements
                                                        JsonDeserializer<?> deserializer, Object bean,
                                                        String propertyName) throws IOException,
                                                        JsonProcessingException {
-                                               if (log.isDebugEnabled())
+                                               if (log.isTraceEnabled())
                                                        log.debug("Ignore property " + propertyName);
+                                               ctxt.getParser().skipChildren();
                                                return true;
                                        }
                                });
@@ -49,30 +56,58 @@ public class JsonServerMapper extends JsonServerSerializer implements
 
        public Object deserialize(Reader reader) {
                try {
-                       // String body = request.getParameter("body");
-                       // if (body == null) {
-                       // // lets read the message body instead
-                       // BufferedReader reader = request.getReader();
-                       // StringBuffer buffer = new StringBuffer();
-                       // String line = null;
-                       // while (((line = reader.readLine()) != null)) {
-                       // buffer.append(line);
-                       // }
-                       // body = buffer.toString();
-                       // }
+                       if (log.isTraceEnabled()) {
+                               String str = IOUtils.toString(reader);
+                               log.debug(str);
+                               reader = new StringReader(str);
+                       }
+
                        return getObjectMapper().readValue(reader, targetClass);
                } catch (Exception e) {
-                       throw new ArgeoServerException("Cannot deserialize " + reader, e);
+                       throw new ArgeoException("Cannot deserialize " + reader, e);
+               }
+
+       }
+
+       public <T> T deserialize(Reader reader, Class<T> clss) {
+               try {
+                       if (log.isTraceEnabled()) {
+                               String str = IOUtils.toString(reader);
+                               log.debug(str);
+                               reader = new StringReader(str);
+                       }
+
+                       return getObjectMapper().readValue(reader, clss);
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot deserialize " + reader, e);
                }
 
        }
 
-       public void setTargetClass(Class targetClass) {
+       public Object deserialize(String content) {
+               StringReader reader = new StringReader(content);
+               try {
+                       return deserialize(reader);
+               } finally {
+                       IOUtils.closeQuietly(reader);
+               }
+       }
+
+       public void setTargetClass(Class<?> targetClass) {
                this.targetClass = targetClass;
        }
 
-       public void setDeserializers(Map<Class, JsonDeserializer> deserializers) {
+       public void setDeserializers(
+                       Map<Class<?>, JsonDeserializer<?>> deserializers) {
                this.deserializers = deserializers;
        }
 
+       public Class<?> getTargetClass() {
+               return targetClass;
+       }
+
+       public Map<Class<?>, JsonDeserializer<?>> getDeserializers() {
+               return deserializers;
+       }
+
 }