mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-21 15:10:01 +01:00
java: refactor several programs in a org.msgpack.util.codegen package
This commit is contained in:
parent
3dc1048dfb
commit
562d50df4d
@ -128,14 +128,15 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
||||
checkClassValidation(origClass);
|
||||
checkDefaultConstructorValidation(origClass);
|
||||
CtClass tmplCtClass = pool.makeClass(tmplName);
|
||||
CtClass acsCtClass = pool.get(TemplateAccessorImpl.class.getName());
|
||||
setInterface(tmplCtClass, Template.class);
|
||||
setInterface(tmplCtClass, DynamicCodeGenBase.TemplateAccessor.class);
|
||||
addDefaultConstructor(tmplCtClass);
|
||||
Field[] fields = getDeclaredFields(origClass);
|
||||
Template[] tmpls = createTemplates(fields);
|
||||
setTemplates(origClass, tmpls);
|
||||
addTemplateArrayField(tmplCtClass, origClass);
|
||||
addSetTemplatesMethod(tmplCtClass, origClass);
|
||||
addTemplateArrayField(tmplCtClass, acsCtClass);
|
||||
addSetTemplatesMethod(tmplCtClass, acsCtClass);
|
||||
addUnpackMethod(tmplCtClass, origClass, fields);
|
||||
addConvertMethod(tmplCtClass, origClass, fields);
|
||||
return createClass(tmplCtClass);
|
||||
@ -153,9 +154,8 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
||||
+ origClass.getName());
|
||||
try {
|
||||
String origName = origClass.getName();
|
||||
String tmplName = origName + POSTFIX_TYPE_NAME_TEMPLATE + inc();
|
||||
checkClassValidation(origClass);
|
||||
CtClass tmplCtClass = pool.makeClass(tmplName);
|
||||
CtClass tmplCtClass = makeClass(origName);
|
||||
setInterface(tmplCtClass, Template.class);
|
||||
addDefaultConstructor(tmplCtClass);
|
||||
addUnpackMethodForOrdinalEnumTypes(tmplCtClass, origClass);
|
||||
@ -170,6 +170,17 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
||||
}
|
||||
}
|
||||
|
||||
private CtClass makeClass(String origName) throws NotFoundException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append(origName);
|
||||
sb.append(POSTFIX_TYPE_NAME_TEMPLATE);
|
||||
sb.append(inc());
|
||||
String invokerName = sb.toString();
|
||||
CtClass newCtClass = pool.makeClass(invokerName);
|
||||
newCtClass.setModifiers(Modifier.PUBLIC);
|
||||
return newCtClass;
|
||||
}
|
||||
|
||||
private void checkClassValidation(Class<?> origClass) {
|
||||
// not public, abstract
|
||||
int mod = origClass.getModifiers();
|
||||
@ -405,46 +416,25 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
||||
}
|
||||
}
|
||||
|
||||
private void addTemplateArrayField(CtClass newCtClass, Class<?> origClass) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
addPublicFieldDecl(sb, Template.class, VARIABLE_NAME_TEMPLATES, 1);
|
||||
insertSemicolon(sb);
|
||||
LOG.trace("templates field src: " + sb.toString());
|
||||
try {
|
||||
CtField templatesCtField = CtField.make(sb.toString(), newCtClass);
|
||||
newCtClass.addField(templatesCtField);
|
||||
} catch (CannotCompileException e) {
|
||||
DynamicCodeGenException ex = new DynamicCodeGenException(e
|
||||
.getMessage()
|
||||
+ ": " + sb.toString(), e);
|
||||
LOG.error(ex.getMessage(), ex);
|
||||
throw ex;
|
||||
}
|
||||
private void addTemplateArrayField(CtClass newCtClass, CtClass acsCtClass)
|
||||
throws NotFoundException, CannotCompileException {
|
||||
CtField tmplsField = acsCtClass
|
||||
.getDeclaredField(VARIABLE_NAME_TEMPLATES);
|
||||
CtField tmplsField2 = new CtField(tmplsField.getType(), tmplsField
|
||||
.getName(), newCtClass);
|
||||
newCtClass.addField(tmplsField2);
|
||||
}
|
||||
|
||||
private void addSetTemplatesMethod(CtClass newCtClass, Class<?> origClass) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
StringBuilder body = new StringBuilder();
|
||||
body.append("_$$_templates = _$$_tmpls;");
|
||||
addPublicMethodDecl(sb, METHOD_NAME_SETTEMPLATES, void.class,
|
||||
new Class<?>[] { Template.class }, new int[] { 1 },
|
||||
new String[] { VARIABLE_NAME_TEMPLATES0 }, new Class<?>[0],
|
||||
body.toString());
|
||||
LOG.trace("settemplates method src: " + sb.toString());
|
||||
try {
|
||||
CtMethod newCtMethod = CtNewMethod.make(sb.toString(), newCtClass);
|
||||
newCtClass.addMethod(newCtMethod);
|
||||
} catch (CannotCompileException e) {
|
||||
DynamicCodeGenException ex = new DynamicCodeGenException(e
|
||||
.getMessage()
|
||||
+ ": " + sb.toString(), e);
|
||||
LOG.error(ex.getMessage(), ex);
|
||||
throw ex;
|
||||
}
|
||||
private void addSetTemplatesMethod(CtClass newCtClass, CtClass acsCtClass)
|
||||
throws NotFoundException, CannotCompileException {
|
||||
CtMethod settmplsMethod = acsCtClass
|
||||
.getDeclaredMethod(METHOD_NAME_SETTEMPLATES);
|
||||
CtMethod settmplsMethod2 = CtNewMethod.copy(settmplsMethod, newCtClass,
|
||||
null);
|
||||
newCtClass.addMethod(settmplsMethod2);
|
||||
}
|
||||
|
||||
private void addUnpackMethod(CtClass unpackerCtClass, Class<?> c, Field[] fs)
|
||||
throws CannotCompileException, NotFoundException {
|
||||
private void addUnpackMethod(CtClass unpackerCtClass, Class<?> c, Field[] fs) {
|
||||
// Object unpack(Unpacker pac) throws IOException, MessageTypeException;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
StringBuilder bsb = new StringBuilder();
|
||||
|
@ -21,6 +21,14 @@ public class DynamicCodeGenBase implements BasicConstants {
|
||||
public static interface TemplateAccessor {
|
||||
void setTemplates(Template[] templates);
|
||||
}
|
||||
|
||||
public static class TemplateAccessorImpl implements TemplateAccessor {
|
||||
public Template[] _$$_templates;
|
||||
|
||||
public void setTemplates(Template[] _$$_tmpls) {
|
||||
_$$_templates = _$$_tmpls;
|
||||
}
|
||||
}
|
||||
|
||||
private static Logger LOG = LoggerFactory
|
||||
.getLogger(DynamicCodeGenBase.class);
|
||||
@ -114,7 +122,11 @@ public class DynamicCodeGenBase implements BasicConstants {
|
||||
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
|
||||
String name, int dim) {
|
||||
// int[] lv
|
||||
sb.append(type.getName());
|
||||
if (type.equals(byte[].class)) {
|
||||
sb.append("byte[]");
|
||||
} else {
|
||||
sb.append(type.getName());
|
||||
}
|
||||
for (int i = 0; i < dim; ++i) {
|
||||
sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
|
||||
sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
|
||||
@ -122,6 +134,22 @@ public class DynamicCodeGenBase implements BasicConstants {
|
||||
sb.append(CHAR_NAME_SPACE);
|
||||
sb.append(name);
|
||||
}
|
||||
|
||||
static int getArrayDim(Class<?> type) {
|
||||
if (type.isArray()) {
|
||||
return 1 + getArrayDim(type.getComponentType());
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static Class<?> getArrayBaseType(Class<?> type) {
|
||||
if (type.isArray()) {
|
||||
return getArrayBaseType(type.getComponentType());
|
||||
} else {
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
public void insertValueInsertion(StringBuilder sb, String expr) {
|
||||
// = expr
|
||||
|
@ -9,7 +9,7 @@ public class DynamicCodeGenTemplate {
|
||||
DynamicCodeGen gen = DynamicCodeGen.getInstance();
|
||||
Class<?> tmplClass = gen.generateTemplateClass(c);
|
||||
Object obj = tmplClass.newInstance();
|
||||
((DynamicCodeGenBase.TemplateAccessor)obj).setTemplates(gen.getTemplates(c));
|
||||
((TemplateAccessor) obj).setTemplates(gen.getTemplates(c));
|
||||
return (Template) obj;
|
||||
} catch (InstantiationException e) {
|
||||
throw new DynamicCodeGenException(e.getMessage(), e);
|
||||
|
Loading…
x
Reference in New Issue
Block a user