From 1ad82cb82d149e8b7c855c8f303438bc76e2989c Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 24 Nov 2016 18:44:36 +0100 Subject: [PATCH] DATACMNS-867 - Update forward ported code. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Polished method lookup in DefaultRepositoryInformation using Optionals.firstNonEmpty(…). Optimized creation of JavaSlang's Option type as we don't have to rely on reflection to call static methods on interfaces on Java 8. AssertJ updates in corresponding tests. --- .../support/DefaultRepositoryInformation.java | 22 +++++++++++-------- .../util/QueryExecutionConverters.java | 21 ++---------------- ...DefaultRepositoryInformationUnitTests.java | 8 +++---- .../RepositoryFactorySupportUnitTests.java | 2 +- .../QueryExecutionConvertersUnitTests.java | 2 +- 5 files changed, 21 insertions(+), 34 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java b/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java index 8b9d7aaec..0aeaaed53 100644 --- a/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java +++ b/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java @@ -32,6 +32,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; @@ -41,6 +42,7 @@ import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.CrudMethods; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.data.util.Optionals; import org.springframework.data.util.ReflectionUtils; import org.springframework.data.util.Streamable; import org.springframework.util.Assert; @@ -238,15 +240,17 @@ class DefaultRepositoryInformation implements RepositoryInformation { * @return */ Method getTargetClassMethod(Method method, Optional> baseClass) { - return baseClass.map(it -> { - return Optional.ofNullable(findMethod(it, method.getName(), method.getParameterTypes())).orElseGet(() -> { - return Arrays.stream(it.getMethods())// - .filter(baseClassMethod -> method.getName().equals(baseClassMethod.getName()))// Right name - .filter(baseClassMethod -> method.getParameterTypes().length == baseClassMethod.getParameterTypes().length) - .filter(baseClassMethod -> parametersMatch(method, baseClassMethod))// All parameters match - .findFirst().orElse(method); - }); - }).orElse(method); + + Supplier> directMatch = () -> baseClass + .map(it -> findMethod(it, method.getName(), method.getParameterTypes())); + + Supplier> detailedComparison = () -> baseClass.flatMap(it -> Arrays.stream(it.getMethods())// + .filter(baseClassMethod -> method.getName().equals(baseClassMethod.getName()))// Right name + .filter(baseClassMethod -> method.getParameterTypes().length == baseClassMethod.getParameterTypes().length) + .filter(baseClassMethod -> parametersMatch(method, baseClassMethod))// All parameters match + .findFirst()); + + return Optionals.firstNonEmpty(directMatch, detailedComparison).orElse(method); } /* 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 9cff0cdf8..1f5c007bf 100644 --- a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java +++ b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java @@ -25,8 +25,6 @@ import scala.Function0; import scala.Option; import scala.runtime.AbstractFunction0; -import java.lang.reflect.Method; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -46,7 +44,6 @@ import org.springframework.data.domain.Slice; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; -import org.springframework.util.ReflectionUtils; import org.springframework.util.concurrent.ListenableFuture; import com.google.common.base.Optional; @@ -479,21 +476,13 @@ public abstract class QueryExecutionConverters { */ private static class NullableWrapperToJavaslangOptionConverter extends AbstractWrapperTypeConverter { - private static final Method OF_METHOD; - private static final Method NONE_METHOD; - - static { - OF_METHOD = ReflectionUtils.findMethod(javaslang.control.Option.class, "of", Object.class); - NONE_METHOD = ReflectionUtils.findMethod(javaslang.control.Option.class, "none"); - } - /** * Creates a new {@link NullableWrapperToJavaslangOptionConverter} using the given {@link ConversionService}. * * @param conversionService must not be {@literal null}. */ public NullableWrapperToJavaslangOptionConverter(ConversionService conversionService) { - super(conversionService, createEmptyOption(), javaslang.control.Option.class); + super(conversionService, javaslang.control.Option.none(), getWrapperType()); } public static WrapperType getWrapperType() { @@ -505,14 +494,8 @@ public abstract class QueryExecutionConverters { * @see org.springframework.data.repository.util.QueryExecutionConverters.AbstractWrapperTypeConverter#wrap(java.lang.Object) */ @Override - @SuppressWarnings("unchecked") protected Object wrap(Object source) { - return (javaslang.control.Option) ReflectionUtils.invokeMethod(OF_METHOD, null, source); - } - - @SuppressWarnings("unchecked") - private static javaslang.control.Option createEmptyOption() { - return (javaslang.control.Option) ReflectionUtils.invokeMethod(NONE_METHOD, null); + return javaslang.control.Option.of(source); } } diff --git a/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryInformationUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryInformationUnitTests.java index da3de0564..1989b2a6d 100755 --- a/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryInformationUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryInformationUnitTests.java @@ -242,11 +242,11 @@ public class DefaultRepositoryInformationUnitTests { RepositoryMetadata metadata = new DefaultRepositoryMetadata(FooRepository.class); RepositoryInformation information = new DefaultRepositoryInformation(metadata, CrudRepository.class, - customImplementation.getClass()); + Optional.of(customImplementation.getClass())); Method method = FooRepository.class.getMethod("staticMethod"); - assertThat(information.getQueryMethods(), not(hasItem(method))); + assertThat(information.getQueryMethods()).doesNotContain(method); } @Test // DATACMNS-939 @@ -254,11 +254,11 @@ public class DefaultRepositoryInformationUnitTests { RepositoryMetadata metadata = new DefaultRepositoryMetadata(FooRepository.class); RepositoryInformation information = new DefaultRepositoryInformation(metadata, CrudRepository.class, - customImplementation.getClass()); + Optional.of(customImplementation.getClass())); Method method = FooRepository.class.getMethod("defaultMethod"); - assertThat(information.getQueryMethods(), not(hasItem(method))); + assertThat(information.getQueryMethods()).doesNotContain(method); } @Test // DATACMNS-943 diff --git a/src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java index cc67cd795..4b3ea4001 100755 --- a/src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java @@ -281,7 +281,7 @@ public class RepositoryFactorySupportUnitTests { ObjectRepository repository = factory.getRepository(ObjectRepository.class, customImplementation); - assertThat(repository.staticMethodDelegate(), is(equalTo("OK"))); + assertThat(repository.staticMethodDelegate()).isEqualTo("OK"); verifyZeroInteractions(customImplementation); verifyZeroInteractions(backingRepo); 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 6c5bf6153..8b4b02670 100755 --- a/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java @@ -186,7 +186,7 @@ public class QueryExecutionConvertersUnitTests { @SuppressWarnings("unchecked") public void turnsNullIntoJavaslangOption() { assertThat(conversionService.convert(new NullableWrapper(null), javaslang.control.Option.class)) - .isEqualTo(optionNone()); + .isEqualTo(javaslang.control.Option.none()); } @Test // DATACMNS-937