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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git

commit a1cc01d06b3354715e0f456acd4e01160c04ab70
Author: liubao <bi...@qq.com>
AuthorDate: Sun Oct 8 15:43:15 2023 +0800

    [SCB-2008]adapt DynamicProperties
---
 .../edge/core/CommonHttpEdgeDispatcher.java        |  10 +-
 .../servicecomb/edge/core/EdgeAddHeaderFilter.java |  12 +-
 .../edge/core/URLMappedEdgeDispatcher.java         |  10 +-
 .../config/ConfigurationChangedEvent.java          |  32 ++--
 .../servicecomb/config/DynamicPropertiesImpl.java  | 165 +++++++++++++++------
 .../config/FoundationConfigConfiguration.java      |   4 +-
 .../servicecomb/config/DynamicPropertiesTest.java  |  62 +++++---
 .../servicecomb/qps/QpsControllerManager.java      |  11 +-
 .../authentication/provider/AccessController.java  |  13 +-
 9 files changed, 189 insertions(+), 130 deletions(-)

diff --git 
a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
 
b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
index fbeb0585d..5c3edc183 100644
--- 
a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
+++ 
b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/CommonHttpEdgeDispatcher.java
@@ -19,7 +19,6 @@ package org.apache.servicecomb.edge.core;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 
 import org.apache.servicecomb.config.ConfigurationChangedEvent;
 import org.apache.servicecomb.config.MicroserviceProperties;
@@ -128,13 +127,8 @@ public class CommonHttpEdgeDispatcher extends 
AbstractEdgeDispatcher {
 
   @Subscribe
   public void onConfigurationChangedEvent(ConfigurationChangedEvent event) {
-    Map<String, Object> changed = new HashMap<>();
-    changed.putAll(event.getDeleted());
-    changed.putAll(event.getAdded());
-    changed.putAll(event.getUpdated());
-
-    for (Entry<String, Object> entry : changed.entrySet()) {
-      if (entry.getKey().startsWith(KEY_MAPPING_PREFIX)) {
+    for (String changed : event.getChanged()) {
+      if (changed.startsWith(KEY_MAPPING_PREFIX)) {
         loadConfigurations();
         break;
       }
diff --git 
a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/EdgeAddHeaderFilter.java
 
b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/EdgeAddHeaderFilter.java
index 65a20bc7e..0788397e5 100644
--- 
a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/EdgeAddHeaderFilter.java
+++ 
b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/EdgeAddHeaderFilter.java
@@ -18,10 +18,7 @@ package org.apache.servicecomb.edge.core;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.BiConsumer;
 
@@ -69,13 +66,8 @@ public class EdgeAddHeaderFilter implements ConsumerFilter {
 
   @Subscribe
   public void onConfigurationChangedEvent(ConfigurationChangedEvent event) {
-    Map<String, Object> changed = new HashMap<>();
-    changed.putAll(event.getDeleted());
-    changed.putAll(event.getAdded());
-    changed.putAll(event.getUpdated());
-
-    for (Entry<String, Object> entry : changed.entrySet()) {
-      if (entry.getKey().startsWith(PREFIX)) {
+    for (String changed : event.getChanged()) {
+      if (changed.startsWith(PREFIX)) {
         init();
         break;
       }
diff --git 
a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
 
b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
index 310381e8a..0f2920e8e 100644
--- 
a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
+++ 
b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
@@ -19,7 +19,6 @@ package org.apache.servicecomb.edge.core;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 
 import org.apache.servicecomb.common.rest.RestProducerInvocationFlow;
 import org.apache.servicecomb.config.ConfigurationChangedEvent;
@@ -106,13 +105,8 @@ public class URLMappedEdgeDispatcher extends 
AbstractEdgeDispatcher {
 
   @Subscribe
   public void onConfigurationChangedEvent(ConfigurationChangedEvent event) {
-    Map<String, Object> changed = new HashMap<>();
-    changed.putAll(event.getDeleted());
-    changed.putAll(event.getAdded());
-    changed.putAll(event.getUpdated());
-
-    for (Entry<String, Object> entry : changed.entrySet()) {
-      if (entry.getKey().startsWith(KEY_MAPPING_PREFIX)) {
+    for (String changed : event.getChanged()) {
+      if (changed.startsWith(KEY_MAPPING_PREFIX)) {
         loadConfigurations();
         break;
       }
diff --git 
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigurationChangedEvent.java
 
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigurationChangedEvent.java
index ba2590c17..9e58a5f97 100644
--- 
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigurationChangedEvent.java
+++ 
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/ConfigurationChangedEvent.java
@@ -18,8 +18,10 @@
 package org.apache.servicecomb.config;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 
 public class ConfigurationChangedEvent {
   private final Map<String, Object> added;
@@ -28,53 +30,49 @@ public class ConfigurationChangedEvent {
 
   private final Map<String, Object> updated;
 
-  private final boolean changed;
-
-  private Map<String, Object> complete;
+  private Set<String> changed;
 
   private ConfigurationChangedEvent(Map<String, Object> added, Map<String, 
Object> updated,
-      Map<String, Object> deleted, boolean changed) {
+      Map<String, Object> deleted) {
     this.added = added;
     this.deleted = deleted;
     this.updated = updated;
-    this.changed = changed;
+    this.changed = new HashSet<>();
+    this.changed.addAll(added.keySet());
+    this.changed.addAll(updated.keySet());
+    this.changed.addAll(deleted.keySet());
   }
 
   public static ConfigurationChangedEvent createIncremental(Map<String, 
Object> latest, Map<String, Object> last) {
     Map<String, Object> itemsCreated = new HashMap<>();
     Map<String, Object> itemsDeleted = new HashMap<>();
     Map<String, Object> itemsModified = new HashMap<>();
-    boolean changed = false;
 
     for (Map.Entry<String, Object> entry : latest.entrySet()) {
       String itemKey = entry.getKey();
       if (!last.containsKey(itemKey)) {
         itemsCreated.put(itemKey, entry.getValue());
-        changed = true;
       } else if (!Objects.equals(last.get(itemKey), latest.get(itemKey))) {
         itemsModified.put(itemKey, entry.getValue());
-        changed = true;
       }
     }
     for (String itemKey : last.keySet()) {
       if (!latest.containsKey(itemKey)) {
         itemsDeleted.put(itemKey, null);
-        changed = true;
       }
     }
     ConfigurationChangedEvent event = ConfigurationChangedEvent
-        .createIncremental(itemsCreated, itemsModified, itemsDeleted, changed);
-    event.complete = latest;
+        .createIncremental(itemsCreated, itemsModified, itemsDeleted);
     return event;
   }
 
   public static ConfigurationChangedEvent createIncremental(Map<String, 
Object> added, Map<String, Object> updated,
-      Map<String, Object> deleted, boolean changed) {
-    return new ConfigurationChangedEvent(added, updated, deleted, changed);
+      Map<String, Object> deleted) {
+    return new ConfigurationChangedEvent(added, updated, deleted);
   }
 
   public static ConfigurationChangedEvent createIncremental(Map<String, 
Object> updated) {
-    return new ConfigurationChangedEvent(new HashMap<>(), updated, new 
HashMap<>(), true);
+    return new ConfigurationChangedEvent(new HashMap<>(), updated, new 
HashMap<>());
   }
 
   public final Map<String, Object> getAdded() {
@@ -91,11 +89,7 @@ public class ConfigurationChangedEvent {
     return deleted;
   }
 
-  public final Map<String, Object> getComplete() {
-    return complete;
-  }
-
-  public final boolean isChanged() {
+  public final Set<String> getChanged() {
     return changed;
   }
 }
diff --git 
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/DynamicPropertiesImpl.java
 
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/DynamicPropertiesImpl.java
index 3931061fc..6ce2ea2d1 100644
--- 
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/DynamicPropertiesImpl.java
+++ 
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/DynamicPropertiesImpl.java
@@ -17,108 +17,185 @@
 
 package org.apache.servicecomb.config;
 
-import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
 import java.util.function.Consumer;
 import java.util.function.DoubleConsumer;
 import java.util.function.IntConsumer;
 import java.util.function.LongConsumer;
 
-import org.apache.commons.configuration.AbstractConfiguration;
+import org.apache.servicecomb.foundation.common.event.EventManager;
+import org.springframework.core.env.Environment;
 
-import com.netflix.config.ConcurrentCompositeConfiguration;
-import com.netflix.config.ConfigurationManager;
-import com.netflix.config.DynamicBooleanProperty;
-import com.netflix.config.DynamicDoubleProperty;
-import com.netflix.config.DynamicFloatProperty;
-import com.netflix.config.DynamicIntProperty;
-import com.netflix.config.DynamicLongProperty;
-import com.netflix.config.DynamicPropertyFactory;
-import com.netflix.config.DynamicStringProperty;
+import com.google.common.eventbus.Subscribe;
 
 public class DynamicPropertiesImpl implements DynamicProperties {
-  public DynamicPropertiesImpl() {
+  private final Map<String, Set<Consumer<String>>> stringCallbacks = new 
HashMap<>();
+
+  private final Map<String, Set<IntConsumer>> intCallbacks = new HashMap<>();
+
+  private final Map<String, Set<LongConsumer>> longCallbacks = new HashMap<>();
+
+  private final Map<String, Set<DoubleConsumer>> floatCallbacks = new 
HashMap<>();
+
+  private final Map<String, Set<DoubleConsumer>> doubleCallbacks = new 
HashMap<>();
+
+  private final Map<String, Set<Consumer<Boolean>>> booleanCallbacks = new 
HashMap<>();
+
+  private final Environment environment;
+
+  public DynamicPropertiesImpl(Environment environment) {
+    this.environment = environment;
+    EventManager.register(this);
   }
 
-  public DynamicPropertiesImpl(AbstractConfiguration... configurations) {
-    ConcurrentCompositeConfiguration configuration = new 
ConcurrentCompositeConfiguration();
-    Arrays.stream(configurations).forEach(configuration::addConfiguration);
+  @Subscribe
+  public void onConfigurationChangedEvent(ConfigurationChangedEvent event) {
+    for (Entry<String, Object> entry : event.getAdded().entrySet()) {
+      updateValue(entry);
+    }
 
-    ConfigurationManager.install(configuration);
+    for (Entry<String, Object> entry : event.getUpdated().entrySet()) {
+      updateValue(entry);
+    }
+
+    for (Entry<String, Object> entry : event.getDeleted().entrySet()) {
+      updateDefault(entry);
+    }
+  }
+
+  private void updateDefault(Entry<String, Object> entry) {
+    if (stringCallbacks.containsKey(entry.getKey())) {
+      for (Consumer<String> callbacks : stringCallbacks.get(entry.getKey())) {
+        callbacks.accept(null);
+      }
+    }
+    if (intCallbacks.containsKey(entry.getKey())) {
+      for (IntConsumer callbacks : intCallbacks.get(entry.getKey())) {
+        callbacks.accept(0);
+      }
+    }
+    if (longCallbacks.containsKey(entry.getKey())) {
+      for (LongConsumer callbacks : longCallbacks.get(entry.getKey())) {
+        callbacks.accept(0L);
+      }
+    }
+    if (floatCallbacks.containsKey(entry.getKey())) {
+      for (DoubleConsumer callbacks : floatCallbacks.get(entry.getKey())) {
+        callbacks.accept(0F);
+      }
+    }
+    if (doubleCallbacks.containsKey(entry.getKey())) {
+      for (DoubleConsumer callbacks : doubleCallbacks.get(entry.getKey())) {
+        callbacks.accept(0D);
+      }
+    }
+    if (booleanCallbacks.containsKey(entry.getKey())) {
+      for (Consumer<Boolean> callbacks : booleanCallbacks.get(entry.getKey())) 
{
+        callbacks.accept(false);
+      }
+    }
+  }
+
+  private void updateValue(Entry<String, Object> entry) {
+    if (stringCallbacks.containsKey(entry.getKey())) {
+      for (Consumer<String> callbacks : stringCallbacks.get(entry.getKey())) {
+        callbacks.accept((String) entry.getValue());
+      }
+    }
+    if (intCallbacks.containsKey(entry.getKey())) {
+      for (IntConsumer callbacks : intCallbacks.get(entry.getKey())) {
+        callbacks.accept((int) entry.getValue());
+      }
+    }
+    if (longCallbacks.containsKey(entry.getKey())) {
+      for (LongConsumer callbacks : longCallbacks.get(entry.getKey())) {
+        callbacks.accept((long) entry.getValue());
+      }
+    }
+    if (floatCallbacks.containsKey(entry.getKey())) {
+      for (DoubleConsumer callbacks : floatCallbacks.get(entry.getKey())) {
+        callbacks.accept((float) entry.getValue());
+      }
+    }
+    if (doubleCallbacks.containsKey(entry.getKey())) {
+      for (DoubleConsumer callbacks : doubleCallbacks.get(entry.getKey())) {
+        callbacks.accept((double) entry.getValue());
+      }
+    }
+    if (booleanCallbacks.containsKey(entry.getKey())) {
+      for (Consumer<Boolean> callbacks : booleanCallbacks.get(entry.getKey())) 
{
+        callbacks.accept((boolean) entry.getValue());
+      }
+    }
   }
 
   @Override
   public String getStringProperty(String propertyName, Consumer<String> 
consumer, String defaultValue) {
-    DynamicStringProperty prop = 
propertyFactoryInstance().getStringProperty(propertyName, defaultValue);
-    prop.addCallback(() -> consumer.accept(prop.get()));
-    return prop.get();
+    stringCallbacks.computeIfAbsent(propertyName, key -> new 
HashSet<>()).add(consumer);
+    return environment.getProperty(propertyName, defaultValue);
   }
 
   @Override
   public String getStringProperty(String propertyName, String defaultValue) {
-    return propertyFactoryInstance().getStringProperty(propertyName, 
defaultValue).get();
+    return environment.getProperty(propertyName, defaultValue);
   }
 
   @Override
   public int getIntProperty(String propertyName, IntConsumer consumer, int 
defaultValue) {
-    DynamicIntProperty prop = 
propertyFactoryInstance().getIntProperty(propertyName, defaultValue);
-    prop.addCallback(() -> consumer.accept(prop.get()));
-    return prop.get();
+    intCallbacks.computeIfAbsent(propertyName, key -> new 
HashSet<>()).add(consumer);
+    return environment.getProperty(propertyName, int.class, defaultValue);
   }
 
   @Override
   public int getIntProperty(String propertyName, int defaultValue) {
-    return propertyFactoryInstance().getIntProperty(propertyName, 
defaultValue).get();
+    return environment.getProperty(propertyName, int.class, defaultValue);
   }
 
   @Override
   public long getLongProperty(String propertyName, LongConsumer consumer, long 
defaultValue) {
-    DynamicLongProperty prop = 
propertyFactoryInstance().getLongProperty(propertyName, defaultValue);
-    prop.addCallback(() -> consumer.accept(prop.get()));
-    return prop.get();
+    longCallbacks.computeIfAbsent(propertyName, key -> new 
HashSet<>()).add(consumer);
+    return environment.getProperty(propertyName, long.class, defaultValue);
   }
 
   @Override
   public long getLongProperty(String propertyName, long defaultValue) {
-    return propertyFactoryInstance().getLongProperty(propertyName, 
defaultValue).get();
+    return environment.getProperty(propertyName, long.class, defaultValue);
   }
 
   @Override
   public float getFloatProperty(String propertyName, DoubleConsumer consumer, 
float defaultValue) {
-    DynamicFloatProperty prop = 
propertyFactoryInstance().getFloatProperty(propertyName, defaultValue);
-    prop.addCallback(() -> consumer.accept(prop.get()));
-    return prop.get();
+    floatCallbacks.computeIfAbsent(propertyName, key -> new 
HashSet<>()).add(consumer);
+    return environment.getProperty(propertyName, float.class, defaultValue);
   }
 
   @Override
   public float getFloatProperty(String propertyName, float defaultValue) {
-    return propertyFactoryInstance().getFloatProperty(propertyName, 
defaultValue).get();
+    return environment.getProperty(propertyName, float.class, defaultValue);
   }
 
   @Override
   public double getDoubleProperty(String propertyName, DoubleConsumer 
consumer, double defaultValue) {
-    DynamicDoubleProperty prop = 
propertyFactoryInstance().getDoubleProperty(propertyName, defaultValue);
-    prop.addCallback(() -> consumer.accept(prop.get()));
-    return prop.get();
+    doubleCallbacks.computeIfAbsent(propertyName, key -> new 
HashSet<>()).add(consumer);
+    return environment.getProperty(propertyName, double.class, defaultValue);
   }
 
   @Override
   public double getDoubleProperty(String propertyName, double defaultValue) {
-    return propertyFactoryInstance().getDoubleProperty(propertyName, 
defaultValue).get();
+    return environment.getProperty(propertyName, double.class, defaultValue);
   }
 
   @Override
   public boolean getBooleanProperty(String propertyName, Consumer<Boolean> 
consumer, boolean defaultValue) {
-    DynamicBooleanProperty prop = 
propertyFactoryInstance().getBooleanProperty(propertyName, defaultValue);
-    prop.addCallback(() -> consumer.accept(prop.get()));
-    return prop.get();
+    booleanCallbacks.computeIfAbsent(propertyName, key -> new 
HashSet<>()).add(consumer);
+    return environment.getProperty(propertyName, boolean.class, defaultValue);
   }
 
   @Override
   public boolean getBooleanProperty(String propertyName, boolean defaultValue) 
{
-    return propertyFactoryInstance().getBooleanProperty(propertyName, 
defaultValue).get();
-  }
-
-  private DynamicPropertyFactory propertyFactoryInstance() {
-    return DynamicPropertyFactory.getInstance();
+    return environment.getProperty(propertyName, boolean.class, defaultValue);
   }
 }
diff --git 
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/FoundationConfigConfiguration.java
 
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/FoundationConfigConfiguration.java
index 91f49c8a1..18906749f 100644
--- 
a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/FoundationConfigConfiguration.java
+++ 
b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/FoundationConfigConfiguration.java
@@ -50,8 +50,8 @@ public class FoundationConfigConfiguration {
   }
 
   @Bean
-  public DynamicPropertiesImpl dynamicProperties() {
-    return new DynamicPropertiesImpl();
+  public DynamicPropertiesImpl dynamicProperties(Environment environment) {
+    return new DynamicPropertiesImpl(environment);
   }
 
   @Bean
diff --git 
a/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/DynamicPropertiesTest.java
 
b/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/DynamicPropertiesTest.java
index 9090a64ae..4b2de1c79 100644
--- 
a/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/DynamicPropertiesTest.java
+++ 
b/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/DynamicPropertiesTest.java
@@ -23,13 +23,16 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
 import static org.hamcrest.number.IsCloseTo.closeTo;
 
+import java.util.HashMap;
 import java.util.Objects;
 
+import org.apache.servicecomb.foundation.common.event.EventManager;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.mockito.Mockito;
+import org.springframework.core.env.Environment;
 
-import com.netflix.config.ConcurrentMapConfiguration;
 import com.netflix.config.ConfigurationManager;
 import com.netflix.config.DynamicPropertyFactory;
 import com.seanyinx.github.unit.scaffolding.Poller;
@@ -38,7 +41,6 @@ import com.seanyinx.github.unit.scaffolding.Randomness;
 import mockit.Deencapsulation;
 
 public class DynamicPropertiesTest {
-
   private static final String stringPropertyName = 
uniquify("stringPropertyName");
 
   private static final String intPropertyName = uniquify("intPropertyName");
@@ -57,7 +59,7 @@ public class DynamicPropertiesTest {
 
   private static final long longOldValue = Randomness.nextLong();
 
-  private static final double floatOldValue = Randomness.nextDouble();
+  private static final float floatOldValue = 
Double.valueOf(Randomness.nextDouble()).floatValue();
 
   private static final double doubleOldValue = Randomness.nextDouble();
 
@@ -65,9 +67,9 @@ public class DynamicPropertiesTest {
 
   private static final double ERROR = 0.0000001;
 
-  private static DynamicProperties dynamicProperties;
+  private static Environment environment;
 
-  private static ConcurrentMapConfiguration configuration;
+  private static DynamicProperties dynamicProperties;
 
   private final Poller poller = new Poller(2000, 100);
 
@@ -86,10 +88,9 @@ public class DynamicPropertiesTest {
 
   @BeforeClass
   public static void setUpClass() throws Exception {
-    tearDown();
-    configuration = new ConcurrentMapConfiguration();
+    environment = Mockito.mock(Environment.class);
     writeInitialConfig();
-    dynamicProperties = new DynamicPropertiesImpl(configuration);
+    dynamicProperties = new DynamicPropertiesImpl(environment);
   }
 
   @AfterClass
@@ -100,12 +101,13 @@ public class DynamicPropertiesTest {
   }
 
   private static void writeInitialConfig() throws Exception {
-    configuration.setProperty(stringPropertyName, stringOldValue);
-    configuration.setProperty(intPropertyName, String.valueOf(intOldValue));
-    configuration.setProperty(longPropertyName, String.valueOf(longOldValue));
-    configuration.setProperty(floatPropertyName, 
String.valueOf(floatOldValue));
-    configuration.setProperty(doublePropertyName, 
String.valueOf(doubleOldValue));
-    configuration.setProperty(booleanPropertyName, 
String.valueOf(booleanOldValue));
+    Mockito.when(environment.getProperty(stringPropertyName, (String) 
null)).thenReturn(stringOldValue);
+    Mockito.when(environment.getProperty(intPropertyName, int.class, 
0)).thenReturn(intOldValue);
+    Mockito.when(environment.getProperty(longPropertyName, long.class, 
0L)).thenReturn(longOldValue);
+    Mockito.when(environment.getProperty(floatPropertyName, float.class, 
0F)).thenReturn(floatOldValue);
+    Mockito.when(environment.getProperty(doublePropertyName, double.class, 
0D)).thenReturn(doubleOldValue);
+    Mockito.when(environment.getProperty(booleanPropertyName, boolean.class, 
false))
+        .thenReturn(booleanOldValue);
   }
 
   @Test
@@ -118,7 +120,10 @@ public class DynamicPropertiesTest {
 
     String newValue = uniquify("newValue");
 
-    configuration.setProperty(stringPropertyName, newValue);
+    Mockito.when(environment.getProperty(stringPropertyName, 
stringOldValue)).thenReturn(newValue);
+    HashMap<String, Object> updated = new HashMap<>();
+    updated.put(stringPropertyName, newValue);
+    EventManager.post(ConfigurationChangedEvent.createIncremental(updated));
 
     poller.assertEventually(() -> Objects.equals(stringPropertyValue, 
newValue));
   }
@@ -133,7 +138,10 @@ public class DynamicPropertiesTest {
 
     int newValue = Randomness.nextInt();
 
-    configuration.setProperty(intPropertyName, String.valueOf(newValue));
+    Mockito.when(environment.getProperty(intPropertyName, int.class, 
intOldValue)).thenReturn(newValue);
+    HashMap<String, Object> updated = new HashMap<>();
+    updated.put(intPropertyName, newValue);
+    EventManager.post(ConfigurationChangedEvent.createIncremental(updated));
 
     poller.assertEventually(() -> intPropertyValue == newValue);
   }
@@ -148,7 +156,10 @@ public class DynamicPropertiesTest {
 
     long newValue = Randomness.nextLong();
 
-    configuration.setProperty(longPropertyName, String.valueOf(newValue));
+    Mockito.when(environment.getProperty(longPropertyName, long.class, 
longOldValue)).thenReturn(newValue);
+    HashMap<String, Object> updated = new HashMap<>();
+    updated.put(longPropertyName, newValue);
+    EventManager.post(ConfigurationChangedEvent.createIncremental(updated));
 
     poller.assertEventually(() -> longPropertyValue == newValue);
   }
@@ -161,9 +172,12 @@ public class DynamicPropertiesTest {
     property = dynamicProperties.getFloatProperty(floatPropertyName, value -> 
floatPropertyValue = value, 0);
     assertThat(property, closeTo(floatOldValue, ERROR));
 
-    double newValue = Randomness.nextDouble();
+    float newValue = Double.valueOf(Randomness.nextDouble()).floatValue();
 
-    configuration.setProperty(floatPropertyName, String.valueOf(newValue));
+    Mockito.when(environment.getProperty(floatPropertyName, float.class, 
floatOldValue)).thenReturn(newValue);
+    HashMap<String, Object> updated = new HashMap<>();
+    updated.put(floatPropertyName, newValue);
+    EventManager.post(ConfigurationChangedEvent.createIncremental(updated));
 
     poller.assertEventually(() -> Math.abs(floatPropertyValue - newValue) < 
ERROR);
   }
@@ -178,7 +192,10 @@ public class DynamicPropertiesTest {
 
     double newValue = Randomness.nextDouble();
 
-    configuration.setProperty(doublePropertyName, String.valueOf(newValue));
+    Mockito.when(environment.getProperty(doublePropertyName, double.class, 
doubleOldValue)).thenReturn(newValue);
+    HashMap<String, Object> updated = new HashMap<>();
+    updated.put(doublePropertyName, newValue);
+    EventManager.post(ConfigurationChangedEvent.createIncremental(updated));
 
     poller.assertEventually(() -> Math.abs(doublePropertyValue - newValue) < 
ERROR);
   }
@@ -196,7 +213,10 @@ public class DynamicPropertiesTest {
 
     boolean newValue = !booleanOldValue;
 
-    configuration.setProperty(booleanPropertyName, String.valueOf(newValue));
+    Mockito.when(environment.getProperty(booleanPropertyName, boolean.class, 
booleanOldValue)).thenReturn(newValue);
+    HashMap<String, Object> updated = new HashMap<>();
+    updated.put(booleanPropertyName, newValue);
+    EventManager.post(ConfigurationChangedEvent.createIncremental(updated));
 
     poller.assertEventually(() -> booleanPropertyValue == newValue);
   }
diff --git 
a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/QpsControllerManager.java
 
b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/QpsControllerManager.java
index 8e33088e3..0ef5b2716 100644
--- 
a/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/QpsControllerManager.java
+++ 
b/handlers/handler-flowcontrol-qps/src/main/java/org/apache/servicecomb/qps/QpsControllerManager.java
@@ -17,10 +17,8 @@
 
 package org.apache.servicecomb.qps;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.config.ConfigurationChangedEvent;
@@ -85,13 +83,8 @@ public class QpsControllerManager {
 
   @Subscribe
   public void onConfigurationChangedEvent(ConfigurationChangedEvent event) {
-    Map<String, Object> changed = new HashMap<>();
-    changed.putAll(event.getDeleted());
-    changed.putAll(event.getAdded());
-    changed.putAll(event.getUpdated());
-
-    for (Entry<String, Object> entry : changed.entrySet()) {
-      if (entry.getKey().startsWith(Config.CONFIG_PREFIX)) {
+    for (String changed : event.getChanged()) {
+      if (changed.startsWith(Config.CONFIG_PREFIX)) {
         configQpsControllerMap.clear();
         qualifiedNameControllerMap.clear();
         initGlobalQpsController();
diff --git 
a/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/provider/AccessController.java
 
b/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/provider/AccessController.java
index 07edae566..b923b2939 100644
--- 
a/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/provider/AccessController.java
+++ 
b/handlers/handler-publickey-auth/src/main/java/org/apache/servicecomb/authentication/provider/AccessController.java
@@ -138,19 +138,14 @@ public class AccessController {
 
   @Subscribe
   public void onConfigurationChangedEvent(ConfigurationChangedEvent event) {
-    Map<String, Object> changed = new HashMap<>();
-    changed.putAll(event.getDeleted());
-    changed.putAll(event.getAdded());
-    changed.putAll(event.getUpdated());
-
-    for (Entry<String, Object> entry : changed.entrySet()) {
-      if (entry.getKey().startsWith(KEY_WHITE_LIST_PREFIX)) {
+    for (String changed : event.getChanged()) {
+      if (changed.startsWith(KEY_WHITE_LIST_PREFIX)) {
         loadConfigurations(KEY_WHITE_LIST_PREFIX);
         break;
       }
     }
-    for (Entry<String, Object> entry : changed.entrySet()) {
-      if (entry.getKey().startsWith(KEY_BLACK_LIST_PREFIX)) {
+    for (String changed : event.getChanged()) {
+      if (changed.startsWith(KEY_BLACK_LIST_PREFIX)) {
         loadConfigurations(KEY_BLACK_LIST_PREFIX);
         break;
       }

Reply via email to