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

This commit is contained in:
Muga Nishizawa 2010-10-05 20:45:51 +09:00
parent a85f6e72fe
commit b01c270889
11 changed files with 361 additions and 775 deletions

View File

@ -37,7 +37,7 @@ public interface BasicConstants {
String CHAR_NAME_PLUS = "+";
String CHAR_NAME_MINUS = "-";
String CHAR_NAME_UNDERSCORE = "_";
String CHAR_NAME_LESSTHAN = "<";
@ -82,6 +82,10 @@ public interface BasicConstants {
String VARIABLE_NAME_I = "i";
String VARIABLE_NAME_TEMPLATES = "_$$_templates";
String VARIABLE_NAME_TEMPLATES0 = "_$$_tmpls";
String METHOD_NAME_VALUEOF = "valueOf";
String METHOD_NAME_ADD = "add";
@ -108,6 +112,8 @@ public interface BasicConstants {
String METHOD_NAME_MSGCONVERT = "messageConvert";
String METHOD_NAME_SETTEMPLATES = "setTemplates";
String METHOD_NAME_PACK = "pack";
String METHOD_NAME_PACKARRAY = "packArray";

View File

@ -1,17 +1,46 @@
package org.msgpack.util.codegen;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import org.msgpack.CustomConverter;
import org.msgpack.CustomMessage;
import org.msgpack.Template;
import org.msgpack.Templates;
import org.msgpack.annotation.MessagePackDelegate;
import org.msgpack.annotation.MessagePackMessage;
import org.msgpack.annotation.MessagePackOrdinalEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class DynamicCodeGenBase implements BasicConstants {
public static interface TemplateAccessor {
void setTemplates(Template[] templates);
}
private static Logger LOG = LoggerFactory
.getLogger(DynamicCodeGenBase.class);
public DynamicCodeGenBase() {
}
public void addPublicFieldDecl(StringBuilder sb, Class<?> type, String name) {
addPublicFieldDecl(sb, type, name, 0);
}
public void addPublicFieldDecl(StringBuilder sb, Class<?> type,
String name, int dim) {
sb.append(KEYWORD_MODIFIER_PUBLIC);
sb.append(CHAR_NAME_SPACE);
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);
}
sb.append(CHAR_NAME_SPACE);
sb.append(name);
}
@ -19,6 +48,17 @@ public class DynamicCodeGenBase implements BasicConstants {
public void addPublicMethodDecl(StringBuilder sb, String mname,
Class<?> returnType, Class<?>[] paramTypes, String[] anames,
Class<?>[] exceptTypes, String methodBody) {
int[] dims = new int[paramTypes.length];
for (int i = 0; i < paramTypes.length; ++i) {
dims[i] = 0;
}
addPublicMethodDecl(sb, mname, returnType, paramTypes, dims, anames,
exceptTypes, methodBody);
}
public void addPublicMethodDecl(StringBuilder sb, String mname,
Class<?> returnType, Class<?>[] paramTypes, int[] dims,
String[] anames, Class<?>[] exceptTypes, String methodBody) {
sb.append(KEYWORD_MODIFIER_PUBLIC);
sb.append(CHAR_NAME_SPACE);
sb.append(returnType.getName());
@ -27,6 +67,10 @@ public class DynamicCodeGenBase implements BasicConstants {
sb.append(CHAR_NAME_LEFT_PARENTHESIS);
for (int i = 0; i < paramTypes.length; ++i) {
sb.append(paramTypes[i].getName());
for (int j = 0; j < dims[i]; ++j) {
sb.append(CHAR_NAME_LEFT_SQUARE_BRACKET);
sb.append(CHAR_NAME_RIGHT_SQUARE_BRACKET);
}
sb.append(CHAR_NAME_SPACE);
sb.append(anames[i]);
if (i + 1 != paramTypes.length) {
@ -36,16 +80,18 @@ public class DynamicCodeGenBase implements BasicConstants {
}
sb.append(CHAR_NAME_RIGHT_PARENTHESIS);
sb.append(CHAR_NAME_SPACE);
sb.append(KEYWORD_THROWS);
sb.append(CHAR_NAME_SPACE);
for (int i = 0; i < exceptTypes.length; ++i) {
sb.append(exceptTypes[i].getName());
if (i + 1 != exceptTypes.length) {
sb.append(CHAR_NAME_COMMA);
sb.append(CHAR_NAME_SPACE);
if (exceptTypes.length != 0) {
sb.append(KEYWORD_THROWS);
sb.append(CHAR_NAME_SPACE);
for (int i = 0; i < exceptTypes.length; ++i) {
sb.append(exceptTypes[i].getName());
if (i + 1 != exceptTypes.length) {
sb.append(CHAR_NAME_COMMA);
sb.append(CHAR_NAME_SPACE);
}
}
sb.append(CHAR_NAME_SPACE);
}
sb.append(CHAR_NAME_SPACE);
sb.append(CHAR_NAME_LEFT_CURLY_BRACKET);
sb.append(CHAR_NAME_SPACE);
sb.append(methodBody);
@ -64,7 +110,7 @@ public class DynamicCodeGenBase implements BasicConstants {
// int lv
insertLocalVariableDecl(sb, type, name, 0);
}
public void insertLocalVariableDecl(StringBuilder sb, Class<?> type,
String name, int dim) {
// int[] lv
@ -84,9 +130,9 @@ public class DynamicCodeGenBase implements BasicConstants {
sb.append(CHAR_NAME_SPACE);
sb.append(expr);
}
public void insertInsertion(StringBuilder sb) {
// =
// =
sb.append(CHAR_NAME_SPACE);
sb.append(CHAR_NAME_EQUAL);
sb.append(CHAR_NAME_SPACE);
@ -272,4 +318,76 @@ public class DynamicCodeGenBase implements BasicConstants {
throw new DynamicCodeGenException("Type error: " + c.getName());
}
}
public Template createTemplate(Type t) {
if (t.getClass().equals(Class.class)) {
Class<?> c = (Class<?>) t;
if (c.equals(boolean.class) || c.equals(Boolean.class)) {
return Templates.tBoolean();
} else if (c.equals(byte.class) || c.equals(Byte.class)) {
return Templates.tByte();
} else if (c.equals(short.class) || c.equals(Short.class)) {
return Templates.tShort();
} else if (c.equals(int.class) || c.equals(Integer.class)) {
return Templates.tInteger();
} else if (c.equals(float.class) || c.equals(Float.class)) {
return Templates.tFloat();
} else if (c.equals(long.class) || c.equals(Long.class)) {
return Templates.tLong();
} else if (c.equals(double.class) || c.equals(Double.class)) {
return Templates.tDouble();
} else if (c.equals(String.class)) {
return Templates.tString();
} else if (c.equals(BigInteger.class)) {
return Templates.tBigInteger();
} else if (CustomConverter.isRegistered(c)) {
return (Template) CustomConverter.get(c);
} else if (CustomMessage.isAnnotated(c, MessagePackMessage.class)) {
// @MessagePackMessage
Template tmpl = DynamicCodeGenTemplate.create(c);
CustomMessage.registerTemplate(c, tmpl);
return tmpl;
} else if (CustomMessage.isAnnotated(c, MessagePackDelegate.class)) {
// FIXME DelegatePacker
UnsupportedOperationException e = new UnsupportedOperationException(
"not supported yet. : " + c.getName());
LOG.error(e.getMessage(), e);
throw e;
} else if (CustomMessage.isAnnotated(c,
MessagePackOrdinalEnum.class)) {
// @MessagePackOrdinalEnum
Template tmpl = DynamicCodeGenOrdinalEnumTemplate.create(c);
CustomMessage.registerTemplate(c, tmpl);
return tmpl;
} else {
throw new DynamicCodeGenException("Type error: "
+ ((Class<?>) t).getName());
}
} else if (t instanceof GenericArrayType) {
GenericArrayType gat = (GenericArrayType) t;
Type gct = gat.getGenericComponentType();
if (gct.equals(byte.class)) {
return Templates.tByteArray();
} else {
throw new DynamicCodeGenException("Not supported yet: " + gat);
}
} else if (t instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) t;
Class<?> rawType = (Class<?>) pt.getRawType();
if (rawType.equals(List.class)) {
Type[] ats = pt.getActualTypeArguments();
return Templates.tList(createTemplate(ats[0]));
} else if (rawType.equals(Map.class)) {
Type[] ats = pt.getActualTypeArguments();
return Templates.tMap(createTemplate(ats[0]),
createTemplate(ats[1]));
} else {
throw new DynamicCodeGenException("Type error: "
+ t.getClass().getName());
}
} else {
throw new DynamicCodeGenException("Type error: "
+ t.getClass().getName());
}
}
}

View File

@ -4,14 +4,6 @@ import org.msgpack.MessageConverter;
public class DynamicCodeGenConverter {
public static MessageConverter create(Class<?> c) {
try {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> unpackerClass = gen.generateMessageConverterClass(c);
return (MessageConverter) unpackerClass.newInstance();
} catch (InstantiationException e) {
throw new DynamicCodeGenException(e.getMessage(), e);
} catch (IllegalAccessException e) {
throw new DynamicCodeGenException(e.getMessage(), e);
}
return DynamicCodeGenTemplate.create(c);
}
}

View File

@ -5,7 +5,7 @@ public class DynamicCodeGenException extends RuntimeException {
public DynamicCodeGenException(String reason) {
super(reason);
}
public DynamicCodeGenException(String reason, Throwable t) {
super(reason, t);
}

View File

@ -6,7 +6,7 @@ public class DynamicCodeGenOrdinalEnumConverter {
public static MessageConverter create(Class<?> c) {
try {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> unpackerClass = gen.generateOrdinalEnumConverterClass(c);
Class<?> unpackerClass = gen.generateOrdinalEnumTemplateClass(c);
return (MessageConverter) unpackerClass.newInstance();
} catch (InstantiationException e) {
throw new DynamicCodeGenException(e.getMessage(), e);

View File

@ -7,7 +7,7 @@ public class DynamicCodeGenOrdinalEnumPacker {
try {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> packerClass = gen.generateOrdinalEnumPackerClass(c);
return (MessagePacker)packerClass.newInstance();
return (MessagePacker) packerClass.newInstance();
} catch (InstantiationException e) {
throw new DynamicCodeGenException(e.getMessage(), e);
} catch (IllegalAccessException e) {

View File

@ -6,7 +6,7 @@ public class DynamicCodeGenOrdinalEnumUnpacker {
public static MessageUnpacker create(Class<?> c) {
try {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> unpackerClass = gen.generateOrdinalEnumUnpackerClass(c);
Class<?> unpackerClass = gen.generateOrdinalEnumTemplateClass(c);
return (MessageUnpacker) unpackerClass.newInstance();
} catch (InstantiationException e) {
throw new DynamicCodeGenException(e.getMessage(), e);

View File

@ -8,7 +8,7 @@ public class DynamicCodeGenPacker {
try {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> packerClass = gen.generateMessagePackerClass(c);
return (MessagePacker)packerClass.newInstance();
return (MessagePacker) packerClass.newInstance();
} catch (InstantiationException e) {
throw new DynamicCodeGenException(e.getMessage(), e);
} catch (IllegalAccessException e) {

View File

@ -1,13 +1,16 @@
package org.msgpack.util.codegen;
import org.msgpack.Template;
import org.msgpack.util.codegen.DynamicCodeGenBase.TemplateAccessor;
public class DynamicCodeGenTemplate {
public static Template create(Class<?> c) {
try {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> tmplClass = gen.generateTemplateClass(c);
return (Template) tmplClass.newInstance();
Object obj = tmplClass.newInstance();
((DynamicCodeGenBase.TemplateAccessor)obj).setTemplates(gen.getTemplates(c));
return (Template) obj;
} catch (InstantiationException e) {
throw new DynamicCodeGenException(e.getMessage(), e);
} catch (IllegalAccessException e) {

View File

@ -4,14 +4,6 @@ import org.msgpack.MessageUnpacker;
public class DynamicCodeGenUnpacker {
public static MessageUnpacker create(Class<?> c) {
try {
DynamicCodeGen gen = DynamicCodeGen.getInstance();
Class<?> unpackerClass = gen.generateMessageUnpackerClass(c);
return (MessageUnpacker) unpackerClass.newInstance();
} catch (InstantiationException e) {
throw new DynamicCodeGenException(e.getMessage(), e);
} catch (IllegalAccessException e) {
throw new DynamicCodeGenException(e.getMessage(), e);
}
return DynamicCodeGenTemplate.create(c);
}
}