summaryrefslogtreecommitdiff
path: root/java/src
diff options
context:
space:
mode:
authorMuga Nishizawa <muga@f11vm.(none)>2010-09-27 10:00:47 +0900
committerMuga Nishizawa <muga@f11vm.(none)>2010-09-27 10:00:47 +0900
commitdfb97e7961e7947d09240f18234a5aaced6e2d6f (patch)
tree9619feed81f537ceb3a877d4a32ffc6b57d9fe0e /java/src
parent0a41b253f3a688cbdd11c2cfcb574f1333b32a0e (diff)
downloadmsgpack-python-dfb97e7961e7947d09240f18234a5aaced6e2d6f.tar.gz
java: adds several annotations in an org.msgpack.annotation package and edits Packer.java and its test program
Diffstat (limited to 'java/src')
-rw-r--r--java/src/main/java/org/msgpack/CustomPacker.java17
-rw-r--r--java/src/main/java/org/msgpack/Packer.java38
-rw-r--r--java/src/main/java/org/msgpack/annotation/MessagePackDelegate.java12
-rw-r--r--java/src/main/java/org/msgpack/annotation/MessagePackMessage.java12
-rw-r--r--java/src/main/java/org/msgpack/annotation/MessagePackOrdinalEnum.java12
-rw-r--r--java/src/test/java/org/msgpack/TestReflectionPackerTemplate.java28
6 files changed, 101 insertions, 18 deletions
diff --git a/java/src/main/java/org/msgpack/CustomPacker.java b/java/src/main/java/org/msgpack/CustomPacker.java
index f0c6b62..743a52b 100644
--- a/java/src/main/java/org/msgpack/CustomPacker.java
+++ b/java/src/main/java/org/msgpack/CustomPacker.java
@@ -17,23 +17,20 @@
//
package org.msgpack;
-import java.util.Map;
-import java.util.HashMap;
+import java.util.concurrent.ConcurrentHashMap;
-// FIXME package private?
public class CustomPacker {
- public static void register(Class target, MessagePacker converter) {
- map.put(target, converter);
+ private static ConcurrentHashMap<Class<?>, MessagePacker> map = new ConcurrentHashMap<Class<?>, MessagePacker>();
+
+ public static void register(Class<?> target, MessagePacker packer) {
+ map.putIfAbsent(target, packer);
}
- public static MessagePacker get(Class target) {
+ public static MessagePacker get(Class<?> target) {
return map.get(target);
}
- public static boolean isRegistered(Class target) {
+ public static boolean isRegistered(Class<?> target) {
return map.containsKey(target);
}
-
- private static Map<Class, MessagePacker> map = new HashMap<Class, MessagePacker>();
}
-
diff --git a/java/src/main/java/org/msgpack/Packer.java b/java/src/main/java/org/msgpack/Packer.java
index dd8cdee..2f34bde 100644
--- a/java/src/main/java/org/msgpack/Packer.java
+++ b/java/src/main/java/org/msgpack/Packer.java
@@ -22,8 +22,13 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.List;
import java.util.Map;
+import java.lang.annotation.Annotation;
import java.math.BigInteger;
+import org.msgpack.annotation.MessagePackDelegate;
+import org.msgpack.annotation.MessagePackMessage;
+import org.msgpack.annotation.MessagePackOrdinalEnum;
+
/**
* Packer enables you to serialize objects into OutputStream.
*
@@ -473,19 +478,36 @@ public class Packer {
return packDouble((Double)o);
} else if(o instanceof BigInteger) {
return packBigInteger((BigInteger)o);
- }
-
- Class klass = o.getClass();
+ }
- MessagePacker packer = CustomPacker.get(klass);
- if(packer != null) {
+ Class<?> klass = o.getClass();
+ if (CustomPacker.isRegistered(klass)) {
+ MessagePacker packer = CustomPacker.get(klass);
+ packer.pack(this, o);
+ return this;
+ } else if (isAnnotated(klass, MessagePackMessage.class)) {
+ MessagePacker packer = ReflectionPacker.create(klass);
+ CustomPacker.register(klass, packer);
packer.pack(this, o);
return this;
+ } else if (isAnnotated(klass, MessagePackDelegate.class)) {
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
+ } else if (isAnnotated(klass, MessagePackOrdinalEnum.class)) {
+ throw new UnsupportedOperationException("not supported yet. : " + klass.getName());
}
-
- // FIXME check annotations -> code generation -> CustomMessage.registerPacker
+// Class<?> klass = o.getClass();
+// MessagePacker packer = CustomPacker.get(klass);
+// if(packer != null) {
+// packer.pack(this, o);
+// return this;
+// }
+//
+// // FIXME check annotations -> code generation -> CustomMessage.registerPacker
throw new MessageTypeException("unknown object "+o+" ("+o.getClass()+")");
}
+
+ static boolean isAnnotated(Class<?> target, Class<? extends Annotation> with) {
+ return target.getAnnotation(with) != null;
+ }
}
-
diff --git a/java/src/main/java/org/msgpack/annotation/MessagePackDelegate.java b/java/src/main/java/org/msgpack/annotation/MessagePackDelegate.java
new file mode 100644
index 0000000..2a72d73
--- /dev/null
+++ b/java/src/main/java/org/msgpack/annotation/MessagePackDelegate.java
@@ -0,0 +1,12 @@
+package org.msgpack.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MessagePackDelegate {
+
+}
diff --git a/java/src/main/java/org/msgpack/annotation/MessagePackMessage.java b/java/src/main/java/org/msgpack/annotation/MessagePackMessage.java
new file mode 100644
index 0000000..6efeb9d
--- /dev/null
+++ b/java/src/main/java/org/msgpack/annotation/MessagePackMessage.java
@@ -0,0 +1,12 @@
+package org.msgpack.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MessagePackMessage {
+
+}
diff --git a/java/src/main/java/org/msgpack/annotation/MessagePackOrdinalEnum.java b/java/src/main/java/org/msgpack/annotation/MessagePackOrdinalEnum.java
new file mode 100644
index 0000000..4b0d9bb
--- /dev/null
+++ b/java/src/main/java/org/msgpack/annotation/MessagePackOrdinalEnum.java
@@ -0,0 +1,12 @@
+package org.msgpack.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MessagePackOrdinalEnum {
+
+}
diff --git a/java/src/test/java/org/msgpack/TestReflectionPackerTemplate.java b/java/src/test/java/org/msgpack/TestReflectionPackerTemplate.java
index f361eb4..27edde1 100644
--- a/java/src/test/java/org/msgpack/TestReflectionPackerTemplate.java
+++ b/java/src/test/java/org/msgpack/TestReflectionPackerTemplate.java
@@ -42,5 +42,33 @@ public class TestReflectionPackerTemplate {
assertEquals(src.s1, dst.s1);
assertEquals(src.s2, dst.s2);
}
+
+ @Test
+ public void testPackConvert02() throws Exception {
+ tString(); // FIXME link StringTemplate
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ CustomPacker.register(StringFieldClass.class, ReflectionPacker.create(StringFieldClass.class));
+
+
+ StringFieldClass src = new StringFieldClass();
+
+ src.s1 = "kumofs";
+ src.s2 = "frsyuki";
+
+ new Packer(out).pack(src);
+
+ Template tmpl = ReflectionTemplate.create(StringFieldClass.class);
+
+ ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
+
+ Object obj = tmpl.unpack(new Unpacker(in));
+ assertEquals(obj.getClass(), StringFieldClass.class);
+
+ StringFieldClass dst = (StringFieldClass)obj;
+ assertEquals(src.s1, dst.s1);
+ assertEquals(src.s2, dst.s2);
+ }
}