]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java
Restructure security
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.json / src / main / java / org / argeo / server / json / JsonServerMapper.java
1 package org.argeo.server.json;
2
3 import java.io.IOException;
4 import java.io.Reader;
5 import java.io.StringReader;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 import org.apache.commons.io.IOUtils;
10 import org.apache.commons.logging.Log;
11 import org.apache.commons.logging.LogFactory;
12 import org.argeo.server.ArgeoServerException;
13 import org.argeo.server.ServerDeserializer;
14 import org.codehaus.jackson.JsonProcessingException;
15 import org.codehaus.jackson.map.DeserializationContext;
16 import org.codehaus.jackson.map.DeserializationProblemHandler;
17 import org.codehaus.jackson.map.JsonDeserializer;
18 import org.codehaus.jackson.map.deser.CustomDeserializerFactory;
19 import org.codehaus.jackson.map.deser.StdDeserializerProvider;
20 import org.springframework.beans.factory.InitializingBean;
21
22 public class JsonServerMapper extends JsonServerSerializer implements
23 ServerDeserializer, InitializingBean {
24 private final static Log log = LogFactory.getLog(JsonServerMapper.class);
25
26 private Class<?> targetClass;
27
28 private Map<Class<?>, JsonDeserializer<?>> deserializers = new HashMap<Class<?>, JsonDeserializer<?>>();
29
30 @SuppressWarnings("unchecked")
31 public void afterPropertiesSet() throws Exception {
32 CustomDeserializerFactory dsf = new CustomDeserializerFactory();
33 for (Class clss : deserializers.keySet()) {
34 dsf.addSpecificMapping(clss, deserializers.get(clss));
35 }
36 StdDeserializerProvider sdp = new StdDeserializerProvider(dsf);
37 getObjectMapper().setDeserializerProvider(sdp);
38 // ignore unkown properties
39 getObjectMapper().getDeserializationConfig().addHandler(
40 new DeserializationProblemHandler() {
41 public boolean handleUnknownProperty(
42 DeserializationContext ctxt,
43 JsonDeserializer<?> deserializer, Object bean,
44 String propertyName) throws IOException,
45 JsonProcessingException {
46 if (log.isTraceEnabled())
47 log.debug("Ignore property " + propertyName);
48 ctxt.getParser().skipChildren();
49 return true;
50 }
51 });
52 }
53
54 public Object deserialize(Reader reader) {
55 try {
56 // String body = request.getParameter("body");
57 // if (body == null) {
58 // // lets read the message body instead
59 // BufferedReader reader = request.getReader();
60 // StringBuffer buffer = new StringBuffer();
61 // String line = null;
62 // while (((line = reader.readLine()) != null)) {
63 // buffer.append(line);
64 // }
65 // body = buffer.toString();
66 // }
67 return getObjectMapper().readValue(reader, targetClass);
68 } catch (Exception e) {
69 throw new ArgeoServerException("Cannot deserialize " + reader, e);
70 }
71
72 }
73
74 public Object deserialize(String content) {
75 StringReader reader = new StringReader(content);
76 try {
77 return deserialize(reader);
78 } finally {
79 IOUtils.closeQuietly(reader);
80 }
81 }
82
83 public void setTargetClass(Class<?> targetClass) {
84 this.targetClass = targetClass;
85 }
86
87 public void setDeserializers(Map<Class<?>, JsonDeserializer<?>> deserializers) {
88 this.deserializers = deserializers;
89 }
90
91 public Class<?> getTargetClass() {
92 return targetClass;
93 }
94
95 public Map<Class<?>, JsonDeserializer<?>> getDeserializers() {
96 return deserializers;
97 }
98
99 }