Progress on JSON
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.json / src / main / java / org / argeo / server / json / JsonServerMapper.java
index 4ab128e0b51f24605ad98cb75f9c7646dd0634df..8fef8e6b2fa7772638bbcdae89280d0c218cc201 100644 (file)
@@ -1,53 +1,78 @@
 package org.argeo.server.json;
 
-import java.io.BufferedReader;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.argeo.server.ArgeoServerException;
 import org.argeo.server.ServerDeserializer;
-import org.argeo.server.ServerSerializer;
-import org.codehaus.jackson.JsonFactory;
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.DeserializationProblemHandler;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.codehaus.jackson.map.deser.CustomDeserializerFactory;
+import org.codehaus.jackson.map.deser.StdDeserializerProvider;
+import org.springframework.beans.factory.InitializingBean;
 
-public class JsonServerMapper implements ServerSerializer, ServerDeserializer {
-       private JsonFactory jsonFactory = new JsonFactory();
-       private ObjectMapper objectMapper = new ObjectMapper();
+public class JsonServerMapper extends JsonServerSerializer implements
+               ServerDeserializer, InitializingBean {
+       private final static Log log = LogFactory.getLog(JsonServerMapper.class);
 
-       public void serialize(Object obj, HttpServletRequest request,
-                       HttpServletResponse response) {
-               try {
-                       response.setContentType("application/json");
+       private Class targetClass;
 
-                       JsonGenerator jsonGenerator = jsonFactory
-                                       .createJsonGenerator(response.getWriter());
-                       jsonGenerator.useDefaultPrettyPrinter();
+       private Map<Class, JsonDeserializer> deserializers = new HashMap<Class, JsonDeserializer>();
 
-                       objectMapper.writeValue(jsonGenerator, obj);
-               } catch (Exception e) {
-                       throw new ArgeoServerException("Cannot serialize " + obj, e);
+       public void afterPropertiesSet() throws Exception {
+               CustomDeserializerFactory dsf = new CustomDeserializerFactory();
+               for (Class clss : deserializers.keySet()) {
+                       dsf.addSpecificMapping(clss, deserializers.get(clss));
                }
+               StdDeserializerProvider sdp = new StdDeserializerProvider(dsf);
+               getObjectMapper().setDeserializerProvider(sdp);
+               // ignore unkown properties
+               getObjectMapper().getDeserializationConfig().addHandler(
+                               new DeserializationProblemHandler() {
+                                       public boolean handleUnknownProperty(
+                                                       DeserializationContext ctxt,
+                                                       JsonDeserializer<?> deserializer, Object bean,
+                                                       String propertyName) throws IOException,
+                                                       JsonProcessingException {
+                                               if (log.isDebugEnabled())
+                                                       log.debug("Ignore property " + propertyName);
+                                               return true;
+                                       }
+                               });
        }
 
-       public Object deserialize(Object obj, HttpServletRequest request) {
+       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();
-                       }
-                       return objectMapper.readValue(body, Object.class);
+                       // 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();
+                       // }
+                       return getObjectMapper().readValue(reader, targetClass);
                } catch (Exception e) {
-                       throw new ArgeoServerException("Cannot deserialize " + request, e);
+                       throw new ArgeoServerException("Cannot deserialize " + reader, e);
                }
+
+       }
+
+       public void setTargetClass(Class targetClass) {
+               this.targetClass = targetClass;
+       }
+
+       public void setDeserializers(Map<Class, JsonDeserializer> deserializers) {
+               this.deserializers = deserializers;
        }
 
 }