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 dcb2d703fb Optimize the logic of ConfigConfigurationAdapter to get
prefixed meta… (#10389)
dcb2d703fb is described below
commit dcb2d703fbc5c53bbd7e5be52b1b7554566a9481
Author: 灼华 <[email protected]>
AuthorDate: Mon Aug 1 14:41:47 2022 +0800
Optimize the logic of ConfigConfigurationAdapter to get prefixed meta…
(#10389)
* Optimize the logic of ConfigConfigurationAdapter to get prefixed metadata
* Remove unused import
* Rollback
* Rollback
---
.../org/apache/dubbo/config/AbstractConfig.java | 66 +++++++++------
.../apache/dubbo/config/ReferenceConfigBase.java | 9 ++-
.../org/apache/dubbo/config/RegistryConfig.java | 6 +-
.../org/apache/dubbo/config/ServiceConfigBase.java | 11 ++-
.../config/context/ConfigConfigurationAdapter.java | 9 +--
.../apache/dubbo/config/context/ConfigMode.java | 2 +-
.../apache/dubbo/config/AbstractConfigTest.java | 94 +++++++++++++++++++++-
.../apache/dubbo/config/RegistryConfigTest.java | 10 ++-
8 files changed, 161 insertions(+), 46 deletions(-)
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 05e83a40e8..b341bdd0f9 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
@@ -162,6 +162,10 @@ public abstract class AbstractConfig implements
Serializable {
appendParameters0(parameters, config, null, false);
}
+ public static void appendAttributes(Map<String, String> parameters, Object
config, String prefix) {
+ appendParameters0(parameters, config, prefix, false);
+ }
+
private static void appendParameters0(Map<String, String> parameters,
Object config, String prefix, boolean asParameters) {
if (config == null) {
return;
@@ -261,6 +265,10 @@ public abstract class AbstractConfig implements
Serializable {
return "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
}
+ private static String calculatePropertyToSetter(String name) {
+ return "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
+ }
+
private static String calculatePropertyFromGetter(String name) {
int i = name.startsWith("get") ? 3 : 2;
return StringUtils.camelToSplitName(name.substring(i, i +
1).toLowerCase() + name.substring(i + 1), ".");
@@ -468,7 +476,7 @@ public abstract class AbstractConfig implements
Serializable {
if ("interfaceClass".equals(property) ||
"interfaceName".equals(property)) {
property = "interface";
}
- String setter = "set" + property.substring(0,
1).toUpperCase() + property.substring(1);
+ String setter = calculatePropertyToSetter(property);
Object value = method.invoke(annotation);
if (value != null &&
!value.equals(method.getDefaultValue())) {
Class<?> parameterType =
ReflectUtils.getBoxedClass(method.getReturnType());
@@ -496,7 +504,7 @@ public abstract class AbstractConfig implements
Serializable {
/**
* <p>
* <b>The new instance of the AbstractConfig subclass should return empty
metadata.</b>
- * The purpose is is to get the attributes set by the user instead of the
default value when the {@link #refresh()} method handles attribute overrides.
+ * The purpose is to get the attributes set by the user instead of the
default value when the {@link #refresh()} method handles attribute overrides.
* </p>
*
* <p><b>The default value of the field should be set in the {@link
#checkDefault()} method</b>,
@@ -514,8 +522,12 @@ public abstract class AbstractConfig implements
Serializable {
* @see AbstractConfig#appendParameters(Map, Object, String)
*/
public Map<String, String> getMetaData() {
+ return getMetaData(null);
+ }
+
+ public Map<String, String> getMetaData(String prefix) {
Map<String, String> metaData = new HashMap<>();
- appendAttributes(metaData, this);
+ appendAttributes(metaData, this, prefix);
return metaData;
}
@@ -656,14 +668,15 @@ public abstract class AbstractConfig implements
Serializable {
// Search props starts with PREFIX in order
String preferredPrefix = null;
- for (String prefix : getPrefixes()) {
+ List<String> prefixes = getPrefixes();
+ for (String prefix : prefixes) {
if (ConfigurationUtils.hasSubProperties(configurationMaps,
prefix)) {
preferredPrefix = prefix;
break;
}
}
if (preferredPrefix == null) {
- preferredPrefix = getPrefixes().get(0);
+ preferredPrefix = prefixes.get(0);
}
// Extract sub props (which key was starts with preferredPrefix)
Collection<Map<String, String>> instanceConfigMaps =
environment.getConfigurationMaps(this, preferredPrefix);
@@ -738,6 +751,19 @@ public abstract class AbstractConfig implements
Serializable {
} else if (isParametersSetter(method)) {
String propertyName = extractPropertyName(method.getName());
+ String value =
StringUtils.trim(configuration.getString(propertyName));
+ Map<String, String> parameterMap;
+ if (StringUtils.hasText(value)) {
+ parameterMap = StringUtils.parseParameters(value);
+ } else {
+ // in this case, maybe parameters.item3=value3.
+ parameterMap =
ConfigurationUtils.getSubProperties(properties, PARAMETERS);
+ }
+ Map<String, String> newMap = convert(parameterMap, "");
+ if (CollectionUtils.isEmptyMap(newMap)) {
+ continue;
+ }
+
// get old map from original obj
Map<String, String> oldMap = null;
try {
@@ -751,16 +777,6 @@ public abstract class AbstractConfig implements
Serializable {
}
- String value =
StringUtils.trim(configuration.getString(propertyName));
- Map<String, String> parameterMap;
- if (StringUtils.hasText(value)) {
- parameterMap = StringUtils.parseParameters(value);
- } else {
- // in this case, maybe parameters.item3=value3.
- parameterMap =
ConfigurationUtils.getSubProperties(properties, PARAMETERS);
- }
- Map<String, String> newMap = convert(parameterMap, "");
-
// if old map is null, directly set params
if (oldMap == null) {
invokeSetParameters(newMap, obj);
@@ -917,17 +933,15 @@ public abstract class AbstractConfig implements
Serializable {
buf.append(getTagName(getClass()));
for (Method method : getAttributedMethods()) {
try {
- if (MethodUtils.isGetter(method)) {
- String name = method.getName();
- String key = calculateAttributeFromGetter(name);
- Object value = method.invoke(this);
- if (value != null) {
- buf.append(' ');
- buf.append(key);
- buf.append("=\"");
- buf.append(key.equals("password") ? "******" :
value);
- buf.append('\"');
- }
+ String name = method.getName();
+ String key = calculateAttributeFromGetter(name);
+ Object value = method.invoke(this);
+ if (value != null) {
+ buf.append(' ');
+ buf.append(key);
+ buf.append("=\"");
+ buf.append(key.equals("password") ? "******" : value);
+ buf.append('\"');
}
} catch (Exception e) {
logger.warn(e.getMessage(), e);
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
index f97cda53fc..e2c18094db 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/config/ReferenceConfigBase.java
@@ -149,6 +149,11 @@ public abstract class ReferenceConfigBase<T> extends
AbstractReferenceConfig {
@Override
public Map<String, String> getMetaData() {
+ return getMetaData(null);
+ }
+
+ @Override
+ public Map<String, String> getMetaData(String prefix) {
Map<String, String> metaData = new HashMap<>();
ConsumerConfig consumer = this.getConsumer();
// consumer should be initialized at preProcessRefresh()
@@ -156,8 +161,8 @@ public abstract class ReferenceConfigBase<T> extends
AbstractReferenceConfig {
throw new IllegalStateException("Consumer is not initialized");
}
// use consumer attributes as default value
- appendAttributes(metaData, consumer);
- appendAttributes(metaData, this);
+ appendAttributes(metaData, consumer, prefix);
+ appendAttributes(metaData, this, prefix);
return metaData;
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/RegistryConfig.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/RegistryConfig.java
index f3863a589a..e4fb3a9d6e 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/RegistryConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/RegistryConfig.java
@@ -88,7 +88,7 @@ public class RegistryConfig extends AbstractConfig {
private String zone;
/**
- * The group the services registry in
+ * The group that services registry in
*/
private String group;
@@ -125,12 +125,12 @@ public class RegistryConfig extends AbstractConfig {
private Boolean dynamic;
/**
- * Whether to export service on the register center
+ * Whether to allow exporting service on the register center
*/
private Boolean register;
/**
- * Whether allow to subscribe service on the register center
+ * Whether to allow subscribing service on the register center
*/
private Boolean subscribe;
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
index ef6d5d696b..84a6076351 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ServiceConfigBase.java
@@ -234,16 +234,21 @@ public abstract class ServiceConfigBase<T> extends
AbstractServiceConfig {
@Override
public Map<String, String> getMetaData() {
+ return getMetaData(null);
+ }
+
+ @Override
+ public Map<String, String> getMetaData(String prefix) {
Map<String, String> metaData = new HashMap<>();
ProviderConfig provider = this.getProvider();
- // provider should be inited at preProcessRefresh()
+ // provider should be initialized at preProcessRefresh()
if (isRefreshed() && provider == null) {
throw new IllegalStateException("Provider is not initialized");
}
// use provider attributes as default value
- appendAttributes(metaData, provider);
+ appendAttributes(metaData, provider, prefix);
// Finally, put the service's attributes, overriding previous
attributes
- appendAttributes(metaData, this);
+ appendAttributes(metaData, this, prefix);
return metaData;
}
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 57faf25495..2b141e8a8b 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
@@ -20,7 +20,6 @@ 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;
/**
@@ -31,14 +30,10 @@ public class ConfigConfigurationAdapter implements
Configuration {
private Map<String, String> metaData;
public ConfigConfigurationAdapter(AbstractConfig config, String prefix) {
- Map<String, String> configMetadata = config.getMetaData();
if (StringUtils.hasText(prefix)) {
- metaData = new HashMap<>(configMetadata.size(), 1.0f);
- for (Map.Entry<String, String> entry : configMetadata.entrySet()) {
- metaData.put(prefix + "." + entry.getKey(), entry.getValue());
- }
+ metaData = config.getMetaData(prefix);
} else {
- metaData = configMetadata;
+ metaData = config.getMetaData();
}
}
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigMode.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigMode.java
index 5ca32398be..90580c22e0 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigMode.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigMode.java
@@ -22,7 +22,7 @@ package org.apache.dubbo.config.context;
*/
public enum ConfigMode {
/**
- * Strict mode: accept only one config for unique config type, throw
exceptions if found more than one configs for an unique config type.
+ * Strict mode: accept only one config for unique config type, throw
exceptions if found more than one config for a unique config type.
*/
STRICT,
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 f9e87663f1..6fc328fcb1 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
@@ -19,11 +19,14 @@ package org.apache.dubbo.config;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.api.Greeting;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.config.context.ConfigMode;
import org.apache.dubbo.config.support.Nested;
import org.apache.dubbo.config.support.Parameter;
import org.apache.dubbo.config.utils.ConfigValidationUtils;
import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+import org.apache.dubbo.rpc.model.ScopeModel;
import org.hamcrest.Matchers;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
@@ -173,7 +176,7 @@ public class AbstractConfigTest {
@Test
public void testAppendAttributes1() throws Exception {
- ParameterConfig config = new ParameterConfig(1, "hello/world", 30,
"password");
+ ParameterConfig config = new ParameterConfig(1, "hello/world", 30,
"password","BEIJING");
Map<String, String> parameters = new HashMap<>();
AbstractConfig.appendParameters(parameters, config);
@@ -188,6 +191,8 @@ public class AbstractConfigTest {
Assertions.assertEquals(String.valueOf(config.getNumber()),
attributes.get("number"));
Assertions.assertEquals(String.valueOf(config.getAge()),
attributes.get("age"));
Assertions.assertEquals(StringUtils.encodeParameters(config.getParameters()),
attributes.get("parameters"));
+ Assertions.assertTrue(parameters.containsKey("detail.address"));//
detailAddress -> detail.address
+ Assertions.assertTrue(attributes.containsKey("detail-address"));//
detailAddress -> detail-address
}
@Test
@@ -514,6 +519,65 @@ public class AbstractConfigTest {
}
}
+ @Test
+ public void testRefreshParametersWithOverrideConfigMode() {
+ FrameworkModel frameworkModel = new FrameworkModel();
+ try {
+ // test OVERRIDE_ALL configMode
+ {
+ SysProps.setProperty(ConfigKeys.DUBBO_CONFIG_MODE,
ConfigMode.OVERRIDE_ALL.name());
+ SysProps.setProperty("dubbo.override.address",
"system://127.0.0.1:2181");
+ SysProps.setProperty("dubbo.override.protocol", "system");
+ SysProps.setProperty("dubbo.override.parameters",
"[{key1:systemValue1},{key2:systemValue2}]");
+
+ ApplicationModel applicationModel1 =
frameworkModel.newApplication();
+ OverrideConfig overrideConfig = new
OverrideConfig(applicationModel1);
+ overrideConfig.setAddress("override-config://127.0.0.1:2181");
+ overrideConfig.setProtocol("override-config");
+ Map<String, String> parameters = new HashMap<>();
+ parameters.put("key1", "value1");
+ parameters.put("key3", "value3");
+ overrideConfig.setParameters(parameters);
+
+ // overrideConfig's config is overridden by system config
+ overrideConfig.refresh();
+ Assertions.assertEquals(overrideConfig.getAddress(),
"system://127.0.0.1:2181");
+ Assertions.assertEquals(overrideConfig.getProtocol(),
"system");
+ Assertions.assertEquals(overrideConfig.getParameters(),
+
StringUtils.parseParameters("[{key1:systemValue1},{key2:systemValue2},{key3:value3}]"));
+
+ }
+ // test OVERRIDE_IF_ABSENT configMode
+ {
+ SysProps.setProperty(ConfigKeys.DUBBO_CONFIG_MODE,
ConfigMode.OVERRIDE_IF_ABSENT.name());
+ SysProps.setProperty("dubbo.override.address",
"system://127.0.0.1:2181");
+ SysProps.setProperty("dubbo.override.protocol", "system");
+ SysProps.setProperty("dubbo.override.parameters",
"[{key1:systemValue1},{key2:systemValue2}]");
+ SysProps.setProperty("dubbo.override.key", "systemKey");
+
+ ApplicationModel applicationModel =
frameworkModel.newApplication();
+ OverrideConfig overrideConfig = new
OverrideConfig(applicationModel);
+ overrideConfig.setAddress("override-config://127.0.0.1:2181");
+ overrideConfig.setProtocol("override-config");
+ Map<String, String> parameters = new HashMap<>();
+ parameters.put("key1", "value1");
+ parameters.put("key3", "value3");
+ overrideConfig.setParameters(parameters);
+
+ // overrideConfig's config is overridden/set by system config
only when the overrideConfig's config is absent/empty
+ overrideConfig.refresh();
+ Assertions.assertEquals(overrideConfig.getAddress(),
"override-config://127.0.0.1:2181");
+ Assertions.assertEquals(overrideConfig.getProtocol(),
"override-config");
+ Assertions.assertEquals(overrideConfig.getKey(), "systemKey");
+ Assertions.assertEquals(overrideConfig.getParameters(),
+
StringUtils.parseParameters("[{key1:value1},{key2:systemValue2},{key3:value3}]"));
+ }
+
+ } finally {
+ frameworkModel.destroy();
+ }
+ }
+
@Test
public void testOnlyPrefixedKeyTakeEffect() {
try {
@@ -561,6 +625,13 @@ public class AbstractConfigTest {
Assertions.assertEquals("override-config", metaData.get("exclude"));
Assertions.assertNull(metaData.get("key"));
Assertions.assertNull(metaData.get("key2"));
+
+ // with prefix
+ Map<String, String> prefixMetadata =
overrideConfig.getMetaData(OverrideConfig.getTypePrefix(OverrideConfig.class));
+ Assertions.assertEquals("override-config://127.0.0.1:2181",
prefixMetadata.get("dubbo.override.address"));
+ Assertions.assertEquals("override-config",
prefixMetadata.get("dubbo.override.protocol"));
+ Assertions.assertEquals("override-config://",
prefixMetadata.get("dubbo.override.escape"));
+ Assertions.assertEquals("override-config",
prefixMetadata.get("dubbo.override.exclude"));
}
@Test
@@ -618,6 +689,13 @@ public class AbstractConfigTest {
public String notConflictKey2;
protected Map<String, String> parameters;
+ public OverrideConfig() {
+ }
+
+ public OverrideConfig(ScopeModel scopeModel) {
+ super(scopeModel);
+ }
+
public String getAddress() {
return address;
}
@@ -791,15 +869,29 @@ public class AbstractConfigTest {
private String name;
private int age;
private String secret;
+ private String detailAddress;
ParameterConfig() {
}
ParameterConfig(int number, String name, int age, String secret) {
+ this(number, name, age, secret, "");
+ }
+
+ ParameterConfig(int number, String name, int age, String secret,String
detailAddress) {
this.number = number;
this.name = name;
this.age = age;
this.secret = secret;
+ this.detailAddress = detailAddress;
+ }
+
+ public String getDetailAddress() {
+ return detailAddress;
+ }
+
+ public void setDetailAddress(String detailAddress) {
+ this.detailAddress = detailAddress;
}
@Parameter(key = "num", append = true)
diff --git
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java
index d2b7ba5662..d8fd191a32 100644
---
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java
+++
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/RegistryConfigTest.java
@@ -65,9 +65,13 @@ public class RegistryConfigTest {
@Test
public void testAddress() throws Exception {
RegistryConfig registry = new RegistryConfig();
- registry.setAddress("localhost");
- assertThat(registry.getAddress(), equalTo("localhost"));
- Map<String, String> parameters = new HashMap<String, String>();
+
registry.setAddress("zookeeper://mrh:123@localhost:9103/registry?backup=localhost:9104&k1=v1");
+ assertThat(registry.getAddress(),
equalTo("zookeeper://mrh:123@localhost:9103/registry?backup=localhost:9104&k1=v1"));
+ assertThat(registry.getProtocol(), equalTo("zookeeper"));
+ assertThat(registry.getUsername(), equalTo("mrh"));
+ assertThat(registry.getPassword(), equalTo("123"));
+ assertThat(registry.getParameters().get("k1"), equalTo("v1"));
+ Map<String, String> parameters = new HashMap<>();
RegistryConfig.appendParameters(parameters, registry);
assertThat(parameters, not(hasKey("address")));
}