From 50c3284bf3875bd4e2f6eb02a6d5fc39231cf64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Sun, 13 Jun 2010 14:17:07 +0000 Subject: [PATCH] #593247 : Added support for inheriting delegate methods --- .../java/com/mysema/query/apt/Processor.java | 2 +- .../com/mysema/query/domain/DelegateTest.java | 40 ++++++++++++++- .../com/mysema/query/codegen/Delegate.java | 21 +++++--- .../query/codegen/EmbeddableSerializer.java | 20 ++++++-- .../query/codegen/EntitySerializer.java | 51 +++++++++++-------- .../query/codegen/SupertypeSerializer.java | 20 ++++++-- 6 files changed, 112 insertions(+), 42 deletions(-) diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java index 190169434..bbd7b75a8 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/Processor.java @@ -272,7 +272,7 @@ public class Processor { } if (entityType != null){ - entityType.addDelegate(new Delegate(delegateType, name, parameters, returnType)); + entityType.addDelegate(new Delegate(entityType, delegateType, name, parameters, returnType)); } } diff --git a/querydsl-apt/src/test/java/com/mysema/query/domain/DelegateTest.java b/querydsl-apt/src/test/java/com/mysema/query/domain/DelegateTest.java index 15775ba48..048073ae4 100644 --- a/querydsl-apt/src/test/java/com/mysema/query/domain/DelegateTest.java +++ b/querydsl-apt/src/test/java/com/mysema/query/domain/DelegateTest.java @@ -7,14 +7,22 @@ import org.junit.Test; import com.mysema.query.annotations.QueryDelegate; import com.mysema.query.annotations.QueryEntity; +import com.mysema.query.annotations.QuerySupertype; import com.mysema.query.types.expr.EBoolean; import com.mysema.query.types.expr.EBooleanConst; import com.mysema.query.types.path.PString; public class DelegateTest { + @QuerySupertype + public static class Identifiable { + + long id; + + } + @QueryEntity - public static class User{ + public static class User extends Identifiable{ String name; @@ -22,6 +30,16 @@ public class DelegateTest { } + @QueryEntity + public static class SimpleUser extends User{ + + } + + @QueryEntity + public static class SimpleUser2 extends SimpleUser{ + + } + @QueryDelegate(User.class) public static EBoolean isManagedBy(QDelegateTest_User user, User other){ return EBooleanConst.TRUE; @@ -43,7 +61,7 @@ public class DelegateTest { } @Test - public void test(){ + public void testUser(){ QDelegateTest_User user = QDelegateTest_User.user; assertNotNull(user.isManagedBy(new User())); assertNotNull(user.isManagedBy(user)); @@ -51,5 +69,23 @@ public class DelegateTest { assertEquals(user.name, user.getName()); } + + @Test + public void testSimpleUser(){ + QDelegateTest_SimpleUser user = QDelegateTest_SimpleUser.simpleUser; + assertNotNull(user.isManagedBy(new User())); + assertNotNull(user.isManagedBy(user._super)); + + assertEquals(user.name, user.getName()); + } + + @Test + public void testSimpleUser2(){ + QDelegateTest_SimpleUser2 user = QDelegateTest_SimpleUser2.simpleUser2; + assertNotNull(user.isManagedBy(new User())); + assertNotNull(user.isManagedBy(user._super._super)); + + assertEquals(user.name, user.getName()); + } } diff --git a/querydsl-core/src/main/java/com/mysema/query/codegen/Delegate.java b/querydsl-core/src/main/java/com/mysema/query/codegen/Delegate.java index dbb416fae..2977a541a 100644 --- a/querydsl-core/src/main/java/com/mysema/query/codegen/Delegate.java +++ b/querydsl-core/src/main/java/com/mysema/query/codegen/Delegate.java @@ -14,6 +14,8 @@ import com.mysema.commons.lang.Assert; @Immutable public class Delegate { + private final Type declaringType; + private final Type delegateType; private final String name; @@ -22,7 +24,8 @@ public class Delegate { private final Type returnType; - public Delegate(Type delegateType, String name, List params, Type returnType) { + public Delegate(Type declaringType, Type delegateType, String name, List params, Type returnType) { + this.declaringType = Assert.notNull(declaringType,"declaringType"); this.delegateType = Assert.notNull(delegateType,"delegateType"); this.name = Assert.notNull(name,"name"); this.parameters = Assert.notNull(params,"params"); @@ -41,21 +44,25 @@ public class Delegate { } } + public Type getDeclaringType() { + return declaringType; + } + + public Type getDelegateType() { + return delegateType; + } + public String getName() { return name; } - + public List getParameters() { return parameters; } - + public Type getReturnType() { return returnType; } - - public Type getDelegateType() { - return delegateType; - } @Override public int hashCode() { diff --git a/querydsl-core/src/main/java/com/mysema/query/codegen/EmbeddableSerializer.java b/querydsl-core/src/main/java/com/mysema/query/codegen/EmbeddableSerializer.java index 2b13cee6a..89b97440f 100644 --- a/querydsl-core/src/main/java/com/mysema/query/codegen/EmbeddableSerializer.java +++ b/querydsl-core/src/main/java/com/mysema/query/codegen/EmbeddableSerializer.java @@ -6,7 +6,9 @@ package com.mysema.query.codegen; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import com.mysema.codegen.CodeWriter; import com.mysema.query.types.PathMetadata; @@ -44,18 +46,26 @@ public final class EmbeddableSerializer extends EntitySerializer{ @Override protected void introImports(CodeWriter writer, SerializerConfig config, EntityType model) throws IOException { - writer.imports(PathMetadata.class.getPackage(), PSimple.class.getPackage()); - + List packages = new ArrayList(); + packages.add(PathMetadata.class.getPackage()); + packages.add(PSimple.class.getPackage()); if ((model.hasLists() && config.useListAccessors()) || !model.getMethods().isEmpty() || !model.getDelegates().isEmpty() || (model.hasMaps() && config.useMapAccessors())){ - writer.imports(EComparable.class.getPackage()); + packages.add(EComparable.class.getPackage()); + } + if (!model.getMethods().isEmpty()){ + packages.add(CSimple.class.getPackage()); } - if (!model.getMethods().isEmpty()){ - writer.imports(CSimple.class.getPackage()); + for (Delegate delegate : model.getDelegates()){ + if (!delegate.getDelegateType().getPackageName().equals(model.getPackageName())){ + packages.add(Package.getPackage(delegate.getDelegateType().getPackageName())); + } } + + writer.imports(packages.toArray(new Package[packages.size()])); } diff --git a/querydsl-core/src/main/java/com/mysema/query/codegen/EntitySerializer.java b/querydsl-core/src/main/java/com/mysema/query/codegen/EntitySerializer.java index 37a8a494e..183f763f4 100644 --- a/querydsl-core/src/main/java/com/mysema/query/codegen/EntitySerializer.java +++ b/querydsl-core/src/main/java/com/mysema/query/codegen/EntitySerializer.java @@ -5,20 +5,7 @@ */ package com.mysema.query.codegen; -import static com.mysema.codegen.Symbols.ASSIGN; -import static com.mysema.codegen.Symbols.COMMA; -import static com.mysema.codegen.Symbols.DOT; -import static com.mysema.codegen.Symbols.DOT_CLASS; -import static com.mysema.codegen.Symbols.EMPTY; -import static com.mysema.codegen.Symbols.NEW; -import static com.mysema.codegen.Symbols.QUOTE; -import static com.mysema.codegen.Symbols.RETURN; -import static com.mysema.codegen.Symbols.SEMICOLON; -import static com.mysema.codegen.Symbols.SPACE; -import static com.mysema.codegen.Symbols.STAR; -import static com.mysema.codegen.Symbols.SUPER; -import static com.mysema.codegen.Symbols.THIS; -import static com.mysema.codegen.Symbols.UNCHECKED; +import static com.mysema.codegen.Symbols.*; import java.io.IOException; import java.lang.annotation.Annotation; @@ -32,6 +19,7 @@ import org.apache.commons.collections15.Transformer; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; +import com.mysema.codegen.CodeWriter; import com.mysema.commons.lang.Assert; import com.mysema.query.types.Path; import com.mysema.query.types.PathMetadata; @@ -45,7 +33,6 @@ import com.mysema.query.types.path.PNumber; import com.mysema.query.types.path.PSimple; import com.mysema.query.types.path.PTime; import com.mysema.query.types.path.PathMetadataFactory; -import com.mysema.codegen.CodeWriter; /** * EntitySerializer is a Serializer implementation for entity types @@ -304,19 +291,28 @@ public class EntitySerializer implements Serializer{ protected void introImports(CodeWriter writer, SerializerConfig config, EntityType model) throws IOException { writer.staticimports(PathMetadataFactory.class); - writer.imports(PathMetadata.class.getPackage(), PSimple.class.getPackage()); - + + List packages = new ArrayList(); + packages.add(PathMetadata.class.getPackage()); + packages.add(PSimple.class.getPackage()); if (!model.getConstructors().isEmpty() || !model.getMethods().isEmpty() || !model.getDelegates().isEmpty() || (model.hasLists() && config.useListAccessors()) || (model.hasMaps() && config.useMapAccessors())){ - writer.imports(EComparable.class.getPackage()); + packages.add(EComparable.class.getPackage()); + } + if (!model.getMethods().isEmpty()){ + packages.add(CSimple.class.getPackage()); + } + + for (Delegate delegate : model.getDelegates()){ + if (!delegate.getDelegateType().getPackageName().equals(model.getPackageName())){ + packages.add(Package.getPackage(delegate.getDelegateType().getPackageName())); + } } - if (!model.getMethods().isEmpty()){ - writer.imports(CSimple.class.getPackage()); - } + writer.imports(packages.toArray(new Package[packages.size()])); } protected void introInits(CodeWriter writer, EntityType model) throws IOException { @@ -460,8 +456,19 @@ public class EntitySerializer implements Serializer{ }); // body start - writer.beginLine(RETURN + delegate.getDelegateType().getFullName() + "."+delegate.getName()+"("); + writer.beginLine(RETURN + delegate.getDelegateType().getSimpleName() + "."+delegate.getName()+"("); writer.append("this"); + if (!model.equals(delegate.getDeclaringType())){ + int counter = 0; + EntityType type = model; + while (type != null && !type.equals(delegate.getDeclaringType())){ + type = type.getSuperType() != null ? type.getSuperType().getEntityType() : null; + counter++; + } + for (int i = 0; i < counter; i++){ + writer.append("._super"); + } + } for (Parameter parameter : delegate.getParameters()){ writer.append(COMMA + parameter.getName()); } diff --git a/querydsl-core/src/main/java/com/mysema/query/codegen/SupertypeSerializer.java b/querydsl-core/src/main/java/com/mysema/query/codegen/SupertypeSerializer.java index 091134686..10c913f79 100644 --- a/querydsl-core/src/main/java/com/mysema/query/codegen/SupertypeSerializer.java +++ b/querydsl-core/src/main/java/com/mysema/query/codegen/SupertypeSerializer.java @@ -6,7 +6,9 @@ package com.mysema.query.codegen; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import net.jcip.annotations.Immutable; @@ -46,18 +48,26 @@ public final class SupertypeSerializer extends EntitySerializer{ @Override protected void introImports(CodeWriter writer, SerializerConfig config, EntityType model) throws IOException { - writer.imports(PathMetadata.class.getPackage(), PSimple.class.getPackage()); - + List packages = new ArrayList(); + packages.add(PathMetadata.class.getPackage()); + packages.add(PSimple.class.getPackage()); if ((model.hasLists() && config.useListAccessors()) || !model.getMethods().isEmpty() || !model.getDelegates().isEmpty() || (model.hasMaps() && config.useMapAccessors())){ - writer.imports(EComparable.class.getPackage()); + packages.add(EComparable.class.getPackage()); + } + if (!model.getMethods().isEmpty()){ + packages.add(CSimple.class.getPackage()); } - if (!model.getMethods().isEmpty()){ - writer.imports(CSimple.class.getPackage()); + for (Delegate delegate : model.getDelegates()){ + if (!delegate.getDelegateType().getPackageName().equals(model.getPackageName())){ + packages.add(Package.getPackage(delegate.getDelegateType().getPackageName())); + } } + + writer.imports(packages.toArray(new Package[packages.size()])); } }