From a8f186160f366041e45a9662fbba8535f8743e3c Mon Sep 17 00:00:00 2001 From: jboner Date: Tue, 28 Jul 2009 13:28:01 +0200 Subject: [PATCH] added missing methods to JSON serializers --- akka.iws | 175 +++++++----------- .../se/scalablesolutions/akka/api/Foo.java | 2 +- .../scala/nio/RemoteProtocolBuilder.scala | 24 +-- .../scala/serialization/Serializable.scala | 21 ++- .../main/scala/serialization/Serializer.scala | 9 +- 5 files changed, 95 insertions(+), 136 deletions(-) diff --git a/akka.iws b/akka.iws index 0a4177957b..8f051bc7b4 100644 --- a/akka.iws +++ b/akka.iws @@ -6,12 +6,10 @@ - - - + @@ -148,48 +146,10 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -198,7 +158,25 @@ - + + + + + + + + + + + + + + + + + + + @@ -207,34 +185,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -253,22 +204,22 @@ @@ -2102,13 +2053,6 @@ - - - - - - - @@ -2116,13 +2060,6 @@ - - - - - - - @@ -2158,20 +2095,6 @@ - - - - - - - - - - - - - - @@ -2200,19 +2123,47 @@ - + - + + + + + + + + + + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/Foo.java b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/Foo.java index 94942c0a1a..bb9cfd83d4 100644 --- a/fun-test-java/src/test/java/se/scalablesolutions/akka/api/Foo.java +++ b/fun-test-java/src/test/java/se/scalablesolutions/akka/api/Foo.java @@ -3,7 +3,7 @@ package se.scalablesolutions.akka.api; import com.google.inject.Inject; import se.scalablesolutions.akka.annotation.oneway; -public class Foo extends se.scalablesolutions.akka.serialization.Serializable.JavaJSON { +public class Foo extends se.scalablesolutions.akka.serialization.Serializable.JavaJSON { @Inject private Bar bar; public Foo body() { return this; } diff --git a/kernel/src/main/scala/nio/RemoteProtocolBuilder.scala b/kernel/src/main/scala/nio/RemoteProtocolBuilder.scala index bdfc90184c..b492a2fe0c 100644 --- a/kernel/src/main/scala/nio/RemoteProtocolBuilder.scala +++ b/kernel/src/main/scala/nio/RemoteProtocolBuilder.scala @@ -64,16 +64,16 @@ object RemoteProtocolBuilder { builder.setProtocol(SerializationProtocol.PROTOBUF) builder.setMessage(ByteString.copyFrom(serializable.toByteArray)) builder.setMessageManifest(ByteString.copyFrom(Serializer.Java.out(serializable.getClass))) - } else if (message.isInstanceOf[Serializable.ScalaJSON[_]]) { - val serializable = message.asInstanceOf[Serializable.ScalaJSON[_]] + } else if (message.isInstanceOf[Serializable.ScalaJSON]) { + val serializable = message.asInstanceOf[Serializable.ScalaJSON] builder.setProtocol(SerializationProtocol.SCALA_JSON) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) - builder.setMessageManifest(ByteString.copyFrom(serializable.body.asInstanceOf[AnyRef].getClass.getName.getBytes)) - } else if (message.isInstanceOf[Serializable.JavaJSON[_]]) { - val serializable = message.asInstanceOf[Serializable.JavaJSON[_]] + builder.setMessageManifest(ByteString.copyFrom(serializable.asInstanceOf[AnyRef].getClass.getName.getBytes)) + } else if (message.isInstanceOf[Serializable.JavaJSON]) { + val serializable = message.asInstanceOf[Serializable.JavaJSON] builder.setProtocol(SerializationProtocol.JAVA_JSON) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) - builder.setMessageManifest(ByteString.copyFrom(serializable.body.asInstanceOf[AnyRef].getClass.getName.getBytes)) + builder.setMessageManifest(ByteString.copyFrom(serializable.asInstanceOf[AnyRef].getClass.getName.getBytes)) } else { // default, e.g. if no protocol used explicitly then use Java serialization builder.setProtocol(SerializationProtocol.JAVA) @@ -92,16 +92,16 @@ object RemoteProtocolBuilder { builder.setProtocol(SerializationProtocol.PROTOBUF) builder.setMessage(ByteString.copyFrom(serializable.toByteArray)) builder.setMessageManifest(ByteString.copyFrom(Serializer.Java.out(serializable.getClass))) - } else if (message.isInstanceOf[Serializable.ScalaJSON[_]]) { - val serializable = message.asInstanceOf[Serializable.ScalaJSON[_]] + } else if (message.isInstanceOf[Serializable.ScalaJSON]) { + val serializable = message.asInstanceOf[Serializable.ScalaJSON] builder.setProtocol(SerializationProtocol.SCALA_JSON) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) - builder.setMessageManifest(ByteString.copyFrom(serializable.body.asInstanceOf[AnyRef].getClass.getName.getBytes)) - } else if (message.isInstanceOf[Serializable.JavaJSON[_]]) { - val serializable = message.asInstanceOf[Serializable.JavaJSON[_]] + builder.setMessageManifest(ByteString.copyFrom(serializable.asInstanceOf[AnyRef].getClass.getName.getBytes)) + } else if (message.isInstanceOf[Serializable.JavaJSON]) { + val serializable = message.asInstanceOf[Serializable.JavaJSON] builder.setProtocol(SerializationProtocol.JAVA_JSON) builder.setMessage(ByteString.copyFrom(serializable.toBytes)) - builder.setMessageManifest(ByteString.copyFrom(serializable.body.asInstanceOf[AnyRef].getClass.getName.getBytes)) + builder.setMessageManifest(ByteString.copyFrom(serializable.asInstanceOf[AnyRef].getClass.getName.getBytes)) } else { // default, e.g. if no protocol used explicitly then use Java serialization builder.setProtocol(SerializationProtocol.JAVA) diff --git a/kernel/src/main/scala/serialization/Serializable.scala b/kernel/src/main/scala/serialization/Serializable.scala index 796f3cbc0b..4faa220357 100644 --- a/kernel/src/main/scala/serialization/Serializable.scala +++ b/kernel/src/main/scala/serialization/Serializable.scala @@ -68,20 +68,20 @@ object Serializable { /** * @author Jonas Bonér */ - trait JSON[T] extends Serializable { - def body: T + trait JSON extends Serializable { def toJSON: String } - + /** * @author Jonas Bonér */ - abstract class JavaJSON[T] extends JSON[T]{ - private val mapper = new ObjectMapper + abstract class JavaJSON extends JSON { def toJSON: String = { val out = new StringWriter - mapper.writeValue(out, body) + // FIXME: is this mapper expensive to create? Should I cache it away? + val mapper = new ObjectMapper + mapper.writeValue(out, this) out.close out.toString } @@ -89,7 +89,8 @@ object Serializable { def toBytes: Array[Byte] = { val bos = new ByteArrayOutputStream val out = new ObjectOutputStream(bos) - mapper.writeValue(out, body) + val mapper = new ObjectMapper + mapper.writeValue(out, this) out.close bos.toByteArray } @@ -98,9 +99,9 @@ object Serializable { /** * @author Jonas Bonér */ - trait ScalaJSON[T] extends JSON[T] { - def toJSON: String = Json.build(body).toString - def toBytes: Array[Byte] = Json.build(body).toString.getBytes + trait ScalaJSON extends JSON { + def toJSON: String = Json.build(this).toString + def toBytes: Array[Byte] = toJSON.getBytes("UTF-8") } /** diff --git a/kernel/src/main/scala/serialization/Serializer.scala b/kernel/src/main/scala/serialization/Serializer.scala index 536af0ba9b..2baec56bf9 100644 --- a/kernel/src/main/scala/serialization/Serializer.scala +++ b/kernel/src/main/scala/serialization/Serializer.scala @@ -107,8 +107,13 @@ object Serializer { in.close obj } - } + def in(json: String, clazz: Class[_]): AnyRef = { + if (clazz == null) throw new IllegalArgumentException("Can't deserialize JSON to instance if no class is provided") + mapper.readValue(json, clazz).asInstanceOf[AnyRef] + } + } + /** * @author Jonas Bonér */ @@ -118,6 +123,8 @@ object Serializer { def out(obj: AnyRef): Array[Byte] = Json.build(obj).toString.getBytes("UTF-8") def in(bytes: Array[Byte], clazz: Option[Class[_]]): AnyRef = Json.parse(new String(bytes, "UTF-8")).asInstanceOf[AnyRef] + + def in(json: String): AnyRef = Json.parse(json).asInstanceOf[AnyRef] } /**