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

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


The following commit(s) were added to refs/heads/master by this push:
     new 12d99d6  Refactor, configuration override does not work properly. 
(#5709)
12d99d6 is described below

commit 12d99d686f3b7946758a02554f81f562fc394419
Author: ken.lj <[email protected]>
AuthorDate: Thu Feb 20 15:00:26 2020 +0800

    Refactor, configuration override does not work properly. (#5709)
---
 .../common/config/AbstractPrefixConfiguration.java |  52 --------
 .../common/config/CompositeConfiguration.java      |  32 ++++-
 .../apache/dubbo/common/config/Environment.java    | 144 +++++++++++----------
 .../common/config/EnvironmentConfiguration.java    |  10 +-
 .../dubbo/common/config/InmemoryConfiguration.java |  15 +--
 .../common/config/PropertiesConfiguration.java     |  10 +-
 .../dubbo/common/config/SystemConfiguration.java   |  13 +-
 .../org/apache/dubbo/config/AbstractConfig.java    |  13 +-
 .../config/context/ConfigConfigurationAdapter.java |  10 +-
 .../common/config/PropertiesConfigurationTest.java |   4 +-
 .../apache/dubbo/config/AbstractConfigTest.java    |   4 +
 11 files changed, 134 insertions(+), 173 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/AbstractPrefixConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/AbstractPrefixConfiguration.java
deleted file mode 100644
index a8cbe3d..0000000
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/AbstractPrefixConfiguration.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.dubbo.common.config;
-
-import org.apache.dubbo.common.utils.StringUtils;
-
-/**
- * This is an abstraction specially customized for the sequence Dubbo 
retrieves properties.
- */
-public abstract class AbstractPrefixConfiguration implements Configuration {
-    protected String id;
-    protected String prefix;
-
-    public AbstractPrefixConfiguration(String prefix, String id) {
-        if (StringUtils.isNotEmpty(prefix) && !prefix.endsWith(".")) {
-            this.prefix = prefix + ".";
-        } else {
-            this.prefix = prefix;
-        }
-        this.id = id;
-    }
-
-    @Override
-    public Object getProperty(String key, Object defaultValue) {
-        Object value = null;
-        if (StringUtils.isNotEmpty(prefix)) {
-            if (StringUtils.isNotEmpty(id)) {
-                value = getInternalProperty(prefix + id + "." + key);
-            }
-            if (value == null) {
-                value = getInternalProperty(prefix + key);
-            }
-        } else {
-            value = getInternalProperty(key);
-        }
-        return value != null ? value : defaultValue;
-    }
-}
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
index b301ff0..eebf5a0 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/CompositeConfiguration.java
@@ -18,27 +18,41 @@ package org.apache.dubbo.common.config;
 
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.StringUtils;
 
 import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
 /**
- *
+ * This is an abstraction specially customized for the sequence Dubbo 
retrieves properties.
  */
 public class CompositeConfiguration implements Configuration {
     private Logger logger = 
LoggerFactory.getLogger(CompositeConfiguration.class);
 
+    private String id;
+    private String prefix;
+
     /**
      * List holding all the configuration
      */
     private List<Configuration> configList = new LinkedList<Configuration>();
 
     public CompositeConfiguration() {
+        this(null, null);
+    }
 
+    public CompositeConfiguration(String prefix, String id) {
+        if (StringUtils.isNotEmpty(prefix) && !prefix.endsWith(".")) {
+            this.prefix = prefix + ".";
+        } else {
+            this.prefix = prefix;
+        }
+        this.id = id;
     }
 
     public CompositeConfiguration(Configuration... configurations) {
+        this();
         if (configurations != null && configurations.length > 0) {
             Arrays.stream(configurations).filter(config -> 
!configList.contains(config)).forEach(configList::add);
         }
@@ -83,4 +97,20 @@ public class CompositeConfiguration implements Configuration 
{
     public boolean containsKey(String key) {
         return configList.stream().anyMatch(c -> c.containsKey(key));
     }
+
+    @Override
+    public Object getProperty(String key, Object defaultValue) {
+        Object value = null;
+        if (StringUtils.isNotEmpty(prefix)) {
+            if (StringUtils.isNotEmpty(id)) {
+                value = getInternalProperty(prefix + id + "." + key);
+            }
+            if (value == null) {
+                value = getInternalProperty(prefix + key);
+            }
+        } else {
+            value = getInternalProperty(key);
+        }
+        return value != null ? value : defaultValue;
+    }
 }
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 67e652d..e4522a7 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
@@ -17,12 +17,12 @@
 package org.apache.dubbo.common.config;
 
 import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
-import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.context.FrameworkExt;
 import org.apache.dubbo.common.context.LifecycleAdapter;
 import org.apache.dubbo.common.extension.DisableInject;
-import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.config.AbstractConfig;
 import org.apache.dubbo.config.ConfigCenterConfig;
+import org.apache.dubbo.config.context.ConfigConfigurationAdapter;
 import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
@@ -31,15 +31,19 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 public class Environment extends LifecycleAdapter implements FrameworkExt {
     public static final String NAME = "environment";
 
-    private Map<String, PropertiesConfiguration> propertiesConfigs = new 
ConcurrentHashMap<>();
-    private Map<String, SystemConfiguration> systemConfigs = new 
ConcurrentHashMap<>();
-    private Map<String, EnvironmentConfiguration> environmentConfigs = new 
ConcurrentHashMap<>();
-    private Map<String, InmemoryConfiguration> externalConfigs = new 
ConcurrentHashMap<>();
-    private Map<String, InmemoryConfiguration> appExternalConfigs = new 
ConcurrentHashMap<>();
+    private final PropertiesConfiguration propertiesConfiguration;
+    private final SystemConfiguration systemConfiguration;
+    private final EnvironmentConfiguration environmentConfiguration;
+    private final InmemoryConfiguration externalConfiguration;
+    private final InmemoryConfiguration appExternalConfiguration;
+
+    private final ConcurrentMap<AbstractConfig, CompositeConfiguration> 
prefixedConfigurations = new ConcurrentHashMap<>();
+    private CompositeConfiguration globalConfiguration;
 
     private Map<String, String> externalConfigurationMap = new HashMap<>();
     private Map<String, String> appExternalConfigurationMap = new HashMap<>();
@@ -48,6 +52,14 @@ public class Environment extends LifecycleAdapter implements 
FrameworkExt {
 
     private DynamicConfiguration dynamicConfiguration;
 
+    public Environment() {
+        this.propertiesConfiguration = new PropertiesConfiguration();
+        this.systemConfiguration = new SystemConfiguration();
+        this.environmentConfiguration = new EnvironmentConfiguration();
+        this.externalConfiguration = new InmemoryConfiguration();
+        this.appExternalConfiguration = new InmemoryConfiguration();
+    }
+
     @Override
     public void initialize() throws IllegalStateException {
         ConfigManager configManager = ApplicationModel.getConfigManager();
@@ -58,34 +70,9 @@ public class Environment extends LifecycleAdapter implements 
FrameworkExt {
                 
this.setAppExternalConfigMap(config.getAppExternalConfiguration());
             }
         });
-    }
 
-    public PropertiesConfiguration getPropertiesConfig(String prefix, String 
id) {
-        return propertiesConfigs.computeIfAbsent(toKey(prefix, id), k -> new 
PropertiesConfiguration(prefix, id));
-    }
-
-    public SystemConfiguration getSystemConfig(String prefix, String id) {
-        return systemConfigs.computeIfAbsent(toKey(prefix, id), k -> new 
SystemConfiguration(prefix, id));
-    }
-
-    public InmemoryConfiguration getExternalConfig(String prefix, String id) {
-        return externalConfigs.computeIfAbsent(toKey(prefix, id), k -> {
-            InmemoryConfiguration configuration = new 
InmemoryConfiguration(prefix, id);
-            configuration.setProperties(externalConfigurationMap);
-            return configuration;
-        });
-    }
-
-    public InmemoryConfiguration getAppExternalConfig(String prefix, String 
id) {
-        return appExternalConfigs.computeIfAbsent(toKey(prefix, id), k -> {
-            InmemoryConfiguration configuration = new 
InmemoryConfiguration(prefix, id);
-            configuration.setProperties(appExternalConfigurationMap);
-            return configuration;
-        });
-    }
-
-    public EnvironmentConfiguration getEnvironmentConfig(String prefix, String 
id) {
-        return environmentConfigs.computeIfAbsent(toKey(prefix, id), k -> new 
EnvironmentConfiguration(prefix, id));
+        this.externalConfiguration.setProperties(externalConfigurationMap);
+        
this.appExternalConfiguration.setProperties(appExternalConfigurationMap);
     }
 
     @DisableInject
@@ -119,46 +106,65 @@ public class Environment extends LifecycleAdapter 
implements FrameworkExt {
     }
 
     /**
-     * Create new instance for each call, since it will be called only at 
startup, I think there's no big deal of the potential cost.
-     * Otherwise, if use cache, we should make sure each Config has a unique 
id which is difficult to guarantee because is on the user's side,
-     * especially when it comes to ServiceConfig and ReferenceConfig.
+     * At start-up, Dubbo is driven by various configuration, such as 
Application, Registry, Protocol, etc.
+     * All configurations will be converged into a data bus - URL, and then 
drive the subsequent process.
+     * <p>
+     * At present, there are many configuration sources, including 
AbstractConfig (API, XML, annotation), - D, config center, etc.
+     * This method helps us to filter out the most priority values from 
various configuration sources.
      *
-     * @param prefix
-     * @param id
+     * @param config
      * @return
      */
-    public CompositeConfiguration getConfiguration(String prefix, String id) {
-        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));
-        return compositeConfiguration;
+    public synchronized CompositeConfiguration 
getPrefixedConfiguration(AbstractConfig config) {
+//        CompositeConfiguration prefixedConfiguration =
+//                prefixedConfigurations.putIfAbsent(config, new 
CompositeConfiguration(config.getPrefix(), config.getId()));
+//        if (prefixedConfiguration != null) {
+//            return prefixedConfiguration;
+//        }
+//        prefixedConfiguration = prefixedConfigurations.get(config);
+        CompositeConfiguration prefixedConfiguration = new 
CompositeConfiguration(config.getPrefix(), config.getId());
+        Configuration configuration = new ConfigConfigurationAdapter(config);
+        if (this.isConfigCenterFirst()) {
+            // The sequence would be: SystemConfiguration -> 
AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig -> 
PropertiesConfiguration
+            // Config center has the highest priority
+            prefixedConfiguration.addConfiguration(systemConfiguration);
+            prefixedConfiguration.addConfiguration(environmentConfiguration);
+            prefixedConfiguration.addConfiguration(appExternalConfiguration);
+            prefixedConfiguration.addConfiguration(externalConfiguration);
+            prefixedConfiguration.addConfiguration(configuration);
+            prefixedConfiguration.addConfiguration(propertiesConfiguration);
+        } else {
+            // The sequence would be: SystemConfiguration -> AbstractConfig -> 
AppExternalConfiguration -> ExternalConfiguration -> PropertiesConfiguration
+            // Config center has the highest priority
+            prefixedConfiguration.addConfiguration(systemConfiguration);
+            prefixedConfiguration.addConfiguration(environmentConfiguration);
+            prefixedConfiguration.addConfiguration(configuration);
+            prefixedConfiguration.addConfiguration(appExternalConfiguration);
+            prefixedConfiguration.addConfiguration(externalConfiguration);
+            prefixedConfiguration.addConfiguration(propertiesConfiguration);
+        }
+        return prefixedConfiguration;
     }
 
+    /**
+     * There are two ways to get configuration during exposure / reference or 
at runtime:
+     * 1. URL, The value in the URL is relatively fixed. we can get value 
directly.
+     * 2. The configuration exposed in this method is convenient for us to 
query the latest values from multiple
+     * prioritized sources, it also guarantees that configs changed 
dynamically can take effect on the fly.
+     */
     public Configuration getConfiguration() {
-        return getConfiguration(null, null);
-    }
-
-    private static String toKey(String prefix, String id) {
-        StringBuilder sb = new StringBuilder();
-        if (StringUtils.isNotEmpty(prefix)) {
-            sb.append(prefix);
-        }
-        if (StringUtils.isNotEmpty(id)) {
-            sb.append(id);
-        }
-
-        if (sb.length() > 0 && sb.charAt(sb.length() - 1) != '.') {
-            sb.append(".");
-        }
-
-        if (sb.length() > 0) {
-            return sb.toString();
+        if (globalConfiguration == null) {
+            globalConfiguration = new CompositeConfiguration();
+            if (dynamicConfiguration != null) {
+                globalConfiguration.addConfiguration(dynamicConfiguration);
+            }
+            globalConfiguration.addConfiguration(systemConfiguration);
+            globalConfiguration.addConfiguration(environmentConfiguration);
+            globalConfiguration.addConfiguration(appExternalConfiguration);
+            globalConfiguration.addConfiguration(externalConfiguration);
+            globalConfiguration.addConfiguration(propertiesConfiguration);
         }
-        return CommonConstants.DUBBO;
+        return globalConfiguration;
     }
 
     public boolean isConfigCenterFirst() {
@@ -187,13 +193,13 @@ public class Environment extends LifecycleAdapter 
implements FrameworkExt {
 
     // For test
     public void clearExternalConfigs() {
-        this.externalConfigs.clear();
+        this.externalConfiguration.clear();
         this.externalConfigurationMap.clear();
     }
 
     // For test
     public void clearAppExternalConfigs() {
-        this.appExternalConfigs.clear();
+        this.appExternalConfiguration.clear();
         this.appExternalConfigurationMap.clear();
     }
 }
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 c61e954..793d101 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
@@ -21,15 +21,7 @@ import org.apache.dubbo.common.utils.StringUtils;
 /**
  * Configuration from system environment
  */
-public class EnvironmentConfiguration extends AbstractPrefixConfiguration {
-
-    public EnvironmentConfiguration(String prefix, String id) {
-        super(prefix, id);
-    }
-
-    public EnvironmentConfiguration() {
-        this(null, null);
-    }
+public class EnvironmentConfiguration implements Configuration {
 
     @Override
     public Object getInternalProperty(String key) {
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java
index bfbed85..fd9624a 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/InmemoryConfiguration.java
@@ -22,19 +22,11 @@ import java.util.Map;
 /**
  * In-memory configuration
  */
-public class InmemoryConfiguration extends AbstractPrefixConfiguration {
+public class InmemoryConfiguration implements Configuration {
 
     // stores the configuration key-value pairs
     private Map<String, String> store = new LinkedHashMap<>();
 
-    public InmemoryConfiguration(String prefix, String id) {
-        super(prefix, id);
-    }
-
-    public InmemoryConfiguration() {
-        this(null, null);
-    }
-
     @Override
     public Object getInternalProperty(String key) {
         return store.get(key);
@@ -64,4 +56,9 @@ public class InmemoryConfiguration extends 
AbstractPrefixConfiguration {
             this.store = properties;
         }
     }
+
+    // for unit test
+    public void clear() {
+        this.store.clear();
+    }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/PropertiesConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/PropertiesConfiguration.java
index 79ac1cb..22bfa1f 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/PropertiesConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/PropertiesConfiguration.java
@@ -27,11 +27,9 @@ import java.util.Set;
 /**
  * Configuration from system properties and dubbo.properties
  */
-public class PropertiesConfiguration extends AbstractPrefixConfiguration {
-
-    public PropertiesConfiguration(String prefix, String id) {
-        super(prefix, id);
+public class PropertiesConfiguration implements Configuration {
 
+    public PropertiesConfiguration() {
         ExtensionLoader<OrderedPropertiesProvider> 
propertiesProviderExtensionLoader = 
ExtensionLoader.getExtensionLoader(OrderedPropertiesProvider.class);
         Set<String> propertiesProviderNames = 
propertiesProviderExtensionLoader.getSupportedExtensions();
         if (propertiesProviderNames == null || 
propertiesProviderNames.isEmpty()) {
@@ -59,10 +57,6 @@ public class PropertiesConfiguration extends 
AbstractPrefixConfiguration {
         ConfigUtils.setProperties(properties);
     }
 
-    public PropertiesConfiguration() {
-        this(null, null);
-    }
-
     @Override
     public Object getInternalProperty(String key) {
         return ConfigUtils.getProperty(key);
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
index a594a87..f4c1ab2 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/config/SystemConfiguration.java
@@ -19,18 +19,11 @@ package org.apache.dubbo.common.config;
 
 /**
  * FIXME: is this really necessary? PropertiesConfiguration should have 
already covered this:
- * @see PropertiesConfiguration
+ *
  * @See ConfigUtils#getProperty(String)
+ * @see PropertiesConfiguration
  */
-public class SystemConfiguration extends AbstractPrefixConfiguration {
-
-    public SystemConfiguration(String prefix, String id) {
-        super(prefix, id);
-    }
-
-    public SystemConfiguration() {
-        this(null, null);
-    }
+public class SystemConfiguration implements Configuration {
 
     @Override
     public Object getInternalProperty(String key) {
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 f7b5ef4..16e1180 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
@@ -18,7 +18,6 @@ package org.apache.dubbo.config;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.config.CompositeConfiguration;
-import org.apache.dubbo.common.config.Configuration;
 import org.apache.dubbo.common.config.Environment;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.logger.Logger;
@@ -28,7 +27,6 @@ import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.MethodUtils;
 import org.apache.dubbo.common.utils.ReflectUtils;
 import org.apache.dubbo.common.utils.StringUtils;
-import org.apache.dubbo.config.context.ConfigConfigurationAdapter;
 import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.config.support.Parameter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
@@ -459,16 +457,7 @@ public abstract class AbstractConfig implements 
Serializable {
     public void refresh() {
         Environment env = ApplicationModel.getEnvironment();
         try {
-            CompositeConfiguration compositeConfiguration = 
env.getConfiguration(getPrefix(), getId());
-            Configuration config = new ConfigConfigurationAdapter(this);
-            if (env.isConfigCenterFirst()) {
-                // The sequence would be: SystemConfiguration -> 
AppExternalConfiguration -> ExternalConfiguration -> AbstractConfig -> 
PropertiesConfiguration
-                compositeConfiguration.addConfiguration(4, config);
-            } else {
-                // The sequence would be: SystemConfiguration -> 
AbstractConfig -> AppExternalConfiguration -> ExternalConfiguration -> 
PropertiesConfiguration
-                compositeConfiguration.addConfiguration(2, config);
-            }
-
+            CompositeConfiguration compositeConfiguration = 
env.getPrefixedConfiguration(this);
             // loop methods, get override value and set the new value back to 
method
             Method[] methods = getClass().getMethods();
             for (Method method : methods) {
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigConfigurationAdapter.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigConfigurationAdapter.java
index 4a47645..dca7978 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigConfigurationAdapter.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigConfigurationAdapter.java
@@ -17,8 +17,10 @@
 package org.apache.dubbo.config.context;
 
 import org.apache.dubbo.common.config.Configuration;
+import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.AbstractConfig;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -29,7 +31,13 @@ public class ConfigConfigurationAdapter implements 
Configuration {
     private Map<String, String> metaData;
 
     public ConfigConfigurationAdapter(AbstractConfig config) {
-        this.metaData = config.getMetaData();
+        Map<String, String> configMetadata = config.getMetaData();
+        metaData = new HashMap<>(configMetadata.size());
+        for (Map.Entry<String, String> entry : configMetadata.entrySet()) {
+            String prefix = config.getPrefix().endsWith(".") ? 
config.getPrefix() : config.getPrefix() + ".";
+            String id = StringUtils.isEmpty(config.getId()) ? "" : 
config.getId() + ".";
+            metaData.put(prefix + id + entry.getKey(), entry.getValue());
+        }
     }
 
     @Override
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/PropertiesConfigurationTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/PropertiesConfigurationTest.java
index 30b81f0..f887764 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/config/PropertiesConfigurationTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/config/PropertiesConfigurationTest.java
@@ -24,8 +24,8 @@ public class PropertiesConfigurationTest {
 
     @Test
     public void testOrderPropertiesProviders() {
-        PropertiesConfiguration configuration = new 
PropertiesConfiguration("test", null);
-        
Assertions.assertTrue(configuration.getInternalProperty("testKey").equals("999"));
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        Assertions.assertEquals("999", 
configuration.getInternalProperty("testKey"));
     }
 
 }
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 0d08b4e..041cd75 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
@@ -305,6 +305,7 @@ public class AbstractConfigTest {
             // @Parameter(key="key2", useKeyAsProperty=true)
             external.put("dubbo.override.key2", "external");
             ApplicationModel.getEnvironment().setExternalConfigMap(external);
+            ApplicationModel.getEnvironment().initialize();
 
             System.setProperty("dubbo.override.address", 
"system://127.0.0.1:2181");
             System.setProperty("dubbo.override.protocol", "system");
@@ -401,6 +402,7 @@ public class AbstractConfigTest {
             // @Parameter(key="key2", useKeyAsProperty=true)
             external.put("dubbo.override.key2", "external");
             ApplicationModel.getEnvironment().setExternalConfigMap(external);
+            ApplicationModel.getEnvironment().initialize();
 
             overrideConfig.refresh();
 
@@ -435,6 +437,7 @@ public class AbstractConfigTest {
             // @Parameter(key="key2", useKeyAsProperty=true)
             external.put("dubbo.override.key2", "external");
             ApplicationModel.getEnvironment().setExternalConfigMap(external);
+            ApplicationModel.getEnvironment().initialize();
 
             ConfigCenterConfig configCenter = new ConfigCenterConfig();
             overrideConfig.setConfigCenter(configCenter);
@@ -464,6 +467,7 @@ public class AbstractConfigTest {
             Map<String, String> external = new HashMap<>();
             external.put("dubbo.override.parameters", 
"[{key3:value3},{key4:value4},{key2:value5}]");
             ApplicationModel.getEnvironment().setExternalConfigMap(external);
+            ApplicationModel.getEnvironment().initialize();
 
             ConfigCenterConfig configCenter = new ConfigCenterConfig();
             overrideConfig.setConfigCenter(configCenter);

Reply via email to