From 7ada1f4bb066702bb775e49ba36b50a242ea96b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Mon, 2 Aug 2010 21:10:48 +0000 Subject: [PATCH] extended Type --- .../java/com/mysema/codegen/ClassType.java | 93 +++++++++++++++++++ .../java/com/mysema/codegen/ClassUtils.java | 26 +----- .../com/mysema/codegen/EvaluatorFactory.java | 14 +-- src/main/java/com/mysema/codegen/Type.java | 56 +++-------- .../mysema/codegen/ComplexEvaluationTest.java | 6 +- 5 files changed, 116 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/mysema/codegen/ClassType.java diff --git a/src/main/java/com/mysema/codegen/ClassType.java b/src/main/java/com/mysema/codegen/ClassType.java new file mode 100644 index 000000000..004a3ecd6 --- /dev/null +++ b/src/main/java/com/mysema/codegen/ClassType.java @@ -0,0 +1,93 @@ +package com.mysema.codegen; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Set; + +/** + * Type represents a generic type used in code generation + * + * @author tiwe + * + * @param + */ +public class ClassType implements Type { + + private final Class javaClass; + + private final List> parameters; + + public ClassType(Class javaClass, List> parameters) { + this.javaClass = javaClass; + this.parameters = parameters; + } + + public ClassType(Class clazz, Type... parameters) { + this(clazz, Arrays.asList(parameters)); + } + + @Override + public boolean equals(Object o){ + if (o == this){ + return true; + }else if (o instanceof ClassType){ + ClassType t = (ClassType)o; + return t.javaClass.equals(javaClass) && t.parameters.equals(parameters); + }else{ + return false; + } + } + + @Override + public String getGenericName() { + return getGenericName(Collections.emptySet(), Collections.emptySet()); + } + + @Override + public String getGenericName(Set packages, Set classes) { + if (parameters.isEmpty()){ + return ClassUtils.getName(javaClass, packages, classes); + }else{ + StringBuilder builder = new StringBuilder(); + builder.append(ClassUtils.getName(javaClass, packages, classes)); + builder.append("<"); + boolean first = true; + for (Type parameter : parameters){ + builder.append(parameter.getGenericName(packages, classes)); + if (!first){ + builder.append(","); + } + first = false; + } + builder.append(">"); + return builder.toString(); + } + } + + @Override + public String getName() { + return javaClass.getName(); + } + + @Override + public String getPackageName() { + return javaClass.getPackage().getName(); + } + + @Override + public List> getParameters() { + return parameters; + } + + @Override + public String getSimpleName() { + return javaClass.getSimpleName(); + } + + @Override + public int hashCode(){ + return javaClass.hashCode(); + } + +} diff --git a/src/main/java/com/mysema/codegen/ClassUtils.java b/src/main/java/com/mysema/codegen/ClassUtils.java index 271ee6547..b6080aca5 100644 --- a/src/main/java/com/mysema/codegen/ClassUtils.java +++ b/src/main/java/com/mysema/codegen/ClassUtils.java @@ -30,31 +30,7 @@ public final class ClassUtils { return cl.getName().replace('$', '.'); } } - - public static String getName(Type cl){ - return getName(cl, Collections.singleton("java.lang"), Collections.emptySet()); - } - - public static String getName(Type type, Set packages, Set classes){ - if (type.getParameters().isEmpty()){ - return getName(type.getJavaClass(), packages, classes); - }else{ - StringBuilder builder = new StringBuilder(); - builder.append(getName(type.getJavaClass(), packages, classes)); - builder.append("<"); - boolean first = true; - for (Type parameter : type.getParameters()){ - builder.append(getName(parameter, packages, classes)); - if (!first){ - builder.append(","); - } - first = false; - } - builder.append(">"); - return builder.toString(); - } - } - + public static Class normalize(Class clazz){ if (List.class.isAssignableFrom(clazz)){ return List.class; diff --git a/src/main/java/com/mysema/codegen/EvaluatorFactory.java b/src/main/java/com/mysema/codegen/EvaluatorFactory.java index d1c379fd4..ad968adfd 100644 --- a/src/main/java/com/mysema/codegen/EvaluatorFactory.java +++ b/src/main/java/com/mysema/codegen/EvaluatorFactory.java @@ -54,7 +54,7 @@ public class EvaluatorFactory { this.compilationOptions = Arrays.asList("-classpath", classpath, "-g:none"); } - private void compile(String source, Type projectionType, + private void compile(String source, Class projectionType, String[] names, Type[] types, String id, Map constants) throws IOException { // create source StringWriter writer = new StringWriter(); @@ -62,7 +62,7 @@ public class EvaluatorFactory { javaw.beginClass(id, null); String[] params = new String[names.length]; for (int i = 0; i < params.length; i++) { - params[i] = ClassUtils.getName(types[i]) + " " + names[i]; + params[i] = types[i].getGenericName() + " " + names[i]; } for (Map.Entry entry : constants.entrySet()){ @@ -105,9 +105,9 @@ public class EvaluatorFactory { Map constants) { Type[] types = new Type[classes.length]; for (int i = 0; i < types.length; i++){ - types[i] = new Type(classes[i]); + types[i] = new ClassType(classes[i]); } - return createEvaluator(source, new Type(projectionType), names, types, classes, constants); + return createEvaluator(source, projectionType, names, types, classes, constants); } /** @@ -123,7 +123,7 @@ public class EvaluatorFactory { */ public Evaluator createEvaluator( String source, - Type projection, + Class projection, String[] names, Type[] types, Class[] classes, @@ -147,7 +147,7 @@ public class EvaluatorFactory { } Method method = clazz.getMethod("eval", classes); - return new MethodEvaluator(method, object, projection.getJavaClass()); + return new MethodEvaluator(method, object, projection); } catch (ClassNotFoundException e) { throw new CodegenException(e); } catch (SecurityException e) { @@ -168,7 +168,7 @@ public class EvaluatorFactory { } - protected String toId(String source, Type returnType, Type... types) { + protected String toId(String source, Class returnType, Type... types) { StringBuilder b = new StringBuilder("Q"); b.append("_").append(source.hashCode()); b.append("_").append(returnType.getName().hashCode()); diff --git a/src/main/java/com/mysema/codegen/Type.java b/src/main/java/com/mysema/codegen/Type.java index 2db342dab..1986d678c 100644 --- a/src/main/java/com/mysema/codegen/Type.java +++ b/src/main/java/com/mysema/codegen/Type.java @@ -1,57 +1,25 @@ package com.mysema.codegen; -import java.util.Arrays; import java.util.List; +import java.util.Set; /** - * Type represents a generic type used in code generation - * * @author tiwe * * @param */ -public class Type { +public interface Type { + + String getGenericName(); - private final Class javaClass; + String getGenericName(Set packages, Set classes); - private final List> parameters; - - public Type(Class javaClass, List> parameters) { - this.javaClass = javaClass; - this.parameters = parameters; - } - - public Type(Class clazz, Type... parameters) { - this(clazz, Arrays.asList(parameters)); - } - - public Class getJavaClass() { - return javaClass; - } + String getName(); - public List> getParameters() { - return parameters; - } + String getPackageName(); + + List> getParameters(); + + String getSimpleName(); - public String getName() { - return javaClass.getName(); - } - - @Override - public int hashCode(){ - return javaClass.hashCode(); - } - - @Override - public boolean equals(Object o){ - if (o == this){ - return true; - }else if (o instanceof Type){ - Type t = (Type)o; - return t.javaClass.equals(javaClass) && t.parameters.equals(parameters); - }else{ - return false; - } - } - -} +} \ No newline at end of file diff --git a/src/test/java/com/mysema/codegen/ComplexEvaluationTest.java b/src/test/java/com/mysema/codegen/ComplexEvaluationTest.java index 84aaf5ab5..2c009d71b 100644 --- a/src/test/java/com/mysema/codegen/ComplexEvaluationTest.java +++ b/src/test/java/com/mysema/codegen/ComplexEvaluationTest.java @@ -15,8 +15,8 @@ public class ComplexEvaluationTest { @Test @SuppressWarnings("unchecked") - public void testComplex(){Type stringType = new Type(String.class); - Type resultType = new Type(List.class, stringType); + public void testComplex(){ClassType stringType = new ClassType(String.class); + Type resultType = new ClassType(List.class, stringType); StringBuilder source = new StringBuilder(); source.append("java.util.List rv = new java.util.ArrayList();\n"); source.append("for (String a : a_){\n"); @@ -30,7 +30,7 @@ public class ComplexEvaluationTest { Evaluator evaluator = factory.createEvaluator( source.toString(), - resultType, + List.class, new String[]{"a_","b_"}, new Type[]{resultType, resultType}, new Class[]{List.class,List.class},