diff options
| author | Muga Nishizawa <muga@f11vm.(none)> | 2010-10-21 02:02:23 +0900 |
|---|---|---|
| committer | Muga Nishizawa <muga@f11vm.(none)> | 2010-10-21 02:02:23 +0900 |
| commit | c790735b9ff97535ab5d2b776ae2ccc4ef1a5fc0 (patch) | |
| tree | b58568cba2ddb827b9afd55d1c695309375667b8 /java/src/main | |
| parent | 64711e615e78328cee3250e83db0527f1c33c0f7 (diff) | |
| download | msgpack-python-c790735b9ff97535ab5d2b776ae2ccc4ef1a5fc0.tar.gz | |
java: add test programs for org.msgpack.util.codegen.*.java
Diffstat (limited to 'java/src/main')
| -rw-r--r-- | java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java | 101 | ||||
| -rw-r--r-- | java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java | 54 |
2 files changed, 54 insertions, 101 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 9ba7ec6..677ace9 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 f1415d5..0f8cace 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()); |
