From 7f839f8ddd024a0f3e15419a975af0c2acf31f7e Mon Sep 17 00:00:00 2001 From: Michael Bayne Date: Wed, 25 Jul 2012 16:38:43 +0000 Subject: [PATCH] Patch from Mike T to support parameterized types in genrecord. --- .../samskivert/depot/tools/GenRecordTask.java | 45 ++++++++++++++----- .../java/com/samskivert/depot/TestBase.java | 4 ++ .../java/com/samskivert/depot/TestRecord.java | 8 ++++ 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/samskivert/depot/tools/GenRecordTask.java b/src/main/java/com/samskivert/depot/tools/GenRecordTask.java index aae9d55..a2cbc6e 100644 --- a/src/main/java/com/samskivert/depot/tools/GenRecordTask.java +++ b/src/main/java/com/samskivert/depot/tools/GenRecordTask.java @@ -12,7 +12,10 @@ import java.io.FileWriter; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Field; +import java.lang.reflect.GenericArrayType; import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.List; import java.util.Map; import java.util.Set; @@ -27,6 +30,8 @@ import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.Reference; import org.apache.tools.ant.util.ClasspathUtils; +import com.google.common.base.Function; +import com.google.common.base.Joiner; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -259,7 +264,7 @@ public class GenRecordTask extends Task // create our substitution mappings Map fsubs = Maps.newHashMap(subs); - fsubs.put("type", getTypeName(f.getType())); + fsubs.put("type", getTypeName(f.getGenericType())); fsubs.put("field", fname); fsubs.put("capfield", StringUtil.unStudlyName(fname).toUpperCase()); @@ -444,19 +449,37 @@ public class GenRecordTask extends Task return name; } - protected static String getTypeName (Class clazz) + protected static String getTypeName (Type type) { - if (clazz.isArray()) { - Class cclass = clazz.getComponentType(); - return (cclass.isPrimitive() ? cclass.getSimpleName() : getTypeName(cclass)) + "[]"; - } else { - Class nclass = clazz.isPrimitive() ? BOXES.get(clazz) : clazz; - Class eclass = nclass.getEnclosingClass(); - if (eclass != null) { - return getTypeName(eclass) + "." + nclass.getSimpleName(); + if (type instanceof Class) { + Class clazz = (Class)type; + if (clazz.isArray()) { + Class cclass = clazz.getComponentType(); + return (cclass.isPrimitive() ? cclass.getSimpleName() : getTypeName(cclass)) + "[]"; } else { - return nclass.getSimpleName(); + Class nclass = clazz.isPrimitive() ? BOXES.get(clazz) : clazz; + Class eclass = nclass.getEnclosingClass(); + return (eclass == null) ? nclass.getSimpleName() : + getTypeName(eclass) + "." + nclass.getSimpleName(); } + + } else if (type instanceof ParameterizedType) { + ParameterizedType paramType = (ParameterizedType)type; + Type[] typeArgs = paramType.getActualTypeArguments(); + String tparams = (typeArgs == null || typeArgs.length == 0) ? "" : + "<" + Joiner.on(", ").join( + Lists.transform(Lists.newArrayList(typeArgs), new Function() { + @Override public String apply (Type input) { + return getTypeName(input); + } + })) + ">"; + return getTypeName(paramType.getRawType()) + tparams; + + } else if (type instanceof GenericArrayType) { + return getTypeName(((GenericArrayType)type).getGenericComponentType()) + "[]"; + + } else { + throw new IllegalArgumentException("Unknown kind of type '" + type + "'"); } } diff --git a/src/test/java/com/samskivert/depot/TestBase.java b/src/test/java/com/samskivert/depot/TestBase.java index 6e2ee8e..cd70d7a 100644 --- a/src/test/java/com/samskivert/depot/TestBase.java +++ b/src/test/java/com/samskivert/depot/TestBase.java @@ -10,6 +10,8 @@ import java.sql.Timestamp; import java.util.Arrays; import java.util.Properties; +import com.google.common.collect.Lists; + import com.samskivert.jdbc.ConnectionProvider; import com.samskivert.jdbc.StaticConnectionProvider; import com.samskivert.util.Calendars; @@ -100,6 +102,7 @@ public abstract class TestBase rec.type = EnumKeyRecord.Type.A; rec.lastModified = tnow; rec.numbers = new int[] { 9, 0, 2, 1, 0 }; + rec.strList = Lists.newArrayList("foo", "bar", "Hello", "World"); return rec; } @@ -117,5 +120,6 @@ public abstract class TestBase assertEquals(expect.type, got.type); assertEquals(expect.lastModified, got.lastModified); assertTrue(Arrays.equals(expect.numbers, got.numbers)); + assertEquals(expect.strList, got.strList); } } diff --git a/src/test/java/com/samskivert/depot/TestRecord.java b/src/test/java/com/samskivert/depot/TestRecord.java index 9b1fd4a..c55ffa9 100644 --- a/src/test/java/com/samskivert/depot/TestRecord.java +++ b/src/test/java/com/samskivert/depot/TestRecord.java @@ -4,14 +4,18 @@ package com.samskivert.depot; +import java.util.List; + import java.sql.Date; import java.sql.Timestamp; import com.samskivert.util.StringUtil; +import com.samskivert.depot.Transformers; import com.samskivert.depot.annotation.Entity; import com.samskivert.depot.annotation.Id; import com.samskivert.depot.annotation.Index; +import com.samskivert.depot.annotation.Transform; import com.samskivert.depot.expression.ColumnExp; /** @@ -31,6 +35,7 @@ public class TestRecord extends PersistentRecord public static final ColumnExp CREATED = colexp(_R, "created"); public static final ColumnExp LAST_MODIFIED = colexp(_R, "lastModified"); public static final ColumnExp NUMBERS = colexp(_R, "numbers"); + public static final ColumnExp> STR_LIST = colexp(_R, "strList"); // AUTO-GENERATED: FIELDS END public static final int SCHEMA_VERSION = 3; @@ -55,6 +60,9 @@ public class TestRecord extends PersistentRecord public int[] numbers; + @Transform(Transformers.StringIterable.class) + public List strList; + @Override public String toString () {