This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.1
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.1 by this push:
new 3e77b6b94a bugfix: meatadata service support read dubbo:protocol
(#10855)
3e77b6b94a is described below
commit 3e77b6b94acff58c44974351e1bf1e43c8977c3c
Author: FUNKYE <[email protected]>
AuthorDate: Thu Nov 3 07:27:35 2022 +0800
bugfix: meatadata service support read dubbo:protocol (#10855)
---
.../apache/dubbo/common/utils/CollectionUtils.java | 17 +++++++++++++
.../org/apache/dubbo/config/ProtocolConfig.java | 28 ++++++++++++++++++++++
.../dubbo/common/utils/CollectionUtilsTest.java | 9 +++++++
.../dubbo/config/context/ConfigManagerTest.java | 9 +++++++
.../ConfigurableMetadataServiceExporter.java | 5 ++--
5 files changed, 66 insertions(+), 2 deletions(-)
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CollectionUtils.java
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CollectionUtils.java
index 48c4c4b0be..4bf027e434 100644
---
a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CollectionUtils.java
+++
b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/CollectionUtils.java
@@ -16,6 +16,7 @@
*/
package org.apache.dubbo.common.utils;
+import java.lang.reflect.Field;
import java.util.AbstractSet;
import java.util.ArrayList;
import java.util.Collection;
@@ -237,6 +238,22 @@ public class CollectionUtils {
return ret;
}
+ @SuppressWarnings("unchecked")
+ public static <K, V> Map<K, V> objToMap(Object object) throws
IllegalAccessException {
+ Map<K, V> ret = new HashMap<>();
+ if (object != null) {
+ Field[] fields = object.getClass().getDeclaredFields();
+ for (Field field : fields) {
+ field.setAccessible(true);
+ Object value = field.get(object);
+ if (value != null) {
+ ret.put((K)field.getName(), (V)value);
+ }
+ }
+ }
+ return ret;
+ }
+
/**
* Return {@code true} if the supplied Collection is {@code null} or empty.
* Otherwise, return {@code false}.
diff --git
a/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
b/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
index 5821ac6442..0903ac94b8 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
@@ -16,11 +16,14 @@
*/
package org.apache.dubbo.config;
+import org.apache.dubbo.common.utils.CollectionUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.config.support.Parameter;
import org.apache.dubbo.rpc.model.ApplicationModel;
+import java.lang.reflect.Field;
import java.util.Map;
+import java.util.Optional;
import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;
import static
org.apache.dubbo.common.constants.CommonConstants.SSL_ENABLED_KEY;
@@ -579,4 +582,29 @@ public class ProtocolConfig extends AbstractConfig {
public void setExtProtocol(String extProtocol) {
this.extProtocol = extProtocol;
}
+
+ public void mergeProtocol(ProtocolConfig sourceConfig) {
+ if (sourceConfig == null) {
+ return;
+ }
+ Field[] targetFields = this.getClass().getDeclaredFields();
+ try {
+ Map<String, Object> protocolConfigMap =
CollectionUtils.objToMap(sourceConfig);
+ for (Field targetField : targetFields) {
+
Optional.ofNullable(protocolConfigMap.get(targetField.getName())).ifPresent(value
-> {
+ try {
+ targetField.setAccessible(true);
+ if (targetField.get(this) == null) {
+ targetField.set(this, value);
+ }
+ } catch (IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ });
+ }
+ } catch (Exception e) {
+ logger.error("merge protocol config fail, error: ", e);
+ }
+ }
+
}
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/CollectionUtilsTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/CollectionUtilsTest.java
index f128862cc3..d40ab82ab4 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/common/utils/CollectionUtilsTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/common/utils/CollectionUtilsTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.dubbo.common.utils;
+import org.apache.dubbo.config.ProtocolConfig;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
@@ -200,6 +201,14 @@ public class CollectionUtilsTest {
assertEquals(expected, CollectionUtils.toMap("a", 1, "b", 2, "c", 3));
}
+ @Test
+ public void testObjectToMap() throws Exception {
+ ProtocolConfig protocolConfig=new ProtocolConfig();
+ protocolConfig.setSerialization("fastjson2");
+
+ assertFalse(CollectionUtils.objToMap(protocolConfig).isEmpty());
+ }
+
@Test
public void testToMap2() throws Exception {
Assertions.assertThrows(IllegalArgumentException.class, () ->
toMap("a", "b", "c"));
diff --git
a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
index 284c00c2e1..3a59d30ce0 100644
---
a/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
+++
b/dubbo-common/src/test/java/org/apache/dubbo/config/context/ConfigManagerTest.java
@@ -41,6 +41,7 @@ import static
org.apache.dubbo.common.constants.MetricsConstants.PROTOCOL_PROMET
import static org.apache.dubbo.config.context.ConfigManager.DUBBO_CONFIG_MODE;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
@@ -192,6 +193,14 @@ public class ConfigManagerTest {
assertEquals(config, configs.iterator().next());
assertFalse(configManager.getDefaultProtocols().isEmpty());
assertEquals(configs, moduleConfigManager.getProtocols());
+ assertNotEquals(20881, config.getPort());
+ assertNotEquals(config.getSerialization(),"fastjson2");
+ ProtocolConfig defaultConfig = new ProtocolConfig();
+ defaultConfig.setPort(20881);
+ defaultConfig.setSerialization("fastjson2");
+ config.mergeProtocol(defaultConfig);
+ assertEquals(config.getPort(),20881);
+ assertEquals(config.getSerialization(),"fastjson2");
}
// Test RegistryConfig correlative methods
diff --git
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java
index a96b74473e..9f8cecae60 100644
---
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java
+++
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java
@@ -113,7 +113,6 @@ public class ConfigurableMetadataServiceExporter {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName(specifiedProtocol);
-
if (port == null || port < -1) {
try {
if (logger.isInfoEnabled()) {
@@ -146,6 +145,9 @@ public class ConfigurableMetadataServiceExporter {
} else {
protocolConfig.setPort(port);
}
+
+
applicationModel.getApplicationConfigManager().getProtocol(specifiedProtocol)
+ .ifPresent(protocolConfig::mergeProtocol);
if (protocolConfig.getPort() == null) {
protocolConfig.setPort(-1);
@@ -182,7 +184,6 @@ public class ConfigurableMetadataServiceExporter {
return StringUtils.isNotEmpty(protocol) ? protocol : DUBBO_PROTOCOL;
}
-
private ServiceConfig<MetadataService> buildServiceConfig() {
ApplicationConfig applicationConfig = getApplicationConfig();
ServiceConfig<MetadataService> serviceConfig = new ServiceConfig<>();