From 0f27df01898453d05364befc15969f787f6a3392 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Fri, 16 Oct 2009 10:31:01 +0000 Subject: [PATCH] Improve serialization interfaces git-svn-id: https://svn.argeo.org/commons/trunk@3042 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../java/org/argeo/server/Deserializer.java | 7 +++ .../org/argeo/server/DeserializingEditor.java | 8 ++- .../java/org/argeo/server/Serializer.java | 7 +++ .../org/argeo/server/ServerDeserializer.java | 2 +- .../argeo/server/json/JsonServerMapper.java | 18 +++++- .../server/json/JsonServerSerializer.java | 63 ++++++++++++------- 6 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Deserializer.java create mode 100644 server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Serializer.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 index 000000000..219eda99d --- /dev/null +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Deserializer.java @@ -0,0 +1,7 @@ +package org.argeo.server; + +import java.io.Reader; + +public interface Deserializer { + public T deserialize(Reader reader, Class clss); +} diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/DeserializingEditor.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/DeserializingEditor.java index 4c8dc6d8d..80b3e408d 100644 --- a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/DeserializingEditor.java +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/DeserializingEditor.java @@ -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 index 000000000..60d564cde --- /dev/null +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/Serializer.java @@ -0,0 +1,7 @@ +package org.argeo.server; + +import java.io.Writer; + +public interface Serializer { + public void serialize(Writer writer, Object obj); +} diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ServerDeserializer.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ServerDeserializer.java index 7c15b066c..082604d4c 100644 --- a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ServerDeserializer.java +++ b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/ServerDeserializer.java @@ -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); } diff --git a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java index 601b55dc1..36312ed59 100644 --- a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java +++ b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java @@ -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 deserialize(Reader reader, Class 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 { diff --git a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java index 4f762f168..a5a7f43e3 100644 --- a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java +++ b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java @@ -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); } + } } -- 2.30.2