mirror of
https://github.com/msgpack/msgpack-python.git
synced 2026-02-09 03:10:19 +00:00
java: write test programs for OptionalTemplate.java
This commit is contained in:
parent
71ae75a5bf
commit
69e32d264c
19 changed files with 2925 additions and 623 deletions
|
|
@ -6,7 +6,6 @@ import java.lang.annotation.RetentionPolicy;
|
|||
import java.lang.annotation.Target;
|
||||
|
||||
@Target(ElementType.FIELD)
|
||||
@Retention(RetentionPolicy.CLASS)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface MessagePackOptional {
|
||||
int value() default -1;
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
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;
|
||||
}
|
||||
|
|
@ -42,6 +42,7 @@ public class MapTemplate implements Template {
|
|||
return map;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public Object convert(MessagePackObject from) throws MessageTypeException {
|
||||
Map<MessagePackObject,MessagePackObject> src = from.asMap();
|
||||
Map<Object,Object> map = new HashMap();
|
||||
|
|
|
|||
|
|
@ -17,8 +17,6 @@
|
|||
//
|
||||
package org.msgpack.template;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
import java.io.IOException;
|
||||
import org.msgpack.*;
|
||||
|
||||
|
|
|
|||
|
|
@ -9,96 +9,20 @@ public interface Constants {
|
|||
|
||||
String POSTFIX_TYPE_NAME_TEMPLATE = "_$$_Template";
|
||||
|
||||
String KEYWORD_MODIFIER_PUBLIC = "public";
|
||||
String STRING_NAME_COMMA_SPACE = ", ";
|
||||
|
||||
String KEYWORD_CATCH = "catch";
|
||||
|
||||
String KEYWORD_ELSE = "else";
|
||||
|
||||
String KEYWORD_ELSEIF = "else if";
|
||||
|
||||
String KEYWORD_FOR = "for";
|
||||
|
||||
String KEYWORD_IF = "if";
|
||||
|
||||
String KEYWORD_INSTANCEOF = "instanceof";
|
||||
|
||||
String KEYWORD_NEW = "new";
|
||||
|
||||
String KEYWORD_NULL = "null";
|
||||
|
||||
String KEYWORD_RETURN = "return";
|
||||
|
||||
String KEYWORD_THROW = "throw";
|
||||
|
||||
String KEYWORD_THROWS = "throws";
|
||||
|
||||
String KEYWORD_TRY = "try";
|
||||
String STRING_NAME_LEFT_RIGHT_SQUARE_BRACKET = "[]";
|
||||
|
||||
String CHAR_NAME_SPACE = " ";
|
||||
|
||||
String CHAR_NAME_COMMA = ",";
|
||||
|
||||
String CHAR_NAME_EQUAL = "=";
|
||||
|
||||
String CHAR_NAME_PLUS = "+";
|
||||
|
||||
String CHAR_NAME_MINUS = "-";
|
||||
|
||||
String CHAR_NAME_UNDERSCORE = "_";
|
||||
|
||||
String CHAR_NAME_LESSTHAN = "<";
|
||||
|
||||
String CHAR_NAME_RIGHT_PARENTHESIS = ")";
|
||||
|
||||
String CHAR_NAME_LEFT_PARENTHESIS = "(";
|
||||
|
||||
String CHAR_NAME_RIGHT_CURLY_BRACKET = "}";
|
||||
|
||||
String CHAR_NAME_LEFT_CURLY_BRACKET = "{";
|
||||
|
||||
String CHAR_NAME_RIGHT_SQUARE_BRACKET = "]";
|
||||
|
||||
String CHAR_NAME_LEFT_SQUARE_BRACKET = "[";
|
||||
|
||||
String CHAR_NAME_DOT = ".";
|
||||
|
||||
String CHAR_NAME_SEMICOLON = ";";
|
||||
|
||||
String VARIABLE_NAME_PK = "_$$_pk";
|
||||
|
||||
String VARIABLE_NAME_OBJECT = "_$$_obj";
|
||||
|
||||
String VARIABLE_NAME_TARGET = "_$$_t";
|
||||
|
||||
String VARIABLE_NAME_SIZE = "_$$_len";
|
||||
|
||||
String VARIABLE_NAME_ARRAY = "_$$_ary";
|
||||
|
||||
String VARIABLE_NAME_LIST = "_$$_list";
|
||||
|
||||
String VARIABLE_NAME_MAP = "_$$_map";
|
||||
|
||||
String VARIABLE_NAME_KEY = "_$$_key";
|
||||
|
||||
String VARIABLE_NAME_VAL = "_$$_val";
|
||||
|
||||
String VARIABLE_NAME_ITER = "_$$_iter";
|
||||
|
||||
String VARIABLE_NAME_MPO = "_$$_mpo";
|
||||
|
||||
String VARIABLE_NAME_I = "i";
|
||||
|
||||
String VARIABLE_NAME_TEMPLATES = "_$$_templates";
|
||||
|
||||
String VARIABLE_NAME_TEMPLATES0 = "_$$_tmpls";
|
||||
|
||||
String VARIABLE_NAME_CLIENT = "_$$_client";
|
||||
|
||||
String VARIABLE_NAME_CLIENT0 = "_$$_c";
|
||||
|
||||
String METHOD_NAME_VALUEOF = "valueOf";
|
||||
|
||||
String METHOD_NAME_BOOLEANVALUE = "booleanValue";
|
||||
|
||||
String METHOD_NAME_BYTEVALUE = "byteValue";
|
||||
|
|
@ -113,38 +37,14 @@ public interface Constants {
|
|||
|
||||
String METHOD_NAME_DOUBLEVALUE = "doubleValue";
|
||||
|
||||
String METHOD_NAME_ADD = "add";
|
||||
|
||||
String METHOD_NAME_PUT = "put";
|
||||
|
||||
String METHOD_NAME_GET = "get";
|
||||
|
||||
String METHOD_NAME_SIZE = "size";
|
||||
|
||||
String METHOD_NAME_KEYSET = "keySet";
|
||||
|
||||
String METHOD_NAME_ITERATOR = "iterator";
|
||||
|
||||
String METHOD_NAME_HASNEXT = "hasNext";
|
||||
|
||||
String METHOD_NAME_NEXT = "next";
|
||||
|
||||
String METHOD_NAME_ORDINAL = "ordinal";
|
||||
|
||||
String METHOD_NAME_GETENUMCONSTANTS = "getEnumConstants";
|
||||
|
||||
String METHOD_NAME_CONVERT = "convert";
|
||||
|
||||
String METHOD_NAME_MSGCONVERT = "messageConvert";
|
||||
|
||||
String METHOD_NAME_SETTEMPLATES = "setTemplates";
|
||||
|
||||
String METHOD_NAME_SETCLIENT = "setClient";
|
||||
|
||||
String METHOD_NAME_PACK = "pack";
|
||||
|
||||
String METHOD_NAME_PACKARRAY = "packArray";
|
||||
|
||||
String METHOD_NAME_UNPACK = "unpack";
|
||||
|
||||
String METHOD_NAME_UNPACKBOOLEAN = "unpackBoolean";
|
||||
|
|
@ -207,13 +107,11 @@ public interface Constants {
|
|||
|
||||
String STATEMENT_PACKER_PACKERMETHODBODY_04 = "$1.pack(((java.lang.Enum)_$$_t).ordinal()); ";
|
||||
|
||||
String STATEMENT_PACKER_PACKERMETHODBODY_05 = "if (_$$_nullCheck && $2 == null) { $1.packNil(); return; } ";
|
||||
|
||||
String STATEMENT_TMPL_UNPACKERMETHODBODY_01 = "%s _$$_t = new %s(); ";
|
||||
|
||||
String STATEMENT_TMPL_UNPACKERMETHODBODY_02 = "$1.unpackArray(); ";
|
||||
|
||||
String STATEMENT_TMPL_UNPACKERMETHODBODY_03 = "if (!_$$_nullCheck || !$1.tryUnpackNull()) { _$$_t.%s = %s(%s)_$$_templates[%d].unpack($1)%s; } ";
|
||||
String STATEMENT_TMPL_UNPACKERMETHODBODY_03 = "_$$_t.%s = %s(%s)_$$_templates[%d].unpack($1)%s; ";
|
||||
|
||||
String STATEMENT_TMPL_UNPACKERMETHODBODY_04 = "return _$$_t; ";
|
||||
|
||||
|
|
@ -221,13 +119,9 @@ public interface Constants {
|
|||
|
||||
String STATEMENT_TMPL_UNPACKERMETHODBODY_06 = "return %s.class.getEnumConstants()[i]; ";
|
||||
|
||||
String STATEMENT_TMPL_UNPACKERMETHODBODY_07 = "if (_$$_nullCheck && $1.tryUnpackNull()) { return null; } ";
|
||||
|
||||
String STATEMENT_TMPL_CONVERTMETHODBODY_01 = "%s _$$_ary = $1.asArray(); ";
|
||||
|
||||
String STATEMENT_TMPL_CONVERTMETHODBODY_02 = "if (!_$$_nullCheck || !_$$_ary[%d].isNil()) { _$$_t.%s = %s(%s)_$$_templates[%d].convert(_$$_ary[%d])%s; } ";
|
||||
String STATEMENT_TMPL_CONVERTMETHODBODY_02 = "_$$_t.%s = %s(%s)_$$_templates[%d].convert(_$$_ary[%d])%s; ";
|
||||
|
||||
String STATEMENT_TMPL_CONVERTMETHODBODY_03 = "int i = _$$_ary[0].asInt(); ";
|
||||
|
||||
String STATEMENT_TMPL_CONVERTMETHODBODY_04 = "if (_$$_nullCheck && $1.isNil()) { return null; } ";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package org.msgpack.util.codegen;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
|
@ -27,7 +28,9 @@ import org.msgpack.Template;
|
|||
import org.msgpack.Unpacker;
|
||||
import org.msgpack.annotation.MessagePackDelegate;
|
||||
import org.msgpack.annotation.MessagePackMessage;
|
||||
import org.msgpack.annotation.MessagePackOptional;
|
||||
import org.msgpack.annotation.MessagePackOrdinalEnum;
|
||||
import org.msgpack.template.OptionalTemplate;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
|
|
@ -61,7 +64,8 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
return tmplCache.get(type.getName());
|
||||
}
|
||||
|
||||
public Class<?> generateMessagePackerClass(Class<?> origClass) {
|
||||
public Class<?> generateMessagePackerClass(Class<?> origClass,
|
||||
List<FieldOption> fieldOpts) {
|
||||
try {
|
||||
LOG.debug("start generating a packer class for "
|
||||
+ origClass.getName());
|
||||
|
|
@ -70,10 +74,12 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
checkTypeValidation(origClass);
|
||||
checkDefaultConstructorValidation(origClass);
|
||||
CtClass packerCtClass = pool.makeClass(packerName);
|
||||
setSuperclass(packerCtClass, NullCheckerImpl.class);
|
||||
setInterface(packerCtClass, MessagePacker.class);
|
||||
addDefaultConstructor(packerCtClass);
|
||||
Field[] fields = getDeclaredFields(origClass);
|
||||
if (fieldOpts != null) {
|
||||
fields = sortFields(fields, fieldOpts);
|
||||
}
|
||||
addPackMethod(packerCtClass, origClass, fields, false);
|
||||
Class<?> packerClass = createClass(packerCtClass);
|
||||
LOG.debug("generated a packer class for " + origClass.getName());
|
||||
|
|
@ -95,7 +101,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
String packerName = origName + POSTFIX_TYPE_NAME_PACKER + inc();
|
||||
checkTypeValidation(origClass);
|
||||
CtClass packerCtClass = pool.makeClass(packerName);
|
||||
setSuperclass(packerCtClass, NullCheckerImpl.class);
|
||||
setInterface(packerCtClass, MessagePacker.class);
|
||||
addDefaultConstructor(packerCtClass);
|
||||
addPackMethod(packerCtClass, origClass, null, true);
|
||||
|
|
@ -111,7 +116,8 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
}
|
||||
}
|
||||
|
||||
public Class<?> generateTemplateClass(Class<?> origClass) {
|
||||
public Class<?> generateTemplateClass(Class<?> origClass,
|
||||
List<FieldOption> fieldOpts) {
|
||||
try {
|
||||
LOG.debug("start generating a template class for "
|
||||
+ origClass.getName());
|
||||
|
|
@ -120,11 +126,17 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
checkTypeValidation(origClass);
|
||||
checkDefaultConstructorValidation(origClass);
|
||||
CtClass tmplCtClass = pool.makeClass(tmplName);
|
||||
setSuperclass(tmplCtClass, TemplateTemplate.class);
|
||||
setSuperclass(tmplCtClass, TemplateAccessorImpl.class);
|
||||
setInterface(tmplCtClass, Template.class);
|
||||
addDefaultConstructor(tmplCtClass);
|
||||
Field[] fields = getDeclaredFields(origClass);
|
||||
Template[] tmpls = createTemplates(fields);
|
||||
Template[] tmpls = null;
|
||||
if (fieldOpts != null) {
|
||||
fields = sortFields(fields, fieldOpts);
|
||||
tmpls = createTemplates(fieldOpts);
|
||||
} else {
|
||||
tmpls = createTemplates(fields);
|
||||
}
|
||||
setTemplates(origClass, tmpls);
|
||||
addUnpackMethod(tmplCtClass, origClass, fields, false);
|
||||
addConvertMethod(tmplCtClass, origClass, fields, false);
|
||||
|
|
@ -152,7 +164,7 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
checkTypeValidation(origClass);
|
||||
String tmplName = origName + POSTFIX_TYPE_NAME_TEMPLATE + inc();
|
||||
CtClass tmplCtClass = pool.makeClass(tmplName);
|
||||
setSuperclass(tmplCtClass, TemplateTemplate.class);
|
||||
setSuperclass(tmplCtClass, TemplateAccessorImpl.class);
|
||||
setInterface(tmplCtClass, Template.class);
|
||||
addDefaultConstructor(tmplCtClass);
|
||||
addUnpackMethod(tmplCtClass, origClass, null, true);
|
||||
|
|
@ -240,6 +252,41 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
}
|
||||
}
|
||||
|
||||
Field[] sortFields(Field[] fields, List<FieldOption> fieldOpts) {
|
||||
if (fields.length != fieldOpts.size()) {
|
||||
throwFieldSortingException(String.format(
|
||||
"Mismatch: public field num: %d, option num: %d",
|
||||
new Object[] { fields.length, fieldOpts.size() }));
|
||||
}
|
||||
Field[] sorted = new Field[fields.length];
|
||||
for (int i = 0; i < sorted.length; ++i) {
|
||||
FieldOption opt = fieldOpts.get(i);
|
||||
Field match = null;
|
||||
for (Field f : fields) {
|
||||
if (opt.name.equals(f.getName())) {
|
||||
match = f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (match != null) {
|
||||
sorted[i] = match;
|
||||
} else {
|
||||
throwFieldSortingException(String.format(
|
||||
"Mismatch: a %s field option is not declared",
|
||||
new Object[] { opt.name }));
|
||||
}
|
||||
}
|
||||
return sorted;
|
||||
}
|
||||
|
||||
Template[] createTemplates(List<FieldOption> fieldOpts) {
|
||||
Template[] tmpls = new Template[fieldOpts.size()];
|
||||
for (int i = 0; i < tmpls.length; ++i) {
|
||||
tmpls[i] = fieldOpts.get(i).tmpl;
|
||||
}
|
||||
return tmpls;
|
||||
}
|
||||
|
||||
Template[] createTemplates(Field[] fields) {
|
||||
Template[] tmpls = new Template[fields.length];
|
||||
for (int i = 0; i < tmpls.length; ++i) {
|
||||
|
|
@ -249,12 +296,23 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
}
|
||||
|
||||
Template createTemplate(Field field) {
|
||||
boolean isOptional = isAnnotated(field, MessagePackOptional.class);
|
||||
Class<?> c = field.getType();
|
||||
Template tmpl = null;
|
||||
if (List.class.isAssignableFrom(c) || Map.class.isAssignableFrom(c)) {
|
||||
return createTemplate(field.getGenericType());
|
||||
tmpl = createTemplate(field.getGenericType());
|
||||
} else {
|
||||
return createTemplate(c);
|
||||
tmpl = createTemplate(c);
|
||||
}
|
||||
if (isOptional) {
|
||||
return new OptionalTemplate(tmpl);
|
||||
} else {
|
||||
return tmpl;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isAnnotated(Field field, Class<? extends Annotation> with) {
|
||||
return field.getAnnotation(with) != null;
|
||||
}
|
||||
|
||||
private void addPackMethod(CtClass packerCtClass, Class<?> c, Field[] fs,
|
||||
|
|
@ -297,8 +355,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
// void pack(Packer packer, Object target) throws IOException;
|
||||
sb.append(CHAR_NAME_LEFT_CURLY_BRACKET);
|
||||
sb.append(CHAR_NAME_SPACE);
|
||||
Object[] args2 = new Object[0];
|
||||
sb.append(String.format(STATEMENT_PACKER_PACKERMETHODBODY_05, args2));
|
||||
String typeName = classToString(type);
|
||||
Object[] args0 = new Object[] { typeName, typeName };
|
||||
sb.append(String.format(STATEMENT_PACKER_PACKERMETHODBODY_01, args0));
|
||||
|
|
@ -357,8 +413,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
// void pack(Packer packer, Object target) throws IOException;
|
||||
sb.append(CHAR_NAME_LEFT_CURLY_BRACKET);
|
||||
sb.append(CHAR_NAME_SPACE);
|
||||
Object[] args3 = new Object[0];
|
||||
sb.append(String.format(STATEMENT_PACKER_PACKERMETHODBODY_05, args3));
|
||||
String typeName = classToString(c);
|
||||
Object[] args0 = new Object[] { typeName, typeName };
|
||||
sb.append(String.format(STATEMENT_PACKER_PACKERMETHODBODY_01, args0));
|
||||
|
|
@ -412,8 +466,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
sb.append(CHAR_NAME_SPACE);
|
||||
// Foo _$$_t = new Foo();
|
||||
String typeName = classToString(type);
|
||||
Object[] args3 = new Object[0];
|
||||
sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_07, args3));
|
||||
Object[] args0 = new Object[] { typeName, typeName };
|
||||
sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_01, args0));
|
||||
// $1.unpackArray();
|
||||
|
|
@ -453,8 +505,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
// Object unpack(Unpacker u) throws IOException, MessageTypeException;
|
||||
sb.append(CHAR_NAME_LEFT_CURLY_BRACKET);
|
||||
sb.append(CHAR_NAME_SPACE);
|
||||
Object[] args3 = new Object[0];
|
||||
sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_07, args3));
|
||||
// $1.unpackArray();
|
||||
Object[] args0 = new Object[0];
|
||||
sb.append(String.format(STATEMENT_TMPL_UNPACKERMETHODBODY_02, args0));
|
||||
|
|
@ -506,8 +556,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
// Object convert(MessagePackObject mpo) throws MessageTypeException;
|
||||
sb.append(CHAR_NAME_LEFT_CURLY_BRACKET);
|
||||
sb.append(CHAR_NAME_SPACE);
|
||||
Object[] args3 = new Object[0];
|
||||
sb.append(String.format(STATEMENT_TMPL_CONVERTMETHODBODY_04, args3));
|
||||
// Foo _$$_t = new Foo();
|
||||
String typeName = classToString(type);
|
||||
Object[] args0 = new Object[] { typeName, typeName };
|
||||
|
|
@ -533,7 +581,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
Class<?> returnType = field.getType();
|
||||
boolean isPrim = returnType.isPrimitive();
|
||||
Object[] args = new Object[] {
|
||||
i,
|
||||
field.getName(),
|
||||
isPrim ? "(" : "",
|
||||
isPrim ? getPrimToWrapperType(returnType).getName()
|
||||
|
|
@ -550,8 +597,6 @@ class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||
// Object convert(MessagePackObject mpo) throws MessageTypeException;
|
||||
sb.append(CHAR_NAME_LEFT_CURLY_BRACKET);
|
||||
sb.append(CHAR_NAME_SPACE);
|
||||
Object[] args3 = new Object[0];
|
||||
sb.append(String.format(STATEMENT_TMPL_CONVERTMETHODBODY_04, args3));
|
||||
// MessagePackObject[] _$$_ary = $1.asArray();
|
||||
Object[] args0 = new Object[] { classToString(MessagePackObject[].class) };
|
||||
sb.append(String.format(STATEMENT_TMPL_CONVERTMETHODBODY_01, args0));
|
||||
|
|
|
|||
|
|
@ -41,10 +41,6 @@ public class DynamicCodeGenBase implements Constants {
|
|||
private static Logger LOG = LoggerFactory
|
||||
.getLogger(DynamicCodeGenBase.class);
|
||||
|
||||
public static interface NullChecker {
|
||||
void setNullCheck(boolean nullCheck);
|
||||
}
|
||||
|
||||
public static class MessageUnpackableConvertableTemplate implements
|
||||
Template {
|
||||
|
||||
|
|
@ -86,23 +82,13 @@ public class DynamicCodeGenBase implements Constants {
|
|||
throw new MessageTypeException(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class NullCheckerImpl implements NullChecker {
|
||||
public boolean _$$_nullCheck = true;
|
||||
|
||||
public void setNullCheck(boolean _$$_check) {
|
||||
_$$_nullCheck = _$$_check;
|
||||
}
|
||||
}
|
||||
|
||||
public static interface TemplateAccessor {
|
||||
void setTemplates(Template[] templates);
|
||||
}
|
||||
|
||||
public static class TemplateTemplate extends NullCheckerImpl implements
|
||||
TemplateAccessor {
|
||||
public static class TemplateAccessorImpl implements TemplateAccessor {
|
||||
public Template[] _$$_templates;
|
||||
|
||||
public void setTemplates(Template[] _$$_tmpls) {
|
||||
|
|
@ -160,6 +146,12 @@ public class DynamicCodeGenBase implements Constants {
|
|||
throw e;
|
||||
}
|
||||
|
||||
protected void throwFieldSortingException(String message) {
|
||||
DynamicCodeGenException e = new DynamicCodeGenException(message);
|
||||
LOG.debug(e.getMessage(), e);
|
||||
throw e;
|
||||
}
|
||||
|
||||
protected static void throwMethodValidationException(Method method,
|
||||
String message) throws DynamicCodeGenException {
|
||||
DynamicCodeGenException e = new DynamicCodeGenException(String.format(
|
||||
|
|
@ -207,7 +199,7 @@ public class DynamicCodeGenBase implements Constants {
|
|||
|
||||
protected void addTemplateArrayField(CtClass newCtClass)
|
||||
throws NotFoundException, CannotCompileException {
|
||||
CtClass acsCtClass = pool.get(TemplateTemplate.class.getName());
|
||||
CtClass acsCtClass = pool.get(TemplateAccessorImpl.class.getName());
|
||||
CtField tmplsField = acsCtClass
|
||||
.getDeclaredField(VARIABLE_NAME_TEMPLATES);
|
||||
CtField tmplsField2 = new CtField(tmplsField.getType(), tmplsField
|
||||
|
|
@ -217,7 +209,7 @@ public class DynamicCodeGenBase implements Constants {
|
|||
|
||||
protected void addSetTemplatesMethod(CtClass newCtClass)
|
||||
throws NotFoundException, CannotCompileException {
|
||||
CtClass acsCtClass = pool.get(TemplateTemplate.class.getName());
|
||||
CtClass acsCtClass = pool.get(TemplateAccessorImpl.class.getName());
|
||||
CtMethod settmplsMethod = acsCtClass
|
||||
.getDeclaredMethod(METHOD_NAME_SETTEMPLATES);
|
||||
CtMethod settmplsMethod2 = CtNewMethod.copy(settmplsMethod, newCtClass,
|
||||
|
|
@ -425,8 +417,7 @@ public class DynamicCodeGenBase implements Constants {
|
|||
Class<?> t = getArrayBaseType(type);
|
||||
sb.append(t.getName());
|
||||
for (int i = 0; i < dim; ++i) {
|
||||
sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
|
||||
sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
|
||||
sb.append(STRING_NAME_LEFT_RIGHT_SQUARE_BRACKET);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package org.msgpack.util.codegen;
|
||||
|
||||
@SuppressWarnings("serial")
|
||||
public class DynamicCodeGenException extends RuntimeException {
|
||||
|
||||
public DynamicCodeGenException(String reason) {
|
||||
|
|
|
|||
|
|
@ -1,9 +1,16 @@
|
|||
package org.msgpack.util.codegen;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.msgpack.MessageConverter;
|
||||
|
||||
public class DynamicConverter {
|
||||
public static MessageConverter create(Class<?> c) {
|
||||
return DynamicTemplate.create(c);
|
||||
return create(c, null);
|
||||
}
|
||||
|
||||
public static MessageConverter create(Class<?> c,
|
||||
List<FieldOption> fieldOpts) {
|
||||
return DynamicTemplate.create(c, fieldOpts);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,19 @@
|
|||
package org.msgpack.util.codegen;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.msgpack.MessagePacker;
|
||||
|
||||
public class DynamicPacker {
|
||||
|
||||
public static MessagePacker create(Class<?> c) {
|
||||
return create(c, null);
|
||||
}
|
||||
|
||||
public static MessagePacker create(Class<?> c, List<FieldOption> fieldOpts) {
|
||||
try {
|
||||
DynamicCodeGen gen = DynamicCodeGen.getInstance();
|
||||
Class<?> packerClass = gen.generateMessagePackerClass(c);
|
||||
Class<?> packerClass = gen.generateMessagePackerClass(c, fieldOpts);
|
||||
return (MessagePacker) packerClass.newInstance();
|
||||
} catch (InstantiationException e) {
|
||||
throw new DynamicCodeGenException(e.getMessage(), e);
|
||||
|
|
|
|||
|
|
@ -1,13 +1,19 @@
|
|||
package org.msgpack.util.codegen;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.msgpack.Template;
|
||||
import org.msgpack.util.codegen.DynamicCodeGenBase.TemplateAccessor;
|
||||
|
||||
public class DynamicTemplate {
|
||||
public static Template create(Class<?> c) {
|
||||
return create(c, null);
|
||||
}
|
||||
|
||||
public static Template create(Class<?> c, List<FieldOption> fieldOpts) {
|
||||
try {
|
||||
DynamicCodeGen gen = DynamicCodeGen.getInstance();
|
||||
Class<?> tmplClass = gen.generateTemplateClass(c);
|
||||
Class<?> tmplClass = gen.generateTemplateClass(c, fieldOpts);
|
||||
Object obj = tmplClass.newInstance();
|
||||
((TemplateAccessor) obj).setTemplates(gen.getTemplates(c));
|
||||
return (Template) obj;
|
||||
|
|
|
|||
|
|
@ -1,9 +1,15 @@
|
|||
package org.msgpack.util.codegen;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.msgpack.MessageUnpacker;
|
||||
|
||||
public class DynamicUnpacker {
|
||||
public static MessageUnpacker create(Class<?> c) {
|
||||
return DynamicTemplate.create(c);
|
||||
return create(c, null);
|
||||
}
|
||||
|
||||
public static MessageUnpacker create(Class<?> c, List<FieldOption> fieldOpts) {
|
||||
return DynamicTemplate.create(c, fieldOpts);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,22 @@ import org.msgpack.Template;
|
|||
|
||||
public class FieldOption {
|
||||
|
||||
public String name;
|
||||
|
||||
public Template tmpl;
|
||||
private static final String NULL_ERR_MSG = "param is FieldOption is null.";
|
||||
|
||||
String name;
|
||||
|
||||
Template tmpl;
|
||||
|
||||
public FieldOption(final String name, final Template tmpl) {
|
||||
if (name == null) {
|
||||
throw new NullPointerException(String.format("%s %s", new Object[] {
|
||||
"1st", NULL_ERR_MSG }));
|
||||
}
|
||||
if (tmpl == null) {
|
||||
throw new NullPointerException(String.format("%s %s", new Object[] {
|
||||
"2nd", NULL_ERR_MSG }));
|
||||
}
|
||||
this.name = name;
|
||||
this.tmpl = tmpl;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue