diff options
| author | Muga Nishizawa <muga@f11vm.(none)> | 2010-09-27 10:00:47 +0900 |
|---|---|---|
| committer | Muga Nishizawa <muga@f11vm.(none)> | 2010-09-27 10:00:47 +0900 |
| commit | dfb97e7961e7947d09240f18234a5aaced6e2d6f (patch) | |
| tree | 9619feed81f537ceb3a877d4a32ffc6b57d9fe0e /java/src | |
| parent | 0a41b253f3a688cbdd11c2cfcb574f1333b32a0e (diff) | |
| download | msgpack-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')
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); + } } |
