You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by ky...@apache.org on 2021/07/20 03:22:24 UTC

[dubbo] branch 3.0 updated: support dubbo.registry.parameters.item3=value3 configuration properties (#8308)

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

kylixs 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 cb10c9e  support  dubbo.registry.parameters.item3=value3 configuration properties (#8308)
cb10c9e is described below

commit cb10c9e568638a04d8cff8f0190525ff85fcda3a
Author: xiaoheng1 <20...@qq.com>
AuthorDate: Tue Jul 20 11:22:03 2021 +0800

    support  dubbo.registry.parameters.item3=value3 configuration properties (#8308)
---
 .../dubbo/common/config/ConfigurationUtils.java    | 27 ++++++++++++++++++----
 .../org/apache/dubbo/config/AbstractConfig.java    | 21 +++++++++++++----
 .../java/org/apache/dubbo/config/Constants.java    |  2 ++
 .../apache/dubbo/config/AbstractConfigTest.java    | 14 +++++++++++
 4 files changed, 55 insertions(+), 9 deletions(-)

diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
index b988d26..913b218 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/ConfigurationUtils.java
@@ -166,12 +166,28 @@ public class ConfigurationUtils {
      * @return
      */
     public static <V extends Object> Map<String, V> getSubProperties(Collection<Map<String, V>> configMaps, String prefix) {
+        Map<String, V> map = new LinkedHashMap<>();
+        for (Map<String, V> configMap : configMaps) {
+            getSubProperties(configMap, prefix, map);
+        }
+        return map;
+    }
+
+    public static <V extends Object> Map<String, V> getSubProperties(Map<String, V> configMap, String prefix) {
+        return getSubProperties(configMap, prefix, null);
+    }
+
+    private static <V extends Object> Map<String, V> getSubProperties(Map<String, V> configMap, String prefix, Map<String, V> resultMap) {
         if (!prefix.endsWith(".")) {
             prefix += ".";
         }
-        Map<String, V> map = new LinkedHashMap<>();
-        for (Map<String, V> configMap : configMaps) {
-            for (Map.Entry<String, V> entry : configMap.entrySet()) {
+
+        if (null == resultMap) {
+            resultMap = new LinkedHashMap<>();
+        }
+
+        if (null != configMap) {
+            for(Map.Entry<String, V> entry : configMap.entrySet()) {
                 String key = entry.getKey();
                 V val = entry.getValue();
                 if (StringUtils.startsWithIgnoreCase(key, prefix)
@@ -181,11 +197,12 @@ public class ConfigurationUtils {
                     String k = key.substring(prefix.length());
                     // convert camelCase/snake_case to kebab-case
                     k = StringUtils.convertToSplitName(k, "-");
-                    map.putIfAbsent(k, val);
+                    resultMap.putIfAbsent(k, val);
                 }
             }
         }
-        return map;
+
+        return resultMap;
     }
 
     public static <V extends Object> boolean hasSubProperties(Collection<Map<String, V>> configMaps, String prefix) {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index efe5941..4759237 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -55,6 +55,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
 import static org.apache.dubbo.common.utils.ReflectUtils.findMethodByMethodSignature;
+import static org.apache.dubbo.config.Constants.PARAMETERS;
 
 /**
  * Utility methods and public methods for parsing configuration
@@ -546,12 +547,14 @@ public abstract class AbstractConfig implements Serializable {
                 } else if (isParametersSetter(method)) {
                     String propertyName = extractPropertyName(method.getName());
                     String value = StringUtils.trim(subPropsConfiguration.getString(propertyName));
+                    Map<String, String> parameterMap = null;
                     if (StringUtils.hasText(value)) {
-                        Map<String, String> map = invokeGetParameters(getClass(), this);
-                        map = map == null ? new HashMap<>() : map;
-                        map.putAll(convert(StringUtils.parseParameters(value), ""));
-                        invokeSetParameters(getClass(), this, map);
+                        parameterMap = StringUtils.parseParameters(value);
+                    } else {
+                        // in this case, maybe parameters.item3=value3.
+                        parameterMap = ConfigurationUtils.getSubProperties(subProperties, PARAMETERS);
                     }
+                    invokeSetParameters(convert(parameterMap, ""));
                 }
             }
 
@@ -566,6 +569,16 @@ public abstract class AbstractConfig implements Serializable {
         postProcessRefresh();
     }
 
+    private void invokeSetParameters(Map<String, String> values) {
+        if (CollectionUtils.isEmptyMap(values)) {
+            return;
+        }
+        Map<String, String> map = invokeGetParameters(getClass(), this);
+        map = map == null ? new HashMap<>() : map;
+        map.putAll(values);
+        invokeSetParameters(getClass(), this, map);
+    }
+
     private boolean isIgnoredAttribute(Class<? extends AbstractConfig> clazz, String propertyName) {
         Method getter = null;
         String capitalizePropertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/Constants.java b/dubbo-common/src/main/java/org/apache/dubbo/config/Constants.java
index 09941b7..a08d014 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/Constants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/Constants.java
@@ -125,4 +125,6 @@ public interface Constants {
     String[] DOT_COMPATIBLE_KEYS = new String[]{"qos-enable", "qos-port", "qos-accept-foreign-ip"};
 
     String IGNORE_CHECK_KEYS = "ignoreCheckKeys";
+
+    String PARAMETERS = "parameters";
 }
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
index 2cb5c78..450ba35 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
@@ -43,6 +43,7 @@ import java.util.Map;
 import java.util.Properties;
 
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
@@ -505,6 +506,19 @@ public class AbstractConfigTest {
     }
 
     @Test
+    public void testRefreshParametersWithAttribute() {
+        try {
+            OverrideConfig overrideConfig = new OverrideConfig();
+            SysProps.setProperty("dubbo.override.parameters.key00", "value00");
+            overrideConfig.refresh();
+            assertEquals("value00", overrideConfig.getParameters().get("key00"));
+        } finally {
+            SysProps.clear();
+            ApplicationModel.getEnvironment().destroy();
+        }
+    }
+
+    @Test
     public void testOnlyPrefixedKeyTakeEffect() {
         try {
             OverrideConfig overrideConfig = new OverrideConfig();