diff --git a/pom.xml b/pom.xml index 3aeab7ab3..4ae75b825 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,7 @@ ${java.version} ${java.version} 1.0.31.RELEASE + 7.26.0 spring-cloud-function true true @@ -225,6 +226,50 @@ spring-cloud-function-web + + pmd + + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.28.0 + + + net.sourceforge.pmd + pmd-core + ${pmd.version} + + + net.sourceforge.pmd + pmd-java + ${pmd.version} + + + + + ${maven.multiModuleProjectDirectory}/src/checkstyle/pmd-modern-java.xml + + false + true + true + 17 + + + + verify + + check + + + + + + + spring diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSLambdaUtils.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSLambdaUtils.java index 990b60514..84266c765 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSLambdaUtils.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/AWSLambdaUtils.java @@ -222,7 +222,7 @@ public static byte[] generateOutput(Message requestMessage, Message responseM byte[] responseBytes = responseMessage == null ? "\"OK\"".getBytes() : extractPayload((Message) responseMessage, objectMapper); if (requestMessage.getHeaders().containsKey(AWS_API_GATEWAY) && ((boolean) requestMessage.getHeaders().get(AWS_API_GATEWAY))) { - Map response = new HashMap(); + Map response = new HashMap<>(); response.put(IS_BASE64_ENCODED, responseMessage != null && responseMessage.getHeaders().containsKey(IS_BASE64_ENCODED) ? responseMessage.getHeaders().get(IS_BASE64_ENCODED) : false); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java index a5111b7e2..a6cbcd08c 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoop.java @@ -94,9 +94,7 @@ public CustomRuntimeEventLoop(ConfigurableApplicationContext applicationContext) public void run() { this.running = true; - this.executor.execute(() -> { - eventLoop(this.applicationContext); - }); + this.executor.execute(() -> eventLoop(this.applicationContext)); } @Override diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/FunctionInvoker.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/FunctionInvoker.java index 0a03aa5f1..5d200fadd 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/FunctionInvoker.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/FunctionInvoker.java @@ -115,7 +115,7 @@ private void start() { if (this.jsonMapper instanceof JacksonMapper) { ((JacksonMapper) this.jsonMapper).configureObjectMapper(objectMapper -> { if (!objectMapper.isEnabled(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)) { - MapperBuilder builder = objectMapper.rebuild(); + MapperBuilder builder = objectMapper.rebuild(); builder.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES); objectMapper = builder.build(); } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/LambdaDestinationResolver.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/LambdaDestinationResolver.java index 1223b6051..5135ea1a8 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/LambdaDestinationResolver.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/main/java/org/springframework/cloud/function/adapter/aws/LambdaDestinationResolver.java @@ -43,8 +43,7 @@ public String destination(Supplier supplier, String name, Object value) { logger.debug("Lambda incoming value: " + value); } String destination = "unknown"; - if (value instanceof Message) { - Message message = (Message) value; + if (value instanceof Message message) { MessageHeaders headers = message.getHeaders(); if (headers.containsKey("lambda-runtime-aws-request-id")) { destination = (String) headers.get("lambda-runtime-aws-request-id"); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoopTest.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoopTest.java index 77798a2b5..cbb063278 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoopTest.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/CustomRuntimeEventLoopTest.java @@ -326,9 +326,7 @@ public Function uppercasePerson() { @Bean public Function, Flux> echoFlux() { - return flux -> flux.map(g -> { - return new GeoLocation(g.longitude(), g.latitude()); - }); + return flux -> flux.map(g -> new GeoLocation(g.longitude(), g.latitude())); } } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java index c440c7818..5faa0de88 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java @@ -1109,7 +1109,7 @@ public void testLBEventStringInOut() throws Exception { ByteArrayOutputStream output = new ByteArrayOutputStream(); invoker.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toByteArray(), Map.class); + Map result = mapper.readValue(output.toByteArray(), Map.class); assertThat(result.get("body")).isEqualTo("\"Hello from ELB\""); } @@ -1137,7 +1137,7 @@ public void testLBEvent() throws Exception { ByteArrayOutputStream output = new ByteArrayOutputStream(); invoker.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toByteArray(), Map.class); + Map result = mapper.readValue(output.toByteArray(), Map.class); assertThat(result.get("body")).isEqualTo("\"Hello from ELB\""); } @@ -1151,7 +1151,7 @@ public void testLBEventAsMessage() throws Exception { ByteArrayOutputStream output = new ByteArrayOutputStream(); invoker.handleRequest(targetStream, output, Mockito.mock(Context.class)); - Map result = mapper.readValue(output.toByteArray(), Map.class); + Map result = mapper.readValue(output.toByteArray(), Map.class); assertThat(result.get("body")).isEqualTo("\"Hello from ELB\""); } @@ -1171,7 +1171,7 @@ public void handleRequest(InputStream input, OutputStream output, Context contex ByteArrayOutputStream output = new ByteArrayOutputStream(); invoker.handleRequest(targetStream, output, new TestContext()); - Map result = mapper.readValue(output.toByteArray(), Map.class); + Map result = mapper.readValue(output.toByteArray(), Map.class); assertThat(result.get("body")).isEqualTo("Hello from ELB"); } @@ -1343,7 +1343,7 @@ public void testResponseBase64Encoded() throws Exception { JsonMapper mapper = new JacksonMapper(new ObjectMapper()); String result = new String(output.toByteArray(), StandardCharsets.UTF_8); - Map resultMap = mapper.fromJson(result, Map.class); + Map resultMap = mapper.fromJson(result, Map.class); assertThat((boolean) resultMap.get(AWSLambdaUtils.IS_BASE64_ENCODED)).isTrue(); assertThat((int) resultMap.get(AWSLambdaUtils.STATUS_CODE)).isEqualTo(201); String body = new String(Base64.getDecoder().decode((String) resultMap.get(AWSLambdaUtils.BODY)), StandardCharsets.UTF_8); @@ -1476,7 +1476,7 @@ public void testShouldNotWrapIamPolicyResponse() throws Exception { ByteArrayOutputStream output = new ByteArrayOutputStream(); invoker.handleRequest(targetStream, output, null); - Map result = mapper.readValue(output.toByteArray(), Map.class); + Map result = mapper.readValue(output.toByteArray(), Map.class); assertThat(result.get("body")).isNull(); assertThat(result.get("principalId")).isNotNull(); } @@ -1563,9 +1563,7 @@ public void testPrimitiveMessage() throws Exception { public static class BasicConfiguration { @Bean public Function, Message> uppercase() { - return v -> { - return MessageBuilder.withPayload(v.getPayload().toUpperCase(Locale.ROOT)).build(); - }; + return v -> MessageBuilder.withPayload(v.getPayload().toUpperCase(Locale.ROOT)).build(); } } @@ -1574,7 +1572,7 @@ public Function, Message> uppercase() { public static class AuthorizerConfiguration { @Bean public Function acceptAuthorizerEvent() { - return v -> v.toString(); + return Object::toString; } } @@ -1753,9 +1751,7 @@ public static class S3Configuration { @Bean public Function outputS3Event() { - return v -> { - return v; - }; + return v -> v; } @Bean public Function echoString() { @@ -1858,7 +1854,7 @@ public Function, Message> echoStringMessage() { @Bean public Consumer consume() { - return v -> System.out.println(v); + return System.out::println; } @Bean @@ -1873,9 +1869,7 @@ public Function, Mono> reactiveWithVoidReturn() { @Bean public Function uppercasePojo() { - return v -> { - return v.getName().toUpperCase(Locale.ROOT); - }; + return v -> v.getName().toUpperCase(Locale.ROOT); } @Bean @@ -1898,9 +1892,7 @@ public Function, Flux> uppercasePojoReturnPojoReactive() { @Bean public Function inputApiEvent() { - return v -> { - return v.getBody(); - }; + return APIGatewayProxyRequestEvent::getBody; } @Bean @@ -1962,16 +1954,12 @@ public Function inputOutputApiE @Bean public Function inputApiV2Event() { - return v -> { - return v.getBody(); - }; + return APIGatewayV2HTTPEvent::getBody; } @Bean public Function, String> inputApiEventAsMessage() { - return v -> { - return v.getPayload().getBody(); - }; + return v -> v.getPayload().getBody(); } @Bean @@ -2006,9 +1994,7 @@ public Function, Mono> outputPolicyResponse() { public static class PrimitiveConfiguration { @Bean public Function, byte[]> returnByteArrayAsMessage() { - return v -> { - return v.getPayload(); - }; + return Message::getPayload; } } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/src/test/java/org/springframework/cloud/function/adapter/azure/web/AzureWebProxyInvokerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/src/test/java/org/springframework/cloud/function/adapter/azure/web/AzureWebProxyInvokerTests.java index f34924657..d0cf6f48e 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/src/test/java/org/springframework/cloud/function/adapter/azure/web/AzureWebProxyInvokerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/src/test/java/org/springframework/cloud/function/adapter/azure/web/AzureWebProxyInvokerTests.java @@ -37,7 +37,7 @@ public void test() throws Exception { AzureWebProxyInvoker proxyInvoker = new AzureWebProxyInvoker(); AzureWebProxyInvoker instance = proxyInvoker.getInstance(AzureWebProxyInvoker.class); - HttpRequestMessageStub> request = new HttpRequestMessageStub>(); + HttpRequestMessageStub> request = new HttpRequestMessageStub<>(); request.setHttpMethod(HttpMethod.GET); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/src/test/java/org/springframework/cloud/function/adapter/azure/web/PetStoreSpringAppConfig.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/src/test/java/org/springframework/cloud/function/adapter/azure/web/PetStoreSpringAppConfig.java index 3ffaa3443..739c5d1bf 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/src/test/java/org/springframework/cloud/function/adapter/azure/web/PetStoreSpringAppConfig.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure-web/src/test/java/org/springframework/cloud/function/adapter/azure/web/PetStoreSpringAppConfig.java @@ -16,13 +16,7 @@ package org.springframework.cloud.function.adapter.azure.web; -import java.io.IOException; - import jakarta.servlet.Filter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.ServletResponse; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.Bean; @@ -57,13 +51,9 @@ public HandlerAdapter handlerAdapter() { @Bean public Filter filter() { - return new Filter() { - @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) - throws IOException, ServletException { - System.out.println("FILTER ===> Hello from: " + request.getLocalAddr()); - chain.doFilter(request, response); - } + return (request, response, chain) -> { + System.out.println("FILTER ===> Hello from: " + request.getLocalAddr()); + chain.doFilter(request, response); }; } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureFunctionUtil.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureFunctionUtil.java index 041ccd5df..a288fb4b3 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureFunctionUtil.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/main/java/org/springframework/cloud/function/adapter/azure/AzureFunctionUtil.java @@ -67,9 +67,7 @@ else if (input instanceof Message) { .setHeaderIfAbsent(EXECUTION_CONTEXT, executionContext).build(); } else if (input instanceof Iterable) { - return Flux.fromIterable((Iterable) input).map(item -> { - return constructInputMessageFromItem(item, executionContext); - }); + return Flux.fromIterable((Iterable) input).map(item -> constructInputMessageFromItem(item, executionContext)); } return constructInputMessageFromItem(input, executionContext); } @@ -95,7 +93,7 @@ private static Message constructInputMessageFromItem(Object input, Execut } private static MessageHeaders getHeaders(HttpRequestMessage event) { - Map headers = new HashMap(); + Map headers = new HashMap<>(); if (event.getHeaders() != null) { headers.putAll(event.getHeaders()); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/injector/AzureFunctionInstanceInjectorTest.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/injector/AzureFunctionInstanceInjectorTest.java index 97051ead9..9462df3cc 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/injector/AzureFunctionInstanceInjectorTest.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/injector/AzureFunctionInstanceInjectorTest.java @@ -63,7 +63,7 @@ public void testFunctionInjector() throws Exception { Assertions.assertThat(azureFunction).isNotNull(); - HttpRequestMessageStub> requestStub = new HttpRequestMessageStub>(); + HttpRequestMessageStub> requestStub = new HttpRequestMessageStub<>(); requestStub.setBody(Optional.of("payload")); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/injector/FunctionInstanceInjectorServiceLoadingTest.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/injector/FunctionInstanceInjectorServiceLoadingTest.java index f9a6efaae..3f74cd868 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/injector/FunctionInstanceInjectorServiceLoadingTest.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-azure/src/test/java/org/springframework/cloud/function/adapter/azure/injector/FunctionInstanceInjectorServiceLoadingTest.java @@ -64,7 +64,7 @@ public void testFunctionInjector() throws Exception { MyAzureTestFunction functionInstance = injector.getInstance(MyAzureTestFunction.class); - HttpRequestMessageStub> request = new HttpRequestMessageStub>(); + HttpRequestMessageStub> request = new HttpRequestMessageStub<>(); request.setBody(Optional.of("test")); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java index a84c15e33..9e46f5807 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/main/java/org/springframework/cloud/function/adapter/gcp/FunctionInvoker.java @@ -180,7 +180,7 @@ else if (result.getHeaders().containsKey("Content-Type")) { httpResponse.setContentType(result.getHeaders().get("Content-Type").toString()); } else { - httpRequest.getContentType().ifPresent(contentType -> httpResponse.setContentType(contentType)); + httpRequest.getContentType().ifPresent(httpResponse::setContentType); } String content = result.getPayload() instanceof String strPayload ? strPayload : new String((byte[]) result.getPayload(), StandardCharsets.UTF_8); @@ -188,7 +188,7 @@ else if (result.getHeaders().containsKey("Content-Type")) { for (Entry header : headers.entrySet()) { Object values = header.getValue(); if (values instanceof Collection) { - String headerValue = ((Collection) values).stream().map(item -> item.toString()) + String headerValue = ((Collection) values).stream().map(Object::toString) .collect(Collectors.joining(",")); httpResponse.appendHeader(header.getKey(), headerValue); } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java index 9b827a125..a50d6db03 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/FunctionInvokerHttpTests.java @@ -249,7 +249,7 @@ protected static class MultiValueHeaderSupplier { public Function> function() { String payload = "hello"; - List li = new ArrayList(asList(123, "headerThing")); + List li = new ArrayList<>(asList(123, "headerThing")); Message msg = MessageBuilder.withPayload(payload).setHeader("multiValueHeader", li) .build(); @@ -298,11 +298,9 @@ protected static class JsonInputOutputFunction { @Bean public Function> function() { - return (in) -> { - return MessageBuilder + return (in) -> MessageBuilder .withPayload(new OutgoingResponse("Thank you for sending the message: " + in.message)) .setHeader("foo", "bar").build(); - }; } } diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/integration/FunctionInvokerIntegrationTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/integration/FunctionInvokerIntegrationTests.java index a5f61c612..0bd56b40a 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/integration/FunctionInvokerIntegrationTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/integration/FunctionInvokerIntegrationTests.java @@ -70,7 +70,7 @@ public void testErrorResponse() { HttpHeaders headers = new HttpHeaders(); ResponseEntity response = testRestTemplate.postForEntity( - "http://localhost:" + serverProcess.getPort(), new HttpEntity<>("test", headers), + "http://localhost:" + serverProcess.port(), new HttpEntity<>("test", headers), String.class); assertThat(response.getStatusCode().is5xxServerError()).isTrue(); diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/integration/LocalServerTestSupport.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/integration/LocalServerTestSupport.java index 4ab2bcefa..f561b1b7d 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/integration/LocalServerTestSupport.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-gcp/src/test/java/org/springframework/cloud/function/adapter/gcp/integration/LocalServerTestSupport.java @@ -74,7 +74,7 @@ public static void verify(Class mainClass, String function, I input, O HttpHeaders headers = new HttpHeaders(); ResponseEntity response = testRestTemplate.postForEntity( - "http://localhost:" + serverProcess.getPort(), new HttpEntity<>(gson.toJson(input), headers), + "http://localhost:" + serverProcess.port(), new HttpEntity<>(gson.toJson(input), headers), String.class); assertThat(response.getBody()).isEqualTo(gson.toJson(expectedOutput)); @@ -148,30 +148,13 @@ private static Integer monitorOutput(InputStream processOutput) { throw new RuntimeException("End of input stream and server never became ready"); } - static class ServerProcess implements AutoCloseable { - - private final Process process; - - private final int port; - - ServerProcess(Process process, int port) { - this.process = process; - this.port = port; - } - - Process process() { - return process; - } + record ServerProcess(Process process, int port) implements AutoCloseable { @Override public void close() { process().destroy(); } - public int getPort() { - return port; - } - } } diff --git a/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcAutoConfiguration.java b/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcAutoConfiguration.java index 034cd780e..14283bce4 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcAutoConfiguration.java +++ b/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcAutoConfiguration.java @@ -65,7 +65,7 @@ public BindableService grpcSpringMessageHandler(MessageHandlingHelper helper) { @Bean public MessageHandlingHelper grpcMessageHandlingHelper(List> grpcConverters, FunctionProperties funcProperties, FunctionCatalog functionCatalog) { - return new MessageHandlingHelper(grpcConverters, functionCatalog, funcProperties); + return new MessageHandlingHelper<>(grpcConverters, functionCatalog, funcProperties); } @Bean diff --git a/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcSpringMessageConverter.java b/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcSpringMessageConverter.java index da884d686..f5fcfd52a 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcSpringMessageConverter.java +++ b/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcSpringMessageConverter.java @@ -43,9 +43,7 @@ protected Message doToSpringMessage(GrpcSpringMessage grpcMessage) { @Override protected GrpcSpringMessage doFromSpringMessage(Message springMessage) { Map stringHeaders = new HashMap<>(); - springMessage.getHeaders().forEach((k, v) -> { - stringHeaders.put(k, v.toString()); - }); + springMessage.getHeaders().forEach((k, v) -> stringHeaders.put(k, v.toString())); return GrpcSpringMessage.newBuilder() .setPayload(ByteString.copyFrom(springMessage.getPayload())) .putAllHeaders(stringHeaders) diff --git a/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcUtils.java b/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcUtils.java index 2fb4e3b32..aa416f3e0 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcUtils.java +++ b/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/GrpcUtils.java @@ -64,9 +64,7 @@ public static GrpcSpringMessage toGrpcSpringMessage(byte[] payload, Map message) { Map stringHeaders = new HashMap<>(); - message.getHeaders().forEach((k, v) -> { - stringHeaders.put(k, v.toString()); - }); + message.getHeaders().forEach((k, v) -> stringHeaders.put(k, v.toString())); return toGrpcSpringMessage(message.getPayload(), stringHeaders); } @@ -201,7 +199,7 @@ public static Message clientStream(String host, int port, Flux> resultRef = new LinkedBlockingQueue<>(1); - StreamObserver responseObserver = new StreamObserver() { + StreamObserver responseObserver = new StreamObserver<>() { @Override public void onNext(GrpcSpringMessage result) { if (logger.isDebugEnabled()) { @@ -237,9 +235,7 @@ public void onCompleted() { catch (Exception e) { requestObserver.onError(e); } - }).doOnComplete(() -> { - requestObserver.onCompleted(); - }).doOnError(e -> { + }).doOnComplete(requestObserver::onCompleted).doOnError(e -> { e.printStackTrace(); responseObserver.onError(Status.UNKNOWN.withDescription("Error handling request") .withCause(e).asRuntimeException()); @@ -256,7 +252,7 @@ public void onCompleted() { } private static ClientResponseObserver clientResponseObserver(Flux> inputStream, Many> sink) { - return new ClientResponseObserver() { + return new ClientResponseObserver<>() { ClientCallStreamObserver requestStreamObserver; @@ -265,22 +261,15 @@ public void beforeStart(ClientCallStreamObserver requestStrea this.requestStreamObserver = requestStreamObserver; requestStreamObserver.disableAutoInboundFlowControl(); - requestStreamObserver.setOnReadyHandler(new Runnable() { - @Override - public void run() { - inputStream - .doOnNext(request -> { - if (logger.isDebugEnabled()) { - logger.debug("Streaming message to function: " + request); - } - requestStreamObserver.onNext(GrpcUtils.toGrpcSpringMessage(request)); - }) - .doOnComplete(() -> { - requestStreamObserver.onCompleted(); - }) - .subscribe(); - } - }); + requestStreamObserver.setOnReadyHandler(() -> inputStream + .doOnNext(request -> { + if (logger.isDebugEnabled()) { + logger.debug("Streaming message to function: " + request); + } + requestStreamObserver.onNext(GrpcUtils.toGrpcSpringMessage(request)); + }) + .doOnComplete(requestStreamObserver::onCompleted) + .subscribe()); } @Override diff --git a/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/MessageHandlingHelper.java b/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/MessageHandlingHelper.java index 0e126f39e..4a437bf81 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/MessageHandlingHelper.java +++ b/spring-cloud-function-adapters/spring-cloud-function-grpc/src/main/java/org/springframework/cloud/function/grpc/MessageHandlingHelper.java @@ -108,10 +108,8 @@ public void serverStream(T request, StreamObserver responseObserver) { Message message = this.toSpringMessage(request); FunctionInvocationWrapper function = this.resolveFunction(message.getHeaders()); Publisher> replyStream = (Publisher>) function.apply(message); - Flux.from(replyStream).doOnNext(replyMessage -> { - responseObserver.onNext(this.toGrpcMessage(replyMessage, (Class) request.getClass())); - }) - .doOnComplete(() -> responseObserver.onCompleted()) + Flux.from(replyStream).doOnNext(replyMessage -> responseObserver.onNext(this.toGrpcMessage(replyMessage, (Class) request.getClass()))) + .doOnComplete(responseObserver::onCompleted) .subscribe(); } @@ -154,7 +152,7 @@ else if (function.isOutputTypePublisher()) { resultRef.offer(replyMessage); }); - return new StreamObserver() { + return new StreamObserver<>() { @Override public void onNext(T inputMessage) { if (logger.isDebugEnabled()) { @@ -245,7 +243,7 @@ private StreamObserver biStreamReactive(StreamObserver responseObserver, responseObserver.onNext(outputMessage); }); - return new StreamObserver() { + return new StreamObserver<>() { @Override public void onNext(T inputMessage) { if (logger.isDebugEnabled()) { @@ -275,7 +273,7 @@ public void onCompleted() { private StreamObserver biStreamImperative(StreamObserver responseObserver, ServerCallStreamObserver serverCallStreamObserver, AtomicBoolean wasReady) { - return new StreamObserver() { + return new StreamObserver<>() { @SuppressWarnings("unchecked") @Override diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java index 5b273b9df..ea1200e85 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessMVC.java @@ -399,7 +399,7 @@ public ServletContext getServletContext() { @Override public Enumeration getInitParameterNames() { - return Collections.enumeration(new ArrayList()); + return Collections.enumeration(new ArrayList<>()); } @Override diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessServletContext.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessServletContext.java index 9c2f2f3f7..56fc6d601 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessServletContext.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessServletContext.java @@ -64,7 +64,7 @@ public class ServerlessServletContext implements ServletContext { private final Map filterRegistrations = new HashMap<>(); - private static final Enumeration EMPTY_ENUM = Collections.enumeration(new ArrayList()); + private static final Enumeration EMPTY_ENUM = Collections.enumeration(new ArrayList<>()); @Override public Enumeration getInitParameterNames() { diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessWebApplication.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessWebApplication.java index b2f151d43..9441c9468 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessWebApplication.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/main/java/org/springframework/cloud/function/serverless/web/ServerlessWebApplication.java @@ -235,13 +235,7 @@ private void addAotGeneratedInitializerIfNecessary(List sourceClass; - - PrintedBanner(Banner banner, Class sourceClass) { - this.banner = banner; - this.sourceClass = sourceClass; - } + private record PrintedBanner(Banner banner, Class sourceClass) implements Banner { @Override public void printBanner(Environment environment, Class sourceClass, PrintStream out) { - sourceClass = (sourceClass != null) ? sourceClass : this.sourceClass; - this.banner.printBanner(environment, sourceClass, out); + sourceClass = (sourceClass != null) ? sourceClass : this.sourceClass(); + this.banner().printBanner(environment, sourceClass, out); } } diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/serverless/web/RequestResponseTests.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/serverless/web/RequestResponseTests.java index 2c16ac898..e050ed215 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/serverless/web/RequestResponseTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/serverless/web/RequestResponseTests.java @@ -99,7 +99,7 @@ public void validateGetListOfPojos() throws Exception { HttpServletRequest request = new ServerlessHttpServletRequest(null, "GET", "/pets"); ServerlessHttpServletResponse response = new ServerlessHttpServletResponse(); mvc.service(request, response); - TypeReference> tr = new TypeReference>() { + TypeReference> tr = new TypeReference<>() { }; List pets = mapper.readValue(response.getContentAsByteArray(), tr); assertThat(pets.size()).isEqualTo(10); @@ -112,7 +112,7 @@ public void validateGetListOfPojosWithParam() throws Exception { request.setParameter("limit", "5"); ServerlessHttpServletResponse response = new ServerlessHttpServletResponse(); mvc.service(request, response); - TypeReference> tr = new TypeReference>() { + TypeReference> tr = new TypeReference<>() { }; List pets = mapper.readValue(response.getContentAsByteArray(), tr); assertThat(pets.size()).isEqualTo(5); diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/test/app/PetStoreSpringAppConfig.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/test/app/PetStoreSpringAppConfig.java index 90405243a..18dcb7a8a 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/test/app/PetStoreSpringAppConfig.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/test/app/PetStoreSpringAppConfig.java @@ -36,6 +36,8 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configurers.CorsConfigurer; +import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; @@ -80,8 +82,8 @@ public HandlerAdapter handlerAdapter() { public SecurityFilterChain securityFilterChain(HttpSecurity http, SimpleFilter simpleFilter, AnotherFilter anotherFilter) throws Exception { http - .csrf(csrf -> csrf.disable()) - .cors(cors -> cors.disable()) + .csrf(CsrfConfigurer::disable) + .cors(CorsConfigurer::disable) .addFilterBefore(new GenericFilterBean() { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) @@ -95,9 +97,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha } }, SecurityContextHolderFilter.class) .securityMatcher("/foo/deny") - .authorizeHttpRequests(auth -> { - auth.anyRequest().hasRole("FOO"); - }) + .authorizeHttpRequests(auth -> auth.anyRequest().hasRole("FOO")) .addFilterAfter(simpleFilter, LogoutFilter.class) .addFilterAfter(anotherFilter, RequestCacheAwareFilter.class) .exceptionHandling(f -> f.accessDeniedHandler(new MyAccessDeinedHandler())); diff --git a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/test/app/PetsController.java b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/test/app/PetsController.java index e71a09599..c56ac151e 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/test/app/PetsController.java +++ b/spring-cloud-function-adapters/spring-cloud-function-serverless-web/src/test/java/org/springframework/cloud/function/test/app/PetsController.java @@ -45,7 +45,7 @@ public DeferredResult createPetAsync(@RequestBody Pet newPet) { Pet dbPet = newPet; dbPet.setId(UUID.randomUUID().toString()); - DeferredResult result = new DeferredResult(); + DeferredResult result = new DeferredResult<>(); result.setResult(dbPet); return result; } diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageBuilder.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageBuilder.java index 456ba4fb8..14a039fab 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageBuilder.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageBuilder.java @@ -55,13 +55,13 @@ private CloudEventMessageBuilder(Map headers) { } public static CloudEventMessageBuilder withData(T data) { - CloudEventMessageBuilder builder = new CloudEventMessageBuilder(null); + CloudEventMessageBuilder builder = new CloudEventMessageBuilder<>(null); builder.data = data; return builder; } public static CloudEventMessageBuilder fromMessage(Message message) { - CloudEventMessageBuilder builder = new CloudEventMessageBuilder(new HashMap<>(message.getHeaders())); + CloudEventMessageBuilder builder = new CloudEventMessageBuilder<>(new HashMap<>(message.getHeaders())); builder.data = message.getPayload(); return builder; } @@ -211,7 +211,7 @@ private Message doBuild(String prefix) { this.headers.put(prefix + CloudEventMessageUtils._SOURCE, URI.create("https://spring.io/")); } MessageHeaders headers = new MessageHeaders(this.headers); - GenericMessage message = new GenericMessage(this.data, headers); + GenericMessage message = new GenericMessage<>(this.data, headers); Assert.isTrue(CloudEventMessageUtils.isCloudEvent(message), "The message does not appear to be a valid Cloud Event, " + "since one of the required attributes (id, specversion, type, source) is missing"); return message; diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageUtils.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageUtils.java index 867b135f9..d464b2f6b 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageUtils.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageUtils.java @@ -246,7 +246,7 @@ public static T getData(Message message) { public static Map getAttributes(Message message) { return message.getHeaders().entrySet().stream() .filter(e -> isAttribute(e.getKey())) - .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } /** @@ -483,8 +483,8 @@ private static Message buildBinaryMessageFromStructuredMap(Map map, String key) { Object uri = map.get(key); if (uri != null) { - if (uri instanceof String) { - uri = URI.create((String) uri); + if (uri instanceof String s) { + uri = URI.create(s); } else if (uri instanceof byte[] u) { uri = URI.create(toString(u)); diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventsFunctionInvocationHelper.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventsFunctionInvocationHelper.java index f552590e2..77ad73f04 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventsFunctionInvocationHelper.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventsFunctionInvocationHelper.java @@ -101,7 +101,7 @@ public Message postProcessResult(Object result, Message input) { if (input != null) { targetPrefix = CloudEventMessageUtils.determinePrefixToUse(input.getHeaders(), true); } - else if (result instanceof Message resultMessage) { + else if (result instanceof Message resultMessage) { targetPrefix = CloudEventMessageUtils.determinePrefixToUse(resultMessage.getHeaders(), true); } diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionProperties.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionProperties.java index 11d5bd5ed..0bb25ee12 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionProperties.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionProperties.java @@ -133,12 +133,12 @@ private void normalizeHeaderMappingExpression(Entry headerMapping = input ? entry.getValue().getInputHeaderMappingExpression() : entry.getValue().getOutputHeaderMappingExpression(); if (!CollectionUtils.isEmpty(headerMapping)) { - for (Object k : headerMapping.keySet()) { + for (String k : headerMapping.keySet()) { if (this.environment.containsProperty(propertyX + k) || this.environment.containsProperty(propertyY + k)) { - Map current = input ? entry.getValue().getInputHeaderMappingExpression() + Map current = input ? entry.getValue().getInputHeaderMappingExpression() : entry.getValue().getOutputHeaderMappingExpression(); if (current.containsKey("0")) { - ((Map) current.get("0")).put(k, headerMapping.get(k)); + ((Map) current.get("0")).put(k, headerMapping.get(k)); } else { if (input) { diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionTypeProcessor.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionTypeProcessor.java index ba716fd9b..114e666d0 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionTypeProcessor.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionTypeProcessor.java @@ -72,8 +72,8 @@ private void registerAllGenericTypes(ParameterizedType type, Set> typeH if (!isCoreJavaType(name)) { typeHints.add(FunctionTypeUtils.getRawType(functionParameterType)); } - if (functionParameterType instanceof ParameterizedType) { - this.registerAllGenericTypes((ParameterizedType) functionParameterType, typeHints); + if (functionParameterType instanceof ParameterizedType parameterizedType) { + this.registerAllGenericTypes(parameterizedType, typeHints); } } } @@ -88,13 +88,7 @@ private boolean isFunction(Class beanType) { || Supplier.class.isAssignableFrom(beanType); } - private static final class ReflectiveProcessorBeanFactoryInitializationAotContribution implements BeanFactoryInitializationAotContribution { - - private final Class[] typeHints; - - private ReflectiveProcessorBeanFactoryInitializationAotContribution(Class[] typeHints) { - this.typeHints = typeHints; - } + private record ReflectiveProcessorBeanFactoryInitializationAotContribution(Class[] typeHints) implements BeanFactoryInitializationAotContribution { @Override public void applyTo(GenerationContext generationContext, BeanFactoryInitializationCode beanFactoryInitializationCode) { diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionalSpringApplication.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionalSpringApplication.java index 5c8a2f391..c238031f3 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionalSpringApplication.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionalSpringApplication.java @@ -99,8 +99,7 @@ protected void postProcessApplicationContext(ConfigurableApplicationContext cont System.out.println("======> SOURCE: " + source); Class type = null; Object handler = null; - if (source instanceof String) { - String name = (String) source; + if (source instanceof String name) { if (ClassUtils.isPresent(name, null)) { type = ClassUtils.resolveClassName(name, null); } diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java index 10e688c80..461cabe16 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistry.java @@ -31,7 +31,6 @@ import java.util.stream.Collectors; import org.aopalliance.intercept.MethodInterceptor; -import org.aopalliance.intercept.MethodInvocation; import org.springframework.aop.framework.ProxyFactory; import org.springframework.beans.BeansException; @@ -165,8 +164,8 @@ public T lookup(Class type, String functionDefinition, String... expected if (functionCandidate != null) { Type functionType = null; FunctionRegistration functionRegistration = null; - if (functionCandidate instanceof FunctionRegistration) { - functionRegistration = (FunctionRegistration) functionCandidate; + if (functionCandidate instanceof FunctionRegistration registration) { + functionRegistration = registration; } else if (functionCandidate instanceof BiFunction || functionCandidate instanceof BiConsumer) { functionRegistration = this.registerMessagingBiFunction(functionCandidate, functionName); @@ -223,9 +222,9 @@ private FunctionRegistration registerMessagingBiFunction(Object userFunction, St Type biFunctionType = FunctionContextUtils.findType(this.applicationContext.getBeanFactory(), functionName); Type inputType1 = Object.class; Type inputType2 = Object.class; - if (biFunctionType instanceof ParameterizedType) { - inputType1 = ((ParameterizedType) biFunctionType).getActualTypeArguments()[0]; - inputType2 = ((ParameterizedType) biFunctionType).getActualTypeArguments()[1]; + if (biFunctionType instanceof ParameterizedType parameterizedType) { + inputType1 = parameterizedType.getActualTypeArguments()[0]; + inputType2 = parameterizedType.getActualTypeArguments()[1]; } if (!FunctionTypeUtils.isTypeMap(inputType2)) { @@ -242,8 +241,8 @@ private FunctionRegistration registerMessagingBiFunction(Object userFunction, St if (payload.getClass().getName().equals("org.springframework.kafka.support.KafkaNull")) { payload = null; } - if (userFunction instanceof BiConsumer) { - ((BiConsumer) userFunction).accept(payload, ((Message) message).getHeaders()); + if (userFunction instanceof BiConsumer biConsumer) { + biConsumer.accept(payload, ((Message) message).getHeaders()); return null; } else { @@ -304,12 +303,7 @@ private Object proxyTarget(Object targetFunction, Method actualMethodToCall) { ProxyFactory pf = new ProxyFactory(targetFunction); pf.setProxyTargetClass(true); pf.setInterfaces(Function.class); - pf.addAdvice(new MethodInterceptor() { - @Override - public Object invoke(MethodInvocation invocation) throws Throwable { - return actualMethodToCall.invoke(invocation.getThis(), invocation.getArguments()); - } - }); + pf.addAdvice((MethodInterceptor) invocation -> actualMethodToCall.invoke(invocation.getThis(), invocation.getArguments())); return pf.getProxy(); } } 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 b886e1af4..d722412f5 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 @@ -116,7 +116,7 @@ public static Type supplierType(Type output) { * @return 'true' if this type represents a {@link Collection}. Otherwise 'false'. */ public static boolean isTypeCollection(Type type) { - Class rawClass = getRawType(type); + Class rawClass = getRawType(type); if (rawClass == null) { return false; } @@ -170,8 +170,8 @@ public static Type getGenericType(Type type) { * @return instance of {@link Class} as raw representation of the provided {@link Type} */ public static Class getRawType(Type type) { - if (type instanceof WildcardType) { - Type[] upperbounds = ((WildcardType) type).getUpperBounds(); + if (type instanceof WildcardType wildcardType) { + Type[] upperbounds = wildcardType.getUpperBounds(); /* * Kotlin may have something like this which is technically a whildcard yet it has upper/lower types. * See GH-1260 @@ -443,8 +443,8 @@ public static Type discoverFunctionType(Object function, String functionName, Ge if (function instanceof RoutingFunction) { return ROUTING_FUNCTION_TYPE; } - else if (function instanceof FunctionRegistration) { - return ((FunctionRegistration) function).getType(); + else if (function instanceof FunctionRegistration registration) { + return registration.getType(); } if (applicationContext.containsBean(functionName + FunctionRegistration.REGISTRATION_NAME_SUFFIX)) { // for Kotlin primarily FunctionRegistration fr = applicationContext @@ -498,8 +498,8 @@ public static String discoverBeanDefinitionNameByQualifier(ListableBeanFactory b return null; } public static Type getImmediateGenericType(Type type, int index) { - if (type instanceof ParameterizedType) { - return ((ParameterizedType) type).getActualTypeArguments()[index]; + if (type instanceof ParameterizedType parameterizedType) { + return parameterizedType.getActualTypeArguments()[index]; } return null; } @@ -615,15 +615,15 @@ private static boolean isOfType(Type type, Class cls) { if (type instanceof Class) { return cls.isAssignableFrom((Class) type); } - else if (type instanceof ParameterizedType) { - return isOfType(((ParameterizedType) type).getRawType(), cls); + else if (type instanceof ParameterizedType parameterizedType) { + return isOfType(parameterizedType.getRawType(), cls); } return false; } private static void assertSupportedTypes(Type type) { - if (type instanceof ParameterizedType) { - type = ((ParameterizedType) type).getRawType(); + if (type instanceof ParameterizedType parameterizedType) { + type = parameterizedType.getRawType(); Assert.isTrue(type instanceof Class, "Must be one of Supplier, Function, Consumer" + " or FunctionRegistration. Was " + type); } diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/HeaderEnricher.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/HeaderEnricher.java index 23fc39646..28f3f265f 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/HeaderEnricher.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/HeaderEnricher.java @@ -52,10 +52,10 @@ class HeaderEnricher implements Function { private final StandardEvaluationContext evalContext = new StandardEvaluationContext(); - @SuppressWarnings({ "rawtypes", "unchecked" }) - HeaderEnricher(Map headerExpressions, @Nullable BeanResolver beanResolver) { + @SuppressWarnings("unchecked") + HeaderEnricher(Map headerExpressions, @Nullable BeanResolver beanResolver) { Assert.notEmpty(headerExpressions, "'headerExpressions' must not be null or empty"); - this.headerExpressions = headerExpressions; + this.headerExpressions = (Map>) (Map) headerExpressions; this.evalContext.addPropertyAccessor(new MapAccessor()); if (beanResolver != null) { this.evalContext.setBeanResolver(beanResolver); diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java index abdfb5dea..721e5b915 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java @@ -135,7 +135,7 @@ public SimpleFunctionRegistry(ConversionService conversionService, CompositeMess this.messageConverter = messageConverter; this.functionInvocationHelper = functionInvocationHelper; this.functionProperties = functionProperties; - this.wrappedFunctionDefinitions = new LinkedHashMap() { + this.wrappedFunctionDefinitions = new LinkedHashMap<>() { @Override protected boolean removeEldestEntry(Map.Entry eldest) { boolean remove = size() > wrappedFunctionDefinitionsCacheSize; @@ -486,8 +486,8 @@ public class FunctionInvocationWrapper implements Function, Cons private boolean isPojoFunction; FunctionInvocationWrapper(String functionDefinition, Object target, Type inputType, Type outputType) { - if (target instanceof PostProcessingFunction) { - this.postProcessor = (PostProcessingFunction) target; + if (target instanceof PostProcessingFunction postProcessingFunction) { + this.postProcessor = postProcessingFunction; } if (ClassUtils.isPresent("kotlin.jvm.functions.Function0", ClassUtils.getDefaultClassLoader()) && target instanceof KotlinLambdaToFunctionAutoConfiguration.KotlinFunctionWrapper kotlinFunction @@ -940,8 +940,8 @@ private Object fluxifyInputIfNecessary(Object input) { logger.debug("Actual input represents a collection while input type of the function does not represent a collection. " + "Therefore framework will attempt invoke function for each element in the collection."); MessageHeaders headers = input instanceof Message ? ((Message) input).getHeaders() : new MessageHeaders(Collections.emptyMap()); - Collection collectionPayload = jsonMapper.fromJson(payload, Collection.class); - Class inputClass = FunctionTypeUtils.getRawType(this.inputType); + Collection collectionPayload = jsonMapper.fromJson(payload, Collection.class); + Class inputClass = FunctionTypeUtils.getRawType(this.inputType); if (this.isInputTypeMessage()) { inputClass = FunctionTypeUtils.getRawType(FunctionTypeUtils.getImmediateGenericType(this.inputType, 0)); } @@ -968,8 +968,8 @@ else if (input instanceof Message && ((Message) input).getPayload() instanceof I return Flux.fromIterable((Iterable) ((Message) v).getPayload()); }); } - else if (input instanceof Iterable) { - input = FunctionTypeUtils.isMono(this.inputType) ? Mono.just(input) : Flux.fromIterable((Iterable) input); + else if (input instanceof Iterable iterable) { + input = FunctionTypeUtils.isMono(this.inputType) ? Mono.just(input) : Flux.fromIterable(iterable); } else { @@ -998,9 +998,9 @@ private Object invokeFunction(Object convertedInput) { Object result; if (!this.isTypePublisher(this.inputType) && convertedInput instanceof Publisher publisherInput) { result = publisherInput instanceof Mono - ? Mono.from(publisherInput).map(value -> this.invokeFunctionAndEnrichResultIfNecessary(value)) + ? Mono.from(publisherInput).map(this::invokeFunctionAndEnrichResultIfNecessary) .doOnError(ex -> logger.error("Failed to invoke function '" + this.functionDefinition + "'", (Throwable) ex)) - : Flux.from(publisherInput).map(value -> this.invokeFunctionAndEnrichResultIfNecessary(value)) + : Flux.from(publisherInput).map(this::invokeFunctionAndEnrichResultIfNecessary) .doOnError(ex -> logger.error("Failed to invoke function '" + this.functionDefinition + "'", (Throwable) ex)); } else { @@ -1025,18 +1025,18 @@ private Object invokeFunctionAndEnrichResultIfNecessary(Object value) { AtomicReference> firstInputMessage = new AtomicReference<>(); Object inputValue; - if (value instanceof Flux) { - inputValue = ((Flux) value).map(v -> { - if (v instanceof OriginalMessageHolder && firstInputMessage.get() == null) { - firstInputMessage.set(((OriginalMessageHolder) v).getOriginalMessage()); + if (value instanceof Flux flux) { + inputValue = flux.map(v -> { + if (v instanceof OriginalMessageHolder originalMessageHolder && firstInputMessage.get() == null) { + firstInputMessage.set(originalMessageHolder.originalMessage()); } return this.extractValueFromOriginalValueHolderIfNecessary(v); }); } - else if (value instanceof Mono) { - inputValue = ((Mono) value).map(v -> { - if (v instanceof OriginalMessageHolder) { - firstInputMessage.set(((OriginalMessageHolder) v).getOriginalMessage()); + else if (value instanceof Mono mono) { + inputValue = mono.map(v -> { + if (v instanceof OriginalMessageHolder originalMessageHolder) { + firstInputMessage.set(originalMessageHolder.originalMessage()); } return this.extractValueFromOriginalValueHolderIfNecessary(v); }); @@ -1066,7 +1066,7 @@ else if (value instanceof Mono) { } return value instanceof OriginalMessageHolder originalMessageHolder - ? this.enrichInvocationResultIfNecessary((originalMessageHolder).getOriginalMessage(), result) + ? this.enrichInvocationResultIfNecessary(originalMessageHolder.originalMessage(), result) : result; } @@ -1114,7 +1114,7 @@ private Object invokeConsumer(Object convertedInput) { if (convertedInput instanceof Flux fluxInput) { result = fluxInput .transform(flux -> { - flux = Flux.from((Publisher) flux).map(v -> this.extractValueFromOriginalValueHolderIfNecessary(v)); + flux = Flux.from((Publisher) flux).map(this::extractValueFromOriginalValueHolderIfNecessary); ((Consumer) this.target).accept(flux); return Mono.ignoreElements((Flux) flux); }).then(); @@ -1122,7 +1122,7 @@ private Object invokeConsumer(Object convertedInput) { else { result = ((Mono) convertedInput) .transform(mono -> { - mono = Mono.from((Publisher) mono).map(v -> this.extractValueFromOriginalValueHolderIfNecessary(v)); + mono = Mono.from((Publisher) mono).map(this::extractValueFromOriginalValueHolderIfNecessary); ((Consumer) this.target).accept(mono); return Mono.ignoreElements((Mono) mono); }).then(); @@ -1131,10 +1131,10 @@ private Object invokeConsumer(Object convertedInput) { else if (convertedInput instanceof Publisher publisherInput) { result = convertedInput instanceof Mono ? Mono.from(publisherInput) - .map(v -> this.extractValueFromOriginalValueHolderIfNecessary(v)) + .map(this::extractValueFromOriginalValueHolderIfNecessary) .doOnNext((Consumer) this.target).then() : Flux.from(publisherInput) - .map(v -> this.extractValueFromOriginalValueHolderIfNecessary(v)) + .map(this::extractValueFromOriginalValueHolderIfNecessary) .doOnNext((Consumer) this.target).then(); } else { @@ -1145,8 +1145,8 @@ else if (convertedInput instanceof Publisher publisherInput) { } private Object extractValueFromOriginalValueHolderIfNecessary(Object input) { - if (input instanceof OriginalMessageHolder) { - input = ((OriginalMessageHolder) input).getValue(); + if (input instanceof OriginalMessageHolder originalMessageHolder) { + input = originalMessageHolder.value(); } return input; } @@ -1171,10 +1171,10 @@ private Object[] parseMultipleValueArguments(Object multipleValueArgument, int a private boolean isInputConversionNecessary(Object input, Type type) { if (type == null || this.getRawClassFor(type) == Void.class || this.target instanceof RoutingFunction || this.isComposed() || this.target instanceof PassThruFunction) { if (this.getRawClassFor(type) == Void.class) { - if (input instanceof Message) { - input = ((Message) input).getPayload(); - if (input instanceof Optional) { - input = ((Optional) input).orElseGet(() -> null); + if (input instanceof Message messageResult) { + input = messageResult.getPayload(); + if (input instanceof Optional optional) { + input = optional.orElseGet(() -> null); } } Assert.isNull(input, "Can't have non-null input with Void input type."); @@ -1184,16 +1184,18 @@ private boolean isInputConversionNecessary(Object input, Type type) { return true; } /* - * + * The input variable is reassigned within the block, so casts after the reassignment + * cannot be replaced with pattern matching. */ + @SuppressWarnings("PMD.PreferPatternMatchingForInstanceof") private Object convertInputIfNecessary(Object input, Type type) { if (!this.isInputConversionNecessary(input, type)) { return input; } Object convertedInput = null; - if (input instanceof Publisher) { - convertedInput = this.convertInputPublisherIfNecessary((Publisher) input, type); + if (input instanceof Publisher publisher) { + convertedInput = this.convertInputPublisherIfNecessary(publisher, type); } else if (FunctionTypeUtils.isMultipleArgumentType(type)) { Type[] inputTypes = ((ParameterizedType) type).getActualTypeArguments(); @@ -1213,8 +1215,8 @@ else if (this.skipInputConversion) { ? input : new OriginalMessageHolder(((Message) input).getPayload(), (Message) input); } - else if (input instanceof Message) { - input = this.filterOutHeaders((Message) input); + else if (input instanceof Message messageResult) { + input = this.filterOutHeaders(messageResult); if (((Message) input).getPayload().getClass().getName().equals("org.springframework.kafka.support.KafkaNull")) { return input; } @@ -1298,8 +1300,8 @@ private Object convertOutputIfNecessary(Object output, Type type, String[] conte return convertedOutput; } - if (convertedOutput instanceof Publisher) { - return this.convertOutputPublisherIfNecessary((Publisher) convertedOutput, type, contentType); + if (convertedOutput instanceof Publisher publisher) { + return this.convertOutputPublisherIfNecessary(publisher, type, contentType); } if (convertedOutput instanceof Message) { @@ -1316,8 +1318,8 @@ else if (isExtractPayload((Message) convertedOutput, type)) { } if (this.getTarget() instanceof PassThruFunction) { // scst-2303 Message enrichedMessage; - if (convertedOutput instanceof Message) { - enrichedMessage = MessageBuilder.fromMessage((Message) convertedOutput) + if (convertedOutput instanceof Message messageResult) { + enrichedMessage = MessageBuilder.fromMessage(messageResult) .setHeader(MessageHeaders.CONTENT_TYPE, contentType[0]).build(); } else { @@ -1550,7 +1552,7 @@ private Object convertOutputMessageIfNecessary(Object output, String expectedOut } if (StringUtils.hasText(contentType)) { - Map headersMap = new HashMap(((Message) output).getHeaders()); + Map headersMap = new HashMap<>(((Message) output).getHeaders()); String[] expectedContentTypes = StringUtils.delimitedListToStringArray(contentType, ","); for (String expectedContentType : expectedContentTypes) { headersMap.put(MessageHeaders.CONTENT_TYPE, expectedContentType); @@ -1569,8 +1571,8 @@ private Object convertOutputMessageIfNecessary(Object output, String expectedOut */ @SuppressWarnings("unchecked") private Object convertMultipleOutputValuesIfNecessary(Object output, String[] contentType) { - Collection outputCollection = ObjectUtils.isArray(output) ? CollectionUtils.arrayToList(output) : (Collection) output; - Collection convertedOutputCollection = outputCollection instanceof List ? new ArrayList<>() : new TreeSet<>(); + Collection outputCollection = ObjectUtils.isArray(output) ? CollectionUtils.arrayToList(output) : (Collection) output; + Collection convertedOutputCollection = outputCollection instanceof List ? new ArrayList<>() : new TreeSet<>(); Type type = this.isOutputTypeMessage() ? FunctionTypeUtils.getGenericType(this.outputType) : this.outputType; for (Object outToConvert : outputCollection) { Object result = this.convertOutputIfNecessary(outToConvert, type, contentType); @@ -1641,23 +1643,7 @@ private Object convertOutputPublisherIfNecessary(Publisher publisher, Type type, /** * */ - private static final class OriginalMessageHolder { - private final Object value; - - private final Message originalMessage; - - private OriginalMessageHolder(Object value, Message originalMessage) { - this.value = value; - this.originalMessage = originalMessage; - } - - public Object getValue() { - return this.value; - } - - public Message getOriginalMessage() { - return this.originalMessage; - } + private record OriginalMessageHolder(Object value, Message originalMessage) { } public static class PassThruFunction implements Function { @@ -1668,13 +1654,7 @@ public Object apply(Object t) { } @SuppressWarnings({ "unchecked", "rawtypes" }) - private static class ConsumerWrapper implements Consumer> { - - private final Consumer targetConsumer; - - ConsumerWrapper(Consumer targetConsumer) { - this.targetConsumer = targetConsumer; - } + private record ConsumerWrapper(Consumer targetConsumer) implements Consumer> { @Override public void accept(Flux messageFlux) { diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java index 08e09dd55..c81755c1c 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java @@ -175,7 +175,7 @@ public RoutingFunction functionRouter(FunctionCatalog functionCatalog, FunctionP BeanFactory beanFactory, @Nullable MessageRoutingCallback routingCallback, @Nullable DefaultMessageRoutingHandler defaultMessageRoutingHandler) { if (defaultMessageRoutingHandler != null) { - FunctionRegistration functionRegistration = new FunctionRegistration(defaultMessageRoutingHandler, RoutingFunction.DEFAULT_ROUTE_HANDLER); + FunctionRegistration functionRegistration = new FunctionRegistration<>(defaultMessageRoutingHandler, RoutingFunction.DEFAULT_ROUTE_HANDLER); functionRegistration.type(FunctionTypeUtils.consumerType(ResolvableType.forClassWithGenerics(Message.class, Object.class).getType())); ((FunctionRegistry) functionCatalog).register(functionRegistration); } diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogInitializer.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogInitializer.java index d996ffcb6..b95048f27 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogInitializer.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogInitializer.java @@ -128,7 +128,7 @@ protected void register(BeanDefinitionRegistry registry, ConfigurableListableBea .containsBeanDefinition(AnnotationConfigUtils.CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) { // Switch off the ConfigurationClassPostProcessor this.context.registerBean(AnnotationConfigUtils.CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME, - DummyProcessor.class, () -> new DummyProcessor()); + DummyProcessor.class, DummyProcessor::new); // But switch on other annotation processing AnnotationConfigUtils.registerAnnotationConfigProcessors(this.context); } @@ -138,7 +138,7 @@ protected void register(BeanDefinitionRegistry registry, ConfigurableListableBea if (ClassUtils.isPresent("com.google.gson.Gson", null) && "gson".equals(preferredMapper)) { if (this.context.getBeanFactory().getBeanNamesForType(Gson.class, false, false).length == 0) { - this.context.registerBean(Gson.class, () -> new Gson()); + this.context.registerBean(Gson.class, Gson::new); } this.context.registerBean(JsonMapper.class, () -> new ContextFunctionCatalogAutoConfiguration.JsonMapperConfiguration().jsonMapper(this.context)); } @@ -185,7 +185,7 @@ && new ClassPathResource(basePackage.replace(".", "/")).exists()) { int cacheSize = this.context.getEnvironment().getProperty("spring.cloud.function.registry.cache-size", int.class, 1000); return new SimpleFunctionRegistry(conversionService, messageConverter, this.context.getBean(JsonMapper.class), null, null, cacheSize); }); - this.context.registerBean(FunctionProperties.class, () -> new FunctionProperties()); + this.context.registerBean(FunctionProperties.class, FunctionProperties::new); this.context.registerBean(FunctionRegistrationPostProcessor.class, () -> new FunctionRegistrationPostProcessor(this.context.getAutowireCapableBeanFactory() .getBeanProvider(FunctionRegistration.class))); @@ -201,7 +201,7 @@ private void performPreinitialization() { @Override public void run() { - runSafely(() -> new DefaultFormattingConversionService()); + runSafely(DefaultFormattingConversionService::new); } public void runSafely(Runnable runnable) { @@ -232,8 +232,7 @@ private class FunctionRegistrationPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof FunctionRegistry) { - FunctionRegistry catalog = (FunctionRegistry) bean; + if (bean instanceof FunctionRegistry catalog) { for (FunctionRegistration registration : this.functions) { Assert.notEmpty(registration.getNames(), "FunctionRegistration must define at least one name. Was empty"); diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/FunctionContextUtils.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/FunctionContextUtils.java index 7a36140d5..b214a1396 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/FunctionContextUtils.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/FunctionContextUtils.java @@ -70,8 +70,8 @@ else if (registry.containsBean(name)) { Object source = definition.getSource(); Type param = null; - if (source instanceof MethodMetadata) { - param = findBeanType(definition, ((MethodMetadata) source).getDeclaringClassName(), ((MethodMetadata) source).getMethodName()); + if (source instanceof MethodMetadata methodMetadata) { + param = findBeanType(definition, methodMetadata.getDeclaringClassName(), methodMetadata.getMethodName()); } else if (source instanceof Resource) { param = registry.getType(actualName); @@ -89,8 +89,7 @@ else if (source instanceof Resource) { public static Class[] getParamTypesFromBeanDefinitionFactory(Class factory, AbstractBeanDefinition definition, String methodName) { - if (definition instanceof RootBeanDefinition) { - RootBeanDefinition root = (RootBeanDefinition) definition; + if (definition instanceof RootBeanDefinition root) { for (Method method : getCandidateMethods(factory, root)) { if (method.getName().equals(methodName) && AnnotationUtils.findAnnotation(method, Bean.class) != null) { return method.getParameterTypes(); diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/SmartCompositeMessageConverter.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/SmartCompositeMessageConverter.java index bbf9fb351..1ee743ae7 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/SmartCompositeMessageConverter.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/SmartCompositeMessageConverter.java @@ -171,8 +171,8 @@ public Message toMessage(Object payload, @Nullable MessageHeaders headers) { String[] contentTypes = StringUtils.delimitedListToStringArray((String) value, ","); for (String contentType : contentTypes) { if (!MimeType.valueOf(contentType).isConcrete()) { - if (converter instanceof AbstractMessageConverter) { - List supportedMimeTypes = ((AbstractMessageConverter) converter).getSupportedMimeTypes(); + if (converter instanceof AbstractMessageConverter abstractMessageConverter) { + List supportedMimeTypes = abstractMessageConverter.getSupportedMimeTypes(); for (MimeType supportedMimeType : supportedMimeTypes) { if (supportedMimeType.isCompatibleWith(MimeType.valueOf(contentType))) { MessageHeaderAccessor h = new MessageHeaderAccessor(); diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/message/MessageUtils.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/message/MessageUtils.java index 0d073b4d0..a546c4682 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/message/MessageUtils.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/message/MessageUtils.java @@ -46,13 +46,11 @@ public static MessageStructureWithCaseInsensitiveHeaderKeys toCaseInsensitiveHea /** * !!! INTERNAL USE ONLY, MAY CHANGE OR REMOVED WITHOUT NOTICE!!! */ - @SuppressWarnings({"rawtypes"}) public static class MessageStructureWithCaseInsensitiveHeaderKeys { private final Object payload; - private final Map headers; + private final Map headers; - @SuppressWarnings("unchecked") - MessageStructureWithCaseInsensitiveHeaderKeys(Message message) { + MessageStructureWithCaseInsensitiveHeaderKeys(Message message) { this.payload = message.getPayload(); this.headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); this.headers.putAll(message.getHeaders()); @@ -61,7 +59,7 @@ public Object getPayload() { return payload; } - public Map getHeaders() { + public Map getHeaders() { return headers; } } diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/GsonMapper.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/GsonMapper.java index a77ec420a..6f2785788 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/GsonMapper.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/GsonMapper.java @@ -46,14 +46,14 @@ protected T doFromJson(Object json, Type type) { if (json instanceof byte[]) { convertedValue = this.gson.fromJson(new String(((byte[]) json), StandardCharsets.UTF_8), type); } - else if (json instanceof String) { - convertedValue = this.gson.fromJson((String) json, type); + else if (json instanceof String s) { + convertedValue = this.gson.fromJson(s, type); } - else if (json instanceof Reader) { - convertedValue = this.gson.fromJson((Reader) json, type); + else if (json instanceof Reader reader) { + convertedValue = this.gson.fromJson(reader, type); } - else if (json instanceof JsonElement) { - convertedValue = this.gson.fromJson((JsonElement) json, type); + else if (json instanceof JsonElement jsonElement) { + convertedValue = this.gson.fromJson(jsonElement, type); } return convertedValue; } diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JacksonMapper.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JacksonMapper.java index a36fc456a..2ac341c87 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JacksonMapper.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JacksonMapper.java @@ -57,14 +57,14 @@ protected T doFromJson(Object json, Type type) { JavaType constructType = TypeFactory.createDefaultInstance().constructType(type); try { - if (json instanceof String) { - convertedValue = this.mapper.readValue((String) json, constructType); + if (json instanceof String s) { + convertedValue = this.mapper.readValue(s, constructType); } - else if (json instanceof byte[]) { - convertedValue = this.mapper.readValue((byte[]) json, constructType); + else if (json instanceof byte[] bytes) { + convertedValue = this.mapper.readValue(bytes, constructType); } - else if (json instanceof Reader) { - convertedValue = this.mapper.readValue((Reader) json, constructType); + else if (json instanceof Reader reader) { + convertedValue = this.mapper.readValue(reader, constructType); } else if (json instanceof Map) { convertedValue = this.mapper.convertValue(json, constructType); diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JsonMapper.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JsonMapper.java index 7b9552f46..4bbcbc1b6 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JsonMapper.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/json/JsonMapper.java @@ -51,11 +51,10 @@ public abstract class JsonMapper { @SuppressWarnings("unchecked") public T fromJson(Object json, Type type) { - if (json instanceof Collection) { + if (json instanceof Collection inputs) { if (FunctionTypeUtils.isTypeCollection(type)) { return (T) json; } - Collection inputs = (Collection) json; Type itemType = FunctionTypeUtils.getImmediateGenericType(type, 0); Collection results = FunctionTypeUtils.getRawType(type).isAssignableFrom(List.class) ? new ArrayList<>() @@ -115,11 +114,11 @@ public static boolean isJsonString(Object value) { if (value instanceof byte[]) { value = new String((byte[]) value, StandardCharsets.UTF_8); } - if (value instanceof String) { + if (value instanceof String s) { try { - mapper.readTree((String) value); + mapper.readTree(s); try { - Integer.parseInt((String) value); + Integer.parseInt(s); return false; } catch (Exception e) { diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/utils/JsonMasker.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/utils/JsonMasker.java index 5fc54fc77..db6130f7a 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/utils/JsonMasker.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/utils/JsonMasker.java @@ -104,16 +104,16 @@ public String mask(Object json) { @SuppressWarnings({ "unchecked" }) private String iterate(Object json) { - if (json instanceof Collection arrayValue) { + if (json instanceof Collection arrayValue) { for (Object element : arrayValue) { - if (element instanceof Map mapElement) { + if (element instanceof Map mapElement) { for (Map.Entry entry : ((Map) mapElement).entrySet()) { this.doMask(entry.getKey(), entry); } } } } - else if (json instanceof Map mapElement) { + else if (json instanceof Map mapElement) { for (Map.Entry entry : ((Map) mapElement).entrySet()) { this.doMask(entry.getKey(), entry); } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryMultiInOutTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryMultiInOutTests.java index 6f5cf8418..13587f8d7 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryMultiInOutTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryMultiInOutTests.java @@ -331,8 +331,8 @@ public BiFunction, Flux, Flux> multiInputSingleOut public Function, Tuple3, Flux, Flux>> multiOutputAsTuplePojoIn() { return flux -> { Flux pubSubFlux = flux.publish().autoConnect(3); - Flux nameFlux = pubSubFlux.map(person -> person.getName()); - Flux idFlux = pubSubFlux.map(person -> person.getId()); + Flux nameFlux = pubSubFlux.map(Person::getName); + Flux idFlux = pubSubFlux.map(Person::getId); return Tuples.of(pubSubFlux, nameFlux, idFlux); }; } @@ -340,9 +340,9 @@ public Function, Tuple3, Flux, Flux>> @Bean public Function>, Tuple3, Flux, Flux>> multiOutputAsTupleMessageIn() { return flux -> { - Flux pubSubFlux = flux.map(message -> message.getPayload()).publish().autoConnect(3); - Flux nameFlux = pubSubFlux.map(person -> person.getName()); - Flux idFlux = pubSubFlux.map(person -> person.getId()); + Flux pubSubFlux = flux.map(Message::getPayload).publish().autoConnect(3); + Flux nameFlux = pubSubFlux.map(Person::getName); + Flux idFlux = pubSubFlux.map(Person::getId); return Tuples.of(pubSubFlux, nameFlux, idFlux); }; } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java index aea8edafa..fcc68f8e2 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/BeanFactoryAwareFunctionRegistryTests.java @@ -208,17 +208,16 @@ public void testCompositionReactiveSupplierWithImplicitConsumer() throws Excepti assertThat(CompositionReactiveSupplierWithConsumer.RESULTS.get(1)).isEqualTo("BUBBLES"); } - @SuppressWarnings({ "rawtypes", "unchecked" }) @Test public void testMessageWithArrayAsPayload() throws Exception { FunctionCatalog catalog = this.configureCatalog(MessageWithArrayAsPayload.class); FunctionInvocationWrapper function = catalog.lookup("myFunction"); - List payload = List.of("Ricky", "Julien", "Bubbles"); + List payload = List.of("Ricky", "Julien", "Bubbles"); - Message result = (Message) function.apply(MessageBuilder.withPayload(payload).build()); + Message result = (Message) function.apply(MessageBuilder.withPayload(payload).build()); - assertThat(((Collection) result.getPayload())).isNotEmpty(); + assertThat(((Collection) result.getPayload())).isNotEmpty(); } @@ -234,7 +233,7 @@ public void testCompositionWithNullReturnInBetween() { @Test public void testFunctionEligibilityFiltering() { System.setProperty("spring.cloud.function.ineligible-definitions", "asJsonNode"); - Collection registeredFunction = new ArrayList(); + Collection registeredFunction = new ArrayList<>(); FunctionCatalog catalog = this.configureCatalog(JsonNodeConfiguration.class); for (String beanName : context.getBeanDefinitionNames()) { try { @@ -262,23 +261,18 @@ public void testJsonNodeAsInput() throws Exception { assertThat(new String(f.apply(m).getPayload())).isEqualTo("[{\"name\":\"bob\"},{\"name\":\"bob\"}]"); } - @SuppressWarnings({ "rawtypes" }) @Test public void concurrencyLookupTest() throws Exception { FunctionCatalog catalog = this.configureCatalog(); ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 0; i < 100; i++) { - executor.execute(() -> { - catalog.lookup("uppercase", "application/json"); - }); - executor.execute(() -> { - catalog.lookup("numberword", "application/json"); - }); + executor.execute(() -> catalog.lookup("uppercase", "application/json")); + executor.execute(() -> catalog.lookup("numberword", "application/json")); } Thread.sleep(1000); Field frField = ReflectionUtils.findField(catalog.getClass(), "functionRegistrations"); frField.setAccessible(true); - Collection c = (Collection) frField.get(catalog); + Collection c = (Collection) frField.get(catalog); assertThat(c.size()).isEqualTo(2); } @@ -368,10 +362,10 @@ public void testConsumerFunction() { // function that returns Void, effectively assertThat(consumerFunction.apply("hello")).isNull(); Function, Void> consumerFunctionAsMessageA = catalog.lookup("consumerFunction"); - assertThat(consumerFunctionAsMessageA.apply(new GenericMessage("\"hello\"".getBytes()))).isNull(); + assertThat(consumerFunctionAsMessageA.apply(new GenericMessage<>("\"hello\"".getBytes()))).isNull(); Function, Void> consumerFunctionAsMessageB = catalog.lookup("consumerFunction", "application/json"); - assertThat(consumerFunctionAsMessageB.apply(new GenericMessage("\"hello\"".getBytes()))).isNull(); + assertThat(consumerFunctionAsMessageB.apply(new GenericMessage<>("\"hello\"".getBytes()))).isNull(); } @Test @@ -647,17 +641,16 @@ public void byteArrayNoSpecialHandling() throws Exception { assertThat(result.getPayload()).isEqualTo("\"b2xsZWg=\"".getBytes()); } - @SuppressWarnings({ "rawtypes", "unchecked" }) @Test public void testMultipleValuesInOutputHandling() throws Exception { FunctionCatalog catalog = this.configureCatalog(CollectionOutConfiguration.class); FunctionInvocationWrapper function = catalog.lookup("parseToList", "application/json"); assertThat(function).isNotNull(); Object result = function.apply(MessageBuilder.withPayload("1,2,3".getBytes()).setHeader(MessageHeaders.CONTENT_TYPE, "text/plain").build()); - assertThat(result instanceof Message).isTrue(); - byte[] payload = ((Message) result).getPayload(); + assertThat(result instanceof Message).isTrue(); + byte[] payload = (byte[]) ((Message) result).getPayload(); JsonMapper mapper = this.context.getBean(JsonMapper.class); - List resultList = mapper.fromJson(payload, List.class); + List resultList = mapper.fromJson(payload, List.class); assertThat(resultList.size()).isEqualTo(3); assertThat(resultList.get(0)).isEqualTo("1"); assertThat(resultList.get(1)).isEqualTo("2"); @@ -665,7 +658,7 @@ public void testMultipleValuesInOutputHandling() throws Exception { function = catalog.lookup("parseToListOfMessages", "application/json"); assertThat(function).isNotNull(); result = function.apply(MessageBuilder.withPayload("1,2,3".getBytes()).setHeader(MessageHeaders.CONTENT_TYPE, "text/plain").build()); - assertThat(result instanceof List).isTrue(); + assertThat(result instanceof List).isTrue(); assertThat(((Message) ((List) result).get(0)).getHeaders()).containsKey("foo"); assertThat(((Message) ((List) result).get(1)).getHeaders()).containsKey("foo"); assertThat(((Message) ((List) result).get(2)).getHeaders()).containsKey("foo"); @@ -726,7 +719,7 @@ public void testSerializationWithCompatibleWildcardSubtypeAcceptHeader() { public void testWithComplexHierarchyAndTypeConversion() { FunctionCatalog catalog = this.configureCatalog(ReactiveFunctionImpl.class); Function f = catalog.lookup(""); - assertThat(f.apply(new GenericMessage("23")).blockFirst()).isEqualTo(23); + assertThat(f.apply(new GenericMessage<>("23")).blockFirst()).isEqualTo(23); assertThat(f.apply(Flux.just("25")).blockFirst()).isEqualTo(25); assertThat(f.apply(Flux.just(25)).blockFirst()).isEqualTo(25); } @@ -765,7 +758,7 @@ public void testSupplierConsumerAsRunnable() { public void testWrappedWithAroundAdviseConfiguration() { FunctionCatalog catalog = this.configureCatalog(WrappedWithAroundAdviseConfiguration.class); Function f = catalog.lookup("uppercase"); - Message result = (Message) f.apply(new GenericMessage("hello")); + Message result = (Message) f.apply(new GenericMessage<>("hello")); assertThat(result.getHeaders().get("before")).isEqualTo("foo"); assertThat(result.getHeaders().get("after")).isEqualTo("bar"); } @@ -813,7 +806,7 @@ public void testEachElementInFluxIsProcessed() { - result = (Flux) f.apply(new GenericMessage("[{\"id\":1, \"name\":\"oleg\"}, {\"id\":2, \"name\":\"seva\"}]")); + result = (Flux) f.apply(new GenericMessage<>("[{\"id\":1, \"name\":\"oleg\"}, {\"id\":2, \"name\":\"seva\"}]")); list = (List) result.collectList().block(); assertThat(list.size()).isEqualTo(2); assertThat(list.get(0).name).isEqualTo("OLEG"); @@ -865,20 +858,20 @@ public void testGH_609() { assertThat(result.block()).isEqualTo("hello"); } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings("unchecked") @Test public void testGH_635() throws Exception { FunctionCatalog catalog = this.configureCatalog(SCF_GH_635ConfigurationAsFunction.class); - Function lmFunction = catalog.lookup("emptyMessageList", "application/json"); + FunctionInvocationWrapper lmFunction = catalog.lookup("emptyMessageList", "application/json"); List> emptyListOfMessages = (List>) lmFunction.apply(MessageBuilder.withPayload("hello").build()); assertThat(emptyListOfMessages).isEmpty(); emptyListOfMessages = (List>) lmFunction.apply("hello"); assertThat(emptyListOfMessages).isEmpty(); JsonMapper mapper = this.context.getBean(JsonMapper.class); - Function lsFunction = catalog.lookup("emptyStringList", "application/json"); + FunctionInvocationWrapper lsFunction = catalog.lookup("emptyStringList", "application/json"); Message emptyListOfString = (Message) lsFunction.apply(MessageBuilder.withPayload("hello").build()); - List resultList = mapper.fromJson(emptyListOfString.getPayload(), List.class); + List resultList = mapper.fromJson(emptyListOfString.getPayload(), List.class); assertThat(resultList).isEmpty(); emptyListOfString = (Message) lsFunction.apply("hello"); resultList = mapper.fromJson(emptyListOfString.getPayload(), List.class); @@ -977,7 +970,7 @@ public Function uppercase() { @Bean public Function, String> echo() { - return v -> v.getPayload(); + return Message::getPayload; } @Bean @@ -996,16 +989,12 @@ public Function, String> uppercasePerson() { public static class JsonNodeConfiguration { @Bean public Function, String> messageAsJsonNode() { - return v -> { - return v.getPayload().toString(); - }; + return v -> v.getPayload().toString(); } @Bean public Function asJsonNode() { - return v -> { - return v.toString(); - }; + return Object::toString; } } @@ -1023,7 +1012,7 @@ public interface ReactiveFunction extends Function, Flux> { public static class ReactiveFunctionImpl implements ReactiveFunction { @Override public Flux apply(Flux inFlux) { - return inFlux.map(v -> Integer.parseInt(v)); + return inFlux.map(Integer::parseInt); } } @@ -1221,9 +1210,7 @@ public Function>>, Flux> echoGenericO @Bean public Function uppercasePerson() { - return person -> { - return new Person(person.getName().toUpperCase(Locale.ROOT), person.getId()); - }; + return person -> new Person(person.getName().toUpperCase(Locale.ROOT), person.getId()); } @Bean @@ -1232,10 +1219,8 @@ public Supplier numberword() { } @Bean - public BiFunction biFuncUpperCase() { - return (p, h) -> { - return p.toUpperCase(Locale.ROOT); - }; + public BiFunction, String> biFuncUpperCase() { + return (p, h) -> p.toUpperCase(Locale.ROOT); } @Bean @@ -1295,9 +1280,7 @@ public Function reverse() { @Bean public Function, Flux> reverseFlux() { - return flux -> flux.map(value -> { - return new StringBuilder(value).reverse().toString(); - }); + return flux -> flux.map(value -> new StringBuilder(value).reverse().toString()); } @@ -1325,8 +1308,8 @@ public Function, Flux>, Flux> multiInputSin public Function, Tuple3, Flux, Flux>> multiOutputAsTuple() { return flux -> { Flux pubSubFlux = flux.publish().autoConnect(3); - Flux nameFlux = pubSubFlux.map(person -> person.getName()); - Flux idFlux = pubSubFlux.map(person -> person.getId()); + Flux nameFlux = pubSubFlux.map(Person::getName); + Flux idFlux = pubSubFlux.map(Person::getId); return Tuples.of(pubSubFlux, nameFlux, idFlux); }; } @@ -1395,7 +1378,7 @@ public Consumer> reactiveConsumer() { @Bean // Perhaps it should not be allowed. Recommend Function> public Consumer> reactivePojoConsumer() { - return flux -> flux.subscribe(v -> consumerInputRef.set(v)); + return flux -> flux.subscribe(consumerInputRef::set); } @Bean @@ -1646,9 +1629,9 @@ public Function echo2() { @EnableAutoConfiguration @Configuration // s-c-f-1141 - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings({ "unchecked", "rawtypes" }) public static class CompositionReactiveSupplierWithConsumer { - private static final List RESULTS = new ArrayList<>(); + private static final List RESULTS = new ArrayList<>(); @Bean public Function, Flux> functionPrimitive() { @@ -1662,18 +1645,14 @@ public Function>, Flux>> functionMessage() @Bean public Supplier>> supplyMessage() { - return () -> { - return Flux.fromArray( + return () -> Flux.fromArray( new Message[] { MessageBuilder.withPayload(1).build(), MessageBuilder.withPayload(2).build() }); - }; } @Bean public Supplier> supplyPrimitive() { - return () -> { - return Flux.fromArray( + return () -> Flux.fromArray( new Integer[] { 1, 2}); - }; } @Bean 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 dd3dc0bfa..ca1cd5009 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 @@ -120,7 +120,7 @@ public void testIsTypeCollection() { public void testWithComplexGenericsHierarchy() throws Exception { Type functionType = FunctionTypeUtils.discoverFunctionTypeFromFunctionFactoryMethod(FunctionTypeUtilsTests.class, "methodWithGenerics"); Type inputType = FunctionTypeUtils.getInputType(functionType); - Class typeClass = FunctionTypeUtils.getRawType(inputType); + Class typeClass = FunctionTypeUtils.getRawType(inputType); assertThat(typeClass).isAssignableFrom(Message.class); ParameterizedType parameterizedInputType = (ParameterizedType) inputType; Type[] typeArguments = parameterizedInputType.getActualTypeArguments(); @@ -264,7 +264,7 @@ private Type getReturnType(String methodName) throws Exception { } public static GenericBatchMessageListConsumer methodWithGenerics() { - return new GenericBatchMessageListConsumer(); + return new GenericBatchMessageListConsumer<>(); } //============ @@ -299,7 +299,7 @@ public static class ReactiveFunctionImpl implements ReactiveFunction apply(Flux inFlux) { - return inFlux.map(v -> Integer.parseInt(v)); + return inFlux.map(Integer::parseInt); } } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java index 64a273556..401803605 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistryTests.java @@ -135,7 +135,6 @@ public void testSCF1094(String stringValue) throws IOException { assertThat(lookedUpFunction.apply(inputMessage)).isEqualTo(stringValue); } - @SuppressWarnings("rawtypes") @Test public void concurrencyRegistrationTest() throws Exception { Echo function = new Echo(); @@ -145,14 +144,12 @@ public void concurrencyRegistrationTest() throws Exception { new JacksonMapper(new ObjectMapper())); ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 0; i < 1000; i++) { - executor.execute(() -> { - catalog.register(registration); - }); + executor.execute(() -> catalog.register(registration)); } Thread.sleep(1000); Field frField = ReflectionUtils.findField(catalog.getClass(), "functionRegistrations"); frField.setAccessible(true); - Collection c = (Collection) frField.get(catalog); + Collection c = (Collection) frField.get(catalog); assertThat(c.size()).isEqualTo(1); } @@ -615,13 +612,13 @@ public void testFunctionCompositionWithReactiveSupplierAndConsumer() { new JacksonMapper(new ObjectMapper())); Object reactiveFunc = reactiveFluxSupplier(); - FunctionRegistration functionRegistration = new FunctionRegistration(reactiveFunc, "reactiveFluxSupplier") + FunctionRegistration functionRegistration = new FunctionRegistration<>(reactiveFunc, "reactiveFluxSupplier") .type(ResolvableType.forClassWithGenerics( Supplier.class, ResolvableType.forClassWithGenerics(Flux.class, String.class)).getType()); catalog.register(functionRegistration); reactiveFunc = reactiveFluxConsumer(); - functionRegistration = new FunctionRegistration(reactiveFunc, "reactiveFluxConsumer") + functionRegistration = new FunctionRegistration<>(reactiveFunc, "reactiveFluxConsumer") .type(ResolvableType.forClassWithGenerics( Consumer.class, ResolvableType.forClassWithGenerics(Flux.class, String.class)).getType()); catalog.register(functionRegistration); @@ -659,7 +656,7 @@ public Function uppercase() { public Function hash() { - return v -> v.hashCode(); + return Object::hashCode; } public Supplier supplier() { @@ -671,9 +668,7 @@ public Consumer consumer() { } public Consumer> reactiveConsumer() { - return flux -> flux.subscribe(v -> { - System.out.println(v); - }); + return flux -> flux.subscribe(System.out::println); } private final AtomicInteger consumerDowncounter = new AtomicInteger(10); @@ -734,7 +729,7 @@ protected boolean supports(Class clazz) { @Bean public Function func() { - return person -> person.getName(); + return Person::getName; } } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java index 47163e5b5..c880ccab6 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java @@ -498,9 +498,7 @@ public Supplier foo() { @Bean public Consumer consumer() { - return value -> { - this.list.add(value); - }; + return this.list::add; } } @@ -628,7 +626,7 @@ protected static class GenericConfiguration { @Bean public Function, Map> function() { - return m -> m.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), + return m -> m.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString().toUpperCase(Locale.ROOT))); } @@ -723,7 +721,7 @@ protected static class GenericFluxConfiguration { @Bean public Function>, Flux>> function() { return flux -> flux.map(m -> m.entrySet().stream().collect(Collectors - .toMap(e -> e.getKey(), e -> e.getValue().toString().toUpperCase(Locale.ROOT)))); + .toMap(Map.Entry::getKey, e -> e.getValue().toString().toUpperCase(Locale.ROOT)))); } } @@ -815,7 +813,7 @@ protected static class RegistrationConfiguration { @Bean public FunctionRegistration> registration() { - return new FunctionRegistration>(function(), + return new FunctionRegistration<>(function(), "other"); } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogInitializerTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogInitializerTests.java index 1082d84e5..25bf4171c 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogInitializerTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogInitializerTests.java @@ -276,7 +276,7 @@ public Supplier supplier() { @Bean public Consumer consumer() { - return value -> this.list.add(value); + return this.list::add; } } @@ -351,7 +351,7 @@ protected static class DependencyInjectionConfiguration @Override public void initialize(GenericApplicationContext context) { - context.registerBean(String.class, () -> value()); + context.registerBean(String.class, this::value); context.registerBean("foos", FunctionRegistration.class, () -> new FunctionRegistration<>(foos(context.getBean(String.class))) .type(FunctionTypeUtils.functionType(String.class, Foo.class))); diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/scan/ScannedFunction.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/scan/ScannedFunction.java index 59521a79a..d08a6bd6e 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/scan/ScannedFunction.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/scan/ScannedFunction.java @@ -33,7 +33,7 @@ public class ScannedFunction @Override public Map apply(Map m) { - return m.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), + return m.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString().toUpperCase(Locale.ROOT))); } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/test/GenericFunction.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/test/GenericFunction.java index a5c20509e..bbc7b3794 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/test/GenericFunction.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/test/GenericFunction.java @@ -33,7 +33,7 @@ public class GenericFunction { @Bean public Function, Map> function() { - return m -> m.entrySet().stream().collect(Collectors.toMap(e -> e.getKey(), + return m -> m.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue().toString().toUpperCase(Locale.ROOT))); } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/userissues/UserIssuesTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/userissues/UserIssuesTests.java index 1bb2aa78d..6a9ad1d37 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/userissues/UserIssuesTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/userissues/UserIssuesTests.java @@ -65,7 +65,7 @@ public void testIssue602() throws Exception { FunctionCatalog catalog = this.configureCatalog(Issue602Configuration.class); Function, Integer> function = catalog.lookup("consumer"); int result = function.apply( - new GenericMessage("[{\"name\":\"julien\"},{\"name\":\"ricky\"},{\"name\":\"bubbles\"}]")); + new GenericMessage<>("[{\"name\":\"julien\"},{\"name\":\"ricky\"},{\"name\":\"bubbles\"}]")); assertThat(result).isEqualTo(3); } @@ -76,13 +76,13 @@ public void testIssue1075() throws Exception { List list = Arrays.asList(new Product[] {new Product("foo"), new Product("bar")}); - Event event = new Event(list); - EventHolder eventHolder = new EventHolder(event); + Event event = new Event<>(list); + EventHolder eventHolder = new EventHolder<>(event); ObjectMapper mapper = new ObjectMapper(); String message = mapper.writeValueAsString(eventHolder); Function function = catalog.lookup("somethingYouShouldNeverDo"); boolean result = (boolean) function.apply( - new GenericMessage(message)); + new GenericMessage<>(message)); assertThat(result).isTrue(); } @@ -103,7 +103,7 @@ public void testIssue602asPOJO() throws Exception { p = new Product(); p.setName("bubbles"); products.add(p); - int result = function.apply(new GenericMessage>(products)); + int result = function.apply(new GenericMessage<>(products)); assertThat(result).isEqualTo(3); } @@ -116,7 +116,7 @@ public void testIssue602asCollectionOfUnconvertedItems() throws Exception { products.add("{\"name\":\"julien\"}"); products.add("{\"name\":\"ricky\"}"); products.add("{\"name\":\"bubbles\"}"); - int result = function.apply(new GenericMessage>(products)); + int result = function.apply(new GenericMessage<>(products)); assertThat(result).isEqualTo(3); } @@ -217,7 +217,7 @@ public static class Uppercase implements Function, Flux> { @Override public Flux apply(Flux s) { - return s.map(v -> v.length()); + return s.map(String::length); } } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/utils/JsonMaskerTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/utils/JsonMaskerTests.java index 76f931547..f05ccccf4 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/utils/JsonMaskerTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/utils/JsonMaskerTests.java @@ -250,34 +250,33 @@ public void validateMaskingWithAdditionalKeys() throws Exception { jsonMaskerField.set(masker, null); } - @SuppressWarnings({ "unchecked", "rawtypes" }) - private void iterate(Object json, List keysToMask) { - if (json instanceof Collection arrayValue) { + @SuppressWarnings("unchecked") + private void iterate(Object json, List keysToMask) { + if (json instanceof Collection arrayValue) { for (Object element : arrayValue) { - if (element instanceof Map mapElement) { + if (element instanceof Map mapElement) { for (Map.Entry entry : ((Map) mapElement).entrySet()) { this.doMask(entry.getKey(), entry, keysToMask); } } } } - else if (json instanceof Map mapElement) { + else if (json instanceof Map mapElement) { for (Map.Entry entry : ((Map) mapElement).entrySet()) { this.doMask(entry.getKey(), entry, keysToMask); } } } - @SuppressWarnings("rawtypes") - private void doMask(String key, Map.Entry entry, List keysToMask) { + private void doMask(String key, Map.Entry entry, List keysToMask) { if (keysToMask.contains(key)) { System.out.println("Masked: " + entry.getKey()); maskedKeys.add(key); } - else if (entry.getValue() instanceof Map) { + else if (entry.getValue() instanceof Map) { this.iterate(entry.getValue(), keysToMask); } - else if (entry.getValue() instanceof Collection) { + else if (entry.getValue() instanceof Collection) { this.iterate(entry.getValue(), keysToMask); } } diff --git a/spring-cloud-function-samples/function-sample-aws-custom-bean/src/main/java/com/example/LambdaApplication.java b/spring-cloud-function-samples/function-sample-aws-custom-bean/src/main/java/com/example/LambdaApplication.java index a321e8946..4e5a55a35 100644 --- a/spring-cloud-function-samples/function-sample-aws-custom-bean/src/main/java/com/example/LambdaApplication.java +++ b/spring-cloud-function-samples/function-sample-aws-custom-bean/src/main/java/com/example/LambdaApplication.java @@ -22,9 +22,7 @@ public class LambdaApplication { @Bean public Consumer consume() { - return value -> { - logger.info("Consuming: " + value); - }; + return value -> logger.info("Consuming: " + value); } @Bean diff --git a/spring-cloud-function-samples/function-sample-azure-eventgrid-trigger/src/main/java/com/example/azure/eventgrid/EventGridHandler.java b/spring-cloud-function-samples/function-sample-azure-eventgrid-trigger/src/main/java/com/example/azure/eventgrid/EventGridHandler.java index 785053f13..0d49d152c 100644 --- a/spring-cloud-function-samples/function-sample-azure-eventgrid-trigger/src/main/java/com/example/azure/eventgrid/EventGridHandler.java +++ b/spring-cloud-function-samples/function-sample-azure-eventgrid-trigger/src/main/java/com/example/azure/eventgrid/EventGridHandler.java @@ -179,7 +179,7 @@ private HttpResponseMessage handleEventGridFormat(HttpRequestMessage> eventGridEvents = objectMapper.readValue( - requestBody, new TypeReference>>() {}); + requestBody, new TypeReference<>() { }); StringBuilder results = new StringBuilder(); diff --git a/spring-cloud-function-samples/function-sample/src/main/java/com/example/Client.java b/spring-cloud-function-samples/function-sample/src/main/java/com/example/Client.java index d20e2358f..74c00b528 100644 --- a/spring-cloud-function-samples/function-sample/src/main/java/com/example/Client.java +++ b/spring-cloud-function-samples/function-sample/src/main/java/com/example/Client.java @@ -33,9 +33,7 @@ public static void main(String[] args) throws Exception { .header("accept", "text/event-stream") .retrieve(); - responseSpec.bodyToFlux(String.class).subscribe(v -> { - System.out.println(v); - }); + responseSpec.bodyToFlux(String.class).subscribe(System.out::println); System.in.read(); diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionController.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionController.java index fe241df35..182cf6af8 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionController.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/flux/FunctionController.java @@ -196,8 +196,7 @@ private MultiValueMap multi(MultiValueMap body) { MultiValueMap map = new LinkedMultiValueMap<>(); for (String key : body.keySet()) { for (Part part : body.get(key)) { - if (part instanceof FormFieldPart) { - FormFieldPart form = (FormFieldPart) part; + if (part instanceof FormFieldPart form) { map.add(key, form.value()); } } diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/ErrorHandlerRegistrar.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/ErrorHandlerRegistrar.java index 705551fbd..5744c95da 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/ErrorHandlerRegistrar.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/ErrorHandlerRegistrar.java @@ -31,10 +31,10 @@ private ErrorHandlerRegistrar() { } protected static DefaultErrorWebExceptionHandler errorHandler(GenericApplicationContext context) { - context.registerBean(ErrorAttributes.class, () -> new DefaultErrorAttributes()); - context.registerBean(ErrorProperties.class, () -> new ErrorProperties()); + context.registerBean(ErrorAttributes.class, DefaultErrorAttributes::new); + context.registerBean(ErrorProperties.class, ErrorProperties::new); - context.registerBean(Resources.class, () -> new Resources()); + context.registerBean(Resources.class, Resources::new); DefaultErrorWebExceptionHandler handler = new DefaultErrorWebExceptionHandler( context.getBeansOfType(ErrorAttributes.class).values().iterator().next(), context.getBean(Resources.class), context.getBean(ErrorProperties.class), context); diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializer.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializer.java index ee55a1b0a..1b7f01b99 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializer.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializer.java @@ -106,7 +106,7 @@ private void registerWebFluxAutoConfiguration(GenericApplicationContext context) } private void registerEndpoint(GenericApplicationContext context) { - context.registerBean(FunctionHttpProperties.class, () -> new FunctionHttpProperties()); + context.registerBean(FunctionHttpProperties.class, FunctionHttpProperties::new); context.registerBean(FunctionEndpointFactory.class, () -> new FunctionEndpointFactory(context.getBean(FunctionProperties.class), context.getBean(FunctionCatalog.class), context.getEnvironment(), context.getBean(FunctionHttpProperties.class))); @@ -150,7 +150,7 @@ public void onApplicationEvent(ApplicationEvent event) { logger.info("No web server classes found so no server to start"); return; } - Integer port = Integer.valueOf(context.getEnvironment().resolvePlaceholders("${server.port:${PORT:8080}}")); + int port = Integer.parseInt(context.getEnvironment().resolvePlaceholders("${server.port:${PORT:8080}}")); String address = context.getEnvironment().resolvePlaceholders("${server.address:0.0.0.0}"); if (port >= 0) { HttpHandler handler = context.getBeansOfType(HttpHandler.class).values().iterator().next(); @@ -166,8 +166,8 @@ public void onApplicationEvent(ApplicationEvent event) { private void callback(DisposableServer server, ApplicationContext context) { logger.info("HTTP server started on port: " + server.port()); - if (context instanceof ConfigurableApplicationContext) { - ((ConfigurableApplicationContext) context).getEnvironment().getPropertySources().addFirst( + if (context instanceof ConfigurableApplicationContext configurableContext) { + configurableContext.getEnvironment().getPropertySources().addFirst( new MapPropertySource("functionalServerProps", Collections.singletonMap("local.server.port", server.port()))); } try { diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java index 63880038a..1ca3e0e14 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/mvc/FunctionController.java @@ -17,6 +17,7 @@ package org.springframework.cloud.function.web.mvc; import java.util.Arrays; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; @@ -80,7 +81,7 @@ public Object form(WebRequest request) { MultiValueMap multiFileMap = ((StandardMultipartHttpServletRequest) ((ServletWebRequest) request) .getRequest()).getMultiFileMap(); if (!CollectionUtils.isEmpty(multiFileMap)) { - List> files = multiFileMap.values().stream().flatMap(v -> v.stream()) + List> files = multiFileMap.values().stream().flatMap(Collection::stream) .map(file -> MessageBuilder.withPayload(file).copyHeaders(wrapper.getHeaders().asMultiValueMap()).build()) .collect(Collectors.toList()); FunctionInvocationWrapper function = wrapper.getFunction(); @@ -88,9 +89,7 @@ public Object form(WebRequest request) { Publisher result = (Publisher) function.apply(Flux.fromIterable(files)); BodyBuilder builder = ResponseEntity.ok(); if (result instanceof Flux) { - result = Flux.from(result).map(message -> { - return message instanceof Message ? ((Message) message).getPayload() : message; - }).collectList(); + result = Flux.from(result).map(message -> message instanceof Message ? ((Message) message).getPayload() : message).collectList(); } return Mono.from(result).flatMap(body -> Mono.just(builder.body(body))); } diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/FunctionExporterInitializer.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/FunctionExporterInitializer.java index 42beb3de8..d6a0aca3f 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/FunctionExporterInitializer.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/FunctionExporterInitializer.java @@ -16,8 +16,6 @@ package org.springframework.cloud.function.web.source; -import java.util.function.Supplier; - import org.springframework.boot.web.context.reactive.ConfigurableReactiveWebEnvironment; import org.springframework.boot.web.context.reactive.ReactiveWebApplicationContext; import org.springframework.cloud.function.context.FunctionCatalog; @@ -30,7 +28,6 @@ import org.springframework.web.context.ConfigurableWebEnvironment; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClient.Builder; /** * @author Dave Syer @@ -54,12 +51,7 @@ private void registerWebClient(GenericApplicationContext context) { if (ClassUtils.isPresent("org.springframework.web.reactive.function.client.WebClient", getClass().getClassLoader())) { if (context.getBeanFactory().getBeanNamesForType(WebClient.Builder.class, false, false).length == 0) { - context.registerBean(WebClient.Builder.class, new Supplier() { - @Override - public Builder get() { - return WebClient.builder(); - } - }); + context.registerBean(WebClient.Builder.class, WebClient::builder); } } } @@ -82,7 +74,7 @@ private boolean isExporting(GenericApplicationContext context) { } private void registerExport(GenericApplicationContext context) { - context.registerBean(ExporterProperties.class, () -> new ExporterProperties()); + context.registerBean(ExporterProperties.class, ExporterProperties::new); context.registerBean(FunctionExporterAutoConfiguration.class, () -> new FunctionExporterAutoConfiguration(context.getBean(ExporterProperties.class), context.getBean(FunctionHttpProperties.class))); if (context.getBeanFactory().getBeanNamesForType(DestinationResolver.class, false, false).length == 0) { diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/SimpleRequestBuilder.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/SimpleRequestBuilder.java index 63918d558..cec23b061 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/SimpleRequestBuilder.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/SimpleRequestBuilder.java @@ -52,8 +52,7 @@ class SimpleRequestBuilder implements RequestBuilder { @Override public HttpHeaders headers(String destination, Object value) { MessageHeaders incoming = new MessageHeaders(Collections.emptyMap()); - if (value instanceof Message) { - Message message = (Message) value; + if (value instanceof Message message) { incoming = message.getHeaders(); } HttpHeaders result = HeaderUtils.fromMessage(incoming, this.httpProperties.getIgnoredHeaders()); diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/SupplierExporter.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/SupplierExporter.java index 0a0338f45..b8b04c773 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/SupplierExporter.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/source/SupplierExporter.java @@ -125,9 +125,7 @@ public void start() { // return retry; // } // ) - .doOnComplete(() -> { - stop(); - }) + .doOnComplete(this::stop) .subscribe(); this.ok = true; @@ -168,7 +166,7 @@ public void stop(Runnable callback) { } private Flux forward(Supplier> supplier, String name) { - Flux o = (Flux) supplier.get(); + Flux o = (Flux) supplier.get(); // o.subscribe(v -> { // System.out.println(v); // }); @@ -183,8 +181,7 @@ private Flux forward(Supplier> supplier, Strin private Mono post(URI uri, String destination, Object value) { Object body = value; - if (value instanceof Message) { - Message message = (Message) value; + if (value instanceof Message message) { body = message.getPayload(); } if (this.debug) { diff --git a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/FunctionWebRequestProcessingHelper.java b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/FunctionWebRequestProcessingHelper.java index cb4f95003..8e6ce7e75 100644 --- a/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/FunctionWebRequestProcessingHelper.java +++ b/spring-cloud-function-web/src/main/java/org/springframework/cloud/function/web/util/FunctionWebRequestProcessingHelper.java @@ -142,16 +142,14 @@ public static Publisher processRequest(FunctionWrapper wrapper, Object argume BodyBuilder responseOkBuilder = ResponseEntity.ok().headers(HeaderUtils.sanitize(headers, ignoredHeaders, requestOnlyHeaders)); Publisher pResult; - if (result instanceof Publisher) { - pResult = (Publisher) result; + if (result instanceof Publisher publisher) { + pResult = publisher; if (eventStream) { return Flux.from(pResult); } - if (pResult instanceof Flux) { - pResult = ((Flux) pResult).onErrorContinue((e, v) -> { - logger.error("Failed to process value: " + v, (Throwable) e); - }).collectList(); + if (pResult instanceof Flux flux) { + pResult = flux.onErrorContinue((e, v) -> logger.error("Failed to process value: " + v, (Throwable) e)).collectList(); } pResult = Mono.from(pResult); } @@ -160,10 +158,10 @@ public static Publisher processRequest(FunctionWrapper wrapper, Object argume } return Mono.from(pResult).map(v -> { - if (v instanceof Iterable i) { - List aggregatedResult = (List) StreamSupport.stream(i.spliterator(), false).map(m -> { - return m instanceof Message ? processMessage(responseOkBuilder, (Message) m, ignoredHeaders) : m; - }).collect(Collectors.toList()); + if (v instanceof Iterable i) { + List aggregatedResult = StreamSupport.stream(i.spliterator(), false) + .map(m -> m instanceof Message ? processMessage(responseOkBuilder, (Message) m, ignoredHeaders) : m) + .collect(Collectors.toList()); return responseOkBuilder.header("content-type", "application/json").body(aggregatedResult); } else if (v instanceof Message) { @@ -228,16 +226,16 @@ private static FunctionInvocationWrapper postProcessFunction(FunctionInvocationW @SuppressWarnings({ "unchecked", "rawtypes" }) private static Object postProcessResult(Object result, boolean isMessage) { - if (result instanceof Flux) { - result = ((Flux) result).map(v -> postProcessResult(v, isMessage)); + if (result instanceof Flux flux) { + result = flux.map(v -> postProcessResult(v, isMessage)); } - else if (result instanceof Mono) { - result = ((Mono) result).map(v -> postProcessResult(v, isMessage)); + else if (result instanceof Mono mono) { + result = mono.map(v -> postProcessResult(v, isMessage)); } else if (result instanceof Message messageResult) { if (messageResult.getPayload() instanceof byte[]) { //String str = new String((byte[]) messageResult.getPayload()); - result = MessageBuilder.withPayload(messageResult.getPayload()).copyHeaders(((Message) result).getHeaders()).build(); + result = MessageBuilder.withPayload(messageResult.getPayload()).copyHeaders(messageResult.getHeaders()).build(); } } else if (result instanceof byte[]) { diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/flux/FluxRestApplicationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/flux/FluxRestApplicationTests.java index 3bb83a0f5..8a0758306 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/flux/FluxRestApplicationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/flux/FluxRestApplicationTests.java @@ -361,7 +361,7 @@ public Flux foos() { @ResponseStatus(HttpStatus.ACCEPTED) public Flux updates(@RequestBody List list) { Flux flux = Flux.fromIterable(list).cache(); - flux.subscribe(value -> this.list.add(value)); + flux.subscribe(this.list::add); return flux; } @@ -390,9 +390,7 @@ public Flux empty() { @GetMapping("/timeout") public Flux timeout() { - return Flux.defer(() -> Flux.create(emitter -> { - emitter.next("foo"); - }).timeout(Duration.ofMillis(100L), Flux.empty())); + return Flux.defer(() -> Flux.create(emitter -> emitter.next("foo")).timeout(Duration.ofMillis(100L), Flux.empty())); } @GetMapping("/sentences") diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/mvc/MvcRestApplicationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/mvc/MvcRestApplicationTests.java index 8ffb08f83..e2e7e14a0 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/mvc/MvcRestApplicationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/mvc/MvcRestApplicationTests.java @@ -340,7 +340,7 @@ public Flux foos() { @ResponseStatus(HttpStatus.ACCEPTED) public Flux updates(@RequestBody List list) { Flux flux = Flux.fromIterable(list).cache(); - flux.subscribe(value -> this.list.add(value)); + flux.subscribe(this.list::add); return flux; } @@ -369,9 +369,7 @@ public Flux empty() { @GetMapping("/timeout") public Flux timeout() { - return Flux.defer(() -> Flux.create(emitter -> { - emitter.next("foo"); - }).timeout(Duration.ofMillis(100L), Flux.empty())); + return Flux.defer(() -> Flux.create(emitter -> emitter.next("foo")).timeout(Duration.ofMillis(100L), Flux.empty())); } @GetMapping("/sentences") diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HeadersToMessageTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HeadersToMessageTests.java index 78df32252..9cb2f5ea3 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HeadersToMessageTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HeadersToMessageTests.java @@ -55,6 +55,7 @@ public class HeadersToMessageTests { @Autowired private TestRestTemplate rest; + @SuppressWarnings("PMD.AvoidRawTypesForCollections") @Test public void testBodyAndCustomHeaderFromMessagePropagation() throws Exception { // test POJO paylod diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpGetIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpGetIntegrationTests.java index ef327c37f..04af9bb58 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpGetIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpGetIntegrationTests.java @@ -342,9 +342,7 @@ public Function, Flux> function() { @Bean public Supplier> timeout() { - return () -> Flux.defer(() -> Flux.create(emitter -> { - emitter.next("foo"); - }).timeout(Duration.ofMillis(100L), Flux.empty())); + return () -> Flux.defer(() -> Flux.create(emitter -> emitter.next("foo")).timeout(Duration.ofMillis(100L), Flux.empty())); } @Bean diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java index 72ac0408d..b8f7bf21b 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/flux/HttpPostIntegrationTests.java @@ -398,7 +398,7 @@ public void fluxWithList() throws Exception { //@Test @DirtiesContext public void testReactiveFunctionComposdWithImperativeConsumer() throws Exception { - RequestEntity entity = RequestEntity.post(new URI("/functionReactive,consumerImperative")).build(); + RequestEntity entity = RequestEntity.post(new URI("/functionReactive,consumerImperative")).build(); this.rest.exchange(entity, String.class); assertThat(ApplicationConfiguration.functionReactiveInvocations).isEqualTo(1); } @@ -428,9 +428,7 @@ public Function, Flux> functionReactive() { @Bean public Consumer consumerImperative() { - return value -> { - System.out.println(value); - }; + return System.out::println; } @Bean({ "uppercase", "transform", "post/more" }) @@ -498,16 +496,12 @@ public Function>, Flux>> maps() @Bean @Qualifier("foos") public Function qualifier() { - return value -> { - return new Foo("[" + value.trim().toUpperCase(Locale.ROOT) + "]"); - }; + return value -> new Foo("[" + value.trim().toUpperCase(Locale.ROOT) + "]"); } @Bean public Consumer> updates() { - return flux -> flux.subscribe(value -> { - this.list.add(value); - }); + return flux -> flux.subscribe(this.list::add); } @Bean @@ -517,16 +511,12 @@ public Consumer> addFoosFlux() { @Bean public Consumer addFoos() { - return value -> { - this.list.add(value.getValue()); - }; + return value -> this.list.add(value.getValue()); } @Bean public Consumer bareUpdates() { - return value -> { - this.list.add(value); - }; + return this.list::add; } @Bean("not/a") @@ -549,7 +539,7 @@ public Function, Mono>> count() { @Bean public Function>, Flux> fluxCollectionEcho() { - return flux -> flux.flatMap(v -> Flux.fromIterable(v)); + return flux -> flux.flatMap(Flux::fromIterable); } } diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializerTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializerTests.java index bf6a38655..d423619e0 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializerTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/function/FunctionEndpointInitializerTests.java @@ -70,7 +70,7 @@ public void testEmptyBodyRequestParameters() throws Exception { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", "application/json"); - HttpEntity entity = new HttpEntity(headers); + HttpEntity entity = new HttpEntity<>(headers); String urlTemplate = UriComponentsBuilder.fromUriString("http://localhost:" + port + "/nullPayload") .queryParam("fname", "Jim").queryParam("lname", "Lahey").encode().toUriString(); @@ -162,7 +162,7 @@ protected static class ConsumerConfiguration implements ApplicationContextInitializer { public Consumer consume() { - return v -> System.out.println(v); + return System.out::println; } @Override @@ -180,9 +180,7 @@ public void initialize(GenericApplicationContext applicationContext) { protected static class BeansConfiguration { @Bean public BiFunction, Map> nullPayload() { - return (p, h) -> { - return h; - }; + return (p, h) -> h; } } @@ -204,9 +202,7 @@ public Function lowercase() { } public Function reverse() { - return s -> { - return new StringBuilder(s).reverse().toString(); - }; + return s -> new StringBuilder(s).reverse().toString(); } @Override diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HeadersToMessageTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HeadersToMessageTests.java index ce17d68c2..2175cd923 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HeadersToMessageTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HeadersToMessageTests.java @@ -55,6 +55,7 @@ public class HeadersToMessageTests { @Autowired private TestRestTemplate rest; + @SuppressWarnings("PMD.AvoidRawTypesForCollections") @Test public void testBodyAndCustomHeaderFromMessagePropagation() throws Exception { HttpEntity postForEntity = this.rest @@ -68,6 +69,7 @@ public void testBodyAndCustomHeaderFromMessagePropagation() throws Exception { assertThat(postForEntity.getHeaders().get("foo").get(0)).isEqualTo("bar"); } + @SuppressWarnings("PMD.AvoidRawTypesForCollections") @Test public void testHeadersPropagatedByDefault() throws Exception { HttpEntity postForEntity = this.rest diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpDeleteIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpDeleteIntegrationTests.java index 6da86e6f5..cddb8654c 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpDeleteIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpDeleteIntegrationTests.java @@ -126,7 +126,7 @@ public Consumer deleteConsumer() { public Consumer> deleteConsumerAsMessage() { return v -> { assertThat(v.getPayload()).isEqualTo("123"); - assertThat(((Map) v.getHeaders().get("http_request_param")).get("foo")).isEqualTo("bar"); + assertThat(((Map) v.getHeaders().get("http_request_param")).get("foo")).isEqualTo("bar"); System.out.println("Deleting: " + v); }; } diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java index 40a337cd0..e1fa17900 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpGetIntegrationTests.java @@ -361,9 +361,7 @@ public Function, Flux> function() { @Bean public Supplier> timeout() { - return () -> Flux.defer(() -> Flux.create(emitter -> { - emitter.next("foo"); - }).timeout(Duration.ofMillis(1000L), Flux.empty())); + return () -> Flux.defer(() -> Flux.create(emitter -> emitter.next("foo")).timeout(Duration.ofMillis(1000L), Flux.empty())); } @Bean diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpPostIntegrationTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpPostIntegrationTests.java index 29a0fa976..7a1d2d3d8 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpPostIntegrationTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/HttpPostIntegrationTests.java @@ -410,7 +410,7 @@ public Function qualifier() { @Bean public Consumer> updates() { - return flux -> flux.subscribe(value -> this.list.add(value)); + return flux -> flux.subscribe(this.list::add); } @Bean @@ -420,9 +420,7 @@ public Consumer> addFoos() { @Bean public Consumer bareUpdates() { - return value -> { - this.list.add(value); - }; + return this.list::add; } @Bean("not/a") diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/MultipartFileTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/MultipartFileTests.java index 1a9bdc394..85b21b2e2 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/MultipartFileTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/MultipartFileTests.java @@ -58,7 +58,7 @@ public void testMultipartFileUpload() throws Exception { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); - HttpEntity> requestEntity = new HttpEntity>( + HttpEntity> requestEntity = new HttpEntity<>( map, headers); ResponseEntity result = template.exchange(new URI("http://localhost:" + port + "/uppercase"), HttpMethod.POST, requestEntity, String.class); @@ -79,7 +79,7 @@ public void testMultipartFilesUpload() throws Exception { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); - HttpEntity> requestEntity = new HttpEntity>( + HttpEntity> requestEntity = new HttpEntity<>( map, headers); ResponseEntity result = template.exchange(new URI("http://localhost:" + port + "/uppercase"), HttpMethod.POST, requestEntity, String.class); @@ -93,9 +93,7 @@ protected static class TestConfiguration { @Bean public Function uppercase() { - return value -> { - return value.getOriginalFilename().toUpperCase(Locale.ROOT); - }; + return value -> value.getOriginalFilename().toUpperCase(Locale.ROOT); } } } diff --git a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/RoutingFunctionTests.java b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/RoutingFunctionTests.java index daeec303b..21033ddde 100644 --- a/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/RoutingFunctionTests.java +++ b/spring-cloud-function-web/src/test/java/org/springframework/cloud/function/web/mvc/RoutingFunctionTests.java @@ -219,9 +219,7 @@ public Function, Flux> fluxuppercase() { @Bean public Consumer> fluxconsumer() { - return flux -> flux.doOnNext(s -> { - System.out.println("Received: " + s); - }).subscribe(); + return flux -> flux.doOnNext(s -> System.out.println("Received: " + s)).subscribe(); } @Bean diff --git a/src/checkstyle/pmd-modern-java.xml b/src/checkstyle/pmd-modern-java.xml new file mode 100644 index 000000000..2b7ee9265 --- /dev/null +++ b/src/checkstyle/pmd-modern-java.xml @@ -0,0 +1,132 @@ + + + + Rules to encourage modern Java 17+ syntax conventions + + + + 4 + + + + + 4 + + + + + + Encourages the use of generics over raw types for standard collections to ensure type safety. + Class literals, nested generic types (e.g., Map.Entry), instanceof checks and casts are excluded + as they are not raw type usage in the sense of this rule. + + 4 + + + + + + + + + + + + + Identifies 'instanceof' checks followed by an explicit cast of the same expression to the same type + within the if-block, which can be simplified using pattern matching. + + 4 + + + + + + + + + + + + + Lambdas with a single statement in their block can often be simplified to expression lambdas or method + references. + + 4 + + + + + + + + + + + + + Identifies private static classes with only final fields, which are good candidates for Java Records. + + 5 + + + + 0 and + count(FieldDeclaration/VariableDeclarator/VariableId[@Final=false()]) = 0 and + count(ConstructorDeclaration) = 0 + ] + ]]> + + + + + +