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);
}
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;
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;
}
+ 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 {
import java.io.IOException;
import java.io.StringWriter;
+import java.io.Writer;
import javax.servlet.http.HttpServletRequest;
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);
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 {
if (log.isTraceEnabled())
log.error("Cannot close JSON generator", e);
}
+
}
}