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<>();

Reply via email to