2 * Copyright (C) 2007-2012 Mathieu Baudier
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.
16 package org
.argeo
.server
.json
;
18 import java
.io
.IOException
;
19 import java
.io
.Reader
;
20 import java
.io
.StringReader
;
21 import java
.util
.HashMap
;
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
;
37 public class JsonServerMapper
extends JsonServerSerializer
implements
38 Deserializer
, InitializingBean
{
39 private final static Log log
= LogFactory
.getLog(JsonServerMapper
.class);
41 private Class
<?
> targetClass
;
43 private Map
<Class
<?
>, JsonDeserializer
<?
>> deserializers
= new HashMap
<Class
<?
>, JsonDeserializer
<?
>>();
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
);
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();
72 public Object
deserialize(Reader reader
) {
74 if (log
.isTraceEnabled()) {
75 String str
= IOUtils
.toString(reader
);
77 reader
= new StringReader(str
);
80 return getObjectMapper().readValue(reader
, targetClass
);
81 } catch (Exception e
) {
82 throw new ArgeoException("Cannot deserialize " + reader
, e
);
87 public <T
> T
deserialize(Reader reader
, Class
<T
> clss
) {
89 if (log
.isTraceEnabled()) {
90 String str
= IOUtils
.toString(reader
);
92 reader
= new StringReader(str
);
95 return getObjectMapper().readValue(reader
, clss
);
96 } catch (Exception e
) {
97 throw new ArgeoException("Cannot deserialize " + reader
, e
);
102 public Object
deserialize(String content
) {
103 StringReader reader
= new StringReader(content
);
105 return deserialize(reader
);
107 IOUtils
.closeQuietly(reader
);
111 public void setTargetClass(Class
<?
> targetClass
) {
112 this.targetClass
= targetClass
;
115 public void setDeserializers(
116 Map
<Class
<?
>, JsonDeserializer
<?
>> deserializers
) {
117 this.deserializers
= deserializers
;
120 public Class
<?
> getTargetClass() {
124 public Map
<Class
<?
>, JsonDeserializer
<?
>> getDeserializers() {
125 return deserializers
;