mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-24 17:49:45 +01:00
java: refactor the programs in a org.msgpack.util.codegen package
This commit is contained in:
parent
a85f6e72fe
commit
b01c270889
@ -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";
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ public class DynamicCodeGenException extends RuntimeException {
|
||||
public DynamicCodeGenException(String reason) {
|
||||
super(reason);
|
||||
}
|
||||
|
||||
|
||||
public DynamicCodeGenException(String reason, Throwable t) {
|
||||
super(reason, t);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user