Created
April 25, 2012 15:12
-
-
Save muga/2490490 to your computer and use it in GitHub Desktop.
Fix a bug within TemplateRegistry class: genenate a template for Generic array class
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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