]> git.argeo.org Git - lgpl/argeo-commons.git/blob - server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerMapper.java
1ba04b1912d6ab422a595539f5fb820b71c2278a
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.json / src / main / java / org / argeo / server / json / JsonServerMapper.java
1 /*
2 * Copyright (C) 2007-2012 Mathieu Baudier
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.argeo.server.json;
17
18 import java.io.IOException;
19 import java.io.Reader;
20 import java.io.StringReader;
21 import java.util.HashMap;
22 import java.util.Map;
23
24 import org.apache.commons.io.IOUtils;
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27 import org.argeo.ArgeoException;
28 import org.argeo.server.Deserializer;
29 import org.codehaus.jackson.JsonProcessingException;
30 import org.codehaus.jackson.map.DeserializationContext;
31 import org.codehaus.jackson.map.DeserializationProblemHandler;
32 import org.codehaus.jackson.map.JsonDeserializer;
33 import org.codehaus.jackson.map.deser.CustomDeserializerFactory;
34 import org.codehaus.jackson.map.deser.StdDeserializerProvider;
35 import org.springframework.beans.factory.InitializingBean;
36
37 public class JsonServerMapper extends JsonServerSerializer implements
38 Deserializer, InitializingBean {
39 private final static Log log = LogFactory.getLog(JsonServerMapper.class);
40
41 private Class<?> targetClass;
42
43 private Map<Class<?>, JsonDeserializer<?>> deserializers = new HashMap<Class<?>, JsonDeserializer<?>>();
44
45 @SuppressWarnings("unchecked")
46 public void afterPropertiesSet() throws Exception {
47 CustomDeserializerFactory dsf = new CustomDeserializerFactory();
48 for (Class clss : deserializers.keySet()) {
49 dsf.addSpecificMapping(clss, deserializers.get(clss));
50 if (log.isDebugEnabled())
51 log.debug("Add JSON mapping for " + clss);
52 }
53 StdDeserializerProvider sdp = new StdDeserializerProvider(dsf);
54 getObjectMapper().setDeserializerProvider(sdp);
55 // ignore unkown properties
56 getObjectMapper().getDeserializationConfig().addHandler(
57 new DeserializationProblemHandler() {
58 public boolean handleUnknownProperty(
59 DeserializationContext ctxt,
60 JsonDeserializer<?> deserializer, Object bean,
61 String propertyName) throws IOException,
62 JsonProcessingException {
63 if (log.isTraceEnabled())
64 log.debug("Ignore property " + propertyName
65 + " in bean " + bean);
66 ctxt.getParser().skipChildren();
67 return true;
68 }
69 });
70 }
71
72 public Object deserialize(Reader reader) {
73 try {
74 if (log.isTraceEnabled()) {
75 String str = IOUtils.toString(reader);
76 log.debug(str);
77 reader = new StringReader(str);
78 }
79
80 return getObjectMapper().readValue(reader, targetClass);
81 } catch (Exception e) {
82 throw new ArgeoException("Cannot deserialize " + reader, e);
83 }
84
85 }
86
87 public <T> T deserialize(Reader reader, Class<T> clss) {
88 try {
89 if (log.isTraceEnabled()) {
90 String str = IOUtils.toString(reader);
91 log.debug(str);
92 reader = new StringReader(str);
93 }
94
95 return getObjectMapper().readValue(reader, clss);
96 } catch (Exception e) {
97 throw new ArgeoException("Cannot deserialize " + reader, e);
98 }
99
100 }
101
102 public Object deserialize(String content) {
103 StringReader reader = new StringReader(content);
104 try {
105 return deserialize(reader);
106 } finally {
107 IOUtils.closeQuietly(reader);
108 }
109 }
110
111 public void setTargetClass(Class<?> targetClass) {
112 this.targetClass = targetClass;
113 }
114
115 public void setDeserializers(
116 Map<Class<?>, JsonDeserializer<?>> deserializers) {
117 this.deserializers = deserializers;
118 }
119
120 public Class<?> getTargetClass() {
121 return targetClass;
122 }
123
124 public Map<Class<?>, JsonDeserializer<?>> getDeserializers() {
125 return deserializers;
126 }
127
128 }