Skip to content

Commit f74fe5f

Browse files
authored
fix: ConcurrentModificationException on flag config change java 9 (#954)
Signed-off-by: Todd Baert <[email protected]>
1 parent d3de874 commit f74fe5f

File tree

2 files changed

+6
-7
lines changed
  • providers/flagd/src
    • main/java/dev/openfeature/contrib/providers/flagd/resolver/process/model
    • test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage

2 files changed

+6
-7
lines changed

providers/flagd/src/main/java/dev/openfeature/contrib/providers/flagd/resolver/process/model/FlagParser.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,7 @@ public class FlagParser {
2929
private static final String FLAG_KEY = "flags";
3030
private static final String EVALUATOR_KEY = "$evaluators";
3131
private static final String REPLACER_FORMAT = "\"\\$ref\":(\\s)*\"%s\"";
32-
3332
private static final ObjectMapper MAPPER = new ObjectMapper();
34-
private static final Map<String, Pattern> PATTERN_MAP = new HashMap<>();
35-
3633
private static JsonSchema SCHEMA_VALIDATOR;
3734

3835
private FlagParser() {
@@ -100,6 +97,7 @@ public static Map<String, FeatureFlag> parseString(final String configuration, b
10097

10198
private static String transposeEvaluators(final String configuration) throws IOException {
10299
try (JsonParser parser = MAPPER.createParser(configuration)) {
100+
final Map<String, Pattern> patternMap = new HashMap<>();
103101
final TreeNode treeNode = parser.readValueAsTree();
104102
final TreeNode evaluators = treeNode.get(EVALUATOR_KEY);
105103

@@ -120,7 +118,7 @@ private static String transposeEvaluators(final String configuration) throws IOE
120118

121119
// then derive pattern
122120
final Pattern reg_replace =
123-
PATTERN_MAP.computeIfAbsent(replacePattern, s -> Pattern.compile(replacePattern));
121+
patternMap.computeIfAbsent(replacePattern, s -> Pattern.compile(replacePattern));
124122

125123
// finally replace all references
126124
replacedConfigurations = reg_replace.matcher(replacedConfigurations).replaceAll(replacer);

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/resolver/process/storage/FlagStoreTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.junit.jupiter.api.Test;
99

1010
import java.time.Duration;
11+
import java.util.HashSet;
1112
import java.util.Map;
1213
import java.util.concurrent.BlockingQueue;
1314
import java.util.concurrent.LinkedBlockingQueue;
@@ -98,9 +99,9 @@ public void changedFlags() throws Exception {
9899
Map<String, FeatureFlag> expectedChangedFlags =
99100
FlagParser.parseString(getFlagsFromResource(VALID_LONG),true);
100101
expectedChangedFlags.remove("myBoolFlag");
101-
// flags changed from initial VALID_SIMPLE flag
102-
Assert.assertEquals(expectedChangedFlags.keySet().stream().collect(Collectors.toList()),
103-
storageStateDTOS.take().getChangedFlagsKeys());
102+
// flags changed from initial VALID_SIMPLE flag, as a set because we don't care about order
103+
Assert.assertEquals(expectedChangedFlags.keySet().stream().collect(Collectors.toSet()),
104+
new HashSet<>(storageStateDTOS.take().getChangedFlagsKeys()));
104105
}
105106

106107
}

0 commit comments

Comments
 (0)