Progress on JSON
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.json / src / main / java / org / argeo / server / json / JsonServerSerializer.java
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
new file mode 100644 (file)
index 0000000..1c38bbe
--- /dev/null
@@ -0,0 +1,59 @@
+package org.argeo.server.json;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+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.server.ServerSerializer;
+import org.codehaus.jackson.JsonFactory;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.ObjectMapper;
+
+public class JsonServerSerializer implements ServerSerializer {
+       private final static Log log = LogFactory
+                       .getLog(JsonServerSerializer.class);
+
+       private JsonFactory jsonFactory = new JsonFactory();
+       private ObjectMapper objectMapper = new ObjectMapper();
+
+       private Boolean prettyPrint = true;
+
+       public void serialize(Object obj, HttpServletRequest request,
+                       HttpServletResponse response) {
+               JsonGenerator jsonGenerator = null;
+               try {
+                       response.setContentType("application/json");
+
+                       jsonGenerator = jsonFactory.createJsonGenerator(response
+                                       .getWriter());
+                       if (prettyPrint)
+                               jsonGenerator.useDefaultPrettyPrinter();
+
+                       objectMapper.writeValue(jsonGenerator, obj);
+
+                       jsonGenerator.close();
+               } catch (Exception e) {
+                       throw new ArgeoServerException("Cannot serialize " + obj, e);
+               } finally {
+                       if (jsonGenerator != null)
+                               try {
+                                       jsonGenerator.close();
+                               } catch (IOException e) {
+                                       if (log.isTraceEnabled())
+                                               log.error("Cannot close JSON generator", e);
+                               }
+               }
+       }
+
+       public void setPrettyPrint(Boolean prettyPrint) {
+               this.prettyPrint = prettyPrint;
+       }
+
+       protected ObjectMapper getObjectMapper() {
+               return objectMapper;
+       }
+}