From 562d50df4dcc44c80b946279f3e0ba5c75affebf Mon Sep 17 00:00:00 2001 From: Muga Nishizawa Date: Thu, 7 Oct 2010 13:01:06 +0900 Subject: [PATCH] java: refactor several programs in a org.msgpack.util.codegen package --- .../msgpack/util/codegen/DynamicCodeGen.java | 70 ++++++++----------- .../util/codegen/DynamicCodeGenBase.java | 30 +++++++- .../util/codegen/DynamicCodeGenTemplate.java | 2 +- 3 files changed, 60 insertions(+), 42 deletions(-) diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java index 1877607e..1b4cb91e 100644 --- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java +++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGen.java @@ -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(); diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java index 2e5b204b..533a8bc0 100644 --- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java +++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenBase.java @@ -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 diff --git a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java index 98a1f8d5..2a9e5842 100644 --- a/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java +++ b/java/src/main/java/org/msgpack/util/codegen/DynamicCodeGenTemplate.java @@ -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);