write a simple test program for a DynamicCodeGenPacker class

This commit is contained in:
Muga Nishizawa 2010-09-28 15:31:55 +09:00
parent 190af1d32b
commit 923580d2cd
9 changed files with 619 additions and 782 deletions

View file

@ -20,6 +20,6 @@ package org.msgpack;
import java.io.IOException;
public interface MessagePacker {
public void pack(Packer pk, Object target) throws IOException;
void pack(Packer pk, Object target) throws IOException;
}

View file

@ -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.FIELD)
@Retention(RetentionPolicy.CLASS)
public @interface MessagePackOptional {
int value() default -1;
}

View file

@ -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.FIELD)
@Retention(RetentionPolicy.CLASS)
public @interface MessagePackRequired {
int value() default -1;
}

View file

@ -98,10 +98,8 @@ public interface BasicConstants {
String METHOD_NAME_NEXT = "next";
String METHOD_NAME_MSGPACK = "messagePack";
String METHOD_NAME_MSGUNPACK = "messageUnpack";
String METHOD_NAME_CONVERT = "convert";
String METHOD_NAME_MSGCONVERT = "messageConvert";
String METHOD_NAME_PACK = "pack";

View file

@ -8,6 +8,7 @@ import java.lang.reflect.ParameterizedType;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
@ -21,6 +22,7 @@ import javassist.CtNewConstructor;
import javassist.CtNewMethod;
import javassist.NotFoundException;
import org.msgpack.MessageConvertable;
import org.msgpack.MessagePackObject;
import org.msgpack.MessagePacker;
import org.msgpack.MessageTypeException;
@ -204,6 +206,7 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
private void addPackMethod(CtClass packerCtClass, Class<?> c, Field[] fs)
throws CannotCompileException, NotFoundException {
// void pack(Packer pk, Object target) throws IOException;
StringBuilder sb = new StringBuilder();
StringBuilder bsb = new StringBuilder();
insertPackMethodBody(bsb, c, fs);
@ -211,7 +214,7 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
Packer.class, Object.class }, new String[] { VARIABLE_NAME_PK,
VARIABLE_NAME_OBJECT }, new Class[] { IOException.class }, bsb
.toString());
System.out.println("pack method: " + sb.toString());
// System.out.println("pack method: " + sb.toString());
CtMethod newCtMethod = CtNewMethod.make(sb.toString(), packerCtClass);
packerCtClass.addMethod(newCtMethod);
}
@ -226,17 +229,15 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
new String[] { new Integer(fs.length).toString() });
insertSemicolon(sb);
for (Field f : fs) {
insertCodeOfPackCall(sb, f);
insertCodeOfPackMethodCall(sb, f);
}
}
private void insertCodeOfPackCall(StringBuilder sb, Field field) {
StringBuilder aname = new StringBuilder();
aname.append(VARIABLE_NAME_TARGET);
aname.append(CHAR_NAME_DOT);
aname.append(field.getName());
private void insertCodeOfPackMethodCall(StringBuilder sb, Field field) {
StringBuilder fa = new StringBuilder();
insertFieldAccess(fa, VARIABLE_NAME_TARGET, field.getName());
insertMethodCall(sb, VARIABLE_NAME_PK, METHOD_NAME_PACK,
new String[] { aname.toString() });
new String[] { fa.toString() });
insertSemicolon(sb);
}
@ -251,7 +252,7 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
new String[] { VARIABLE_NAME_PK }, new Class<?>[] {
MessageTypeException.class, IOException.class }, bsb
.toString());
System.out.println("unpack method: " + sb.toString());
// System.out.println("unpack method: " + sb.toString());
CtMethod newCtMethod = CtNewMethod.make(sb.toString(), unpackerCtClass);
unpackerCtClass.addMethod(newCtMethod);
}
@ -326,6 +327,7 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
Field f, Class<?> c) {
if (f != null) {
sb.append(VARIABLE_NAME_TARGET);
sb.append(CHAR_NAME_DOT);
sb.append(f.getName());
sb.append(CHAR_NAME_SPACE);
sb.append(CHAR_NAME_EQUAL);
@ -547,10 +549,501 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
sb.append(CHAR_NAME_SPACE);
}
private void addConvertMethod(CtClass tmplCtClass, Class<?> c, Field[] fs)
public void addConvertMethod(CtClass tmplCtClass, Class<?> c, Field[] fs)
throws CannotCompileException, NotFoundException {
// Object convert(MessagePackObject from) throws MessageTypeException;
// FIXME
StringBuilder sb = new StringBuilder();
StringBuilder bsb = new StringBuilder();
insertConvertMethodBody(bsb, c, fs);
addPublicMethodDecl(sb, METHOD_NAME_CONVERT, Object.class,
new Class<?>[] { MessagePackObject.class },
new String[] { VARIABLE_NAME_MPO },
new Class<?>[] { MessageTypeException.class }, bsb.toString());
// System.out.println("convert method: " + sb.toString());
CtMethod newCtMethod = CtNewMethod.make(sb.toString(), tmplCtClass);
tmplCtClass.addMethod(newCtMethod);
}
private void insertConvertMethodBody(StringBuilder sb, Class<?> c,
Field[] fields) throws CannotCompileException {
insertLocalVariableDecl(sb, c, VARIABLE_NAME_TARGET);
StringBuilder mc = new StringBuilder();
insertDefaultConsCall(mc, c);
insertValueInsertion(sb, mc.toString());
insertSemicolon(sb);
insertCodeOfMessagePackObjectArrayGet(sb);
insertCodeOfConvertMethodCalls(sb, fields);
insertReturnStat(sb, VARIABLE_NAME_TARGET);
insertSemicolon(sb);
}
private void insertCodeOfMessagePackObjectArrayGet(StringBuilder sb) {
// MessagePackObject[] ary = obj.asArray();
sb.append(MessagePackObject.class.getName());
sb.append(Constants.CHAR_NAME_LEFT_SQUARE_BRACKET);
sb.append(Constants.CHAR_NAME_RIGHT_SQUARE_BRACKET);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_ARRAY);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_MPO);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_ASARRAY);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
}
private void insertCodeOfConvertMethodCalls(StringBuilder sb, Field[] fields) {
for (int i = 0; i < fields.length; ++i) {
insertCodeOfMessageConvertCall(sb, fields[i], fields[i].getType(),
i, null);
}
}
private void insertCodeOfMessageConvertCall(StringBuilder sb, Field f,
Class<?> c, int i, String v) {
if (c.isPrimitive()) { // primitive type
insertCodeOfConvertMethodCallForPrimTypes(sb, f, c, i, v);
} else { // reference type
if (c.equals(Boolean.class) || c.equals(Byte.class)
|| c.equals(Short.class) || c.equals(Integer.class)
|| c.equals(Float.class) || c.equals(Long.class)
|| c.equals(Double.class)) {
// wrapper type
insertCodeOfMessageConvertCallForWrapTypes(sb, f, c, i, v);
} else if (c.equals(String.class) || c.equals(byte[].class)
|| c.equals(BigInteger.class)) {
insertCodeOfConvertMethodCallForPrimTypes(sb, f, c, i, v);
} else if (List.class.isAssignableFrom(c)) {
insertCodeOfMessageConvertCallForList(sb, f, c, i);
} else if (Map.class.isAssignableFrom(c)) {
insertCodeOfMessageConvertCallForMap(sb, f, c, i);
} else if (MessageConvertable.class.isAssignableFrom(c)) {
insertCodeOfMessageConvertCallForMsgConvtblType(sb, f, c, i);
} else {
throw new MessageTypeException("Type error: " + c.getName());
}
}
}
//
// private void insertCodeOfMessageConvertCallForEnhancedType(
// StringBuilder sb, Field f, Class<?> c, int i) {
// c = getCache(c.getName());
// insertCodeOfMessageConvertCallForMsgConvtblType(sb, f, c, i);
// }
private void insertCodeOfMessageConvertCallForMsgConvtblType(
StringBuilder sb, Field f, Class<?> c, int i) {
// if (fi == null) { fi = new Foo_$$_Enhanced(); }
sb.append(Constants.KEYWORD_IF);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(f.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.KEYWORD_NULL);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LEFT_CURLY_BRACKET);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(f.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.KEYWORD_NEW);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(c.getName());
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_RIGHT_CURLY_BRACKET);
sb.append(Constants.CHAR_NAME_SPACE);
// ((MessageConvertable)f_i).messageConvert(ary[i]);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(MessageConvertable.class.getName());
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(f.getName());
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_MSGCONVERT);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.VARIABLE_NAME_ARRAY);
sb.append(Constants.CHAR_NAME_LEFT_SQUARE_BRACKET);
sb.append(i);
sb.append(Constants.CHAR_NAME_RIGHT_SQUARE_BRACKET);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
}
private void insertCodeOfConvertMethodCallForPrimTypes(StringBuilder sb,
Field f, Class<?> c, int i, String name) {
// target.f0 = objs[0].intValue();
if (f != null) {
sb.append(Constants.VARIABLE_NAME_TARGET);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(f.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_ARRAY);
sb.append(Constants.CHAR_NAME_LEFT_SQUARE_BRACKET);
sb.append(i);
sb.append(Constants.CHAR_NAME_RIGHT_SQUARE_BRACKET);
} else {
sb.append(name);
}
sb.append(Constants.CHAR_NAME_DOT);
if (c.equals(boolean.class)) {
sb.append(Constants.METHOD_NAME_ASBOOLEAN);
} else if (c.equals(byte.class)) {
sb.append(Constants.METHOD_NAME_ASBYTE);
} else if (c.equals(short.class)) {
sb.append(Constants.METHOD_NAME_ASSHORT);
} else if (c.equals(int.class)) {
sb.append(Constants.METHOD_NAME_ASINT);
} else if (c.equals(float.class)) {
sb.append(Constants.METHOD_NAME_ASFLOAT);
} else if (c.equals(long.class)) {
sb.append(Constants.METHOD_NAME_ASLONG);
} else if (c.equals(double.class)) {
sb.append(Constants.METHOD_NAME_ASDOUBLE);
} else if (c.equals(String.class)) {
sb.append(Constants.METHOD_NAME_ASSTRING);
} else if (c.equals(byte[].class)) {
sb.append(Constants.METHOD_NAME_ASBYTEARRAY);
} else if (c.equals(BigInteger.class)) {
sb.append(Constants.METHOD_NAME_ASBIGINTEGER);
} else {
throw new MessageTypeException("Type error: " + c.getName());
}
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
if (f != null) {
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
}
}
private void insertCodeOfMessageConvertCallForWrapTypes(StringBuilder sb,
Field f, Class<?> c, int i, String v) {
if (f != null) {
sb.append(f.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
}
sb.append(Constants.KEYWORD_NEW);
sb.append(Constants.CHAR_NAME_SPACE);
if (c.equals(Boolean.class)) {
sb.append(Boolean.class.getName());
} else if (c.equals(Byte.class)) {
sb.append(Byte.class.getName());
} else if (c.equals(Short.class)) {
sb.append(Short.class.getName());
} else if (c.equals(Integer.class)) {
sb.append(Integer.class.getName());
} else if (c.equals(Float.class)) {
sb.append(Float.class.getName());
} else if (c.equals(Long.class)) {
sb.append(Long.class.getName());
} else if (c.equals(Double.class)) {
sb.append(Double.class.getName());
} else {
throw new MessageTypeException("Type error: " + c.getName());
}
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
if (f != null) {
sb.append(Constants.VARIABLE_NAME_ARRAY);
sb.append(Constants.CHAR_NAME_LEFT_SQUARE_BRACKET);
sb.append(i);
sb.append(Constants.CHAR_NAME_RIGHT_SQUARE_BRACKET);
} else {
sb.append(v);
}
sb.append(Constants.CHAR_NAME_DOT);
if (c.equals(Boolean.class)) {
sb.append(Constants.METHOD_NAME_ASBOOLEAN);
} else if (c.equals(Byte.class)) {
sb.append(Constants.METHOD_NAME_ASBYTE);
} else if (c.equals(Short.class)) {
sb.append(Constants.METHOD_NAME_ASSHORT);
} else if (c.equals(Integer.class)) {
sb.append(Constants.METHOD_NAME_ASINT);
} else if (c.equals(Float.class)) {
sb.append(Constants.METHOD_NAME_ASFLOAT);
} else if (c.equals(Long.class)) {
sb.append(Constants.METHOD_NAME_ASLONG);
} else if (c.equals(Double.class)) {
sb.append(Constants.METHOD_NAME_ASDOUBLE);
} else {
throw new MessageTypeException("Type error: " + c.getName());
}
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
if (f != null) {
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
}
}
private void insertCodeOfMessageConvertCallForList(StringBuilder sb,
Field field, Class<?> type, int i) {
ParameterizedType generic = (ParameterizedType) field.getGenericType();
Class<?> genericType = (Class<?>) generic.getActualTypeArguments()[0];
// List<MessagePackObject> list = ary[i].asList();
sb.append(List.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_LIST);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_ARRAY);
sb.append(Constants.CHAR_NAME_LEFT_SQUARE_BRACKET);
sb.append(i);
sb.append(Constants.CHAR_NAME_RIGHT_SQUARE_BRACKET);
sb.append(Constants.CHAR_NAME_DOT);
sb.append("asList");
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
// int size = list.size();
sb.append(int.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_SIZE);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_LIST);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_SIZE);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
// field initializer
sb.append(field.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.KEYWORD_NEW);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(ArrayList.class.getName());
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
// for loop
sb.append(Constants.KEYWORD_FOR);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(int.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_I);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(0);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_I);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LESSTHAN);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_SIZE);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_PLUS);
sb.append(Constants.CHAR_NAME_PLUS);
sb.append(Constants.VARIABLE_NAME_I);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SPACE);
// block begin
sb.append(Constants.CHAR_NAME_LEFT_CURLY_BRACKET);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(MessagePackObject.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_VAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(MessagePackObject.class.getName());
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.VARIABLE_NAME_LIST);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_GET);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.VARIABLE_NAME_I);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(field.getName());
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_ADD);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
insertCodeOfMessageConvertCall(sb, null, genericType, -1,
Constants.VARIABLE_NAME_VAL);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
// block end
sb.append(Constants.CHAR_NAME_RIGHT_CURLY_BRACKET);
sb.append(Constants.CHAR_NAME_SPACE);
}
private void insertCodeOfMessageConvertCallForMap(StringBuilder sb,
Field f, Class<?> c, int i) {
ParameterizedType generic = (ParameterizedType) f.getGenericType();
Class<?> genericType0 = (Class<?>) generic.getActualTypeArguments()[0];
Class<?> genericType1 = (Class<?>) generic.getActualTypeArguments()[1];
// Map<MessagePackObject, MessagePackObject> map = ary[i].asMap();
sb.append(Map.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_MAP);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_ARRAY);
sb.append(Constants.CHAR_NAME_LEFT_SQUARE_BRACKET);
sb.append(i);
sb.append(Constants.CHAR_NAME_RIGHT_SQUARE_BRACKET);
sb.append(Constants.CHAR_NAME_DOT);
sb.append("asMap");
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
// int size = list.size();
sb.append(int.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_SIZE);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_MAP);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_SIZE);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
// field initializer
sb.append(f.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.KEYWORD_NEW);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(HashMap.class.getName());
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
// for loop
sb.append(Constants.KEYWORD_FOR);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Iterator.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_ITER);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_MAP);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_KEYSET);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_ITERATOR);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_ITER);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_HASNEXT);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LEFT_CURLY_BRACKET);
sb.append(Constants.CHAR_NAME_SPACE);
// block map.
sb.append(MessagePackObject.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_KEY);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(MessagePackObject.class.getName());
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.VARIABLE_NAME_ITER);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_NEXT);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(MessagePackObject.class.getName());
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.VARIABLE_NAME_VAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_EQUAL);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(MessagePackObject.class.getName());
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.VARIABLE_NAME_MAP);
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_GET);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
sb.append(Constants.VARIABLE_NAME_KEY);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(f.getName());
sb.append(Constants.CHAR_NAME_DOT);
sb.append(Constants.METHOD_NAME_PUT);
sb.append(Constants.CHAR_NAME_LEFT_PARENTHESIS);
insertCodeOfMessageConvertCall(sb, null, genericType0, -1,
Constants.VARIABLE_NAME_KEY);
sb.append(Constants.CHAR_NAME_COMMA);
sb.append(Constants.CHAR_NAME_SPACE);
insertCodeOfMessageConvertCall(sb, null, genericType1, -1,
Constants.VARIABLE_NAME_VAL);
sb.append(Constants.CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(Constants.CHAR_NAME_SEMICOLON);
sb.append(Constants.CHAR_NAME_SPACE);
sb.append(Constants.CHAR_NAME_RIGHT_CURLY_BRACKET);
sb.append(Constants.CHAR_NAME_SPACE);
}
private Class<?> createClass(CtClass packerCtClass)

View file

@ -15,8 +15,8 @@ public class DynamicCodeGenBase implements BasicConstants {
sb.append(CHAR_NAME_SPACE);
sb.append(name);
}
public void addPublicMethodDecl(StringBuilder sb, String mname,
public void addPublicMethodDecl(StringBuilder sb, String mname,
Class<?> returnType, Class<?>[] paramTypes, String[] anames,
Class<?>[] exceptTypes, String methodBody) {
sb.append(KEYWORD_MODIFIER_PUBLIC);
@ -54,12 +54,14 @@ public class DynamicCodeGenBase implements BasicConstants {
}
public void insertSemicolon(StringBuilder sb) {
// ;
sb.append(CHAR_NAME_SEMICOLON);
sb.append(CHAR_NAME_SPACE);
}
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
String name) {
// int lv
sb.append(type.getName());
sb.append(CHAR_NAME_SPACE);
sb.append(name);
@ -73,6 +75,13 @@ public class DynamicCodeGenBase implements BasicConstants {
sb.append(expr);
}
public void insertFieldAccess(StringBuilder sb, String target, String field) {
// target.field
sb.append(target);
sb.append(CHAR_NAME_DOT);
sb.append(field);
}
public void insertDefaultConsCall(StringBuilder sb, Class<?> type) {
// new tname()
insertConsCall(sb, type, null);