1 package org
.argeo
.server
.json
;
3 import java
.io
.IOException
;
4 import java
.io
.StringWriter
;
7 import javax
.servlet
.http
.HttpServletRequest
;
8 import javax
.servlet
.http
.HttpServletResponse
;
10 import org
.apache
.commons
.logging
.Log
;
11 import org
.apache
.commons
.logging
.LogFactory
;
12 import org
.argeo
.ArgeoException
;
13 import org
.argeo
.server
.Serializer
;
14 import org
.argeo
.server
.ServerSerializer
;
15 import org
.codehaus
.jackson
.JsonFactory
;
16 import org
.codehaus
.jackson
.JsonGenerator
;
17 import org
.codehaus
.jackson
.map
.JsonMappingException
;
18 import org
.codehaus
.jackson
.map
.JsonSerializer
;
19 import org
.codehaus
.jackson
.map
.ObjectMapper
;
20 import org
.codehaus
.jackson
.map
.SerializationConfig
;
21 import org
.codehaus
.jackson
.map
.SerializerFactory
;
22 import org
.codehaus
.jackson
.map
.SerializerProvider
;
23 import org
.codehaus
.jackson
.map
.ser
.StdSerializerProvider
;
25 public class JsonServerSerializer
implements ServerSerializer
, Serializer
{
26 private final static Log log
= LogFactory
27 .getLog(JsonServerSerializer
.class);
29 private JsonFactory jsonFactory
= new JsonFactory();
30 private ObjectMapper objectMapper
= new ObjectMapper();
31 private SerializerProvider serializerProvider
= new CustomSerializerProvider();
33 private Boolean prettyPrint
= false;
35 private Boolean asHtml
= false;
37 private String contentTypeCharset
= "UTF-8";
39 // private Map<Class<?>,String> ignoredFields = new HashMap<Class<?>,
42 public JsonServerSerializer() {
43 objectMapper
.setSerializerProvider(serializerProvider
);
46 public void serialize(Object obj
, HttpServletRequest request
,
47 HttpServletResponse response
) {
49 response
.setContentType("text/html;charset=" + contentTypeCharset
);
51 response
.setContentType("application/json;charset="
52 + contentTypeCharset
);
56 response
.getWriter().append("<pre>");
58 serialize(response
.getWriter(), obj
);
61 response
.getWriter().append("</pre>");
63 } catch (IOException e
) {
64 throw new ArgeoException("Cannot open response stream.", e
);
68 public void serialize(Writer writer
, Object obj
) {
71 JsonGenerator jsonGenerator
= null;
73 jsonGenerator
= jsonFactory
.createJsonGenerator(writer
);
76 jsonGenerator
.useDefaultPrettyPrinter();
78 objectMapper
.writeValue(jsonGenerator
, obj
);
79 jsonGenerator
.flush();
80 } catch (Exception e
) {
81 throw new ArgeoException("Cannot serialize " + obj
, e
);
83 if (jsonGenerator
!= null)
85 jsonGenerator
.close();
86 } catch (IOException e
) {
87 if (log
.isTraceEnabled())
88 log
.error("Cannot close JSON generator", e
);
93 protected void serializeAndLog(Object obj
) {
94 if (!log
.isTraceEnabled())
97 JsonGenerator jsonGenerator
= null;
99 StringWriter stringWriter
= new StringWriter();
100 jsonGenerator
= jsonFactory
.createJsonGenerator(stringWriter
);
101 jsonGenerator
.useDefaultPrettyPrinter();
102 objectMapper
.writeValue(jsonGenerator
, obj
);
103 jsonGenerator
.close();
104 log
.debug(stringWriter
.toString());
105 } catch (Exception e
) {
106 throw new ArgeoException("Cannot log JSON", e
);
108 if (jsonGenerator
!= null)
110 jsonGenerator
.close();
111 } catch (IOException e
) {
112 if (log
.isTraceEnabled())
113 log
.error("Cannot close JSON generator", e
);
119 public void setPrettyPrint(Boolean prettyPrint
) {
120 this.prettyPrint
= prettyPrint
;
123 protected ObjectMapper
getObjectMapper() {
127 public void setContentTypeCharset(String contentTypeCharset
) {
128 this.contentTypeCharset
= contentTypeCharset
;
131 static class CustomSerializerProvider
extends StdSerializerProvider
{
133 public CustomSerializerProvider() {
137 public CustomSerializerProvider(SerializationConfig config
,
138 StdSerializerProvider src
, SerializerFactory f
) {
139 super(config
, src
, f
);
142 protected StdSerializerProvider
createInstance(
143 SerializationConfig config
, SerializerFactory jsf
) {
144 return new CustomSerializerProvider(config
, this, jsf
);
148 public JsonSerializer
<Object
> getUnknownTypeSerializer(
149 Class
<?
> unknownType
) {
150 JsonSerializer
<Object
> res
= new JsonSerializer
<Object
>() {
151 public void serialize(Object value
, JsonGenerator jgen
,
152 SerializerProvider provider
)
153 throws JsonMappingException
{
154 if (log
.isDebugEnabled())
155 log
.warn("Unknown serializer for "
156 + value
.getClass().getName());
159 } catch (Exception e
) {
160 throw new ArgeoException("Cannot write null", e
);