From e58128fccf96211abe5a41b2188d3d02a0472691 Mon Sep 17 00:00:00 2001 From: Eckart Hertzler Date: Mon, 14 Dec 2009 17:57:47 +0100 Subject: [PATCH] add a jersey MessageBodyWriter that serializes scala lists to JSON arrays --- .../javax.ws.rs.ext.MessageBodyWriter | 1 + akka-rest/src/main/scala/ListWriter.scala | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 akka-rest/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter create mode 100644 akka-rest/src/main/scala/ListWriter.scala diff --git a/akka-rest/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter b/akka-rest/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter new file mode 100644 index 0000000000..f88c0c8601 --- /dev/null +++ b/akka-rest/src/main/resources/META-INF/services/javax.ws.rs.ext.MessageBodyWriter @@ -0,0 +1 @@ +se.scalablesolutions.akka.rest.ListWriter \ No newline at end of file diff --git a/akka-rest/src/main/scala/ListWriter.scala b/akka-rest/src/main/scala/ListWriter.scala new file mode 100644 index 0000000000..c78c368068 --- /dev/null +++ b/akka-rest/src/main/scala/ListWriter.scala @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2009 Scalable Solutions. + */ +package se.scalablesolutions.akka.rest + +import java.io.OutputStream +import se.scalablesolutions.akka.serialization.Serializer +import javax.ws.rs.core.{MultivaluedMap, MediaType} +import javax.ws.rs.ext.{MessageBodyWriter, Provider} +import javax.ws.rs.Produces + +/** + * writes Lists of JSON serializable objects + */ +@Provider +@Produces(Array("application/json")) +class ListWriter extends MessageBodyWriter[List[_]] { + + def isWriteable(aClass: Class[_], aType: java.lang.reflect.Type, annotations: Array[java.lang.annotation.Annotation], mediaType: MediaType) = { + classOf[List[_]].isAssignableFrom(aClass) || aClass == ::.getClass + } + + def getSize(list: List[_], aClass: Class[_], aType: java.lang.reflect.Type, annotations: Array[java.lang.annotation.Annotation], mediaType: MediaType) = -1L + + def writeTo(list: List[_], + aClass: Class[_], + aType: java.lang.reflect.Type, + annotations: Array[java.lang.annotation.Annotation], + mediaType: MediaType, + stringObjectMultivaluedMap: MultivaluedMap[String, Object], + outputStream: OutputStream) : Unit = { + if (list.isEmpty) + outputStream.write(" ".getBytes) + else + outputStream.write(Serializer.ScalaJSON.out(list)) + } + +}