From 4369cb984079fe1f664f028f478ff00f346acafc Mon Sep 17 00:00:00 2001 From: jianggang Date: Thu, 30 Mar 2023 16:48:21 +0800 Subject: [PATCH 1/9] :sparkles: feat: support Prerequisite --- .../featureprobe/sdk/server/FeatureProbe.java | 9 +++-- .../sdk/server/model/Prerequisite.java | 23 +++++++++++ .../featureprobe/sdk/server/model/Toggle.java | 40 ++++++++++++++++++- 3 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/featureprobe/sdk/server/model/Prerequisite.java diff --git a/src/main/java/com/featureprobe/sdk/server/FeatureProbe.java b/src/main/java/com/featureprobe/sdk/server/FeatureProbe.java index 682deed..d914697 100644 --- a/src/main/java/com/featureprobe/sdk/server/FeatureProbe.java +++ b/src/main/java/com/featureprobe/sdk/server/FeatureProbe.java @@ -255,8 +255,9 @@ private T jsonEvaluate(String toggleKey, FPUser user, T defaultValue, Class< try { Toggle toggle = dataRepository.getToggle(toggleKey); Map segments = dataRepository.getAllSegment(); + Map toggles = dataRepository.getAllToggle(); if (Objects.nonNull(toggle)) { - EvaluationResult evalResult = toggle.eval(user, segments, defaultValue); + EvaluationResult evalResult = toggle.eval(user, toggles, segments, defaultValue, 1); String value = mapper.writeValueAsString(evalResult.getValue()); eventProcessor.push(buildAccessEvent(toggle, evalResult, user)); return mapper.readValue(value, clazz); @@ -273,8 +274,9 @@ private T genericEvaluate(String toggleKey, FPUser user, T defaultValue, Cla try { Toggle toggle = dataRepository.getToggle(toggleKey); Map segments = dataRepository.getAllSegment(); + Map toggles = dataRepository.getAllToggle(); if (Objects.nonNull(toggle)) { - EvaluationResult evalResult = toggle.eval(user, segments, defaultValue); + EvaluationResult evalResult = toggle.eval(user, toggles, segments, defaultValue, 1); eventProcessor.push(buildAccessEvent(toggle, evalResult, user)); return clazz.cast(evalResult.getValue()); } @@ -323,8 +325,9 @@ private FPDetail getEvaluateDetail(String toggleKey, FPUser user, T defau if (this.dataRepository.initialized()) { Toggle toggle = dataRepository.getToggle(toggleKey); Map segments = dataRepository.getAllSegment(); + Map toggles = dataRepository.getAllToggle(); if (Objects.nonNull(toggle)) { - EvaluationResult evalResult = toggle.eval(user, segments, defaultValue); + EvaluationResult evalResult = toggle.eval(user, toggles, segments, defaultValue, 1); if (isJson) { String res = mapper.writeValueAsString(evalResult.getValue()); detail.setValue(mapper.readValue(res, clazz)); diff --git a/src/main/java/com/featureprobe/sdk/server/model/Prerequisite.java b/src/main/java/com/featureprobe/sdk/server/model/Prerequisite.java new file mode 100644 index 0000000..343fbdf --- /dev/null +++ b/src/main/java/com/featureprobe/sdk/server/model/Prerequisite.java @@ -0,0 +1,23 @@ +package com.featureprobe.sdk.server.model; + +public class Prerequisite { + + private String key; + private Object value; + + public void setKey(String key) { + this.key = key; + } + + public void setValue(Object value) { + this.value = value; + } + + public String getKey() { + return key; + } + + public Object getValue() { + return value; + } +} diff --git a/src/main/java/com/featureprobe/sdk/server/model/Toggle.java b/src/main/java/com/featureprobe/sdk/server/model/Toggle.java index 690e3d3..9fc2eb1 100644 --- a/src/main/java/com/featureprobe/sdk/server/model/Toggle.java +++ b/src/main/java/com/featureprobe/sdk/server/model/Toggle.java @@ -20,9 +20,9 @@ import com.featureprobe.sdk.server.EvaluationResult; import com.featureprobe.sdk.server.FPUser; import com.featureprobe.sdk.server.HitResult; - import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; public final class Toggle { @@ -45,15 +45,28 @@ public final class Toggle { private List variations; + private List prerequisites; + private Boolean forClient; - public EvaluationResult eval(FPUser user, Map segments, Object defaultValue) { + public EvaluationResult eval(FPUser user, Map toggles, Map segments, + Object defaultValue, int deep) { + String warning = ""; if (!enabled) { return createDisabledResult(user, this.key, defaultValue); } + if(deep > 20) { + warning = "Exceeded maximum depth of 20"; + return createDefaultResult(user, key, defaultValue, warning); + } + + if (!prerequisite(user, toggles, segments, deep)) { + return createDefaultResult(user, key, defaultValue, warning); + } + if (rules != null && rules.size() > 0) { for (int i = 0; i < rules.size(); i++) { Rule rule = rules.get(i); @@ -82,6 +95,22 @@ private EvaluationResult createDefaultResult(FPUser user, String toggleKey, Obje return defaultResult; } + private boolean prerequisite(FPUser user, Map toggles, Map segments, int deep) { + if (Objects.isNull(prerequisites) || prerequisites.isEmpty()) { + return true; + } + for (Prerequisite prerequisite : prerequisites) { + Toggle toggle = toggles.get(prerequisite.getKey()); + if (Objects.isNull(toggle)) return false; + EvaluationResult eval = toggle.eval(user, toggles, segments, null, deep + 1); + if (Objects.isNull(eval.getValue())) return false; + if (!eval.getValue().equals(prerequisite.getValue())) { + return false; + } + } + return true; + } + private EvaluationResult hitValue(HitResult hitResult, Object defaultValue, Optional ruleIndex) { EvaluationResult res = new EvaluationResult(defaultValue, ruleIndex, hitResult.getIndex(), this.version, hitResult.getReason().orElse("")); @@ -177,4 +206,11 @@ public Long getLastModified() { return lastModified; } + public List getPrerequisites() { + return prerequisites; + } + + public void setPrerequisites(List prerequisites) { + this.prerequisites = prerequisites; + } } From ff68addba8025ba3353911bff3f52dd8bab56ab1 Mon Sep 17 00:00:00 2001 From: jianggang Date: Tue, 4 Apr 2023 17:06:19 +0800 Subject: [PATCH 2/9] :sparkles: feat: prerequisite_support --- pom.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 2569dee..7e22f2b 100644 --- a/pom.xml +++ b/pom.xml @@ -170,7 +170,8 @@ **/*Test **/*Spec - + false 3.0 false @@ -189,7 +190,7 @@ .github/misc/spotless-formatter.xml - + .github/misc/license-header @@ -218,7 +219,7 @@ **/*.md - + From fdfdc1ea09667214aa6f1fc58ea5a46d60f230d9 Mon Sep 17 00:00:00 2001 From: jianggang Date: Tue, 4 Apr 2023 17:12:31 +0800 Subject: [PATCH 3/9] :sparkles: feat: prerequisite_support --- pom.xml | 14 ++++++-------- .../PrerequisitesDeepOverflowException.java | 1 + .../com/featureprobe/sdk/server/model/Toggle.java | 11 ++++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pom.xml b/pom.xml index 7e22f2b..62a0b3d 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.featureprobe server-sdk-java - 2.1.0-SNAPSHOT + 2.1.0 server-sdk-java FeatureProbe Server Side SDK for Java @@ -170,8 +170,7 @@ **/*Test **/*Spec - + false 3.0 false @@ -190,7 +189,7 @@ .github/misc/spotless-formatter.xml - + .github/misc/license-header @@ -219,7 +218,7 @@ **/*.md - + @@ -305,12 +304,11 @@ analyze-only-in-package - package analyze-only - - + package + diff --git a/src/main/java/com/featureprobe/sdk/server/exceptions/PrerequisitesDeepOverflowException.java b/src/main/java/com/featureprobe/sdk/server/exceptions/PrerequisitesDeepOverflowException.java index d1958bb..ec6cd4a 100644 --- a/src/main/java/com/featureprobe/sdk/server/exceptions/PrerequisitesDeepOverflowException.java +++ b/src/main/java/com/featureprobe/sdk/server/exceptions/PrerequisitesDeepOverflowException.java @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.featureprobe.sdk.server.exceptions; public class PrerequisitesDeepOverflowException extends RuntimeException { diff --git a/src/main/java/com/featureprobe/sdk/server/model/Toggle.java b/src/main/java/com/featureprobe/sdk/server/model/Toggle.java index 6a208a3..a740f37 100644 --- a/src/main/java/com/featureprobe/sdk/server/model/Toggle.java +++ b/src/main/java/com/featureprobe/sdk/server/model/Toggle.java @@ -60,7 +60,7 @@ public EvaluationResult eval(FPUser user, Map toggles, Map toggles, Map Date: Tue, 4 Apr 2023 17:25:39 +0800 Subject: [PATCH 4/9] Update build.yml --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4e27f2a..1d6caae 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,6 +25,7 @@ jobs: - name: Build with Maven run: | + git submodule update --remote mvn -B package --file pom.xml mvn failsafe:integration-test From 0ecee7ce0de9a028de955785b86968a031fb7fe1 Mon Sep 17 00:00:00 2001 From: jianggang Date: Tue, 4 Apr 2023 17:31:34 +0800 Subject: [PATCH 5/9] Update build.yml --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d6caae..4b200f8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,6 +13,9 @@ jobs: steps: - uses: actions/checkout@v3 + with: + token: ${{ secrets.CI_TOKEN }} + submodules: true - name: Set up JDK 11 uses: actions/setup-java@v3 with: @@ -25,7 +28,6 @@ jobs: - name: Build with Maven run: | - git submodule update --remote mvn -B package --file pom.xml mvn failsafe:integration-test From 715f5e8bde1210a993609e299552dc10327a4d01 Mon Sep 17 00:00:00 2001 From: jianggang Date: Tue, 4 Apr 2023 17:34:44 +0800 Subject: [PATCH 6/9] Update build.yml --- .github/workflows/build.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4b200f8..e08a5a7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,6 +16,10 @@ jobs: with: token: ${{ secrets.CI_TOKEN }} submodules: true + - name: Git Sumbodule Update + run: | + git pull --recurse-submodules + git submodule update --remote --recursive - name: Set up JDK 11 uses: actions/setup-java@v3 with: From 52ce397f32b51b21b003864a6e573c41c33a003b Mon Sep 17 00:00:00 2001 From: jianggang Date: Tue, 4 Apr 2023 17:36:55 +0800 Subject: [PATCH 7/9] Create build.yml --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e08a5a7..0d2836e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,6 @@ jobs: steps: - uses: actions/checkout@v3 with: - token: ${{ secrets.CI_TOKEN }} submodules: true - name: Git Sumbodule Update run: | From 3125cb40a359423826a605ffeb9d7ef82c2d86ad Mon Sep 17 00:00:00 2001 From: jianggang Date: Tue, 4 Apr 2023 17:43:25 +0800 Subject: [PATCH 8/9] Update build.yml --- .github/workflows/build.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d2836e..c2e1758 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,11 +14,7 @@ jobs: steps: - uses: actions/checkout@v3 with: - submodules: true - - name: Git Sumbodule Update - run: | - git pull --recurse-submodules - git submodule update --remote --recursive + submodules: 'recursive' - name: Set up JDK 11 uses: actions/setup-java@v3 with: From 8bdf63d66cd5ec83586e43e04843285abe44d0fe Mon Sep 17 00:00:00 2001 From: jianggang Date: Tue, 4 Apr 2023 18:13:54 +0800 Subject: [PATCH 9/9] :sparkles: feat: prerequisite_support --- pom.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pom.xml b/pom.xml index 62a0b3d..6290496 100644 --- a/pom.xml +++ b/pom.xml @@ -218,6 +218,9 @@ **/*.md + + src/test/resources/test/** +