diff --git a/java/src/main/java/org/msgpack/MessagePack.java b/java/src/main/java/org/msgpack/MessagePack.java index f9dcce86..449f8a09 100644 --- a/java/src/main/java/org/msgpack/MessagePack.java +++ b/java/src/main/java/org/msgpack/MessagePack.java @@ -21,6 +21,10 @@ import java.io.OutputStream; import java.io.InputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +//import org.msgpack.util.codegen.DynamicTemplate; // FIXME +import org.msgpack.util.codegen.DynamicPacker; +import org.msgpack.util.codegen.DynamicConverter; +import org.msgpack.util.codegen.DynamicUnpacker; public class MessagePack { public static byte[] pack(Object obj) { @@ -110,14 +114,43 @@ public class MessagePack { } - //public static void register(Class target); // TODO: auto-detect + public static void register(Class target) { // auto-detect + // FIXME + //Template tmpl; + //if(List.isAssignableFrom(target)) { + //} else if(Set.isAssignableFrom(target)) { + //} else if(Map.isAssignableFrom(target)) { + //} else if(Collection.isAssignableFrom(target)) { + //} else if(BigInteger.isAssignableFrom(target)) { + //} else { + //} - //public static void register(Class target, Template tmpl); // TODO + // FIXME + //Template tmpl = DynamicTemplate.create(target); + //register(target, tmpl); - //public static void registerPacker(Class target, MessagePacker packer); // TODO + // FIXME + CustomPacker.register(target, DynamicPacker.create(target)); + CustomConverter.register(target, DynamicConverter.create(target)); + CustomUnpacker.register(target, DynamicUnpacker.create(target)); + } - //public static void registerConverter(Class target, MessageConverter converter); // TODO + public static void register(Class target, Template tmpl) { + CustomPacker.register(target, tmpl); + CustomConverter.register(target, tmpl); + CustomUnpacker.register(target, tmpl); + } - //public static void registerUnpacker(Class target, MessageUnpacker unpacker); // TODO + public static void registerPacker(Class target, MessagePacker packer) { + CustomPacker.register(target, packer); + } + + public static void registerConverter(Class target, MessageConverter converter) { + CustomConverter.register(target, converter); + } + + public static void registerUnpacker(Class target, MessageUnpacker unpacker) { + CustomUnpacker.register(target, unpacker); + } } diff --git a/java/src/test/java/org/msgpack/TestMessagePackStaticMethods.java b/java/src/test/java/org/msgpack/TestMessagePackStaticMethods.java index b91615b3..f2aad15e 100644 --- a/java/src/test/java/org/msgpack/TestMessagePackStaticMethods.java +++ b/java/src/test/java/org/msgpack/TestMessagePackStaticMethods.java @@ -12,23 +12,51 @@ import org.junit.Test; import junit.framework.TestCase; public class TestMessagePackStaticMethods extends TestCase { + public static class CustomClass { + public boolean bool; + public String str; + public List list; + + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof CustomClass)) { + return false; + } + CustomClass o = (CustomClass)obj; + return bool == o.bool && str.equals(o.str) && list.equals(o.list); + } + + public String toString() { + return "CustomClass"; + } + } + + static { + MessagePack.register(CustomClass.class); + } + @Test public void testPackToByteArray() throws Exception { byte[] a = MessagePack.pack("msgpack"); byte[] b = MessagePack.pack((Object)1); byte[] c = MessagePack.pack((Object)null); byte[] d = MessagePack.pack(createStringList()); + byte[] e = MessagePack.pack(createCustomClass()); { MessagePackObject aobj = MessagePack.unpack(a); MessagePackObject bobj = MessagePack.unpack(b); MessagePackObject cobj = MessagePack.unpack(c); MessagePackObject dobj = MessagePack.unpack(d); + MessagePackObject eobj = MessagePack.unpack(e); assertEquals(aobj, RawType.create("msgpack")); assertEquals(bobj, IntegerType.create(1)); assertEquals(cobj, NilType.create()); assertEquals(dobj, createStringList_dynamic()); + assertEquals(eobj, createCustomClass_dynamic()); } } @@ -42,6 +70,8 @@ public class TestMessagePackStaticMethods extends TestCase { MessagePack.pack(cout, (Object)null); ByteArrayOutputStream dout = new ByteArrayOutputStream(); MessagePack.pack(dout, createStringList()); + ByteArrayOutputStream eout = new ByteArrayOutputStream(); + MessagePack.pack(eout, createCustomClass()); { InputStream ain = new ByteArrayInputStream(aout.toByteArray()); @@ -52,11 +82,14 @@ public class TestMessagePackStaticMethods extends TestCase { MessagePackObject cobj = MessagePack.unpack(cin); InputStream din = new ByteArrayInputStream(dout.toByteArray()); MessagePackObject dobj = MessagePack.unpack(din); + InputStream ein = new ByteArrayInputStream(eout.toByteArray()); + MessagePackObject eobj = MessagePack.unpack(ein); assertEquals(aobj, RawType.create("msgpack")); assertEquals(bobj, IntegerType.create(1)); assertEquals(cobj, NilType.create()); assertEquals(dobj, createStringList_dynamic()); + assertEquals(eobj, createCustomClass_dynamic()); } } @@ -66,6 +99,7 @@ public class TestMessagePackStaticMethods extends TestCase { byte[] b = MessagePack.pack((Object)1, TInteger); byte[] c = MessagePack.pack((Object)null, TAny); byte[] d = MessagePack.pack(createStringList(), tList(TString)); + byte[] e = MessagePack.pack(createCustomClass(), tClass(CustomClass.class)); { Object aobj = MessagePack.unpack(a, TString); @@ -73,20 +107,26 @@ public class TestMessagePackStaticMethods extends TestCase { Object cobj_any = MessagePack.unpack(c, TAny); Object cobj_obj = MessagePack.unpack(c, tOptional(TAny)); Object dobj = MessagePack.unpack(d, tList(TString)); + Object eobj = MessagePack.unpack(e, tClass(CustomClass.class)); + assertEquals(aobj, "msgpack"); assertEquals(bobj, 1); assertEquals(cobj_any, NilType.create()); assertEquals(cobj_obj, null); assertEquals(dobj, createStringList()); + assertEquals(eobj, createCustomClass()); } { String aobj = MessagePack.unpack(a, String.class); Integer bobj = MessagePack.unpack(b, Integer.class); Object cobj = MessagePack.unpack(c, Object.class); + CustomClass eobj = MessagePack.unpack(e, CustomClass.class); + assertEquals(aobj, "msgpack"); assertEquals(bobj, (Integer)1); assertEquals(cobj, null); + assertEquals(eobj, createCustomClass()); } } @@ -100,6 +140,8 @@ public class TestMessagePackStaticMethods extends TestCase { MessagePack.pack(cout, (Object)null); ByteArrayOutputStream dout = new ByteArrayOutputStream(); MessagePack.pack(dout, createStringList()); + ByteArrayOutputStream eout = new ByteArrayOutputStream(); + MessagePack.pack(eout, createCustomClass()); { InputStream ain = new ByteArrayInputStream(aout.toByteArray()); @@ -112,12 +154,15 @@ public class TestMessagePackStaticMethods extends TestCase { Object cobj_obj = MessagePack.unpack(cin_obj, tOptional(TAny)); InputStream din = new ByteArrayInputStream(dout.toByteArray()); Object dobj = MessagePack.unpack(din, tList(TString)); + InputStream ein = new ByteArrayInputStream(eout.toByteArray()); + Object eobj = MessagePack.unpack(ein, tClass(CustomClass.class)); assertEquals(aobj, "msgpack"); assertEquals(bobj, 1); assertEquals(cobj_any, NilType.create()); assertEquals(cobj_obj, null); assertEquals(dobj, createStringList()); + assertEquals(eobj, createCustomClass()); } { @@ -127,13 +172,17 @@ public class TestMessagePackStaticMethods extends TestCase { Integer bobj = MessagePack.unpack(bin, Integer.class); InputStream cin = new ByteArrayInputStream(cout.toByteArray()); Object cobj = MessagePack.unpack(cin, Object.class); + InputStream ein = new ByteArrayInputStream(eout.toByteArray()); + Object eobj = MessagePack.unpack(ein, CustomClass.class); assertEquals(aobj, "msgpack"); assertEquals(bobj, (Integer)1); assertEquals(cobj, null); + assertEquals(eobj, createCustomClass()); } } + private List createStringList() { List list = new ArrayList(); list.add("frsyuki"); @@ -149,5 +198,29 @@ public class TestMessagePackStaticMethods extends TestCase { array[2] = RawType.create("gem-compile"); return ArrayType.create(array); } + + + private CustomClass createCustomClass() { + CustomClass obj = new CustomClass(); + obj.bool = true; + obj.str = "viver"; + obj.list = new ArrayList(); + obj.list.add(1); + obj.list.add(2); + obj.list.add(3); + return obj; + } + + private MessagePackObject createCustomClass_dynamic() { + MessagePackObject[] obj = new MessagePackObject[3]; + obj[0] = BooleanType.create(true); + obj[1] = RawType.create("viver"); + MessagePackObject[] list = new MessagePackObject[3]; + list[0] = IntegerType.create(1); + list[1] = IntegerType.create(2); + list[2] = IntegerType.create(3); + obj[2] = ArrayType.create(list); + return ArrayType.create(obj); + } }