diff --git a/src/main/java/org/springframework/data/querydsl/binding/PropertyPathInformation.java b/src/main/java/org/springframework/data/querydsl/binding/PropertyPathInformation.java index 463402809..e6b56a865 100644 --- a/src/main/java/org/springframework/data/querydsl/binding/PropertyPathInformation.java +++ b/src/main/java/org/springframework/data/querydsl/binding/PropertyPathInformation.java @@ -22,6 +22,7 @@ import lombok.ToString; import java.beans.PropertyDescriptor; import java.lang.reflect.Field; +import java.util.Optional; import org.springframework.beans.BeanUtils; import org.springframework.data.mapping.PropertyPath; @@ -118,24 +119,29 @@ class PropertyPathInformation implements PathInformation { */ @Override public Path reifyPath(EntityPathResolver resolver) { - return reifyPath(resolver, path, null); + return reifyPath(resolver, path, Optional.empty()); } - private static Path reifyPath(EntityPathResolver resolver, PropertyPath path, Path base) { + private static Path reifyPath(EntityPathResolver resolver, PropertyPath path, Optional> base) { - if (base instanceof CollectionPathBase) { - return reifyPath(resolver, path, (Path) ((CollectionPathBase) base).any()); - } + Optional> map = base.filter(it -> it instanceof CollectionPathBase) + .map(it -> CollectionPathBase.class.cast(it))// + .map(CollectionPathBase::any)// + .map(it -> Path.class.cast(it))// + .map(it -> reifyPath(resolver, path, Optional.of(it))); - Path entityPath = base != null ? base : resolver.createPath(path.getOwningType().getType()); + return map.orElseGet(() -> { - Field field = ReflectionUtils.findField(entityPath.getClass(), path.getSegment()); - Object value = ReflectionUtils.getField(field, entityPath); + Path entityPath = base.orElseGet(() -> resolver.createPath(path.getOwningType().getType())); - if (path.hasNext()) { - return reifyPath(resolver, path.next(), (Path) value); - } + Field field = ReflectionUtils.findField(entityPath.getClass(), path.getSegment()); + Object value = ReflectionUtils.getField(field, entityPath); - return (Path) value; + if (path.hasNext()) { + return reifyPath(resolver, path.next(), Optional.of((Path) value)); + } + + return (Path) value; + }); } } diff --git a/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java b/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java index 9945ca40a..29f1693ca 100644 --- a/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java +++ b/src/main/java/org/springframework/data/querydsl/binding/QuerydslPredicateBuilder.java @@ -16,6 +16,7 @@ package org.springframework.data.querydsl.binding; import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -40,6 +41,7 @@ import org.springframework.util.StringUtils; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Path; import com.querydsl.core.types.Predicate; +import com.querydsl.core.types.dsl.CollectionPathBase; /** * Builder assembling {@link Predicate} out of {@link PropertyValues}. @@ -148,7 +150,7 @@ public class QuerydslPredicateBuilder { Optional> resolvedPath = bindings.getExistingPath(path); - return resolvedPath.orElseGet(() -> paths.computeIfAbsent(path, it -> reifyPath(path, Optional.empty()))); + return resolvedPath.orElseGet(() -> paths.computeIfAbsent(path, it -> it.reifyPath(resolver))); } /** @@ -192,7 +194,7 @@ public class QuerydslPredicateBuilder { */ private Collection convertToPropertyPathSpecificType(List source, PathInformation path) { - Class targetType = path.getLeafProperty().getType(); + Class targetType = path.getLeafType(); if (source.isEmpty() || isSingleElementCollectionWithoutText(source)) { return Collections.emptyList(); diff --git a/src/main/java/org/springframework/data/repository/core/support/RepositoryFactoryBeanSupport.java b/src/main/java/org/springframework/data/repository/core/support/RepositoryFactoryBeanSupport.java index 36e98cfe6..1366305e6 100644 --- a/src/main/java/org/springframework/data/repository/core/support/RepositoryFactoryBeanSupport.java +++ b/src/main/java/org/springframework/data/repository/core/support/RepositoryFactoryBeanSupport.java @@ -56,6 +56,7 @@ public abstract class RepositoryFactoryBeanSupport, private final Class repositoryInterface; + private RepositoryFactorySupport factory; private Key queryLookupStrategyKey; private Optional> repositoryBaseClass = Optional.empty(); private Optional customImplementation = Optional.empty(); diff --git a/src/main/java/org/springframework/data/repository/util/JavaslangCollections.java b/src/main/java/org/springframework/data/repository/util/JavaslangCollections.java index 6ee4b4221..60c247488 100644 --- a/src/main/java/org/springframework/data/repository/util/JavaslangCollections.java +++ b/src/main/java/org/springframework/data/repository/util/JavaslangCollections.java @@ -1,5 +1,5 @@ /* - * Copyright 2016 the original author or authors. + * Copyright 2016-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,9 +15,10 @@ */ package org.springframework.data.repository.util; +import javaslang.collection.LinkedHashMap; +import javaslang.collection.LinkedHashSet; import javaslang.collection.Traversable; -import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -29,7 +30,6 @@ import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.ConditionalGenericConverter; import org.springframework.core.convert.converter.Converter; import org.springframework.data.repository.util.QueryExecutionConverters.WrapperType; -import org.springframework.util.ReflectionUtils; /** * Converter implementations to map from and to Javaslang collections. @@ -112,15 +112,15 @@ class JavaslangCollections { public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { if (source instanceof List) { - return ReflectionUtils.invokeMethod(LIST_FACTORY_METHOD, null, source); + return javaslang.collection.List.ofAll((Iterable) source); } if (source instanceof java.util.Set) { - return ReflectionUtils.invokeMethod(SET_FACTORY_METHOD, null, source); + return LinkedHashSet.ofAll((Iterable) source); } if (source instanceof java.util.Map) { - return ReflectionUtils.invokeMethod(MAP_FACTORY_METHOD, null, source); + return LinkedHashMap.ofAll((java.util.Map) source); } return source; @@ -128,9 +128,6 @@ class JavaslangCollections { }; private static final Set CONVERTIBLE_PAIRS; - private static final Method LIST_FACTORY_METHOD; - private static final Method SET_FACTORY_METHOD; - private static final Method MAP_FACTORY_METHOD; static { @@ -139,11 +136,6 @@ class JavaslangCollections { pairs.add(new ConvertiblePair(Map.class, javaslang.collection.Traversable.class)); CONVERTIBLE_PAIRS = Collections.unmodifiableSet(pairs); - - MAP_FACTORY_METHOD = ReflectionUtils.findMethod(javaslang.collection.LinkedHashMap.class, "ofAll", Map.class); - LIST_FACTORY_METHOD = ReflectionUtils.findMethod(javaslang.collection.List.class, "ofAll", Iterable.class); - SET_FACTORY_METHOD = ReflectionUtils.findMethod(javaslang.collection.LinkedHashSet.class, "ofAll", - Iterable.class); } } } diff --git a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java index 1f5c007bf..e6c7c5a86 100644 --- a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java +++ b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java @@ -25,13 +25,13 @@ import scala.Function0; import scala.Option; import scala.runtime.AbstractFunction0; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Future; -import java.util.function.Supplier; import java.util.stream.Collectors; import org.springframework.core.convert.ConversionService; @@ -60,8 +60,8 @@ import com.google.common.base.Optional; *
  • {@code org.springframework.util.concurrent.ListenableFuture<}
  • *
  • {@code javaslang.control.Option} - as of 1.13
  • *
  • {@code javaslang.collection.Seq}, {@code javaslang.collection.Map}, {@code javaslang.collection.Set} - as of - *
  • Reactive wrappers supported by {@link ReactiveWrappers}
  • * 1.13 + *
  • Reactive wrappers supported by {@link ReactiveWrappers} - as of 2.0
  • * * * @author Oliver Gierke @@ -482,7 +482,7 @@ public abstract class QueryExecutionConverters { * @param conversionService must not be {@literal null}. */ public NullableWrapperToJavaslangOptionConverter(ConversionService conversionService) { - super(conversionService, javaslang.control.Option.none(), getWrapperType()); + super(conversionService, javaslang.control.Option.none(), javaslang.control.Option.class); } public static WrapperType getWrapperType() { @@ -582,17 +582,6 @@ public abstract class QueryExecutionConverters { INSTANCE; - private static final Supplier NULL_SUPPLIER = new Supplier() { - - /* - * (non-Javadoc) - * @see java.util.function.Supplier#get() - */ - public Object get() { - return null; - } - }; - /* * (non-Javadoc) * @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object) @@ -602,7 +591,7 @@ public abstract class QueryExecutionConverters { public Object convert(Object source) { if (source instanceof javaslang.control.Option) { - return ((javaslang.control.Option) source).getOrElse(NULL_SUPPLIER); + return ((javaslang.control.Option) source).getOrElse(() -> null); } if (source instanceof Traversable) { diff --git a/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java b/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java index ab5b3262e..227e36b91 100755 --- a/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java +++ b/src/test/java/org/springframework/data/mapping/model/BasicPersistentEntityUnitTests.java @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.List; import java.util.Optional; +import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; diff --git a/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsUnitTests.java b/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsUnitTests.java index c224d6c33..773c2bdb0 100755 --- a/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsUnitTests.java +++ b/src/test/java/org/springframework/data/querydsl/binding/QuerydslBindingsUnitTests.java @@ -59,11 +59,11 @@ public class QuerydslBindingsUnitTests { } @Test // DATACMNS-669 - public void returnsNullIfNoBindingRegisteredForPath() { + public void returnsEmptyOptionalIfNoBindingRegisteredForPath() { PathInformation path = PropertyPathInformation.of("lastname", User.class); - assertThat(bindings.getBindingForPath(path)).isNull(); + assertThat(bindings.getBindingForPath(path)).isEmpty(); } @Test // DATACMNS-669 @@ -102,7 +102,7 @@ public class QuerydslBindingsUnitTests { PathInformation path = PropertyPathInformation.of("inceptionYear", User.class); - assertThat(bindings.getBindingForPath(path)).isNull(); + assertThat(bindings.getBindingForPath(path)).isEmpty(); } @Test // DATACMNS-669 diff --git a/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java index 32dccf308..260ab4541 100644 --- a/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/EventPublishingRepositoryProxyPostProcessorUnitTests.java @@ -15,10 +15,8 @@ */ package org.springframework.data.repository.core.support; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; -import static org.mockito.Matchers.*; -import static org.mockito.Matchers.any; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import lombok.Getter; @@ -101,7 +99,7 @@ public class EventPublishingRepositoryProxyPostProcessorUnitTests { @Test // DATACMNS-928 public void doesNotCreatePublishingMethodIfNoAnnotationDetected() { - assertThat(EventPublishingMethod.of(Object.class), is(nullValue())); + assertThat(EventPublishingMethod.of(Object.class)).isNull(); } @Test // DATACMNS-928 diff --git a/src/test/java/org/springframework/data/repository/core/support/ExampleSpecificationAccessorUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/ExampleSpecificationAccessorUnitTests.java index 258269518..0ebb8a1eb 100755 --- a/src/test/java/org/springframework/data/repository/core/support/ExampleSpecificationAccessorUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/ExampleSpecificationAccessorUnitTests.java @@ -255,8 +255,8 @@ public class ExampleSpecificationAccessorUnitTests { ExampleMatcher matcher = ExampleMatcher.matching()// .withMatcher("firstname", exact()); - assertThat(new ExampleMatcherAccessor(matcher).getPropertySpecifier("firstname").getStringMatcher(), - is(StringMatcher.EXACT)); + assertThat(new ExampleMatcherAccessor(matcher).getPropertySpecifier("firstname").getStringMatcher()) + .isEqualTo(StringMatcher.EXACT); } static class Person { diff --git a/src/test/java/org/springframework/data/repository/core/support/RepositoryFactoryBeanSupportUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/RepositoryFactoryBeanSupportUnitTests.java index c134b5005..9411028b1 100755 --- a/src/test/java/org/springframework/data/repository/core/support/RepositoryFactoryBeanSupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/RepositoryFactoryBeanSupportUnitTests.java @@ -55,7 +55,7 @@ public class RepositoryFactoryBeanSupportUnitTests { public void initializationFailsWithMissingRepositoryInterface() { assertThatExceptionOfType(IllegalArgumentException.class)// - .isThrownBy(() -> new DummyRepositoryFactoryBean().afterPropertiesSet())// + .isThrownBy(() -> new DummyRepositoryFactoryBean(null))// .withMessageContaining("Repository interface"); } diff --git a/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java b/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java index 8b4b02670..dc1444bc4 100755 --- a/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java @@ -18,8 +18,8 @@ package org.springframework.data.repository.util; import static org.assertj.core.api.Assertions.*; import static org.springframework.data.repository.util.QueryExecutionConverters.*; -import javaslang.collection.HashMap; -import javaslang.collection.HashSet; +import javaslang.collection.LinkedHashMap; +import javaslang.collection.LinkedHashSet; import javaslang.collection.Seq; import javaslang.collection.Traversable; import reactor.core.publisher.Flux; @@ -29,7 +29,6 @@ import rx.Observable; import rx.Single; import scala.Option; -import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -44,7 +43,6 @@ import org.reactivestreams.Publisher; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.data.domain.Page; import org.springframework.data.domain.Slice; -import org.springframework.util.ReflectionUtils; import org.springframework.util.concurrent.ListenableFuture; import com.google.common.base.Optional; @@ -201,12 +199,12 @@ public class QueryExecutionConvertersUnitTests { @Test // DATACMNS-937 public void unwrapsEmptyJavaslangOption() { - assertThat(QueryExecutionConverters.unwrap(optionNone())).isNull(); + assertThat(QueryExecutionConverters.unwrap(javaslang.control.Option.none())).isNull(); } @Test // DATACMNS-937 public void unwrapsJavaslangOption() { - assertThat(QueryExecutionConverters.unwrap(option("string"))).isEqualTo("string"); + assertThat(QueryExecutionConverters.unwrap(javaslang.control.Option.of("string"))).isEqualTo("string"); } @Test // DATACMNS-940 @@ -257,9 +255,9 @@ public class QueryExecutionConvertersUnitTests { @Test // DATACMNS-940 public void unwrapsJavaslangCollectionsToJavaOnes() { - assertThat(unwrap(javaslangList(1, 2, 3))).isInstanceOf(List.class); - assertThat(unwrap(javaslangSet(1, 2, 3))).isInstanceOf(Set.class); - assertThat(unwrap(javaslangMap("key", "value"))).isInstanceOf(Map.class); + assertThat(unwrap(javaslang.collection.List.of(1, 2, 3))).isInstanceOf(List.class); + assertThat(unwrap(LinkedHashSet.of(1, 2, 3))).isInstanceOf(Set.class); + assertThat(unwrap(LinkedHashMap.of("key", "value"))).isInstanceOf(Map.class); } @Test // DATACMNS-1005 @@ -268,40 +266,4 @@ public class QueryExecutionConvertersUnitTests { Set> allowedPageableTypes = QueryExecutionConverters.getAllowedPageableTypes(); assertThat(allowedPageableTypes).contains(Page.class, Slice.class, List.class, Seq.class); } - - @SuppressWarnings("unchecked") - private static javaslang.control.Option optionNone() { - - Method method = ReflectionUtils.findMethod(javaslang.control.Option.class, "none"); - return (javaslang.control.Option) ReflectionUtils.invokeMethod(method, null); - } - - @SuppressWarnings("unchecked") - private static javaslang.control.Option option(T source) { - - Method method = ReflectionUtils.findMethod(javaslang.control.Option.class, "of", Object.class); - return (javaslang.control.Option) ReflectionUtils.invokeMethod(method, null, source); - } - - @SuppressWarnings("unchecked") - private static javaslang.collection.List javaslangList(T... values) { - - Method method = ReflectionUtils.findMethod(javaslang.collection.List.class, "ofAll", Iterable.class); - return (javaslang.collection.List) ReflectionUtils.invokeMethod(method, null, Arrays.asList(values)); - } - - @SuppressWarnings("unchecked") - private static javaslang.collection.Set javaslangSet(T... values) { - - Method method = ReflectionUtils.findMethod(HashSet.class, "ofAll", Iterable.class); - return (javaslang.collection.Set) ReflectionUtils.invokeMethod(method, null, Arrays.asList(values)); - } - - @SuppressWarnings("unchecked") - private static javaslang.collection.Map javaslangMap(K key, V value) { - - Method method = ReflectionUtils.findMethod(HashMap.class, "ofAll", Map.class); - return (javaslang.collection.Map) ReflectionUtils.invokeMethod(method, null, - Collections.singletonMap(key, value)); - } } diff --git a/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java b/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java index 21da0b726..effe16661 100755 --- a/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java +++ b/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java @@ -393,7 +393,9 @@ public class ClassTypeInformationUnitTests { ClassTypeInformation information = ClassTypeInformation.from(SampleTraversable.class); - assertThat(information.getComponentType().getType(), is(typeCompatibleWith(Integer.class))); + assertThat(information.getComponentType()).hasValueSatisfying(it -> { + assertThat(it.getType()).isAssignableFrom(Integer.class); + }); } @Test // DATACMNS-940 @@ -401,8 +403,13 @@ public class ClassTypeInformationUnitTests { ClassTypeInformation information = ClassTypeInformation.from(SampleMap.class); - assertThat(information.getComponentType().getType(), is(typeCompatibleWith(String.class))); - assertThat(information.getMapValueType().getType(), is(typeCompatibleWith(Integer.class))); + assertThat(information.getComponentType()).hasValueSatisfying(it -> { + assertThat(it.getType()).isAssignableFrom(String.class); + }); + + assertThat(information.getMapValueType()).hasValueSatisfying(it -> { + assertThat(it.getType()).isAssignableFrom(Integer.class); + }); } static class StringMapContainer extends MapContainer {