X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=server%2Fruntime%2Forg.argeo.server.json%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fserver%2Fjson%2FJsonServerSerializer.java;h=a77c7fd88a9f3f8c3d5b8d170380df60d4c08cac;hb=490d9907457c43acfa965e7979ce5974bc1ba6ca;hp=a5a7f43e3a0e5b51b5510bb58934e480a07f75e1;hpb=0f27df01898453d05364befc15969f787f6a3392;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java index a5a7f43e3..a77c7fd88 100644 --- a/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java +++ b/server/runtime/org.argeo.server.json/src/main/java/org/argeo/server/json/JsonServerSerializer.java @@ -1,3 +1,19 @@ +/* + * Copyright (C) 2010 Mathieu Baudier + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.argeo.server.json; import java.io.IOException; @@ -9,12 +25,18 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.server.ArgeoServerException; +import org.argeo.ArgeoException; import org.argeo.server.Serializer; import org.argeo.server.ServerSerializer; import org.codehaus.jackson.JsonFactory; import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.JsonSerializer; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.SerializationConfig; +import org.codehaus.jackson.map.SerializerFactory; +import org.codehaus.jackson.map.SerializerProvider; +import org.codehaus.jackson.map.ser.StdSerializerProvider; public class JsonServerSerializer implements ServerSerializer, Serializer { private final static Log log = LogFactory @@ -22,37 +44,58 @@ public class JsonServerSerializer implements ServerSerializer, Serializer { private JsonFactory jsonFactory = new JsonFactory(); private ObjectMapper objectMapper = new ObjectMapper(); + private SerializerProvider serializerProvider = new CustomSerializerProvider(); private Boolean prettyPrint = false; - // private String encoding = "UTF8"; + private Boolean asHtml = false; + + private String contentTypeCharset = "UTF-8"; + + // private Map,String> ignoredFields = new HashMap, + // String>(); + + public JsonServerSerializer() { + objectMapper.setSerializerProvider(serializerProvider); + } + @SuppressWarnings("restriction") public void serialize(Object obj, HttpServletRequest request, HttpServletResponse response) { - response.setContentType("application/json"); + if (asHtml) + response.setContentType("text/html;charset=" + contentTypeCharset); + else + response.setContentType("application/json;charset=" + + contentTypeCharset); + try { - serialize(response.getWriter(), obj); + if (asHtml) + response.getWriter().append("
");
+
+			serialize(obj, response.getWriter());
+
+			if (asHtml)
+				response.getWriter().append("
"); + } catch (IOException e) { - throw new ArgeoServerException("Cannot open response stream.", e); + throw new ArgeoException("Cannot open response stream.", e); } } - public void serialize(Writer writer, Object obj) { + public void serialize(Object obj, Writer writer) { serializeAndLog(obj); JsonGenerator jsonGenerator = null; try { - - // jsonGenerator = jsonFactory.createJsonGenerator(response - // .getOutputStream(), JsonEncoding.valueOf(encoding)); jsonGenerator = jsonFactory.createJsonGenerator(writer); if (prettyPrint) jsonGenerator.useDefaultPrettyPrinter(); objectMapper.writeValue(jsonGenerator, obj); + jsonGenerator.flush(); } catch (Exception e) { - throw new ArgeoServerException("Cannot serialize " + obj, e); + throw new ArgeoException("Cannot serialize " + obj, e); } finally { if (jsonGenerator != null) try { @@ -64,6 +107,11 @@ public class JsonServerSerializer implements ServerSerializer, Serializer { } } + @Deprecated + public void serialize(Writer writer, Object obj) { + serialize(obj, writer); + } + protected void serializeAndLog(Object obj) { if (!log.isTraceEnabled()) return; @@ -77,7 +125,7 @@ public class JsonServerSerializer implements ServerSerializer, Serializer { jsonGenerator.close(); log.debug(stringWriter.toString()); } catch (Exception e) { - throw new ArgeoServerException("Cannot log JSON", e); + throw new ArgeoException("Cannot log JSON", e); } finally { if (jsonGenerator != null) try { @@ -97,4 +145,48 @@ public class JsonServerSerializer implements ServerSerializer, Serializer { protected ObjectMapper getObjectMapper() { return objectMapper; } + + public void setContentTypeCharset(String contentTypeCharset) { + this.contentTypeCharset = contentTypeCharset; + } + + static class CustomSerializerProvider extends StdSerializerProvider { + + public CustomSerializerProvider() { + super(); + } + + public CustomSerializerProvider(SerializationConfig config, + StdSerializerProvider src, SerializerFactory f) { + super(config, src, f); + } + + protected StdSerializerProvider createInstance( + SerializationConfig config, SerializerFactory jsf) { + return new CustomSerializerProvider(config, this, jsf); + } + + @Override + public JsonSerializer getUnknownTypeSerializer( + Class unknownType) { + JsonSerializer res = new JsonSerializer() { + public void serialize(Object value, JsonGenerator jgen, + SerializerProvider provider) + throws JsonMappingException { + if (log.isDebugEnabled()) + log.warn("Unknown serializer for " + + value.getClass().getName()); + try { + jgen.writeNull(); + } catch (Exception e) { + throw new ArgeoException("Cannot write null", e); + } + } + + }; + + return res; + } + + } }