From 4b83241e907bd8229d8b39032843c7ab457914d0 Mon Sep 17 00:00:00 2001 From: Artem Bilan Date: Thu, 8 Jul 2021 12:24:28 -0400 Subject: [PATCH] Fix new Sonar smells --- .../config/MessagingGatewayRegistrar.java | 34 +++++---- .../integration/config/xml/GatewayParser.java | 25 +++++-- .../gateway/GatewayMethodMetadata.java | 11 +-- .../IntegrationGraphControllerRegistrar.java | 69 +++++++++++-------- 4 files changed, 87 insertions(+), 52 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingGatewayRegistrar.java b/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingGatewayRegistrar.java index e3ec9f9064..704bfb28d5 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingGatewayRegistrar.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/MessagingGatewayRegistrar.java @@ -28,7 +28,6 @@ import java.util.stream.Collectors; import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.EmbeddedValueResolver; @@ -57,7 +56,7 @@ import org.springframework.util.StringUtils; /** * The {@link ImportBeanDefinitionRegistrar} to parse {@link MessagingGateway} and its {@code service-interface} - * and to register {@link BeanDefinition} {@link GatewayProxyFactoryBean}. + * and to register bean definition for {@link GatewayProxyFactoryBean}. * * @author Artem Bilan * @author Gary Russell @@ -88,7 +87,7 @@ public class MessagingGatewayRegistrar implements ImportBeanDefinitionRegistrar } } - public BeanDefinitionHolder gatewayProxyBeanDefinition(Map gatewayAttributes, + public BeanDefinitionHolder gatewayProxyBeanDefinition(Map gatewayAttributes, // NOSONAR - complexity BeanDefinitionRegistry registry) { String defaultPayloadExpression = (String) gatewayAttributes.get("defaultPayloadExpression"); @@ -116,7 +115,6 @@ public class MessagingGatewayRegistrar implements ImportBeanDefinitionRegistrar EmbeddedValueResolver embeddedValueResolver = new EmbeddedValueResolver(beanFactory); Class serviceInterface = getServiceInterface((String) gatewayAttributes.get("serviceInterface"), beanFactory); - @SuppressWarnings("unchecked") AbstractBeanDefinition beanDefinition = new RootBeanDefinition(GatewayProxyFactoryBean.class, () -> { GatewayProxyFactoryBean proxyFactoryBean = new GatewayProxyFactoryBean(serviceInterface); @@ -152,6 +150,7 @@ public class MessagingGatewayRegistrar implements ImportBeanDefinitionRegistrar proxyFactoryBean.setGlobalMethodMetadata(globalMethodMetadata); } + @SuppressWarnings("unchecked") Map methodDefinitions = (Map) gatewayAttributes.get("methods"); @@ -160,7 +159,8 @@ public class MessagingGatewayRegistrar implements ImportBeanDefinitionRegistrar methodDefinitions.entrySet() .stream() .collect(Collectors.toMap(Entry::getKey, - entry -> (GatewayMethodMetadata) entry.getValue().getInstanceSupplier().get())); + entry -> (GatewayMethodMetadata) entry.getValue() + .getInstanceSupplier().get())); proxyFactoryBean.setMethodMetadataMap(methodMetadataMap); } @@ -223,7 +223,9 @@ public class MessagingGatewayRegistrar implements ImportBeanDefinitionRegistrar if (hasDefaultPayloadExpression) { String actualPayloadExpression = embeddedValueResolver.resolveStringValue(defaultPayloadExpression); - gatewayMethodMetadata.setPayloadExpression(EXPRESSION_PARSER.parseExpression(actualPayloadExpression)); + if (actualPayloadExpression != null) { + gatewayMethodMetadata.setPayloadExpression(EXPRESSION_PARSER.parseExpression(actualPayloadExpression)); + } } if (hasDefaultHeaders) { @@ -238,12 +240,7 @@ public class MessagingGatewayRegistrar implements ImportBeanDefinitionRegistrar "is required on a gateway's header."); } - Expression expression = - hasValue - ? new LiteralExpression(embeddedValueResolver.resolveStringValue(headerValue)) - : EXPRESSION_PARSER.parseExpression( - embeddedValueResolver.resolveStringValue(headerExpression)); - + Expression expression = buildHeaderExpression(embeddedValueResolver, headerValue, headerExpression); headerExpressions.put((String) header.get("name"), expression); } gatewayMethodMetadata.setHeaderExpressions(headerExpressions); @@ -251,6 +248,19 @@ public class MessagingGatewayRegistrar implements ImportBeanDefinitionRegistrar return gatewayMethodMetadata; } + private static Expression buildHeaderExpression(EmbeddedValueResolver embeddedValueResolver, String headerValue, + String headerExpression) { + + if (StringUtils.hasText(headerValue)) { + String resolvedValue = embeddedValueResolver.resolveStringValue(headerValue); + return resolvedValue != null ? new LiteralExpression(resolvedValue) : null; + } + else { + String resolvedValue = embeddedValueResolver.resolveStringValue(headerExpression); + return resolvedValue != null ? EXPRESSION_PARSER.parseExpression(resolvedValue) : null; + } + } + /** * TODO until SPR-11710 will be resolved. * Captures the meta-annotation attribute values, in order. diff --git a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/GatewayParser.java b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/GatewayParser.java index e8124566b3..32a0dd8605 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/config/xml/GatewayParser.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/config/xml/GatewayParser.java @@ -176,8 +176,10 @@ public class GatewayParser implements BeanDefinitionParser { "'payload-expression' is not allowed when a 'mapper' is provided"); if (StringUtils.hasText(payloadExpression)) { - gatewayMethodMetadata.setPayloadExpression( - EXPRESSION_PARSER.parseExpression(embeddedValueResolver.resolveStringValue(payloadExpression))); + String expressionString = embeddedValueResolver.resolveStringValue(payloadExpression); + if (expressionString != null) { + gatewayMethodMetadata.setPayloadExpression(EXPRESSION_PARSER.parseExpression(expressionString)); + } } List invocationHeaders = DomUtils.getChildElementsByTagName(methodElement, "header"); @@ -188,11 +190,7 @@ public class GatewayParser implements BeanDefinitionParser { for (Element headerElement : invocationHeaders) { String headerValue = headerElement.getAttribute("value"); String headerExpression = headerElement.getAttribute("expression"); - Expression expression = - StringUtils.hasText(headerValue) - ? new LiteralExpression(embeddedValueResolver.resolveStringValue(headerValue)) - : EXPRESSION_PARSER.parseExpression( - embeddedValueResolver.resolveStringValue(headerExpression)); + Expression expression = buildHeaderExpression(embeddedValueResolver, headerValue, headerExpression); headerExpressions.put(headerElement.getAttribute(AbstractBeanDefinitionParser.NAME_ATTRIBUTE), expression); @@ -202,5 +200,18 @@ public class GatewayParser implements BeanDefinitionParser { return gatewayMethodMetadata; } + private static Expression buildHeaderExpression(EmbeddedValueResolver embeddedValueResolver, String headerValue, + String headerExpression) { + + if (StringUtils.hasText(headerValue)) { + String resolvedValue = embeddedValueResolver.resolveStringValue(headerValue); + return resolvedValue != null ? new LiteralExpression(resolvedValue) : null; + } + else { + String resolvedValue = embeddedValueResolver.resolveStringValue(headerExpression); + return resolvedValue != null ? EXPRESSION_PARSER.parseExpression(resolvedValue) : null; + } + } + } diff --git a/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayMethodMetadata.java b/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayMethodMetadata.java index 8bc639be9a..ee92b8da72 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayMethodMetadata.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/gateway/GatewayMethodMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -54,10 +54,11 @@ public class GatewayMethodMetadata { return this.payloadExpression; } - public void setPayloadExpression(Expression payloadExpression) { + public void setPayloadExpression(@Nullable Expression payloadExpression) { this.payloadExpression = payloadExpression; } + @Nullable public Map getHeaderExpressions() { return this.headerExpressions; } @@ -85,19 +86,21 @@ public class GatewayMethodMetadata { this.replyChannelName = replyChannelName; } + @Nullable public String getRequestTimeout() { return this.requestTimeout; } - public void setRequestTimeout(String requestTimeout) { + public void setRequestTimeout(@Nullable String requestTimeout) { this.requestTimeout = requestTimeout; } + @Nullable public String getReplyTimeout() { return this.replyTimeout; } - public void setReplyTimeout(String replyTimeout) { + public void setReplyTimeout(@Nullable String replyTimeout) { this.replyTimeout = replyTimeout; } diff --git a/spring-integration-http/src/main/java/org/springframework/integration/http/config/IntegrationGraphControllerRegistrar.java b/spring-integration-http/src/main/java/org/springframework/integration/http/config/IntegrationGraphControllerRegistrar.java index 55f860df13..71437dfae7 100644 --- a/spring-integration-http/src/main/java/org/springframework/integration/http/config/IntegrationGraphControllerRegistrar.java +++ b/spring-integration-http/src/main/java/org/springframework/integration/http/config/IntegrationGraphControllerRegistrar.java @@ -80,40 +80,51 @@ public class IntegrationGraphControllerRegistrar implements ImportBeanDefinition String path = (String) annotationAttributes.get("value"); String[] allowedOrigins = (String[]) annotationAttributes.get("allowedOrigins"); if (allowedOrigins != null && allowedOrigins.length > 0) { - AbstractBeanDefinition controllerCorsConfigurer = null; - if (HttpContextUtils.WEB_MVC_PRESENT) { - controllerCorsConfigurer = webMvcControllerCorsConfigurerBean(path, allowedOrigins); - } - else if (HttpContextUtils.WEB_FLUX_PRESENT) { - controllerCorsConfigurer = webFluxControllerCorsConfigurerBean(path, allowedOrigins); - } - - if (controllerCorsConfigurer != null) { - BeanDefinitionReaderUtils.registerWithGeneratedName(controllerCorsConfigurer, registry); - } - else { - LOGGER.warn("Nor Spring MVC, neither WebFlux is present to configure CORS origins " + - "for Integration Graph Controller."); - } + registerControlerCorsConfigurer(registry, path, allowedOrigins); } if (!registry.containsBeanDefinition(HttpContextUtils.GRAPH_CONTROLLER_BEAN_NAME)) { - Map properties = annotationAttributes; - AbstractBeanDefinition controllerPropertiesPopulator = - BeanDefinitionBuilder.genericBeanDefinition(GraphControllerPropertiesPopulator.class, - () -> new GraphControllerPropertiesPopulator(properties)) - .setRole(BeanDefinition.ROLE_INFRASTRUCTURE) - .getBeanDefinition(); - BeanDefinitionReaderUtils.registerWithGeneratedName(controllerPropertiesPopulator, registry); + registerIntegrationGraphController(registry, annotationAttributes); + } + } - BeanDefinition graphController = - new RootBeanDefinition(IntegrationGraphController.class, () -> - new IntegrationGraphController( - ((BeanFactory) registry) - .getBean(IntegrationContextUtils.INTEGRATION_GRAPH_SERVER_BEAN_NAME, - IntegrationGraphServer.class))); + private static void registerIntegrationGraphController(BeanDefinitionRegistry registry, + Map properties) { - registry.registerBeanDefinition(HttpContextUtils.GRAPH_CONTROLLER_BEAN_NAME, graphController); + AbstractBeanDefinition controllerPropertiesPopulator = + BeanDefinitionBuilder.genericBeanDefinition(GraphControllerPropertiesPopulator.class, + () -> new GraphControllerPropertiesPopulator(properties)) + .setRole(BeanDefinition.ROLE_INFRASTRUCTURE) + .getBeanDefinition(); + BeanDefinitionReaderUtils.registerWithGeneratedName(controllerPropertiesPopulator, registry); + + BeanDefinition graphController = + new RootBeanDefinition(IntegrationGraphController.class, () -> + new IntegrationGraphController( + ((BeanFactory) registry) + .getBean(IntegrationContextUtils.INTEGRATION_GRAPH_SERVER_BEAN_NAME, + IntegrationGraphServer.class))); + + registry.registerBeanDefinition(HttpContextUtils.GRAPH_CONTROLLER_BEAN_NAME, graphController); + } + + private static void registerControlerCorsConfigurer(BeanDefinitionRegistry registry, String path, + String[] allowedOrigins) { + + AbstractBeanDefinition controllerCorsConfigurer = null; + if (HttpContextUtils.WEB_MVC_PRESENT) { + controllerCorsConfigurer = webMvcControllerCorsConfigurerBean(path, allowedOrigins); + } + else if (HttpContextUtils.WEB_FLUX_PRESENT) { + controllerCorsConfigurer = webFluxControllerCorsConfigurerBean(path, allowedOrigins); + } + + if (controllerCorsConfigurer != null) { + BeanDefinitionReaderUtils.registerWithGeneratedName(controllerCorsConfigurer, registry); + } + else { + LOGGER.warn("Nor Spring MVC, neither WebFlux is present to configure CORS origins " + + "for Integration Graph Controller."); } }