Skip to content

Instantly share code, notes, and snippets.

@muga
Created April 25, 2012 15:12
Show Gist options
  • Save muga/2490489 to your computer and use it in GitHub Desktop.
Save muga/2490489 to your computer and use it in GitHub Desktop.
Fix a bug within TemplateRegistry class: genenate a template for Generic array class
diff --git a/src/main/java/org/msgpack/template/TemplateRegistry.java b/src/main/java/org/msgpack/template/TemplateRegistry.java
index 3045ba3..7a8c267 100644
--- a/src/main/java/org/msgpack/template/TemplateRegistry.java
+++ b/src/main/java/org/msgpack/template/TemplateRegistry.java
@@ -23,6 +23,7 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
+import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
@@ -198,6 +199,15 @@ public class TemplateRegistry {
return tmpl;
}
+ // TODO GenericArrayType is not a Class<?> => buildArrayTemplate
+ if (targetType instanceof GenericArrayType) {
+ GenericArrayType genericArrayType = (GenericArrayType) targetType;
+ tmpl = lookupGenericArrayType(genericArrayType);
+ if (tmpl != null) {
+ return tmpl;
+ }
+ }
+
tmpl = lookupCache(targetType);
if (tmpl != null) {
return tmpl;
@@ -284,6 +294,71 @@ public class TemplateRegistry {
return tmpl.build(tmpls);
}
+ private Template<Type> lookupGenericArrayType(GenericArrayType genericArrayType) {
+ Template<Type> tmpl = lookupGenericArrayTypeImpl(genericArrayType);
+ if (tmpl != null) {
+ return tmpl;
+ }
+
+ try {
+ tmpl = parent.lookupGenericArrayTypeImpl(genericArrayType);
+ if (tmpl != null) {
+ return tmpl;
+ }
+ } catch (NullPointerException e) { // ignore
+ }
+
+ return null;
+ }
+
+ private Template lookupGenericArrayTypeImpl(GenericArrayType genericArrayType) {
+ String genericArrayTypeName = "" + genericArrayType;
+ boolean isPrimitive = genericArrayTypeName.indexOf(".") < 0;
+ if (!isPrimitive) {
+ throw new UnsupportedOperationException(String.format(
+ "Not implemented template generation of %s", genericArrayTypeName));
+ }
+ int dim = genericArrayTypeName.split("\\[").length - 1;
+ if (dim <= 0) {
+ throw new MessageTypeException(
+ String.format("fatal error: type=", genericArrayTypeName));
+ } else if (dim > 1) {
+ throw new UnsupportedOperationException(String.format(
+ "Not implemented template generation of %s", genericArrayTypeName));
+ }
+
+ StringBuffer sbuf = new StringBuffer();
+ for (int i = 0; i < dim; i++) {
+ sbuf.append('[');
+ }
+ String compTypeName = "" + genericArrayType.getGenericComponentType();
+ if (!isPrimitive) {
+ sbuf.append('L');
+ sbuf.append(compTypeName);
+ sbuf.append(';');
+ } else {
+ sbuf.append(toJvmPrimitiveClassName(compTypeName));
+ }
+ String genericArrayClassName = sbuf.toString();
+ try {
+ // TODO #MN
+ //Class c = JavassistTemplateBuilder.class.getClassLoader().loadClass(genericArrayClassName);
+ Class c = Class.forName(genericArrayClassName);
+ return lookupAfterBuilding(c);
+ } catch (ClassNotFoundException e) {
+ throw new MessageTypeException(e);
+ }
+ }
+
+ private static String toJvmPrimitiveClassName(String typeName) {
+ // TODO #MN
+ if (typeName.equals("int")) {
+ return "I";
+ } else {
+ throw new UnsupportedOperationException();
+ }
+ }
+
private Template<Type> lookupCache(Type targetType) {
Template<Type> tmpl = cache.get(targetType);
if (tmpl != null) {
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment