diff --git a/querydsl-core/pom.xml b/querydsl-core/pom.xml index 3f9354f4e..53879cca4 100644 --- a/querydsl-core/pom.xml +++ b/querydsl-core/pom.xml @@ -1,4 +1,4 @@ - + 4.0.0 @@ -72,7 +72,7 @@ jdepend 2.9.1 test - + @@ -141,4 +141,4 @@ 1.13 - + diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/FactoryExpressionBase.java b/querydsl-core/src/main/java/com/querydsl/core/types/FactoryExpressionBase.java index 63cd9da6a..487962041 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/FactoryExpressionBase.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/FactoryExpressionBase.java @@ -82,4 +82,16 @@ public abstract class FactoryExpressionBase extends ExpressionBase impleme return new FactoryExpressionWrapper(this); } + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } else if (o instanceof FactoryExpression) { + return getClass().equals(o.getClass()) + && getArgs().equals(((FactoryExpression) o).getArgs()); + } else { + return false; + } + } + } diff --git a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/PathBuilderValidator.java b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/PathBuilderValidator.java index d6ad88166..453e5ea01 100644 --- a/querydsl-core/src/main/java/com/querydsl/core/types/dsl/PathBuilderValidator.java +++ b/querydsl-core/src/main/java/com/querydsl/core/types/dsl/PathBuilderValidator.java @@ -13,6 +13,7 @@ */ package com.querydsl.core.types.dsl; +import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Collection; @@ -25,7 +26,7 @@ import com.querydsl.core.util.ReflectionUtils; /** * {@code PathBuilderValidator} validates {@link PathBuilder} properties at creation time */ -public interface PathBuilderValidator { +public interface PathBuilderValidator extends Serializable { /** * Validates the given property of given class diff --git a/querydsl-core/src/test/java/com/querydsl/core/types/Concatenation.java b/querydsl-core/src/test/java/com/querydsl/core/types/Concatenation.java index 55b784bd0..d3b1dcb64 100644 --- a/querydsl-core/src/test/java/com/querydsl/core/types/Concatenation.java +++ b/querydsl-core/src/test/java/com/querydsl/core/types/Concatenation.java @@ -20,7 +20,7 @@ import java.util.List; * @author tiwe * */ -public class Concatenation extends ExpressionBase implements FactoryExpression { +public class Concatenation extends FactoryExpressionBase { private static final long serialVersionUID = -355693583588722395L; diff --git a/querydsl-core/src/test/java/com/querydsl/core/types/SerializationTest.java b/querydsl-core/src/test/java/com/querydsl/core/types/SerializationTest.java index 4cac2958d..8198bb845 100644 --- a/querydsl-core/src/test/java/com/querydsl/core/types/SerializationTest.java +++ b/querydsl-core/src/test/java/com/querydsl/core/types/SerializationTest.java @@ -3,15 +3,79 @@ package com.querydsl.core.types; import static com.querydsl.core.testutil.Serialization.serialize; import static org.junit.Assert.assertEquals; -import org.junit.Test; +import java.lang.reflect.Constructor; +import java.lang.reflect.Modifier; +import java.util.Map; +import java.util.Objects; +import java.util.Set; -import com.querydsl.core.types.dsl.Expressions; -import com.querydsl.core.types.dsl.SimplePath; +import org.junit.Test; +import org.reflections.Reflections; + +import com.google.common.collect.Maps; +import com.querydsl.core.DefaultQueryMetadata; +import com.querydsl.core.QueryMetadata; +import com.querydsl.core.group.GroupBy; +import com.querydsl.core.group.GroupExpression; +import com.querydsl.core.testutil.Serialization; +import com.querydsl.core.types.dsl.*; public class SerializationTest { + public enum Gender { MALE, FEMALE } + @Test - public void roundtrip() throws Exception { + public void Expressions() throws Exception { + Map, Object> args = Maps.newHashMap(); + args.put(Object.class, "obj"); + args.put(BeanPath.class, new EntityPathBase(Object.class, "obj")); + args.put(Class.class, Integer.class); + args.put(Class[].class, new Class[]{Object.class, Object.class}); + args.put(java.util.Date.class, new java.util.Date(0)); + args.put(java.sql.Date.class, new java.sql.Date(0)); + args.put(java.sql.Time.class, new java.sql.Time(0)); + args.put(java.sql.Timestamp.class, new java.sql.Timestamp(0)); + args.put(Expression.class, Expressions.enumPath(Gender.class, "e")); + args.put(Expression[].class, new Expression[]{ + Expressions.enumPath(Gender.class, "e"), Expressions.stringPath("s")}); + args.put(FactoryExpression.class, Projections.tuple(Expressions.stringPath("str"))); + args.put(GroupExpression.class, GroupBy.avg(Expressions.numberPath(Integer.class, "num"))); + args.put(Number.class, 1); + args.put(Operator.class, Ops.AND); + args.put(Path.class, Expressions.stringPath("str")); + args.put(PathBuilderValidator.class, PathBuilderValidator.DEFAULT); + args.put(PathMetadata.class, PathMetadataFactory.forVariable("obj")); + args.put(PathInits.class, PathInits.DEFAULT); + args.put(Predicate.class, Expressions.path(Object.class, "obj").isNull()); + args.put(QueryMetadata.class, new DefaultQueryMetadata()); + args.put(String.class, "obj"); + + Reflections reflections = new Reflections(); + Set> types = reflections.getSubTypesOf(Expression.class); + for (Class type : types) { + if (!type.isInterface() && !type.isMemberClass() && !Modifier.isAbstract(type.getModifiers())) { + for (Constructor c : type.getConstructors()) { + Object[] parameters = new Object[c.getParameterTypes().length]; + for (int i = 0; i < c.getParameterTypes().length; i++) { + parameters[i] = Objects.requireNonNull(args.get(c.getParameterTypes()[i]), + c.getParameterTypes()[i].getName()); + } + c.setAccessible(true); + Object o = c.newInstance(parameters); + assertEquals(o, Serialization.serialize(o)); + } + } + } + } + + @Test + public void Order() { + OrderSpecifier order = new OrderSpecifier(Order.ASC, Expressions.stringPath("str")); + assertEquals(order, Serialization.serialize(order)); + } + + @Test + public void Roundtrip() throws Exception { Path path = ExpressionUtils.path(Object.class, "entity"); SimplePath path2 = Expressions.path(Object.class, "entity"); assertEquals(path, serialize(path));