You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/01/23 08:54:47 UTC

[dubbo] branch 3.0 updated: refactor: Improve and perfect StringUtils (#9521)

This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 3caab02  refactor: Improve and perfect StringUtils (#9521)
3caab02 is described below

commit 3caab028bc6b505d01e1e5423fc778f7dad6705c
Author: 桔子 <ju...@qq.com>
AuthorDate: Sun Jan 23 16:54:27 2022 +0800

    refactor: Improve and perfect StringUtils (#9521)
---
 .../org/apache/dubbo/common/utils/StringUtils.java | 10 ++++
 .../spring/schema/DubboBeanDefinitionParser.java   | 68 +++++++++++-----------
 2 files changed, 43 insertions(+), 35 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
index 1fee2e6..386921a 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/StringUtils.java
@@ -426,6 +426,16 @@ public final class StringUtils {
     }
 
     /**
+     * is not blank string.
+     *
+     * @param cs source string.
+     * @return is not blank.
+     */
+    public static boolean isNotBlank(CharSequence cs) {
+        return !isBlank(cs);
+    }
+
+    /**
      * Check the cs String whether contains non whitespace characters.
      * @param cs
      * @return
diff --git a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java
index a146590..d426e56 100644
--- a/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java
+++ b/dubbo-config/dubbo-config-spring/src/main/java/org/apache/dubbo/config/spring/schema/DubboBeanDefinitionParser.java
@@ -168,44 +168,42 @@ public class DubboBeanDefinitionParser implements BeanDefinitionParser {
                 parseArguments(beanName, element.getChildNodes(), beanDefinition, parserContext);
             } else {
                 String value = resolveAttribute(element, property, parserContext);
-                if (value != null) {
-                    value = value.trim();
-                    if (value.length() > 0) {
-                        if ("registry".equals(property) && RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(value)) {
-                            RegistryConfig registryConfig = new RegistryConfig();
-                            registryConfig.setAddress(RegistryConfig.NO_AVAILABLE);
-                            beanDefinition.getPropertyValues().addPropertyValue(beanProperty, registryConfig);
-                        } else if ("provider".equals(property) || "registry".equals(property) || ("protocol".equals(property) && AbstractServiceConfig.class.isAssignableFrom(beanClass))) {
-                            /**
-                             * For 'provider' 'protocol' 'registry', keep literal value (should be id/name) and set the value to 'registryIds' 'providerIds' protocolIds'
-                             * The following process should make sure each id refers to the corresponding instance, here's how to find the instance for different use cases:
-                             * 1. Spring, check existing bean by id, see{@link ServiceBean#afterPropertiesSet()}; then try to use id to find configs defined in remote Config Center
-                             * 2. API, directly use id to find configs defined in remote Config Center; if all config instances are defined locally, please use {@link ServiceConfig#setRegistries(List)}
-                             */
-                            beanDefinition.getPropertyValues().addPropertyValue(beanProperty + "Ids", value);
+                if (StringUtils.isNotBlank(value)) {
+                    value=value.trim();
+                    if ("registry".equals(property) && RegistryConfig.NO_AVAILABLE.equalsIgnoreCase(value)) {
+                        RegistryConfig registryConfig = new RegistryConfig();
+                        registryConfig.setAddress(RegistryConfig.NO_AVAILABLE);
+                        beanDefinition.getPropertyValues().addPropertyValue(beanProperty, registryConfig);
+                    } else if ("provider".equals(property) || "registry".equals(property) || ("protocol".equals(property) && AbstractServiceConfig.class.isAssignableFrom(beanClass))) {
+                        /**
+                         * For 'provider' 'protocol' 'registry', keep literal value (should be id/name) and set the value to 'registryIds' 'providerIds' protocolIds'
+                         * The following process should make sure each id refers to the corresponding instance, here's how to find the instance for different use cases:
+                         * 1. Spring, check existing bean by id, see{@link ServiceBean#afterPropertiesSet()}; then try to use id to find configs defined in remote Config Center
+                         * 2. API, directly use id to find configs defined in remote Config Center; if all config instances are defined locally, please use {@link ServiceConfig#setRegistries(List)}
+                         */
+                        beanDefinition.getPropertyValues().addPropertyValue(beanProperty + "Ids", value);
+                    } else {
+                        Object reference;
+                        if (isPrimitive(type)) {
+                            value = getCompatibleDefaultValue(property, value);
+                            reference = value;
+                        } else if (ONRETURN.equals(property) || ONTHROW.equals(property) || ONINVOKE.equals(property)) {
+                            int index = value.lastIndexOf(".");
+                            String ref = value.substring(0, index);
+                            String method = value.substring(index + 1);
+                            reference = new RuntimeBeanReference(ref);
+                            beanDefinition.getPropertyValues().addPropertyValue(property + METHOD, method);
                         } else {
-                            Object reference;
-                            if (isPrimitive(type)) {
-                                value = getCompatibleDefaultValue(property, value);
-                                reference = value;
-                            } else if (ONRETURN.equals(property) || ONTHROW.equals(property) || ONINVOKE.equals(property)) {
-                                int index = value.lastIndexOf(".");
-                                String ref = value.substring(0, index);
-                                String method = value.substring(index + 1);
-                                reference = new RuntimeBeanReference(ref);
-                                beanDefinition.getPropertyValues().addPropertyValue(property + METHOD, method);
-                            } else {
-                                if ("ref".equals(property) && parserContext.getRegistry().containsBeanDefinition(value)) {
-                                    BeanDefinition refBean = parserContext.getRegistry().getBeanDefinition(value);
-                                    if (!refBean.isSingleton()) {
-                                        throw new IllegalStateException("The exported service ref " + value + " must be singleton! Please set the " + value + " bean scope to singleton, eg: <bean id=\"" + value + "\" scope=\"singleton\" ...>");
-                                    }
+                            if ("ref".equals(property) && parserContext.getRegistry().containsBeanDefinition(value)) {
+                                BeanDefinition refBean = parserContext.getRegistry().getBeanDefinition(value);
+                                if (!refBean.isSingleton()) {
+                                    throw new IllegalStateException("The exported service ref " + value + " must be singleton! Please set the " + value + " bean scope to singleton, eg: <bean id=\"" + value + "\" scope=\"singleton\" ...>");
                                 }
-                                reference = new RuntimeBeanReference(value);
-                            }
-                            if (reference != null) {
-                                beanDefinition.getPropertyValues().addPropertyValue(beanProperty, reference);
                             }
+                            reference = new RuntimeBeanReference(value);
+                        }
+                        if (reference != null) {
+                            beanDefinition.getPropertyValues().addPropertyValue(beanProperty, reference);
                         }
                     }
                 }