From dac455ebe18a0b8b17aa8ee72e7311c8212f18db Mon Sep 17 00:00:00 2001 From: kimjg Date: Sat, 26 Oct 2024 21:52:56 +0900 Subject: [PATCH 1/2] Fixes gh-1098 Support primitive function interfaces Added support for basic type functions supported by Java Resolves #1098 --- .../context/catalog/FunctionTypeUtils.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java index b4ca09b95..692223971 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java @@ -27,8 +27,20 @@ import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.DoubleConsumer; +import java.util.function.DoubleFunction; +import java.util.function.DoubleSupplier; import java.util.function.Function; +import java.util.function.IntConsumer; +import java.util.function.IntFunction; +import java.util.function.IntSupplier; +import java.util.function.LongConsumer; +import java.util.function.LongFunction; +import java.util.function.LongSupplier; import java.util.function.Supplier; +import java.util.function.ToDoubleFunction; +import java.util.function.ToIntFunction; +import java.util.function.ToLongFunction; import java.util.stream.Stream; import com.fasterxml.jackson.databind.JsonNode; @@ -540,10 +552,23 @@ private static void assertSupportedTypes(Type type) { Class candidateType = (Class) type; Assert.isTrue(Supplier.class.isAssignableFrom(candidateType) - || Function.class.isAssignableFrom(candidateType) - || Consumer.class.isAssignableFrom(candidateType) - || FunctionRegistration.class.isAssignableFrom(candidateType) - || type.getTypeName().startsWith("org.springframework.context.annotation.ConfigurationClassEnhancer"), "Must be one of Supplier, Function, Consumer" + || Function.class.isAssignableFrom(candidateType) + || Consumer.class.isAssignableFrom(candidateType) + || FunctionRegistration.class.isAssignableFrom(candidateType) + || IntConsumer.class.isAssignableFrom(candidateType) + || IntSupplier.class.isAssignableFrom(candidateType) + || IntFunction.class.isAssignableFrom(candidateType) + || ToIntFunction.class.isAssignableFrom(candidateType) + || LongConsumer.class.isAssignableFrom(candidateType) + || LongSupplier.class.isAssignableFrom(candidateType) + || LongFunction.class.isAssignableFrom(candidateType) + || ToLongFunction.class.isAssignableFrom(candidateType) + || DoubleConsumer.class.isAssignableFrom(candidateType) + || DoubleSupplier.class.isAssignableFrom(candidateType) + || DoubleFunction.class.isAssignableFrom(candidateType) + || ToDoubleFunction.class.isAssignableFrom(candidateType) + || type.getTypeName().startsWith("org.springframework.context.annotation.ConfigurationClassEnhancer"), + "Must be one of Supplier, Function, Consumer" + " or FunctionRegistration. Was " + type); } From 6dddf31e8fc495448ad893c906e969097aa5e77c Mon Sep 17 00:00:00 2001 From: kjg Date: Thu, 31 Oct 2024 13:08:04 +0900 Subject: [PATCH 2/2] gh-1098 Java's basic type function Unit Test Add Resolves #1098 --- .../catalog/FunctionTypeUtilsTests.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtilsTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtilsTests.java index ee1dfb29b..fc0183c02 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtilsTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtilsTests.java @@ -25,8 +25,20 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import java.util.function.DoubleConsumer; +import java.util.function.DoubleFunction; +import java.util.function.DoubleSupplier; import java.util.function.Function; +import java.util.function.IntConsumer; +import java.util.function.IntFunction; +import java.util.function.IntSupplier; +import java.util.function.LongConsumer; +import java.util.function.LongFunction; +import java.util.function.LongSupplier; import java.util.function.Supplier; +import java.util.function.ToDoubleFunction; +import java.util.function.ToIntFunction; +import java.util.function.ToLongFunction; import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; @@ -113,6 +125,86 @@ public void testNoNpeFromIsMessage() { assertThat(FunctionTypeUtils.isMessage(methodParameter.getGenericParameterType())).isFalse(); } + @Test + public void testPrimitiveFunctionInputTypes() { + Type type = FunctionTypeUtils.discoverFunctionTypeFromClass(IntConsumer.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(IntConsumer.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(IntSupplier.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(IntSupplier.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(IntFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(IntFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(ToIntFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(ToIntFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(LongConsumer.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(LongConsumer.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(LongSupplier.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(LongSupplier.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(LongFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(LongFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(ToLongFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(ToLongFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(DoubleConsumer.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(DoubleConsumer.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(DoubleSupplier.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(DoubleSupplier.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(DoubleFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(DoubleFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(ToDoubleFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getInputType(type))).isAssignableFrom(ToDoubleFunction.class); + } + + + @Test + public void testPrimitiveFunctionOutputTypes() { + Type type = FunctionTypeUtils.discoverFunctionTypeFromClass(IntConsumer.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(IntConsumer.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(IntSupplier.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(IntSupplier.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(IntFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(IntFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(ToIntFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(ToIntFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(LongConsumer.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(LongConsumer.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(LongSupplier.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(LongSupplier.class); + + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(LongFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(LongFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(ToLongFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(ToLongFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(DoubleConsumer.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(DoubleConsumer.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(DoubleSupplier.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(DoubleSupplier.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(DoubleFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(DoubleFunction.class); + + type = FunctionTypeUtils.discoverFunctionTypeFromClass(ToDoubleFunction.class); + assertThat(FunctionTypeUtils.getRawType(FunctionTypeUtils.getOutputType(type))).isAssignableFrom(ToDoubleFunction.class); + } + void notAMessageMethod(AtomicReference payload) { }