1 package org
.argeo
.server
.json
;
3 import java
.io
.IOException
;
5 import java
.io
.StringReader
;
6 import java
.util
.HashMap
;
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
.ArgeoException
;
13 import org
.argeo
.server
.Deserializer
;
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
;
22 public class JsonServerMapper
extends JsonServerSerializer
implements
23 Deserializer
, InitializingBean
{
24 private final static Log log
= LogFactory
.getLog(JsonServerMapper
.class);
26 private Class
<?
> targetClass
;
28 private Map
<Class
<?
>, JsonDeserializer
<?
>> deserializers
= new HashMap
<Class
<?
>, JsonDeserializer
<?
>>();
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 if (log
.isDebugEnabled())
36 log
.debug("Add JSON mapping for " + clss
);
38 StdDeserializerProvider sdp
= new StdDeserializerProvider(dsf
);
39 getObjectMapper().setDeserializerProvider(sdp
);
40 // ignore unkown properties
41 getObjectMapper().getDeserializationConfig().addHandler(
42 new DeserializationProblemHandler() {
43 public boolean handleUnknownProperty(
44 DeserializationContext ctxt
,
45 JsonDeserializer
<?
> deserializer
, Object bean
,
46 String propertyName
) throws IOException
,
47 JsonProcessingException
{
48 if (log
.isTraceEnabled())
49 log
.debug("Ignore property " + propertyName
50 + " in bean " + bean
);
51 ctxt
.getParser().skipChildren();
57 public Object
deserialize(Reader reader
) {
59 if (log
.isTraceEnabled()) {
60 String str
= IOUtils
.toString(reader
);
62 reader
= new StringReader(str
);
65 return getObjectMapper().readValue(reader
, targetClass
);
66 } catch (Exception e
) {
67 throw new ArgeoException("Cannot deserialize " + reader
, e
);
72 public <T
> T
deserialize(Reader reader
, Class
<T
> clss
) {
74 if (log
.isTraceEnabled()) {
75 String str
= IOUtils
.toString(reader
);
77 reader
= new StringReader(str
);
80 return getObjectMapper().readValue(reader
, clss
);
81 } catch (Exception e
) {
82 throw new ArgeoException("Cannot deserialize " + reader
, e
);
87 public Object
deserialize(String content
) {
88 StringReader reader
= new StringReader(content
);
90 return deserialize(reader
);
92 IOUtils
.closeQuietly(reader
);
96 public void setTargetClass(Class
<?
> targetClass
) {
97 this.targetClass
= targetClass
;
100 public void setDeserializers(
101 Map
<Class
<?
>, JsonDeserializer
<?
>> deserializers
) {
102 this.deserializers
= deserializers
;
105 public Class
<?
> getTargetClass() {
109 public Map
<Class
<?
>, JsonDeserializer
<?
>> getDeserializers() {
110 return deserializers
;