Additional clean up and polishing
This commit is contained in:
@@ -428,7 +428,8 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInputTypeMessage() {
|
public boolean isInputTypeMessage() {
|
||||||
return this.message || this.isRoutingFunction();
|
boolean b = this.message || this.isRoutingFunction();
|
||||||
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isOutputTypeMessage() {
|
public boolean isOutputTypeMessage() {
|
||||||
@@ -518,6 +519,32 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
|
|||||||
return this.composed;
|
return this.composed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Object doApply(Object input) {
|
||||||
|
Object result;
|
||||||
|
|
||||||
|
input = this.fluxifyInputIfNecessary(input);
|
||||||
|
|
||||||
|
Object convertedInput = this.convertInputIfNecessary(input, this.inputType);
|
||||||
|
|
||||||
|
if (this.isRoutingFunction() || this.isComposed()) {
|
||||||
|
result = ((Function) this.target).apply(convertedInput);
|
||||||
|
}
|
||||||
|
else if (this.isSupplier()) {
|
||||||
|
result = ((Supplier) this.target).get();
|
||||||
|
}
|
||||||
|
else if (this.isConsumer()) {
|
||||||
|
result = this.invokeConsumer(convertedInput);
|
||||||
|
}
|
||||||
|
else { // Function
|
||||||
|
result = this.invokeFunction(convertedInput);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -587,32 +614,6 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
|
|||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Object doApply(Object input) {
|
|
||||||
Object result;
|
|
||||||
|
|
||||||
input = this.fluxifyInputIfNecessary(input);
|
|
||||||
|
|
||||||
Object convertedInput = this.convertInputIfNecessary(input, this.inputType);
|
|
||||||
|
|
||||||
if (this.isRoutingFunction() || this.isComposed()) {
|
|
||||||
result = ((Function) this.target).apply(convertedInput);
|
|
||||||
}
|
|
||||||
else if (this.isSupplier()) {
|
|
||||||
result = ((Supplier) this.target).get();
|
|
||||||
}
|
|
||||||
else if (this.isConsumer()) {
|
|
||||||
result = this.invokeConsumer(convertedInput);
|
|
||||||
}
|
|
||||||
else { // Function
|
|
||||||
result = this.invokeFunction(convertedInput);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@@ -725,43 +726,62 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
|
|||||||
throw new UnsupportedOperationException("At the moment only Tuple-based function are supporting multiple arguments");
|
throw new UnsupportedOperationException("At the moment only Tuple-based function are supporting multiple arguments");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private boolean isInputConversionNecessary(Object input, Type type) {
|
||||||
|
if (type == null || this.getRawClassFor(type) == Void.class || this.target instanceof RoutingFunction || this.isComposed()) {
|
||||||
|
if (this.getRawClassFor(type) == Void.class) {
|
||||||
|
if (input instanceof Message) {
|
||||||
|
input = ((Message) input).getPayload();
|
||||||
|
if (input instanceof Optional) {
|
||||||
|
input = ((Optional) input).orElseGet(() -> null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Assert.isNull(input, "Can't have non-null input with Void input type.");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private Object convertInputIfNecessary(Object input, Type type) {
|
private Object convertInputIfNecessary(Object input, Type type) {
|
||||||
if (type == null) {
|
if (!this.isInputConversionNecessary(input, type)) {
|
||||||
return input;
|
return input;
|
||||||
}
|
}
|
||||||
if (this.getRawClassFor(type) == Void.class && !(input instanceof Publisher) && !(input instanceof Message)) {
|
|
||||||
logger.info("Input value '" + input + "' is ignored for function '"
|
|
||||||
+ this.functionDefinition + "' since it's input type is Void and as such it is treated as Supplier.");
|
|
||||||
input = null;
|
|
||||||
}
|
|
||||||
if (this.skipInputConversion && !(input instanceof Publisher)) {
|
|
||||||
return this.isInputTypeMessage()
|
|
||||||
? input
|
|
||||||
: new OriginalMessageHolder(((Message) input).getPayload(), (Message<?>) input);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FunctionTypeUtils.isMultipleArgumentType(type)) {
|
Object convertedInput = null;
|
||||||
|
if (input instanceof Publisher) {
|
||||||
|
convertedInput = this.convertInputPublisherIfNecessary((Publisher) input, type);
|
||||||
|
}
|
||||||
|
else if (FunctionTypeUtils.isMultipleArgumentType(type)) {
|
||||||
Type[] inputTypes = ((ParameterizedType) type).getActualTypeArguments();
|
Type[] inputTypes = ((ParameterizedType) type).getActualTypeArguments();
|
||||||
Object[] multipleValueArguments = this.parseMultipleValueArguments(input, inputTypes.length);
|
Object[] multipleValueArguments = this.parseMultipleValueArguments(input, inputTypes.length);
|
||||||
Object[] convertedInputs = new Object[inputTypes.length];
|
Object[] convertedInputs = new Object[inputTypes.length];
|
||||||
for (int i = 0; i < multipleValueArguments.length; i++) {
|
for (int i = 0; i < multipleValueArguments.length; i++) {
|
||||||
Object convertedInput = this.convertInputIfNecessary(multipleValueArguments[i], inputTypes[i]);
|
Object cInput = this.convertInputIfNecessary(multipleValueArguments[i], inputTypes[i]);
|
||||||
convertedInputs[i] = convertedInput;
|
convertedInputs[i] = cInput;
|
||||||
}
|
}
|
||||||
return Tuples.fromArray(convertedInputs);
|
convertedInput = Tuples.fromArray(convertedInputs);
|
||||||
}
|
}
|
||||||
|
else if (this.skipInputConversion) {
|
||||||
Object convertedInput = input;
|
convertedInput = this.isInputTypeMessage()
|
||||||
if (input == null || this.target instanceof RoutingFunction || this.isComposed()) {
|
? input
|
||||||
return input;
|
: new OriginalMessageHolder(((Message) input).getPayload(), (Message<?>) input);
|
||||||
}
|
|
||||||
|
|
||||||
if (input instanceof Publisher) {
|
|
||||||
convertedInput = this.convertInputPublisherIfNecessary((Publisher) input, type);
|
|
||||||
}
|
}
|
||||||
|
// else if (FunctionTypeUtils.isMultipleArgumentType(type)) {
|
||||||
|
// Type[] inputTypes = ((ParameterizedType) type).getActualTypeArguments();
|
||||||
|
// Object[] multipleValueArguments = this.parseMultipleValueArguments(input, inputTypes.length);
|
||||||
|
// Object[] convertedInputs = new Object[inputTypes.length];
|
||||||
|
// for (int i = 0; i < multipleValueArguments.length; i++) {
|
||||||
|
// Object cInput = this.convertInputIfNecessary(multipleValueArguments[i], inputTypes[i]);
|
||||||
|
// convertedInputs[i] = cInput;
|
||||||
|
// }
|
||||||
|
// convertedInput = Tuples.fromArray(convertedInputs);
|
||||||
|
// }
|
||||||
|
// else if (input instanceof Publisher) {
|
||||||
|
// convertedInput = this.convertInputPublisherIfNecessary((Publisher) input, type);
|
||||||
|
// }
|
||||||
else if (input instanceof Message) {
|
else if (input instanceof Message) {
|
||||||
convertedInput = this.convertInputMessageIfNecessary((Message) input, type);
|
convertedInput = this.convertInputMessageIfNecessary((Message) input, type);
|
||||||
if (convertedInput == null) { // give ConversionService a chance
|
if (convertedInput == null) { // give ConversionService a chance
|
||||||
@@ -797,13 +817,15 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
|
|||||||
output = ((Message) output).getPayload();
|
output = ((Message) output).getPayload();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!(output instanceof Publisher) && this.enhancer != null) {
|
||||||
|
output = enhancer.apply(output);
|
||||||
|
}
|
||||||
|
|
||||||
if (ObjectUtils.isEmpty(contentType)) {
|
if (ObjectUtils.isEmpty(contentType)) {
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(output instanceof Publisher) && this.enhancer != null) {
|
|
||||||
output = enhancer.apply(output);
|
|
||||||
}
|
|
||||||
Object convertedOutput = output;
|
Object convertedOutput = output;
|
||||||
if (FunctionTypeUtils.isMultipleArgumentType(type)) {
|
if (FunctionTypeUtils.isMultipleArgumentType(type)) {
|
||||||
convertedOutput = this.convertMultipleOutputArgumentTypeIfNecesary(convertedOutput, type, contentType);
|
convertedOutput = this.convertMultipleOutputArgumentTypeIfNecesary(convertedOutput, type, contentType);
|
||||||
@@ -850,7 +872,7 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private Object convertNonMessageInputIfNecessary(Type inputType, Object input) {
|
private Object convertNonMessageInputIfNecessary(Type inputType, Object input) {
|
||||||
Object convertedInput = input;
|
Object convertedInput = null;
|
||||||
Class<?> rawInputType = this.isTypePublisher(inputType) || this.isInputTypeMessage()
|
Class<?> rawInputType = this.isTypePublisher(inputType) || this.isInputTypeMessage()
|
||||||
? FunctionTypeUtils.getRawType(FunctionTypeUtils.getGenericType(inputType))
|
? FunctionTypeUtils.getRawType(FunctionTypeUtils.getGenericType(inputType))
|
||||||
: this.getRawClassFor(inputType);
|
: this.getRawClassFor(inputType);
|
||||||
@@ -868,6 +890,9 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
|
|||||||
&& SimpleFunctionRegistry.this.conversionService.canConvert(input.getClass(), rawInputType)) {
|
&& SimpleFunctionRegistry.this.conversionService.canConvert(input.getClass(), rawInputType)) {
|
||||||
convertedInput = SimpleFunctionRegistry.this.conversionService.convert(input, rawInputType);
|
convertedInput = SimpleFunctionRegistry.this.conversionService.convert(input, rawInputType);
|
||||||
}
|
}
|
||||||
|
if (convertedInput == null && input.getClass().isAssignableFrom(rawInputType)) {
|
||||||
|
convertedInput = input;
|
||||||
|
}
|
||||||
return convertedInput;
|
return convertedInput;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ public class SpringFunctionAdapterInitializerTests {
|
|||||||
|
|
||||||
};
|
};
|
||||||
initializer.initialize(null);
|
initializer.initialize(null);
|
||||||
Flux result = Flux.from(initializer.apply(Flux.empty()));
|
Flux result = Flux.from(initializer.apply(null));
|
||||||
assertThat(result.blockFirst()).isInstanceOf(Bar.class);
|
assertThat(result.blockFirst()).isInstanceOf(Bar.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -168,7 +168,6 @@ public class BeanFactoryAwareFunctionRegistryTests {
|
|||||||
|
|
||||||
Function<String, String> anyInputSignature = catalog.lookup("voidInputFunction");
|
Function<String, String> anyInputSignature = catalog.lookup("voidInputFunction");
|
||||||
assertThat(anyInputSignature.apply(null)).isEqualTo("voidInputFunction");
|
assertThat(anyInputSignature.apply(null)).isEqualTo("voidInputFunction");
|
||||||
assertThat(anyInputSignature.apply("uppercase")).isEqualTo("voidInputFunction");
|
|
||||||
|
|
||||||
Function<Void, String> asVoid = catalog.lookup("voidInputFunction");
|
Function<Void, String> asVoid = catalog.lookup("voidInputFunction");
|
||||||
assertThat(asVoid.apply(null)).isEqualTo("voidInputFunction");
|
assertThat(asVoid.apply(null)).isEqualTo("voidInputFunction");
|
||||||
|
|||||||
Reference in New Issue
Block a user