From 917c3e2889108a005390cc64331dbe5a13dcca44 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 15 Mar 2017 16:43:00 +0100 Subject: [PATCH] DATACMNS-867 - Removed Optional from QuerydslBindingsFactory API. --- .../querydsl/binding/QuerydslBindings.java | 7 ++--- .../binding/QuerydslBindingsFactory.java | 29 +++++++++++++++++-- .../QuerydslPredicateArgumentResolver.java | 17 +++++------ .../QuerydslBindingsFactoryUnitTests.java | 6 ++-- 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java b/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java index e7eaad8a4..c10511df1 100644 --- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java +++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindings.java @@ -20,7 +20,6 @@ import lombok.RequiredArgsConstructor; import lombok.Value; import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -37,7 +36,6 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; import com.querydsl.core.types.Path; -import com.querydsl.core.types.Predicate; /** * {@link QuerydslBindings} allows definition of path specific bindings. @@ -478,7 +476,8 @@ public class QuerydslBindings { public

> void first(SingleValueBinding binding) { Assert.notNull(binding, "Binding must not be null!"); - all((MultiValueBinding) (path, value) -> Optionals.next(value.iterator()).flatMap(t -> binding.bind(path, t))); + all((MultiValueBinding) (path, value) -> Optionals.next(value.iterator()) + .flatMap(t -> binding.bind(path, t))); } /** @@ -490,7 +489,7 @@ public class QuerydslBindings { Assert.notNull(binding, "Binding must not be null!"); - QuerydslBindings.this.typeSpecs.put(type, PathAndBinding.withoutPath().with(binding)); + QuerydslBindings.this.typeSpecs.put(type, PathAndBinding. withoutPath().with(binding)); } } diff --git a/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java b/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java index f145a9349..244fdbb04 100644 --- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java +++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactory.java @@ -84,6 +84,30 @@ public class QuerydslBindingsFactory implements ApplicationContextAware { return entityPathResolver; } + /** + * Creates the {@link QuerydslBindings} to be used using for the given domain type. A {@link QuerydslBinderCustomizer} + * will be auto-detected. + * + * @param domainType must not be {@literal null}. + * @return will never be {@literal null}. + */ + public QuerydslBindings createBindingsFor(TypeInformation domainType) { + return createBindingsFor(domainType, Optional.empty()); + } + + /** + * Creates the {@link QuerydslBindings} to be used using for the given domain type and a pre-defined + * {@link QuerydslBinderCustomizer}. + * + * @param domainType must not be {@literal null}. + * @param customizer the {@link QuerydslBinderCustomizer} to use, must not be {@literal null}. + * @return will never be {@literal null}. + */ + public QuerydslBindings createBindingsFor(TypeInformation domainType, + Class> customizer) { + return createBindingsFor(domainType, Optional.of(customizer)); + } + /** * Creates the {@link QuerydslBindings} to be used using for the given domain type and a pre-defined * {@link QuerydslBinderCustomizer}. If no customizer is given, auto-detection will be applied. @@ -93,7 +117,7 @@ public class QuerydslBindingsFactory implements ApplicationContextAware { * detection for the given domain type will be applied. * @return */ - public QuerydslBindings createBindingsFor(TypeInformation domainType, + private QuerydslBindings createBindingsFor(TypeInformation domainType, Optional>> customizer) { Assert.notNull(customizer, "Customizer must not be null!"); @@ -141,7 +165,8 @@ public class QuerydslBindingsFactory implements ApplicationContextAware { return customizer// .filter(it -> !QuerydslBinderCustomizer.class.equals(it))// - .map(this::createQuerydslBinderCustomizer).orElseGet(() -> repositories.flatMap(it -> it.getRepositoryFor(domainType))// + .map(this::createQuerydslBinderCustomizer) + .orElseGet(() -> repositories.flatMap(it -> it.getRepositoryFor(domainType))// .map(it -> it instanceof QuerydslBinderCustomizer ? (QuerydslBinderCustomizer>) it : null)// .orElse(NoOpCustomizer.INSTANCE)); } diff --git a/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java b/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java index eaca513fb..3253fa6a1 100644 --- a/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java +++ b/src/main/java/org/springframework/data/web/querydsl/QuerydslPredicateArgumentResolver.java @@ -23,10 +23,10 @@ import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.data.querydsl.binding.QuerydslBinderCustomizer; -import org.springframework.data.querydsl.binding.QuerydslBindings; import org.springframework.data.querydsl.binding.QuerydslBindingsFactory; import org.springframework.data.querydsl.binding.QuerydslPredicate; import org.springframework.data.querydsl.binding.QuerydslPredicateBuilder; +import org.springframework.data.util.CastUtils; import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.TypeInformation; import org.springframework.util.LinkedMultiValueMap; @@ -89,7 +89,6 @@ public class QuerydslPredicateArgumentResolver implements HandlerMethodArgumentR * @see org.springframework.web.method.support.HandlerMethodArgumentResolver#resolveArgument(org.springframework.core.MethodParameter, org.springframework.web.method.support.ModelAndViewContainer, org.springframework.web.context.request.NativeWebRequest, org.springframework.web.bind.support.WebDataBinderFactory) */ @Override - @SuppressWarnings({ "unchecked", "rawtypes" }) public Predicate resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { @@ -103,13 +102,13 @@ public class QuerydslPredicateArgumentResolver implements HandlerMethodArgumentR .ofNullable(parameter.getParameterAnnotation(QuerydslPredicate.class)); TypeInformation domainType = extractTypeInfo(parameter).getActualType(); - Optional> map = annotation - .>map(QuerydslPredicate::bindings); + Optional>> bindings = annotation// + .map(QuerydslPredicate::bindings)// + .map(CastUtils::cast); - QuerydslBindings bindings = bindingsFactory.createBindingsFor(domainType, - (Optional>>) map); - - return predicateBuilder.getPredicate(domainType, parameters, bindings); + return predicateBuilder.getPredicate(domainType, parameters, + bindings.map(it -> bindingsFactory.createBindingsFor(domainType, it)) + .orElseGet(() -> bindingsFactory.createBindingsFor(domainType))); } /** @@ -125,7 +124,7 @@ public class QuerydslPredicateArgumentResolver implements HandlerMethodArgumentR .ofNullable(parameter.getParameterAnnotation(QuerydslPredicate.class)); return annotation.filter(it -> !Object.class.equals(it.root()))// - .>map(it -> ClassTypeInformation.from(it.root()))// + .> map(it -> ClassTypeInformation.from(it.root()))// .orElseGet(() -> detectDomainType(ClassTypeInformation.fromReturnTypeOf(parameter.getMethod()))); } diff --git a/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java b/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java index e52fab2f7..58fcf0ffe 100755 --- a/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsFactoryUnitTests.java @@ -65,7 +65,7 @@ public class QuerydslBindingsFactoryUnitTests { QuerydslBindingsFactory factory = new QuerydslBindingsFactory(SimpleEntityPathResolver.INSTANCE); ReflectionTestUtils.setField(factory, "repositories", Optional.of(repositories)); - QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, Optional.empty()); + QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE); Optional, Object>> binding = bindings .getBindingForPath(PropertyPathInformation.of("firstname", User.class)); @@ -85,7 +85,7 @@ public class QuerydslBindingsFactoryUnitTests { QuerydslBindingsFactory factory = new QuerydslBindingsFactory(SimpleEntityPathResolver.INSTANCE); ReflectionTestUtils.setField(factory, "beanFactory", Optional.of(beanFactory)); - QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, Optional.of(SpecificBinding.class)); + QuerydslBindings bindings = factory.createBindingsFor(USER_TYPE, SpecificBinding.class); Optional, Object>> binding = bindings .getBindingForPath(PropertyPathInformation.of("firstname", User.class)); @@ -99,7 +99,7 @@ public class QuerydslBindingsFactoryUnitTests { public void rejectsPredicateResolutionIfDomainTypeCantBeAutoDetected() { assertThatExceptionOfType(IllegalStateException.class)// - .isThrownBy(() -> factory.createBindingsFor(ClassTypeInformation.from(ModelAndView.class), Optional.empty()))// + .isThrownBy(() -> factory.createBindingsFor(ClassTypeInformation.from(ModelAndView.class)))// .withMessageContaining(QuerydslPredicate.class.getSimpleName())// .withMessageContaining("root");