diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootHttpRequestHandler.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootHttpRequestHandler.java index 8f5c83744..6ceed769d 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootHttpRequestHandler.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootHttpRequestHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2017-2019 the original author or authors. + * Copyright 2019-2019 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. @@ -16,33 +16,32 @@ package org.springframework.cloud.function.adapter.azure; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Optional; -import org.reactivestreams.Publisher; -import org.springframework.cloud.function.adapter.azure.AzureSpringBootRequestHandler; -import org.springframework.messaging.Message; -import org.springframework.messaging.MessageHeaders; -import org.springframework.messaging.support.GenericMessage; import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.HttpRequestMessage; import com.microsoft.azure.functions.HttpResponseMessage; import com.microsoft.azure.functions.HttpResponseMessage.Builder; -import reactor.core.publisher.Flux; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.support.GenericMessage; /** + * Implementation of HTTP Request Handler for Azure which supports + * HttpRequestMessage and HttpResponseMessage the types required by + * Azure Functions for HTTP-triggered functions. + * * @param input type * @author Markus Gulden + * + * @since 2.1 */ public class AzureSpringBootHttpRequestHandler extends AzureSpringBootRequestHandler, HttpResponseMessage> { - private HttpRequestMessage input; - public AzureSpringBootHttpRequestHandler(Class configurationClass) { super(configurationClass); } @@ -99,33 +98,13 @@ public class AzureSpringBootHttpRequestHandler extends return new MessageHeaders(headers); } - @Override @SuppressWarnings("unchecked") - protected O result(Object input, Publisher output) { - - List result = new ArrayList<>(); - for (Object value : Flux.from(output).toIterable()) { - result.add(convertOutput(value)); - } - if (isSingleInput(getFunction(), input) && result.size() == 1) { - HttpResponseMessage value = (HttpResponseMessage) result.get(0); - return (O) value; - } - if (isSingleOutput(getFunction(), output) && result.size() == 1) { - HttpResponseMessage value = (HttpResponseMessage) result.get(0); - return (O) value; - } - - O value = (O) result; - return value; - } - @Override - protected HttpResponseMessage convertOutput(Object output) { + protected HttpResponseMessage convertOutput(Object input, Object output) { + HttpRequestMessage requestMessage = (HttpRequestMessage) input; if (functionReturnsMessage(output)) { - Message message = (Message) output; - Builder builder = this.input + Builder builder = requestMessage .createResponseBuilder(com.microsoft.azure.functions.HttpStatus.OK) .body(message.getPayload()); for (Map.Entry entry : message.getHeaders().entrySet()) { @@ -134,8 +113,7 @@ public class AzureSpringBootHttpRequestHandler extends return builder.build(); } else { - - return this.input + return requestMessage .createResponseBuilder(com.microsoft.azure.functions.HttpStatus.OK) .body(output).build(); } @@ -144,20 +122,13 @@ public class AzureSpringBootHttpRequestHandler extends @Override public HttpResponseMessage handleRequest(HttpRequestMessage event, ExecutionContext context) { - this.input = event; - Object response = super.handleRequest(event, context); - if (returnsOutput()) { - return (HttpResponseMessage) response; - } - else { - return this.input + HttpResponseMessage result = super.handleRequest(event, context); + if (result == null) { + result = event .createResponseBuilder(com.microsoft.azure.functions.HttpStatus.OK) .build(); } - } - - protected boolean returnsOutput() { - return !this.getInspector().getOutputType(function()).equals(Void.class); + return result; } protected boolean functionReturnsMessage(Object output) { diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandler.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandler.java index f63f94370..91dc05814 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandler.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootRequestHandler.java @@ -103,10 +103,10 @@ public class AzureSpringBootRequestHandler extends AbstractSpringFunctionA return Flux.just(input); } - @SuppressWarnings("unchecked") - protected O convertOutput(Object output) { - return (O) output; - } +// @SuppressWarnings("unchecked") +// protected O convertOutput(I input, Object output) { +// return (O) output; +// } protected boolean isSingleInput(Function function, Object input) { if (!(input instanceof Collection)) { diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootHttpRequestHandlerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootHttpRequestHandlerTests.java index 46a72d070..d9b7a6aa8 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootHttpRequestHandlerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/AzureSpringBootHttpRequestHandlerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2019-2019 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. @@ -31,9 +31,9 @@ import com.microsoft.azure.functions.HttpResponseMessage; import com.microsoft.azure.functions.HttpResponseMessage.Builder; import com.microsoft.azure.functions.HttpStatus; import com.microsoft.azure.functions.HttpStatusType; - import org.junit.After; import org.junit.Test; + import org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -262,7 +262,7 @@ public class AzureSpringBootHttpRequestHandlerTests { private Map headers = new HashMap<>(); private Object body; - public HttpResponseMessageStub(HttpStatusType status, Map headers, + HttpResponseMessageStub(HttpStatusType status, Map headers, Object body) { this.status = status; this.headers = headers; @@ -285,4 +285,4 @@ public class AzureSpringBootHttpRequestHandlerTests { } } -} \ No newline at end of file +} diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/AbstractSpringFunctionAdapterInitializer.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/AbstractSpringFunctionAdapterInitializer.java index f706238c0..ee5251210 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/AbstractSpringFunctionAdapterInitializer.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/AbstractSpringFunctionAdapterInitializer.java @@ -196,10 +196,15 @@ public abstract class AbstractSpringFunctionAdapterInitializer implements Clo return ""; } + //@SuppressWarnings("unchecked") + protected Object convertOutput(Object input, Object output) { + return output; + } + protected O result(Object input, Publisher output) { List result = new ArrayList<>(); for (Object value : Flux.from(output).toIterable()) { - result.add(value); + result.add(this.convertOutput(input, value)); } if (isSingleInput(getFunction(), input) && result.size() == 1) { @SuppressWarnings("unchecked")