Skip to content

Commit 50b8929

Browse files
author
Adrien Poupard
committed
Refactor: Replace FunctionUtils with KotlinUtils for consumer and function validation
Signed-off-by: Adrien Poupard <[email protected]>
1 parent 6dfc8ee commit 50b8929

17 files changed

+100
-102
lines changed

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinConsumerFlowWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import kotlinx.coroutines.flow.Flow;
2525
import reactor.core.publisher.Flux;
2626

27-
import org.springframework.cloud.function.context.config.FunctionUtils;
2827
import org.springframework.cloud.function.utils.KotlinUtils;
2928
import org.springframework.core.ResolvableType;
3029

@@ -40,7 +39,7 @@ public final class KotlinConsumerFlowWrapper
4039
implements KotlinFunctionWrapper, Consumer<Flux<Object>>, Function1<Flow<Object>, Unit> {
4140

4241
public static Boolean isValid(Type functionType, Type[] types) {
43-
return FunctionUtils.isValidKotlinConsumer(functionType, types) && KotlinUtils.isFlowType(types[0]);
42+
return KotlinUtils.isValidKotlinConsumer(functionType, types) && KotlinUtils.isFlowType(types[0]);
4443
}
4544

4645
public static KotlinConsumerFlowWrapper asRegistrationFunction(String functionName, Object kotlinLambdaTarget,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinConsumerPlainWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import kotlin.Unit;
2323
import kotlin.jvm.functions.Function1;
2424

25-
import org.springframework.cloud.function.context.config.FunctionUtils;
2625
import org.springframework.cloud.function.utils.KotlinUtils;
2726
import org.springframework.core.ResolvableType;
2827

@@ -36,7 +35,7 @@
3635
public final class KotlinConsumerPlainWrapper implements KotlinFunctionWrapper, Consumer<Object>, Function1<Object, Unit> {
3736

3837
public static Boolean isValid(Type functionType, Type[] types) {
39-
return FunctionUtils.isValidKotlinConsumer(functionType, types) && !KotlinUtils.isFlowType(types[0]);
38+
return KotlinUtils.isValidKotlinConsumer(functionType, types) && !KotlinUtils.isFlowType(types[0]);
4039
}
4140

4241
public static KotlinConsumerPlainWrapper asRegistrationFunction(String functionName, Object kotlinLambdaTarget,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinConsumerSuspendFlowWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import reactor.core.publisher.Flux;
2525

2626
import org.springframework.cloud.function.context.config.CoroutinesUtils;
27-
import org.springframework.cloud.function.context.config.FunctionUtils;
2827
import org.springframework.cloud.function.utils.KotlinUtils;
2928
import org.springframework.core.ResolvableType;
3029

@@ -38,7 +37,7 @@
3837
public final class KotlinConsumerSuspendFlowWrapper implements KotlinFunctionWrapper, Consumer<Flux<Object>>, Function1<Flux<Object>, Unit> {
3938

4039
public static Boolean isValid(Type functionType, Type[] types) {
41-
return FunctionUtils.isValidKotlinSuspendConsumer(functionType, types) && KotlinUtils.isFlowType(types[0]);
40+
return KotlinUtils.isValidKotlinSuspendConsumer(functionType, types) && KotlinUtils.isFlowType(types[0]);
4241
}
4342

4443
public static KotlinConsumerSuspendFlowWrapper asRegistrationFunction(String functionName,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinConsumerSuspendPlainWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import kotlin.jvm.functions.Function1;
2424

2525
import org.springframework.cloud.function.context.config.CoroutinesUtils;
26-
import org.springframework.cloud.function.context.config.FunctionUtils;
2726
import org.springframework.cloud.function.utils.KotlinUtils;
2827
import org.springframework.core.ResolvableType;
2928

@@ -37,7 +36,7 @@
3736
public final class KotlinConsumerSuspendPlainWrapper implements KotlinFunctionWrapper, Consumer<Object>, Function1<Object, Unit> {
3837

3938
public static Boolean isValid(Type functionType, Type[] types) {
40-
return FunctionUtils.isValidKotlinSuspendConsumer(functionType, types) && !KotlinUtils.isFlowType(types[0]);
39+
return KotlinUtils.isValidKotlinSuspendConsumer(functionType, types) && !KotlinUtils.isFlowType(types[0]);
4140
}
4241

4342
public static KotlinConsumerSuspendPlainWrapper asRegistrationFunction(String functionName,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinFunctionFlowToFlowWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import kotlinx.coroutines.flow.Flow;
2424
import reactor.core.publisher.Flux;
2525

26-
import org.springframework.cloud.function.context.config.FunctionUtils;
2726
import org.springframework.cloud.function.utils.KotlinUtils;
2827
import org.springframework.core.ResolvableType;
2928

@@ -38,7 +37,7 @@ public final class KotlinFunctionFlowToFlowWrapper
3837
implements KotlinFunctionWrapper, Function<Flux<Object>, Flux<Object>>, Function1<Flux<Object>, Flux<Object>> {
3938

4039
public static Boolean isValid(Type functionType, Type[] types) {
41-
return FunctionUtils.isValidKotlinFunction(functionType, types) && types.length == 2
40+
return KotlinUtils.isValidKotlinFunction(functionType, types) && types.length == 2
4241
&& KotlinUtils.isFlowType(types[0]) && KotlinUtils.isFlowType(types[1]);
4342
}
4443

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinFunctionFlowToPlainWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import kotlinx.coroutines.flow.Flow;
2424
import reactor.core.publisher.Flux;
2525

26-
import org.springframework.cloud.function.context.config.FunctionUtils;
2726
import org.springframework.cloud.function.utils.KotlinUtils;
2827
import org.springframework.core.ResolvableType;
2928

@@ -38,7 +37,7 @@ public final class KotlinFunctionFlowToPlainWrapper
3837
implements KotlinFunctionWrapper, Function<Flux<Object>, Object>, Function1<Flux<Object>, Object> {
3938

4039
public static Boolean isValid(Type functionType, Type[] types) {
41-
return FunctionUtils.isValidKotlinFunction(functionType, types) && types.length == 2
40+
return KotlinUtils.isValidKotlinFunction(functionType, types) && types.length == 2
4241
&& KotlinUtils.isFlowType(types[0]) && !KotlinUtils.isFlowType(types[1]);
4342
}
4443

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinFunctionPlainToFlowWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import kotlinx.coroutines.flow.Flow;
2424
import reactor.core.publisher.Flux;
2525

26-
import org.springframework.cloud.function.context.config.FunctionUtils;
2726
import org.springframework.cloud.function.utils.KotlinUtils;
2827
import org.springframework.core.ResolvableType;
2928

@@ -39,7 +38,7 @@ public final class KotlinFunctionPlainToFlowWrapper
3938
implements KotlinFunctionWrapper, Function<Object, Flux<Object>>, Function1<Object, Flux<Object>> {
4039

4140
public static Boolean isValid(Type functionType, Type[] types) {
42-
return FunctionUtils.isValidKotlinFunction(functionType, types) && types.length == 2
41+
return KotlinUtils.isValidKotlinFunction(functionType, types) && types.length == 2
4342
&& !KotlinUtils.isFlowType(types[0]) && KotlinUtils.isFlowType(types[1]);
4443
}
4544

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinFunctionPlainToPlainWrapper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import kotlin.jvm.functions.Function1;
2323

24-
import org.springframework.cloud.function.context.config.FunctionUtils;
24+
import org.springframework.cloud.function.utils.KotlinUtils;
2525
import org.springframework.core.ResolvableType;
2626

2727
/**
@@ -35,7 +35,7 @@ public final class KotlinFunctionPlainToPlainWrapper
3535
implements KotlinFunctionWrapper, Function<Object, Object>, Function1<Object, Object> {
3636

3737
public static Boolean isValid(Type functionType, Type[] types) {
38-
return FunctionUtils.isValidKotlinFunction(functionType, types);
38+
return KotlinUtils.isValidKotlinFunction(functionType, types);
3939
}
4040

4141
public static KotlinFunctionPlainToPlainWrapper asRegistrationFunction(String functionName,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinFunctionSuspendFlowToFlowWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import reactor.core.publisher.Flux;
2525

2626
import org.springframework.cloud.function.context.config.CoroutinesUtils;
27-
import org.springframework.cloud.function.context.config.FunctionUtils;
2827
import org.springframework.cloud.function.utils.KotlinUtils;
2928
import org.springframework.core.ResolvableType;
3029

@@ -40,7 +39,7 @@ public final class KotlinFunctionSuspendFlowToFlowWrapper
4039
implements KotlinFunctionWrapper, Function<Flux<Object>, Flux<Object>>, Function1<Flux<Object>, Flux<Object>> {
4140

4241
public static Boolean isValid(Type functionType, Type[] types) {
43-
return FunctionUtils.isValidKotlinSuspendFunction(functionType, types) && types.length == 3
42+
return KotlinUtils.isValidKotlinSuspendFunction(functionType, types) && types.length == 3
4443
&& KotlinUtils.isFlowType(types[0]) && KotlinUtils.isContinuationFlowType(types[1]);
4544
}
4645

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinFunctionSuspendFlowToPlainWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import reactor.core.publisher.Flux;
2525

2626
import org.springframework.cloud.function.context.config.CoroutinesUtils;
27-
import org.springframework.cloud.function.context.config.FunctionUtils;
2827
import org.springframework.cloud.function.utils.KotlinUtils;
2928
import org.springframework.core.ResolvableType;
3029

@@ -39,7 +38,7 @@ public final class KotlinFunctionSuspendFlowToPlainWrapper
3938
implements KotlinFunctionWrapper, Function<Flux<Object>, Object>, Function1<Flux<Object>, Object> {
4039

4140
public static Boolean isValid(Type functionType, Type[] types) {
42-
return FunctionUtils.isValidKotlinSuspendFunction(functionType, types) && types.length == 3
41+
return KotlinUtils.isValidKotlinSuspendFunction(functionType, types) && types.length == 3
4342
&& KotlinUtils.isFlowType(types[0]) && KotlinUtils.isContinuationType(types[1])
4443
&& !KotlinUtils.isContinuationFlowType(types[1]);
4544
}

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinFunctionSuspendPlainToFlowWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import reactor.core.publisher.Flux;
2424

2525
import org.springframework.cloud.function.context.config.CoroutinesUtils;
26-
import org.springframework.cloud.function.context.config.FunctionUtils;
2726
import org.springframework.cloud.function.utils.KotlinUtils;
2827
import org.springframework.core.ResolvableType;
2928

@@ -39,7 +38,7 @@ public final class KotlinFunctionSuspendPlainToFlowWrapper
3938
implements KotlinFunctionWrapper, Function<Object, Flux<Object>>, Function1<Object, Flux<Object>> {
4039

4140
public static Boolean isValid(Type functionType, Type[] types) {
42-
return FunctionUtils.isValidKotlinSuspendFunction(functionType, types) && types.length == 3
41+
return KotlinUtils.isValidKotlinSuspendFunction(functionType, types) && types.length == 3
4342
&& !KotlinUtils.isFlowType(types[0]) && KotlinUtils.isContinuationFlowType(types[1]);
4443
}
4544

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinFunctionSuspendPlainToPlainWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import reactor.core.publisher.Flux;
2424

2525
import org.springframework.cloud.function.context.config.CoroutinesUtils;
26-
import org.springframework.cloud.function.context.config.FunctionUtils;
2726
import org.springframework.cloud.function.utils.KotlinUtils;
2827
import org.springframework.core.ResolvableType;
2928

@@ -38,7 +37,7 @@ public final class KotlinFunctionSuspendPlainToPlainWrapper
3837
implements KotlinFunctionWrapper, Function<Object, Object>, Function1<Object, Object> {
3938

4039
public static Boolean isValid(Type functionType, Type[] types) {
41-
return FunctionUtils.isValidKotlinSuspendFunction(functionType, types);
40+
return KotlinUtils.isValidKotlinSuspendFunction(functionType, types);
4241
}
4342

4443
public static KotlinFunctionSuspendPlainToPlainWrapper asRegistrationFunction(String functionName,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinSupplierFlowWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import kotlinx.coroutines.flow.Flow;
2424
import reactor.core.publisher.Flux;
2525

26-
import org.springframework.cloud.function.context.config.FunctionUtils;
2726
import org.springframework.cloud.function.utils.KotlinUtils;
2827
import org.springframework.core.ResolvableType;
2928

@@ -40,7 +39,7 @@ public final class KotlinSupplierFlowWrapper
4039
implements KotlinFunctionWrapper, Supplier<Flux<Object>>, Function0<Flow<Object>> {
4140

4241
public static Boolean isValid(Type functionType, Type[] types) {
43-
return FunctionUtils.isValidKotlinSupplier(functionType) && types.length == 1 && KotlinUtils.isFlowType(types[0]);
42+
return KotlinUtils.isValidKotlinSupplier(functionType) && types.length == 1 && KotlinUtils.isFlowType(types[0]);
4443
}
4544

4645
public static KotlinSupplierFlowWrapper asRegistrationFunction(String functionName, Object kotlinLambdaTarget,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinSupplierPlainWrapper.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import kotlin.jvm.functions.Function0;
2323

24-
import org.springframework.cloud.function.context.config.FunctionUtils;
24+
import org.springframework.cloud.function.utils.KotlinUtils;
2525
import org.springframework.core.ResolvableType;
2626
import org.springframework.util.ObjectUtils;
2727

@@ -36,7 +36,7 @@
3636
public final class KotlinSupplierPlainWrapper implements KotlinFunctionWrapper, Supplier<Object>, Function0<Object> {
3737

3838
public static Boolean isValid(Type functionType, Type[] types) {
39-
return FunctionUtils.isValidKotlinSupplier(functionType);
39+
return KotlinUtils.isValidKotlinSupplier(functionType);
4040
}
4141

4242
public static KotlinSupplierPlainWrapper asRegistrationFunction(String functionName, Object kotlinLambdaTarget,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/wrapper/KotlinSupplierSuspendWrapper.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import reactor.core.publisher.Flux;
2424

2525
import org.springframework.cloud.function.context.config.CoroutinesUtils;
26-
import org.springframework.cloud.function.context.config.FunctionUtils;
2726
import org.springframework.cloud.function.utils.KotlinUtils;
2827
import org.springframework.core.ResolvableType;
2928
import org.springframework.util.ObjectUtils;
@@ -38,7 +37,7 @@
3837
public final class KotlinSupplierSuspendWrapper implements KotlinFunctionWrapper, Supplier<Object>, Function0<Object> {
3938

4039
public static Boolean isValid(Type functionType, Type[] types) {
41-
return FunctionUtils.isValidKotlinSuspendSupplier(functionType, types);
40+
return KotlinUtils.isValidKotlinSuspendSupplier(functionType, types);
4241
}
4342

4443
public static KotlinSupplierSuspendWrapper asRegistrationFunction(String functionName, Object kotlinLambdaTarget,

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/utils/KotlinUtils.java

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
import java.lang.reflect.ParameterizedType;
2020
import java.lang.reflect.Type;
2121
import java.lang.reflect.WildcardType;
22+
import java.util.function.Consumer;
23+
import java.util.function.Function;
24+
import java.util.function.Supplier;
2225

2326
import kotlin.coroutines.Continuation;
2427
import kotlin.jvm.functions.Function0;
2528
import kotlin.jvm.functions.Function1;
29+
import kotlin.jvm.functions.Function2;
2630
import kotlinx.coroutines.flow.Flow;
2731
import kotlinx.coroutines.reactive.ReactiveFlowKt;
2832
import kotlinx.coroutines.reactor.ReactorFlowKt;
@@ -227,14 +231,92 @@ public static <T> Flux<T> convertToFlux(Flow<T> arg0) {
227231
return ReactorFlowKt.asFlux(arg0);
228232
}
229233

234+
/**
235+
* Check if a type is a valid Kotlin consumer.
236+
*
237+
* @param functionType the function type to check
238+
* @param type the type arguments
239+
* @return true if the type is a valid Kotlin consumer
240+
*/
241+
public static boolean isValidKotlinConsumer(Type functionType, Type[] type) {
242+
return isTypeRepresentedByClass(functionType, Consumer.class) || (
243+
isTypeRepresentedByClass(functionType, Function1.class) &&
244+
type.length == 2 &&
245+
!isContinuationType(type[0]) &&
246+
(isUnitType(type[1]) || isVoidType(type[1]))
247+
);
248+
}
249+
250+
/**
251+
* Check if a type is a valid Kotlin suspend consumer.
252+
*
253+
* @param functionType the function type to check
254+
* @param type the type arguments
255+
* @return true if the type is a valid Kotlin suspend consumer
256+
*/
257+
public static boolean isValidKotlinSuspendConsumer(Type functionType, Type[] type) {
258+
return isTypeRepresentedByClass(functionType, Function2.class) && type.length == 3 &&
259+
isContinuationUnitType(type[1]);
260+
}
261+
262+
/**
263+
* Check if a type is a valid Kotlin function.
264+
*
265+
* @param functionType the function type to check
266+
* @param type the type arguments
267+
* @return true if the type is a valid Kotlin function
268+
*/
269+
public static boolean isValidKotlinFunction(Type functionType, Type[] type) {
270+
return (isTypeRepresentedByClass(functionType, Function1.class) ||
271+
isTypeRepresentedByClass(functionType, Function.class)) &&
272+
type.length == 2 && !isContinuationType(type[0]) &&
273+
!isUnitType(type[1]);
274+
}
275+
276+
/**
277+
* Check if a type is a valid Kotlin suspend function.
278+
*
279+
* @param functionType the function type to check
280+
* @param type the type arguments
281+
* @return true if the type is a valid Kotlin suspend function
282+
*/
283+
public static boolean isValidKotlinSuspendFunction(Type functionType, Type[] type) {
284+
return isTypeRepresentedByClass(functionType, Function2.class) && type.length == 3 &&
285+
isContinuationType(type[1]) &&
286+
!isContinuationUnitType(type[1]);
287+
}
288+
289+
/**
290+
* Check if a type is a valid Kotlin supplier.
291+
*
292+
* @param functionType the function type to check
293+
* @return true if the type is a valid Kotlin supplier
294+
*/
295+
public static boolean isValidKotlinSupplier(Type functionType) {
296+
return isTypeRepresentedByClass(functionType, Function0.class) ||
297+
isTypeRepresentedByClass(functionType, Supplier.class);
298+
}
299+
300+
/**
301+
* Check if a type is a valid Kotlin suspend supplier.
302+
*
303+
* @param functionType the function type to check
304+
* @param type the type arguments
305+
* @return true if the type is a valid Kotlin suspend supplier
306+
*/
307+
public static boolean isValidKotlinSuspendSupplier(Type functionType, Type[] type) {
308+
return isTypeRepresentedByClass(functionType, Function1.class) && type.length == 2 &&
309+
isContinuationType(type[0]);
310+
}
311+
230312
/**
231313
* Check if a type is represented by a specific class.
232314
*
233315
* @param type the type to check
234316
* @param clazz the class to check against
235317
* @return true if the type is represented by the class
236318
*/
237-
private static boolean isTypeRepresentedByClass(Type type, Class<?> clazz) {
319+
public static boolean isTypeRepresentedByClass(Type type, Class<?> clazz) {
238320
return type.getTypeName().contains(clazz.getName());
239321
}
240322
}

0 commit comments

Comments
 (0)