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

huxing pushed a commit to branch 2.7.3-release
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/2.7.3-release by this push:
     new 6667a6f  automatically append env parameters. (#4407)
6667a6f is described below

commit 6667a6f7ff44131f74d3af84326a0b645f1782cc
Author: ken.lj <[email protected]>
AuthorDate: Thu Jul 4 17:23:11 2019 +0800

    automatically append env parameters. (#4407)
---
 .../apache/dubbo/common/config/Environment.java    |  1 +
 .../common/config/EnvironmentConfiguration.java    |  8 +-
 .../dubbo/common/constants/CommonConstants.java    | 11 +++
 .../org/apache/dubbo/common/utils/StringUtils.java | 32 ++++++++
 .../config/EnvironmentConfigurationTest.java       | 86 +++++++++++++---------
 .../apache/dubbo/common/utils/StringUtilsTest.java | 14 ++++
 .../org/apache/dubbo/config/AbstractConfig.java    |  6 +-
 .../org/apache/dubbo/config/ApplicationConfig.java | 48 ++++++++++++
 .../apache/dubbo/config/ApplicationConfigTest.java | 34 +++++++++
 9 files changed, 202 insertions(+), 38 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
index b632808..372d5cb 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/Environment.java
@@ -115,6 +115,7 @@ public class Environment {
         CompositeConfiguration compositeConfiguration = new 
CompositeConfiguration();
         // Config center has the highest priority
         compositeConfiguration.addConfiguration(this.getSystemConfig(prefix, 
id));
+        
compositeConfiguration.addConfiguration(this.getEnvironmentConfig(prefix, id));
         
compositeConfiguration.addConfiguration(this.getAppExternalConfig(prefix, id));
         compositeConfiguration.addConfiguration(this.getExternalConfig(prefix, 
id));
         
compositeConfiguration.addConfiguration(this.getPropertiesConfig(prefix, id));
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java
index c6d6523..c61e954 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/EnvironmentConfiguration.java
@@ -16,6 +16,8 @@
  */
 package org.apache.dubbo.common.config;
 
+import org.apache.dubbo.common.utils.StringUtils;
+
 /**
  * Configuration from system environment
  */
@@ -31,7 +33,11 @@ public class EnvironmentConfiguration extends 
AbstractPrefixConfiguration {
 
     @Override
     public Object getInternalProperty(String key) {
-        return System.getenv(key);
+        String value = System.getenv(key);
+        if (StringUtils.isEmpty(value)) {
+            value = System.getenv(StringUtils.toOSStyleKey(key));
+        }
+        return value;
     }
 
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
index 8a9d870..19e8df4 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
@@ -58,6 +58,8 @@ public interface CommonConstants {
 
     Pattern SEMICOLON_SPLIT_PATTERN = Pattern.compile("\\s*[;]+\\s*");
 
+    Pattern EQUAL_SPLIT_PATTERN = Pattern.compile("\\s*[=]+\\s*");
+
     String DEFAULT_PROXY = "javassist";
 
     String DEFAULT_DIRECTORY = "dubbo";
@@ -102,10 +104,16 @@ public interface CommonConstants {
 
     String PROPERTIES_CHAR_SEPERATOR = "-";
 
+    String UNDERLINE_SEPARATOR = "_";
+
+    String SEPARATOR_REGEX = "_|-";
+
     String GROUP_CHAR_SEPERATOR = ":";
 
     String HIDE_KEY_PREFIX = ".";
 
+    String DOT_REGEX = "\\.";
+
     String DEFAULT_KEY_PREFIX = "default.";
 
     String DEFAULT_KEY = "default";
@@ -171,4 +179,7 @@ public interface CommonConstants {
     String SHUTDOWN_WAIT_SECONDS_KEY = "dubbo.service.shutdown.wait.seconds";
     String SHUTDOWN_WAIT_KEY = "dubbo.service.shutdown.wait";
     String DUBBO_PROTOCOL = "dubbo";
+
+    String DUBBO_LABELS = "dubbo.labels";
+    String DUBBO_ENV_KEYS = "dubbo.env.keys";
 }
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 20331e3..b51c1bc 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
@@ -34,8 +34,12 @@ import java.util.regex.Pattern;
 
 import static 
org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;
 import static 
org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
+import static org.apache.dubbo.common.constants.CommonConstants.DOT_REGEX;
 import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
+import static 
org.apache.dubbo.common.constants.CommonConstants.HIDE_KEY_PREFIX;
 import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
+import static 
org.apache.dubbo.common.constants.CommonConstants.SEPARATOR_REGEX;
+import static 
org.apache.dubbo.common.constants.CommonConstants.UNDERLINE_SEPARATOR;
 import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
 
 /**
@@ -798,4 +802,32 @@ public final class StringUtils {
     public static String trim(String str) {
         return str == null ? null : str.trim();
     }
+
+    public static String toURLKey(String key) {
+        return key.toLowerCase().replaceAll(SEPARATOR_REGEX, HIDE_KEY_PREFIX);
+    }
+
+    public static String toOSStyleKey(String key) {
+        key = key.toUpperCase().replaceAll(DOT_REGEX, UNDERLINE_SEPARATOR);
+        if (!key.startsWith("DUBBO_")) {
+            key = "DUBBO_" + key;
+        }
+        return key;
+    }
+
+    public static boolean isAllUpperCase(String str) {
+        if (str != null && !isEmpty(str)) {
+            int sz = str.length();
+
+            for(int i = 0; i < sz; ++i) {
+                if (!Character.isUpperCase(str.charAt(i))) {
+                    return false;
+                }
+            }
+
+            return true;
+        } else {
+            return false;
+        }
+    }
 }
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentConfigurationTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentConfigurationTest.java
index 00fda43..974e07c 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentConfigurationTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/EnvironmentConfigurationTest.java
@@ -21,15 +21,18 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * The type Environment configuration test.
  */
 class EnvironmentConfigurationTest {
 
-    private static EnvironmentConfiguration environmentConfig;
-    private static final String MOCK_KEY = "mockKey";
+    private static final String MOCK_KEY = "DUBBO_KEY";
     private static final String MOCK_VALUE = "mockValue";
-    private static final String PATH_KEY="PATH";
 
     /**
      * Init.
@@ -37,46 +40,59 @@ class EnvironmentConfigurationTest {
     @BeforeEach
     public void init() {
 
-        environmentConfig = new EnvironmentConfiguration();
-    }
-
-    /**
-     * Test get internal property.
-     */
-    @Test
-    public void testGetInternalProperty(){
-        Assertions.assertNull(environmentConfig.getInternalProperty(MOCK_KEY));
-        
Assertions.assertEquals(System.getenv(PATH_KEY),environmentConfig.getInternalProperty(PATH_KEY));
-
     }
 
-    /**
-     * Test contains key.
-     */
     @Test
-    public void testContainsKey(){
-        Assertions.assertTrue(environmentConfig.containsKey(PATH_KEY));
-        Assertions.assertFalse(environmentConfig.containsKey(MOCK_KEY));
+    public void testGetInternalProperty() {
+        Map<String, String> map = new HashMap<>();
+        map.put(MOCK_KEY, MOCK_VALUE);
+        try {
+            setEnv(map);
+            EnvironmentConfiguration configuration = new 
EnvironmentConfiguration();
+            // this UT maybe only works on particular platform, assert only 
when value is not null.
+            Assertions.assertEquals(MOCK_VALUE, 
configuration.getInternalProperty("dubbo.key"));
+            Assertions.assertEquals(MOCK_VALUE, 
configuration.getInternalProperty("key"));
+            Assertions.assertEquals(MOCK_VALUE, 
configuration.getInternalProperty("dubbo_key"));
+            Assertions.assertEquals(MOCK_VALUE, 
configuration.getInternalProperty(MOCK_KEY));
+        } catch (Exception e) {
+            // skip test.
+            e.printStackTrace();
+        }
     }
 
-    /**
-     * Test get string.
-     */
-    @Test
-    public void testGetString(){
-        Assertions.assertNull(environmentConfig.getString(MOCK_KEY));
-        
Assertions.assertEquals(MOCK_VALUE,environmentConfig.getString(MOCK_KEY,MOCK_VALUE));
+    protected static void setEnv(Map<String, String> newenv) throws Exception {
+        try {
+            Class<?> processEnvironmentClass = 
Class.forName("java.lang.ProcessEnvironment");
+            Field theEnvironmentField = 
processEnvironmentClass.getDeclaredField("theEnvironment");
+            theEnvironmentField.setAccessible(true);
+            Map<String, String> env = (Map<String, String>) 
theEnvironmentField.get(null);
+            env.putAll(newenv);
+            Field theCaseInsensitiveEnvironmentField = 
processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment");
+            theCaseInsensitiveEnvironmentField.setAccessible(true);
+            Map<String, String> cienv = (Map<String, String>) 
theCaseInsensitiveEnvironmentField.get(null);
+            cienv.putAll(newenv);
+        } catch (NoSuchFieldException e) {
+            Class[] classes = Collections.class.getDeclaredClasses();
+            Map<String, String> env = System.getenv();
+            for (Class cl : classes) {
+                if 
("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
+                    Field field = cl.getDeclaredField("m");
+                    field.setAccessible(true);
+                    Object obj = field.get(env);
+                    Map<String, String> map = (Map<String, String>) obj;
+                    map.clear();
+                    map.putAll(newenv);
+                }
+            }
+        }
     }
 
-    /**
-     * Test get property.
-     */
-    @Test
-    public void testGetProperty(){
-        Assertions.assertNull(environmentConfig.getProperty(MOCK_KEY));
-        
Assertions.assertEquals(MOCK_VALUE,environmentConfig.getProperty(MOCK_KEY,MOCK_VALUE));
+    private static void updateEnv(String name, String val) throws 
ReflectiveOperationException {
+        Map<String, String> env = System.getenv();
+        Field field = env.getClass().getDeclaredField("m");
+        field.setAccessible(true);
+        ((Map<String, String>) field.get(env)).put(name, val);
     }
-
     /**
      * Clean.
      */
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java 
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java
index 632c999..76a91c2 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/StringUtilsTest.java
@@ -294,6 +294,20 @@ public class StringUtilsTest {
         assertEquals("left blank", StringUtils.trim(" left blank"));
         assertEquals("right blank", StringUtils.trim("right blank "));
         assertEquals("bi-side blank", StringUtils.trim(" bi-side blank "));
+    }
+
+    @Test
+    public void testToURLKey() {
+        assertEquals("dubbo.tag1", StringUtils.toURLKey("dubbo_tag1"));
+        assertEquals("dubbo.tag1.tag11", 
StringUtils.toURLKey("dubbo-tag1_tag11"));
+    }
 
+    @Test
+    public void testToOSStyleKey() {
+        assertEquals("DUBBO_TAG1", StringUtils.toOSStyleKey("dubbo_tag1"));
+        assertEquals("DUBBO_TAG1", StringUtils.toOSStyleKey("dubbo.tag1"));
+        assertEquals("DUBBO_TAG1_TAG11", 
StringUtils.toOSStyleKey("dubbo.tag1.tag11"));
+        assertEquals("DUBBO_TAG1", StringUtils.toOSStyleKey("tag1"));
     }
+
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
index 2466948..88f1dc1 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractConfig.java
@@ -212,10 +212,12 @@ public abstract class AbstractConfig implements 
Serializable {
         }
     }
 
+    @Deprecated
     protected static void appendAttributes(Map<String, Object> parameters, 
Object config) {
         appendAttributes(parameters, config, null);
     }
 
+    @Deprecated
     protected static void appendAttributes(Map<String, Object> parameters, 
Object config, String prefix) {
         if (config == null) {
             return;
@@ -550,10 +552,10 @@ public abstract class AbstractConfig implements 
Serializable {
             config.addProperties(getMetaData());
             if (Environment.getInstance().isConfigCenterFirst()) {
                 // The sequence would be: SystemConfiguration -> 
AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig -> 
PropertiesConfiguration
-                compositeConfiguration.addConfiguration(3, config);
+                compositeConfiguration.addConfiguration(4, config);
             } else {
                 // The sequence would be: SystemConfiguration -> 
AbstractConfig -> AppExternalConfiguration -> ExternalConfiguration -> 
PropertiesConfiguration
-                compositeConfiguration.addConfiguration(1, config);
+                compositeConfiguration.addConfiguration(2, config);
             }
 
             // loop methods, get override value and set the new value back to 
method
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
index 824a0dd..aa723de 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java
@@ -17,17 +17,24 @@
 package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.compiler.support.AdaptiveCompiler;
+import org.apache.dubbo.common.config.ConfigurationUtils;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.support.Parameter;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import static 
org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
+import static 
org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_ENV_KEYS;
+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_LABELS;
 import static org.apache.dubbo.common.constants.CommonConstants.DUMP_DIRECTORY;
+import static 
org.apache.dubbo.common.constants.CommonConstants.EQUAL_SPLIT_PATTERN;
+import static 
org.apache.dubbo.common.constants.CommonConstants.SEMICOLON_SPLIT_PATTERN;
 import static 
org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_KEY;
 import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;
 import static 
org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP_COMPATIBLE;
@@ -375,4 +382,45 @@ public class ApplicationConfig extends AbstractConfig {
         return !StringUtils.isEmpty(name);
     }
 
+    @Override
+    public void refresh() {
+        super.refresh();
+        appendEnvironmentProperties();
+    }
+
+    /**
+     * 1. OS Environment: DUBBO_LABELS=tag=pre;key=value
+     * 2. JVM Options: -Denv_keys = DUBBO_KEY1, DUBBO_KEY2
+     */
+    private void appendEnvironmentProperties() {
+        String rawLabels = ConfigurationUtils.getProperty(DUBBO_LABELS);
+        if (StringUtils.isNotEmpty(rawLabels)) {
+            String[] labelPairs = SEMICOLON_SPLIT_PATTERN.split(rawLabels);
+            for (String pair : labelPairs) {
+                String[] label = EQUAL_SPLIT_PATTERN.split(pair);
+                if (label.length == 2) {
+                    updateParameters(parameters, label[0], label[1]);
+                }
+            }
+        }
+
+        String rawKeys = ConfigurationUtils.getProperty(DUBBO_ENV_KEYS);
+        if (StringUtils.isNotEmpty(rawKeys)) {
+            String[] keys = COMMA_SPLIT_PATTERN.split(rawKeys);
+            for (String key : keys) {
+                String value = ConfigurationUtils.getProperty(key);
+                if (value != null) {
+                    updateParameters(parameters, key, value);
+                }
+            }
+        }
+    }
+
+    private void updateParameters(Map<String, String> map, String key, String 
value) {
+        if (parameters == null) {
+            parameters = new HashMap<>();
+        }
+        parameters.put(key, value);
+    }
+
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
index 87fb621..f7ff994 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ApplicationConfigTest.java
@@ -180,4 +180,38 @@ public class ApplicationConfigTest {
         assertThat(parameters, hasEntry("k1", "v1"));
         assertThat(parameters, hasEntry(ACCEPT_FOREIGN_IP, "true"));
     }
+
+    @Test
+    public void testAppendEnvironmentProperties() {
+        try {
+            ApplicationConfig application = new ApplicationConfig("app");
+            System.setProperty("dubbo.labels", "tag1=value1;tag2=value2 ; tag3 
= value3");
+            application.refresh();
+            Map<String, String> parameters = application.getParameters();
+            Assertions.assertEquals("value1", parameters.get("tag1"));
+            Assertions.assertEquals("value2", parameters.get("tag2"));
+            Assertions.assertEquals("value3", parameters.get("tag3"));
+
+            ApplicationConfig application1 = new ApplicationConfig("app");
+            System.setProperty("dubbo.env.keys", "tag1, tag2,tag3");
+            // mock environment variables
+            System.setProperty("tag1", "value1");
+            System.setProperty("tag2", "value2");
+            System.setProperty("tag3", "value3");
+            application1.refresh();
+            Map<String, String> parameters1 = application1.getParameters();
+            Assertions.assertEquals("value1", parameters1.get("tag1"));
+            Assertions.assertEquals("value2", parameters1.get("tag2"));
+            Assertions.assertEquals("value3", parameters1.get("tag3"));
+
+            Map<String, String> urlParameters = new HashMap<>();
+            ApplicationConfig.appendParameters(urlParameters, application1);
+            Assertions.assertEquals("value1", urlParameters.get("tag1"));
+            Assertions.assertEquals("value2", urlParameters.get("tag2"));
+            Assertions.assertEquals("value3", urlParameters.get("tag3"));
+        } finally {
+            System.clearProperty("dubbo.labels");
+            System.clearProperty("dubbo.keys");
+        }
+    }
 }

Reply via email to