#593247 : Added support for inheriting delegate methods

This commit is contained in:
Timo Westkämper 2010-06-13 14:17:07 +00:00
parent d60be4c5f4
commit 50c3284bf3
6 changed files with 112 additions and 42 deletions

View File

@ -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));
}
}

View File

@ -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());
}
}

View File

@ -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<Parameter> params, Type returnType) {
public Delegate(Type declaringType, Type delegateType, String name, List<Parameter> 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<Parameter> getParameters() {
return parameters;
}
public Type getReturnType() {
return returnType;
}
public Type getDelegateType() {
return delegateType;
}
@Override
public int hashCode() {

View File

@ -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<Package> packages = new ArrayList<Package>();
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()]));
}

View File

@ -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<Package> packages = new ArrayList<Package>();
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());
}

View File

@ -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<Package> packages = new ArrayList<Package>();
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()]));
}
}