From c790735b9ff97535ab5d2b776ae2ccc4ef1a5fc0 Mon Sep 17 00:00:00 2001 From: Muga Nishizawa Date: Thu, 21 Oct 2010 02:02:23 +0900 Subject: [PATCH] java: add test programs for org.msgpack.util.codegen.*.java --- .../msgpack/util/codegen/DynamicCodeGen.java | 101 ------------------ .../util/codegen/DynamicCodeGenBase.java | 54 ++++++++++ .../msgpack/util/codegen/TestPackConvert.java | 19 ++-- .../msgpack/util/codegen/TestPackUnpack.java | 15 +-- 4 files changed, 73 insertions(+), 116 deletions(-) diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java index 9ba7ec6b..677ace90 100644 --- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java +++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java @@ -18,12 +18,10 @@ import javassist.NotFoundException; import org.msgpack.CustomMessage; import org.msgpack.CustomPacker; -import org.msgpack.MessageConvertable; import org.msgpack.MessagePackObject; import org.msgpack.MessagePackable; import org.msgpack.MessagePacker; import org.msgpack.MessageTypeException; -import org.msgpack.MessageUnpackable; import org.msgpack.Packer; import org.msgpack.Template; import org.msgpack.Unpacker; @@ -450,56 +448,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants { sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_03, args)); } - private void insertCodeOfUnpackMethodCallForMsgUnpackableType( - StringBuilder sb, Field f, Class c) { - // if (t.fi == null) { t.fi = new Foo(); } - sb.append(KEYWORD_IF); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(VARIABLE_NAME_TARGET); - sb.append(CHAR_NAME_DOT); - sb.append(f.getName()); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_EQUAL); - sb.append(CHAR_NAME_EQUAL); - sb.append(CHAR_NAME_SPACE); - sb.append(KEYWORD_NULL); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_LEFT_CURLY_BRACKET); - sb.append(CHAR_NAME_SPACE); - sb.append(VARIABLE_NAME_TARGET); - sb.append(CHAR_NAME_DOT); - sb.append(f.getName()); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_EQUAL); - sb.append(CHAR_NAME_SPACE); - sb.append(KEYWORD_NEW); - sb.append(CHAR_NAME_SPACE); - sb.append(c.getName()); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(CHAR_NAME_SEMICOLON); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_RIGHT_CURLY_BRACKET); - sb.append(CHAR_NAME_SPACE); - - // insert a right variable // ignore - sb.append(VARIABLE_NAME_PK); - sb.append(CHAR_NAME_DOT); - sb.append(METHOD_NAME_UNPACK); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(MessageUnpackable.class.getName()); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(VARIABLE_NAME_TARGET); - sb.append(CHAR_NAME_DOT); - sb.append(f.getName()); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(CHAR_NAME_SEMICOLON); - sb.append(CHAR_NAME_SPACE); - } - private void insertOrdinalEnumUnpackMethodBody(StringBuilder sb, Class type) { // Object unpack(Unpacker u) throws IOException, MessageTypeException; @@ -597,55 +545,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants { sb.append(String.format(STATEMENT_TMPL_CONVERTMETHODBODY_02, args)); } - private void insertCodeOfMessageConvertCallForMsgConvtblType( - StringBuilder sb, Field f, Class c, int i) { - // if (fi == null) { fi = new Foo_$$_Enhanced(); } - sb.append(KEYWORD_IF); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(f.getName()); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_EQUAL); - sb.append(CHAR_NAME_EQUAL); - sb.append(CHAR_NAME_SPACE); - sb.append(KEYWORD_NULL); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_LEFT_CURLY_BRACKET); - sb.append(CHAR_NAME_SPACE); - sb.append(f.getName()); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_EQUAL); - sb.append(CHAR_NAME_SPACE); - sb.append(KEYWORD_NEW); - sb.append(CHAR_NAME_SPACE); - sb.append(c.getName()); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(CHAR_NAME_SEMICOLON); - sb.append(CHAR_NAME_SPACE); - sb.append(CHAR_NAME_RIGHT_CURLY_BRACKET); - sb.append(CHAR_NAME_SPACE); - - // ((MessageConvertable)f_i).messageConvert(ary[i]); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(MessageConvertable.class.getName()); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(f.getName()); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(CHAR_NAME_DOT); - sb.append(METHOD_NAME_MSGCONVERT); - sb.append(CHAR_NAME_LEFT_PARENTHESIS); - sb.append(VARIABLE_NAME_ARRAY); - sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET); - sb.append(i); - sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET); - sb.append(CHAR_NAME_RIGHT_PARENTHESIS); - sb.append(CHAR_NAME_SEMICOLON); - sb.append(CHAR_NAME_SPACE); - } - private void insertOrdinalEnumConvertMethodBody(StringBuilder sb, Class type) { // Object convert(MessagePackObject mpo) throws MessageTypeException; diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java index f1415d52..0f8cace8 100644 --- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java +++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java @@ -1,5 +1,6 @@ package org.msgpack.util.codegen; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.GenericArrayType; import java.lang.reflect.Method; @@ -22,9 +23,13 @@ import javassist.NotFoundException; import org.msgpack.CustomConverter; import org.msgpack.CustomMessage; +import org.msgpack.MessageConvertable; +import org.msgpack.MessagePackObject; import org.msgpack.MessageTypeException; +import org.msgpack.MessageUnpackable; import org.msgpack.Template; import org.msgpack.Templates; +import org.msgpack.Unpacker; import org.msgpack.annotation.MessagePackDelegate; import org.msgpack.annotation.MessagePackMessage; import org.msgpack.annotation.MessagePackOrdinalEnum; @@ -40,6 +45,50 @@ public class DynamicCodeGenBase implements Constants { void setNullCheck(boolean nullCheck); } + public static class MessageUnpackableConvertableTemplate implements + Template { + + private Class type; + + public MessageUnpackableConvertableTemplate(Class type) { + this.type = type; + } + + @Override + public Object unpack(Unpacker unpacker) throws IOException, + MessageTypeException { + try { + MessageUnpackable obj = (MessageUnpackable) type.newInstance(); + obj.messageUnpack(unpacker); + return obj; + } catch (ClassCastException e) { + throw new MessageTypeException(e.getMessage(), e); + } catch (InstantiationException e) { + throw new MessageTypeException(e.getMessage(), e); + } catch (IllegalAccessException e) { + throw new MessageTypeException(e.getMessage(), e); + } + } + + @Override + public Object convert(MessagePackObject from) + throws MessageTypeException { + try { + MessageConvertable obj = (MessageConvertable) type + .newInstance(); + obj.messageConvert(from); + return obj; + } catch (ClassCastException e) { + throw new MessageTypeException(e.getMessage(), e); + } catch (InstantiationException e) { + throw new MessageTypeException(e.getMessage(), e); + } catch (IllegalAccessException e) { + throw new MessageTypeException(e.getMessage(), e); + } + } + + } + public static class NullCheckerImpl implements NullChecker { public boolean _$$_nullCheck = true; @@ -317,6 +366,11 @@ public class DynamicCodeGenBase implements Constants { Template tmpl = DynamicOrdinalEnumTemplate.create(c); CustomMessage.registerTemplate(c, tmpl); return tmpl; + } else if (MessageConvertable.class.isAssignableFrom(c) + || MessageUnpackable.class.isAssignableFrom(c)) { + Template tmpl = new MessageUnpackableConvertableTemplate(c); + CustomMessage.registerTemplate(c, tmpl); + return tmpl; } else { throw new MessageTypeException("Type error: " + ((Class) t).getName()); diff --git a/java/src/test/java/org/msgpack/util/codegen/TestPackConvert.java b/java/src/test/java/org/msgpack/util/codegen/TestPackConvert.java index 2e6ea58f..d2cf35cf 100644 --- a/java/src/test/java/org/msgpack/util/codegen/TestPackConvert.java +++ b/java/src/test/java/org/msgpack/util/codegen/TestPackConvert.java @@ -1012,8 +1012,8 @@ public class TestPackConvert extends TestCase { } } - //@Test - public void XtestMessagePackableUnpackableClass00() throws Exception { + @Test + public void testMessagePackableUnpackableClass00() throws Exception { BaseMessagePackableConvertableClass src = new BaseMessagePackableConvertableClass(); MessagePackableConvertableClass src1 = new MessagePackableConvertableClass(); List src2 = new ArrayList(); @@ -1045,8 +1045,8 @@ public class TestPackConvert extends TestCase { assertFalse(it.hasNext()); } - //@Test - public void XtestMessagePackableUnpackableClass01() throws Exception { + @Test + public void testMessagePackableUnpackableClass01() throws Exception { BaseMessagePackableConvertableClass src = new BaseMessagePackableConvertableClass(); src.f0 = null; src.f1 = 1; @@ -1070,8 +1070,8 @@ public class TestPackConvert extends TestCase { assertFalse(it.hasNext()); } - //@Test - public void XtestMessagePackableUnpackableClass02() throws Exception { + @Test + public void testMessagePackableUnpackableClass02() throws Exception { BaseMessagePackableConvertableClass src = null; ByteArrayOutputStream out = new ByteArrayOutputStream(); MessagePacker packer = DynamicPacker @@ -1113,17 +1113,18 @@ public class TestPackConvert extends TestCase { @Override public void messagePack(Packer packer) throws IOException { + packer.packArray(2); packer.pack(f0); packer.pack(f1); } @Override - public void messageConvert(MessagePackObject obj) + public void messageConvert(MessagePackObject from) throws MessageTypeException { - if (obj.isNil()) { + if (from.isNil()) { return; } - MessagePackObject[] objs = obj.asArray(); + MessagePackObject[] objs = from.asArray(); f0 = objs[0].asInt(); f1 = objs[1].asInt(); } diff --git a/java/src/test/java/org/msgpack/util/codegen/TestPackUnpack.java b/java/src/test/java/org/msgpack/util/codegen/TestPackUnpack.java index dc56b6c7..b7ac7eb2 100644 --- a/java/src/test/java/org/msgpack/util/codegen/TestPackUnpack.java +++ b/java/src/test/java/org/msgpack/util/codegen/TestPackUnpack.java @@ -890,8 +890,8 @@ public class TestPackUnpack extends TestCase { } } - //@Test - public void XtestMessagePackableUnpackableClass00() throws Exception { + @Test + public void testMessagePackableUnpackableClass00() throws Exception { BaseMessagePackableUnpackableClass src = new BaseMessagePackableUnpackableClass(); MessagePackableUnpackableClass src1 = new MessagePackableUnpackableClass(); List src2 = new ArrayList(); @@ -900,6 +900,7 @@ public class TestPackUnpack extends TestCase { src.f0 = src1; src.f1 = 1; src2.add(src1); + src.f2 = src2; ByteArrayOutputStream out = new ByteArrayOutputStream(); MessagePacker packer = DynamicPacker .create(BaseMessagePackableUnpackableClass.class); @@ -917,8 +918,8 @@ public class TestPackUnpack extends TestCase { assertEquals(src.f2.get(0).f1, dst.f2.get(0).f1); } - //@Test - public void XtestMessagePackableUnpackableClass01() throws Exception { + @Test + public void testMessagePackableUnpackableClass01() throws Exception { BaseMessagePackableUnpackableClass src = new BaseMessagePackableUnpackableClass(); src.f0 = null; src.f1 = 1; @@ -937,8 +938,8 @@ public class TestPackUnpack extends TestCase { assertEquals(src.f2, dst.f2); } - //@Test - public void XtestMessagePackableUnpackableClass02() throws Exception { + @Test + public void testMessagePackableUnpackableClass02() throws Exception { BaseMessagePackableUnpackableClass src = null; ByteArrayOutputStream out = new ByteArrayOutputStream(); MessagePacker packer = DynamicPacker @@ -975,6 +976,7 @@ public class TestPackUnpack extends TestCase { @Override public void messagePack(Packer packer) throws IOException { + packer.packArray(2); packer.pack(f0); packer.pack(f1); } @@ -985,6 +987,7 @@ public class TestPackUnpack extends TestCase { if (unpacker.tryUnpackNull()) { return; } + unpacker.unpackArray(); f0 = unpacker.unpackInt(); f1 = unpacker.unpackInt(); }