java: refactor several programs in a org.msgpack.util.codegen package

This commit is contained in:
Muga Nishizawa 2010-10-07 13:01:06 +09:00
parent 3dc1048dfb
commit 562d50df4d
3 changed files with 60 additions and 42 deletions

View File

@ -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();

View File

@ -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

View File

@ -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);