Improve serialization interfaces
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 16 Oct 2009 10:31:01 +0000 (10:31 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 16 Oct 2009 10:31:01 +0000 (10:31 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@3042 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Deserializer.java [new file with mode: 0644]
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/DeserializingEditor.java
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Serializer.java [new file with mode: 0644]
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ServerDeserializer.java
server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java
server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java

diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Deserializer.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Deserializer.java
new file mode 100644 (file)
index 0000000..219eda9
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.server;
+
+import java.io.Reader;
+
+public interface Deserializer {
+       public <T> T deserialize(Reader reader, Class<T> clss);
+}
index 4c8dc6d8d9e29e697359b92f31a4f6ade7f0ecf5..80b3e408d0b401090fa791f59e993ba1fc263492 100644 (file)
@@ -6,18 +6,20 @@ import java.io.StringReader;
 import org.apache.commons.io.IOUtils;
 
 public class DeserializingEditor extends PropertyEditorSupport {
-       private ServerDeserializer deserializer;
+       private final Deserializer deserializer;
+       private final Class<?> targetClass;
 
-       public DeserializingEditor(ServerDeserializer deserializer) {
+       public DeserializingEditor(Deserializer deserializer, Class<?> targetClass) {
                super();
                this.deserializer = deserializer;
+               this.targetClass = targetClass;
        }
 
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
                StringReader reader = new StringReader(text);
                try {
-                       setValue(deserializer.deserialize(reader));
+                       setValue(deserializer.deserialize(reader, targetClass));
                } finally {
                        IOUtils.closeQuietly(reader);
                }
diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Serializer.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Serializer.java
new file mode 100644 (file)
index 0000000..60d564c
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.server;
+
+import java.io.Writer;
+
+public interface Serializer {
+       public void serialize(Writer writer, Object obj);
+}
index 7c15b066c5a20a30429a893af739d5226173357e..082604d4c0f3366298787124e5451a3421e2c776 100644 (file)
@@ -2,7 +2,7 @@ package org.argeo.server;
 
 import java.io.Reader;
 
-
+/** @deprecated use {@link Deserializer} instead */
 public interface ServerDeserializer {
        public Object deserialize(Reader str);
 }
index 601b55dc17dcf46e0b6a24153c5e73f1336f608a..36312ed59fe4f4e614875732d4bedeefdc49398d 100644 (file)
@@ -10,6 +10,7 @@ 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.server.Deserializer;
 import org.argeo.server.ServerDeserializer;
 import org.codehaus.jackson.JsonProcessingException;
 import org.codehaus.jackson.map.DeserializationContext;
@@ -20,7 +21,7 @@ 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;
@@ -66,6 +67,21 @@ public class JsonServerMapper extends JsonServerSerializer implements
 
        }
 
+       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 ArgeoServerException("Cannot deserialize " + reader, e);
+               }
+
+       }
+
        public Object deserialize(String content) {
                StringReader reader = new StringReader(content);
                try {
index 4f762f16867c8f92fd15b172bf73849b3e0507d9..a5a7f43e3a0e5b51b5510bb58934e480a07f75e1 100644 (file)
@@ -2,6 +2,7 @@ package org.argeo.server.json;
 
 import java.io.IOException;
 import java.io.StringWriter;
+import java.io.Writer;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -9,12 +10,13 @@ import javax.servlet.http.HttpServletResponse;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.server.ArgeoServerException;
+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.ObjectMapper;
 
-public class JsonServerSerializer implements ServerSerializer {
+public class JsonServerSerializer implements ServerSerializer, Serializer {
        private final static Log log = LogFactory
                        .getLog(JsonServerSerializer.class);
 
@@ -27,41 +29,55 @@ public class JsonServerSerializer implements ServerSerializer {
 
        public void serialize(Object obj, HttpServletRequest request,
                        HttpServletResponse response) {
+               response.setContentType("application/json");
+               try {
+                       serialize(response.getWriter(), obj);
+               } catch (IOException e) {
+                       throw new ArgeoServerException("Cannot open response stream.", e);
+               }
+       }
+
+       public void serialize(Writer writer, Object obj) {
+               serializeAndLog(obj);
+
                JsonGenerator jsonGenerator = null;
                try {
-                       response.setContentType("application/json");
-                       // response.setHeader("Content-Encoding", "UTF-8");
-
-                       StringWriter stringWriter = null;
-                       if (log.isTraceEnabled()) {
-                               stringWriter = new StringWriter();
-                               JsonGenerator jsonGeneratorLog = jsonFactory
-                                               .createJsonGenerator(stringWriter);
-                               jsonGeneratorLog.useDefaultPrettyPrinter();
-                               objectMapper.writeValue(jsonGenerator, obj);
-                               jsonGeneratorLog.close();
-                       }
 
                        // jsonGenerator = jsonFactory.createJsonGenerator(response
                        // .getOutputStream(), JsonEncoding.valueOf(encoding));
-                       jsonGenerator = jsonFactory.createJsonGenerator(response
-                                       .getWriter());
+                       jsonGenerator = jsonFactory.createJsonGenerator(writer);
 
                        if (prettyPrint)
                                jsonGenerator.useDefaultPrettyPrinter();
 
                        objectMapper.writeValue(jsonGenerator, obj);
+               } catch (Exception e) {
+                       throw new ArgeoServerException("Cannot serialize " + obj, e);
+               } finally {
+                       if (jsonGenerator != null)
+                               try {
+                                       jsonGenerator.close();
+                               } catch (IOException e) {
+                                       if (log.isTraceEnabled())
+                                               log.error("Cannot close JSON generator", e);
+                               }
+               }
+       }
 
-                       jsonGenerator.close();
-
-                       if (stringWriter != null) {
-                               if (log.isTraceEnabled())
-                                       log.debug(stringWriter.toString());
-                               response.getWriter().append(stringWriter.toString());
-                       }
+       protected void serializeAndLog(Object obj) {
+               if (!log.isTraceEnabled())
+                       return;
 
+               JsonGenerator jsonGenerator = null;
+               try {
+                       StringWriter stringWriter = new StringWriter();
+                       jsonGenerator = jsonFactory.createJsonGenerator(stringWriter);
+                       jsonGenerator.useDefaultPrettyPrinter();
+                       objectMapper.writeValue(jsonGenerator, obj);
+                       jsonGenerator.close();
+                       log.debug(stringWriter.toString());
                } catch (Exception e) {
-                       throw new ArgeoServerException("Cannot serialize " + obj, e);
+                       throw new ArgeoServerException("Cannot log JSON", e);
                } finally {
                        if (jsonGenerator != null)
                                try {
@@ -70,6 +86,7 @@ public class JsonServerSerializer implements ServerSerializer {
                                        if (log.isTraceEnabled())
                                                log.error("Cannot close JSON generator", e);
                                }
+
                }
        }