JSON enhancements
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 8 Dec 2009 18:58:08 +0000 (18:58 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 8 Dec 2009 18:58:08 +0000 (18:58 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@3186 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java

index 78f3dff948fbe8683086c25b841386f802d1bdcc..3d7361396dcb65f5bbebc503060b758407f5bf21 100644 (file)
@@ -14,7 +14,13 @@ import org.argeo.server.Serializer;
 import org.argeo.server.ServerSerializer;
 import org.codehaus.jackson.JsonFactory;
 import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.JsonMappingException;
+import org.codehaus.jackson.map.JsonSerializer;
 import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.SerializationConfig;
+import org.codehaus.jackson.map.SerializerFactory;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.StdSerializerProvider;
 
 public class JsonServerSerializer implements ServerSerializer, Serializer {
        private final static Log log = LogFactory
@@ -22,6 +28,7 @@ public class JsonServerSerializer implements ServerSerializer, Serializer {
 
        private JsonFactory jsonFactory = new JsonFactory();
        private ObjectMapper objectMapper = new ObjectMapper();
+       private SerializerProvider serializerProvider = new CustomSerializerProvider();
 
        private Boolean prettyPrint = false;
 
@@ -29,6 +36,13 @@ public class JsonServerSerializer implements ServerSerializer, Serializer {
 
        private String contentTypeCharset = "UTF-8";
 
+       // private Map<Class<?>,String> ignoredFields = new HashMap<Class<?>,
+       // String>();
+
+       public JsonServerSerializer() {
+               objectMapper.setSerializerProvider(serializerProvider);
+       }
+
        public void serialize(Object obj, HttpServletRequest request,
                        HttpServletResponse response) {
                if (asHtml)
@@ -62,6 +76,7 @@ public class JsonServerSerializer implements ServerSerializer, Serializer {
                                jsonGenerator.useDefaultPrettyPrinter();
 
                        objectMapper.writeValue(jsonGenerator, obj);
+                       jsonGenerator.flush();
                } catch (Exception e) {
                        throw new ArgeoException("Cannot serialize " + obj, e);
                } finally {
@@ -113,4 +128,43 @@ public class JsonServerSerializer implements ServerSerializer, Serializer {
                this.contentTypeCharset = contentTypeCharset;
        }
 
+       static class CustomSerializerProvider extends StdSerializerProvider {
+
+               public CustomSerializerProvider() {
+                       super();
+               }
+
+               public CustomSerializerProvider(SerializationConfig config,
+                               StdSerializerProvider src, SerializerFactory f) {
+                       super(config, src, f);
+               }
+
+               protected StdSerializerProvider createInstance(
+                               SerializationConfig config, SerializerFactory jsf) {
+                       return new CustomSerializerProvider(config, this, jsf);
+               }
+
+               @Override
+               public JsonSerializer<Object> getUnknownTypeSerializer(
+                               Class<?> unknownType) {
+                       JsonSerializer<Object> res = new JsonSerializer<Object>() {
+                               public void serialize(Object value, JsonGenerator jgen,
+                                               SerializerProvider provider)
+                                               throws JsonMappingException {
+                                       if (log.isDebugEnabled())
+                                               log.warn("Unknown serializer for "
+                                                               + value.getClass().getName());
+                                       try {
+                                               jgen.writeNull();
+                                       } catch (Exception e) {
+                                               throw new ArgeoException("Cannot write null", e);
+                                       }
+                               }
+
+                       };
+
+                       return res;
+               }
+
+       }
 }