X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.json%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fjson%2FJsonServerMapper.java;h=8fef8e6b2fa7772638bbcdae89280d0c218cc201;hb=00ae7654c948e62c35ef88e7d8d528965d5e0371;hp=4ab128e0b51f24605ad98cb75f9c7646dd0634df;hpb=727a852dcd2a6e80b11ae71ca37f50d202baae5c;p=lgpl%2Fargeo-commons.git 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 4ab128e0b..8fef8e6b2 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 @@ -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 deserializers = new HashMap(); - 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 deserializers) { + this.deserializers = deserializers; } }