2 * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org
.argeo
.server
.json
;
19 import java
.io
.IOException
;
20 import java
.io
.Reader
;
21 import java
.io
.StringReader
;
22 import java
.util
.HashMap
;
25 import org
.apache
.commons
.io
.IOUtils
;
26 import org
.apache
.commons
.logging
.Log
;
27 import org
.apache
.commons
.logging
.LogFactory
;
28 import org
.argeo
.ArgeoException
;
29 import org
.argeo
.server
.Deserializer
;
30 import org
.codehaus
.jackson
.JsonProcessingException
;
31 import org
.codehaus
.jackson
.map
.DeserializationContext
;
32 import org
.codehaus
.jackson
.map
.DeserializationProblemHandler
;
33 import org
.codehaus
.jackson
.map
.JsonDeserializer
;
34 import org
.codehaus
.jackson
.map
.deser
.CustomDeserializerFactory
;
35 import org
.codehaus
.jackson
.map
.deser
.StdDeserializerProvider
;
36 import org
.springframework
.beans
.factory
.InitializingBean
;
38 public class JsonServerMapper
extends JsonServerSerializer
implements
39 Deserializer
, InitializingBean
{
40 private final static Log log
= LogFactory
.getLog(JsonServerMapper
.class);
42 private Class
<?
> targetClass
;
44 private Map
<Class
<?
>, JsonDeserializer
<?
>> deserializers
= new HashMap
<Class
<?
>, JsonDeserializer
<?
>>();
46 @SuppressWarnings("unchecked")
47 public void afterPropertiesSet() throws Exception
{
48 CustomDeserializerFactory dsf
= new CustomDeserializerFactory();
49 for (Class clss
: deserializers
.keySet()) {
50 dsf
.addSpecificMapping(clss
, deserializers
.get(clss
));
51 if (log
.isDebugEnabled())
52 log
.debug("Add JSON mapping for " + clss
);
54 StdDeserializerProvider sdp
= new StdDeserializerProvider(dsf
);
55 getObjectMapper().setDeserializerProvider(sdp
);
56 // ignore unkown properties
57 getObjectMapper().getDeserializationConfig().addHandler(
58 new DeserializationProblemHandler() {
59 public boolean handleUnknownProperty(
60 DeserializationContext ctxt
,
61 JsonDeserializer
<?
> deserializer
, Object bean
,
62 String propertyName
) throws IOException
,
63 JsonProcessingException
{
64 if (log
.isTraceEnabled())
65 log
.debug("Ignore property " + propertyName
66 + " in bean " + bean
);
67 ctxt
.getParser().skipChildren();
73 public Object
deserialize(Reader reader
) {
75 if (log
.isTraceEnabled()) {
76 String str
= IOUtils
.toString(reader
);
78 reader
= new StringReader(str
);
81 return getObjectMapper().readValue(reader
, targetClass
);
82 } catch (Exception e
) {
83 throw new ArgeoException("Cannot deserialize " + reader
, e
);
88 public <T
> T
deserialize(Reader reader
, Class
<T
> clss
) {
90 if (log
.isTraceEnabled()) {
91 String str
= IOUtils
.toString(reader
);
93 reader
= new StringReader(str
);
96 return getObjectMapper().readValue(reader
, clss
);
97 } catch (Exception e
) {
98 throw new ArgeoException("Cannot deserialize " + reader
, e
);
103 public Object
deserialize(String content
) {
104 StringReader reader
= new StringReader(content
);
106 return deserialize(reader
);
108 IOUtils
.closeQuietly(reader
);
112 public void setTargetClass(Class
<?
> targetClass
) {
113 this.targetClass
= targetClass
;
116 public void setDeserializers(
117 Map
<Class
<?
>, JsonDeserializer
<?
>> deserializers
) {
118 this.deserializers
= deserializers
;
121 public Class
<?
> getTargetClass() {
125 public Map
<Class
<?
>, JsonDeserializer
<?
>> getDeserializers() {
126 return deserializers
;