mirror of
https://github.com/querydsl/querydsl.git
synced 2026-06-13 21:01:01 +08:00
#593247 : Added support for inheriting delegate methods
This commit is contained in:
parent
d60be4c5f4
commit
50c3284bf3
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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()]));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
@ -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()]));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user