You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2021/02/23 14:15:41 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2193] dynamic enum can indicate value is static or dynamic (#2248)

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


The following commit(s) were added to refs/heads/master by this push:
     new 1ae0b6b  [SCB-2193] dynamic enum can indicate value is static or dynamic (#2248)
1ae0b6b is described below

commit 1ae0b6b521e1e926c7b156c49e41b626e521dd2c
Author: wujimin <wu...@huawei.com>
AuthorDate: Tue Feb 23 22:15:30 2021 +0800

    [SCB-2193] dynamic enum can indicate value is static or dynamic (#2248)
---
 .../core/registry/ThirdServiceRegister.java            |  6 ++++--
 .../foundation/common/base/DynamicEnum.java            | 18 ++++++++++++++++++
 .../foundation/common/base/DynamicEnumCache.java       |  8 +++++++-
 .../foundation/common/base/DynamicEnumTest.java        | 14 ++++++++++++++
 4 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/registry/ThirdServiceRegister.java b/core/src/main/java/org/apache/servicecomb/core/registry/ThirdServiceRegister.java
index c3053ee..375d3e9 100644
--- a/core/src/main/java/org/apache/servicecomb/core/registry/ThirdServiceRegister.java
+++ b/core/src/main/java/org/apache/servicecomb/core/registry/ThirdServiceRegister.java
@@ -86,13 +86,15 @@ public abstract class ThirdServiceRegister implements BootListener, EnvironmentA
 
   public static final int ORDER = -1000;
 
-  private static final String VERSION = "1.0";
+  public static final String VERSION = "1.0";
+
+  public static final List<String> DEFAULT_ADDRESSES = Collections.singletonList("http://127.0.0.1");
 
   /**
    * role: {@link EndpointUtils}<br>
    * default to any address
    */
-  protected List<String> urls = Collections.singletonList("http://127.0.0.1");
+  protected List<String> urls = DEFAULT_ADDRESSES;
 
   protected String appId;
 
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/base/DynamicEnum.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/base/DynamicEnum.java
index 7889332..6629db5 100644
--- a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/base/DynamicEnum.java
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/base/DynamicEnum.java
@@ -18,11 +18,15 @@ package org.apache.servicecomb.foundation.common.base;
 
 import java.util.Objects;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonValue;
 
 public abstract class DynamicEnum<T> {
   private T value;
 
+  @JsonIgnore
+  private boolean dynamic = false;
+
   public DynamicEnum(T value) {
     this.value = value;
   }
@@ -32,6 +36,20 @@ public abstract class DynamicEnum<T> {
     return value;
   }
 
+  @JsonIgnore
+  public boolean isStatic() {
+    return !dynamic;
+  }
+
+  public boolean isDynamic() {
+    return dynamic;
+  }
+
+  public DynamicEnum<T> setDynamic(boolean dynamic) {
+    this.dynamic = dynamic;
+    return this;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/base/DynamicEnumCache.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/base/DynamicEnumCache.java
index ff50aa5..74d27cd 100644
--- a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/base/DynamicEnumCache.java
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/base/DynamicEnumCache.java
@@ -70,10 +70,16 @@ public class DynamicEnumCache<T extends DynamicEnum<?>> {
     }
 
     T instance = values.get(value);
+    if (instance != null) {
+      return instance;
+    }
+
     try {
       // do not cache unknown value to avoid attach
       // if need to cache unknown value, should avoid cache too many values
-      return instance != null ? instance : constructor.newInstance(value);
+      instance = constructor.newInstance(value);
+      instance.setDynamic(true);
+      return instance;
     } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
       LOGGER.error("failed to create enum, class={}, value={}.", cls.getName(), value);
       return null;
diff --git a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/base/DynamicEnumTest.java b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/base/DynamicEnumTest.java
index 91d1e2c..6658172 100644
--- a/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/base/DynamicEnumTest.java
+++ b/foundations/foundation-common/src/test/java/org/apache/servicecomb/foundation/common/base/DynamicEnumTest.java
@@ -51,6 +51,20 @@ class DynamicEnumTest {
   }
 
   @Test
+  void should_be_dynamic_for_unknown_value() {
+    Color color = Color.fromValue("unknown");
+    assertThat(color.isDynamic()).isTrue();
+    assertThat(color.isStatic()).isFalse();
+  }
+
+  @Test
+  void should_be_static_for_known_value() {
+    Color color = Color.fromValue("RED");
+    assertThat(color.isDynamic()).isFalse();
+    assertThat(color.isStatic()).isTrue();
+  }
+
+  @Test
   void should_encode() {
     assertThat(Json.encode(Color.RED)).isEqualTo("\"RED\"");
   }