mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-23 01:08:20 +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);
|
checkClassValidation(origClass);
|
||||||
checkDefaultConstructorValidation(origClass);
|
checkDefaultConstructorValidation(origClass);
|
||||||
CtClass tmplCtClass = pool.makeClass(tmplName);
|
CtClass tmplCtClass = pool.makeClass(tmplName);
|
||||||
|
CtClass acsCtClass = pool.get(TemplateAccessorImpl.class.getName());
|
||||||
setInterface(tmplCtClass, Template.class);
|
setInterface(tmplCtClass, Template.class);
|
||||||
setInterface(tmplCtClass, DynamicCodeGenBase.TemplateAccessor.class);
|
setInterface(tmplCtClass, DynamicCodeGenBase.TemplateAccessor.class);
|
||||||
addDefaultConstructor(tmplCtClass);
|
addDefaultConstructor(tmplCtClass);
|
||||||
Field[] fields = getDeclaredFields(origClass);
|
Field[] fields = getDeclaredFields(origClass);
|
||||||
Template[] tmpls = createTemplates(fields);
|
Template[] tmpls = createTemplates(fields);
|
||||||
setTemplates(origClass, tmpls);
|
setTemplates(origClass, tmpls);
|
||||||
addTemplateArrayField(tmplCtClass, origClass);
|
addTemplateArrayField(tmplCtClass, acsCtClass);
|
||||||
addSetTemplatesMethod(tmplCtClass, origClass);
|
addSetTemplatesMethod(tmplCtClass, acsCtClass);
|
||||||
addUnpackMethod(tmplCtClass, origClass, fields);
|
addUnpackMethod(tmplCtClass, origClass, fields);
|
||||||
addConvertMethod(tmplCtClass, origClass, fields);
|
addConvertMethod(tmplCtClass, origClass, fields);
|
||||||
return createClass(tmplCtClass);
|
return createClass(tmplCtClass);
|
||||||
@ -153,9 +154,8 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||||||
+ origClass.getName());
|
+ origClass.getName());
|
||||||
try {
|
try {
|
||||||
String origName = origClass.getName();
|
String origName = origClass.getName();
|
||||||
String tmplName = origName + POSTFIX_TYPE_NAME_TEMPLATE + inc();
|
|
||||||
checkClassValidation(origClass);
|
checkClassValidation(origClass);
|
||||||
CtClass tmplCtClass = pool.makeClass(tmplName);
|
CtClass tmplCtClass = makeClass(origName);
|
||||||
setInterface(tmplCtClass, Template.class);
|
setInterface(tmplCtClass, Template.class);
|
||||||
addDefaultConstructor(tmplCtClass);
|
addDefaultConstructor(tmplCtClass);
|
||||||
addUnpackMethodForOrdinalEnumTypes(tmplCtClass, origClass);
|
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) {
|
private void checkClassValidation(Class<?> origClass) {
|
||||||
// not public, abstract
|
// not public, abstract
|
||||||
int mod = origClass.getModifiers();
|
int mod = origClass.getModifiers();
|
||||||
@ -405,46 +416,25 @@ public class DynamicCodeGen extends DynamicCodeGenBase implements Constants {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addTemplateArrayField(CtClass newCtClass, Class<?> origClass) {
|
private void addTemplateArrayField(CtClass newCtClass, CtClass acsCtClass)
|
||||||
StringBuilder sb = new StringBuilder();
|
throws NotFoundException, CannotCompileException {
|
||||||
addPublicFieldDecl(sb, Template.class, VARIABLE_NAME_TEMPLATES, 1);
|
CtField tmplsField = acsCtClass
|
||||||
insertSemicolon(sb);
|
.getDeclaredField(VARIABLE_NAME_TEMPLATES);
|
||||||
LOG.trace("templates field src: " + sb.toString());
|
CtField tmplsField2 = new CtField(tmplsField.getType(), tmplsField
|
||||||
try {
|
.getName(), newCtClass);
|
||||||
CtField templatesCtField = CtField.make(sb.toString(), newCtClass);
|
newCtClass.addField(tmplsField2);
|
||||||
newCtClass.addField(templatesCtField);
|
|
||||||
} catch (CannotCompileException e) {
|
|
||||||
DynamicCodeGenException ex = new DynamicCodeGenException(e
|
|
||||||
.getMessage()
|
|
||||||
+ ": " + sb.toString(), e);
|
|
||||||
LOG.error(ex.getMessage(), ex);
|
|
||||||
throw ex;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addSetTemplatesMethod(CtClass newCtClass, Class<?> origClass) {
|
private void addSetTemplatesMethod(CtClass newCtClass, CtClass acsCtClass)
|
||||||
StringBuilder sb = new StringBuilder();
|
throws NotFoundException, CannotCompileException {
|
||||||
StringBuilder body = new StringBuilder();
|
CtMethod settmplsMethod = acsCtClass
|
||||||
body.append("_$$_templates = _$$_tmpls;");
|
.getDeclaredMethod(METHOD_NAME_SETTEMPLATES);
|
||||||
addPublicMethodDecl(sb, METHOD_NAME_SETTEMPLATES, void.class,
|
CtMethod settmplsMethod2 = CtNewMethod.copy(settmplsMethod, newCtClass,
|
||||||
new Class<?>[] { Template.class }, new int[] { 1 },
|
null);
|
||||||
new String[] { VARIABLE_NAME_TEMPLATES0 }, new Class<?>[0],
|
newCtClass.addMethod(settmplsMethod2);
|
||||||
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 addUnpackMethod(CtClass unpackerCtClass, Class<?> c, Field[] fs)
|
private void addUnpackMethod(CtClass unpackerCtClass, Class<?> c, Field[] fs) {
|
||||||
throws CannotCompileException, NotFoundException {
|
|
||||||
// Object unpack(Unpacker pac) throws IOException, MessageTypeException;
|
// Object unpack(Unpacker pac) throws IOException, MessageTypeException;
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
StringBuilder bsb = new StringBuilder();
|
StringBuilder bsb = new StringBuilder();
|
||||||
|
@ -21,6 +21,14 @@ public class DynamicCodeGenBase implements BasicConstants {
|
|||||||
public static interface TemplateAccessor {
|
public static interface TemplateAccessor {
|
||||||
void setTemplates(Template[] templates);
|
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
|
private static Logger LOG = LoggerFactory
|
||||||
.getLogger(DynamicCodeGenBase.class);
|
.getLogger(DynamicCodeGenBase.class);
|
||||||
@ -114,7 +122,11 @@ public class DynamicCodeGenBase implements BasicConstants {
|
|||||||
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
|
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
|
||||||
String name, int dim) {
|
String name, int dim) {
|
||||||
// int[] lv
|
// 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) {
|
for (int i = 0; i < dim; ++i) {
|
||||||
sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
|
sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
|
||||||
sb.append(CHAR_NAME_RIGHT_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(CHAR_NAME_SPACE);
|
||||||
sb.append(name);
|
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) {
|
public void insertValueInsertion(StringBuilder sb, String expr) {
|
||||||
// = expr
|
// = expr
|
||||||
|
@ -9,7 +9,7 @@ public class DynamicCodeGenTemplate {
|
|||||||
DynamicCodeGen gen = DynamicCodeGen.getInstance();
|
DynamicCodeGen gen = DynamicCodeGen.getInstance();
|
||||||
Class<?> tmplClass = gen.generateTemplateClass(c);
|
Class<?> tmplClass = gen.generateTemplateClass(c);
|
||||||
Object obj = tmplClass.newInstance();
|
Object obj = tmplClass.newInstance();
|
||||||
((DynamicCodeGenBase.TemplateAccessor)obj).setTemplates(gen.getTemplates(c));
|
((TemplateAccessor) obj).setTemplates(gen.getTemplates(c));
|
||||||
return (Template) obj;
|
return (Template) obj;
|
||||||
} catch (InstantiationException e) {
|
} catch (InstantiationException e) {
|
||||||
throw new DynamicCodeGenException(e.getMessage(), e);
|
throw new DynamicCodeGenException(e.getMessage(), e);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user