Skip to content

Commit faf570e

Browse files
Merge pull request #188 from splitio/localhost-client-refactor
LocalhostSplitClient Refactor
2 parents 10bdfc0 + efdc30d commit faf570e

14 files changed

+167
-366
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package io.split.client;
2+
3+
import com.google.common.collect.Lists;
4+
import io.split.cache.SplitCache;
5+
import io.split.client.dtos.ConditionType;
6+
import io.split.client.dtos.MatcherCombiner;
7+
import io.split.client.dtos.Partition;
8+
import io.split.engine.experiments.ParsedCondition;
9+
import io.split.engine.experiments.ParsedSplit;
10+
import io.split.engine.matchers.AllKeysMatcher;
11+
import io.split.engine.matchers.AttributeMatcher;
12+
import io.split.engine.matchers.CombiningMatcher;
13+
import io.split.engine.matchers.strings.WhitelistMatcher;
14+
import io.split.grammar.Treatments;
15+
16+
import java.util.ArrayList;
17+
import java.util.HashMap;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.Comparator;
21+
import java.util.stream.Collectors;
22+
23+
public final class CacheUpdaterService {
24+
25+
private static String LOCALHOST = "localhost";
26+
private SplitCache _splitCache;
27+
28+
public CacheUpdaterService(SplitCache splitCache) {
29+
_splitCache = splitCache;
30+
}
31+
32+
public void updateCache(Map<SplitAndKey, LocalhostSplit> map) {
33+
_splitCache.clear();
34+
for (Map.Entry<SplitAndKey,LocalhostSplit> entrySplit : map.entrySet()) {
35+
SplitAndKey splitAndKey = entrySplit.getKey();
36+
String splitName = splitAndKey.split();
37+
String splitKey = splitAndKey.key();
38+
LocalhostSplit localhostSplit = entrySplit.getValue();
39+
ParsedSplit split = _splitCache.get(splitName);
40+
List<ParsedCondition> conditions = getConditions(splitKey, split, localhostSplit.treatment);
41+
String treatment = conditions.size() > 0 ? Treatments.CONTROL : localhostSplit.treatment;
42+
Map<String, String> configurations = new HashMap<>();
43+
if(split != null && split.configurations().size() > 0) {
44+
configurations = split.configurations();
45+
}
46+
configurations.put(localhostSplit.treatment, localhostSplit.config);
47+
48+
split = new ParsedSplit(splitName, 0, false, treatment,conditions, LOCALHOST, 0, 100, 0, 0, configurations);
49+
_splitCache.put(split);
50+
}
51+
}
52+
53+
private List<ParsedCondition> getConditions(String splitKey, ParsedSplit split, String treatment){
54+
List<ParsedCondition> conditions = split == null ? new ArrayList<>() : split.parsedConditions().stream().collect(Collectors.toList());
55+
Partition partition = new Partition();
56+
partition.treatment = treatment;
57+
partition.size = 100;
58+
59+
if(splitKey != null) {
60+
conditions.add(createWhitelistCondition(splitKey, partition));
61+
}
62+
else {
63+
conditions = conditions.stream().filter(pc -> ConditionType.WHITELIST.equals(pc.conditionType())).collect(Collectors.toList());
64+
conditions.add(createRolloutCondition(partition));
65+
}
66+
conditions.sort(Comparator.comparing(ParsedCondition::conditionType));
67+
return conditions;
68+
}
69+
70+
private ParsedCondition createWhitelistCondition(String splitKey, Partition partition) {
71+
ParsedCondition parsedCondition = new ParsedCondition(ConditionType.WHITELIST,
72+
new CombiningMatcher(MatcherCombiner.AND,
73+
Lists.newArrayList(new AttributeMatcher(null, new WhitelistMatcher(Lists.newArrayList(splitKey)), false))),
74+
Lists.newArrayList(partition), splitKey);
75+
return parsedCondition;
76+
}
77+
78+
private ParsedCondition createRolloutCondition(Partition partition) {
79+
Partition rolloutPartition = new Partition();
80+
rolloutPartition.treatment = "-";
81+
rolloutPartition.size = 0;
82+
ParsedCondition parsedCondition = new ParsedCondition(ConditionType.ROLLOUT,
83+
new CombiningMatcher(MatcherCombiner.AND,
84+
Lists.newArrayList(new AttributeMatcher(null, new AllKeysMatcher(), false))),
85+
Lists.newArrayList(partition, rolloutPartition), "LOCAL");
86+
87+
return parsedCondition;
88+
}
89+
90+
}

client/src/main/java/io/split/client/LocalhostSplitClient.java

Lines changed: 0 additions & 142 deletions
This file was deleted.

client/src/main/java/io/split/client/LocalhostSplitClientAndFactory.java

Lines changed: 0 additions & 101 deletions
This file was deleted.

client/src/main/java/io/split/client/LocalhostSplitFactory.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
package io.split.client;
22

3+
import io.split.cache.InMemoryCacheImp;
4+
import io.split.cache.SplitCache;
5+
import io.split.client.impressions.ImpressionsManager;
6+
import io.split.engine.SDKReadinessGates;
7+
import io.split.engine.evaluator.EvaluatorImp;
8+
import io.split.engine.metrics.Metrics;
39
import org.slf4j.Logger;
410
import org.slf4j.LoggerFactory;
511

@@ -23,9 +29,10 @@ public final class LocalhostSplitFactory implements SplitFactory {
2329
static final String FILENAME = ".split";
2430
static final String LOCALHOST = "localhost";
2531

26-
private final LocalhostSplitClientAndFactory _client;
32+
private final SplitClient _client;
2733
private final LocalhostSplitManager _manager;
2834
private final AbstractLocalhostSplitFile _splitFile;
35+
private final CacheUpdaterService _cacheUpdaterService;
2936

3037
public static LocalhostSplitFactory createLocalhostSplitFactory(SplitClientConfig config) throws IOException {
3138
String directory = System.getProperty("user.home");
@@ -44,7 +51,15 @@ public LocalhostSplitFactory(String directory, String file) throws IOException {
4451
}
4552

4653
Map<SplitAndKey, LocalhostSplit> splitAndKeyToTreatment = _splitFile.readOnSplits();
47-
_client = new LocalhostSplitClientAndFactory(this, new LocalhostSplitClient(splitAndKeyToTreatment));
54+
SplitCache splitCache = new InMemoryCacheImp();
55+
SDKReadinessGates sdkReadinessGates = new SDKReadinessGates();
56+
57+
sdkReadinessGates.splitsAreReady();
58+
_cacheUpdaterService = new CacheUpdaterService(splitCache);
59+
_cacheUpdaterService.updateCache(splitAndKeyToTreatment);
60+
_client = new SplitClientImpl(this, splitCache,
61+
new ImpressionsManager.NoOpImpressionsManager(), new Metrics.NoopMetrics(), new NoopEventClient(),
62+
SplitClientConfig.builder().setBlockUntilReadyTimeout(1).build(), sdkReadinessGates, new EvaluatorImp(splitCache));
4863
_manager = LocalhostSplitManager.of(splitAndKeyToTreatment);
4964

5065
_splitFile.registerWatcher();
@@ -73,7 +88,7 @@ public boolean isDestroyed() {
7388
}
7489

7590
public void updateFeatureToTreatmentMap(Map<SplitAndKey, LocalhostSplit> featureToTreatmentMap) {
76-
_client.updateFeatureToTreatmentMap(featureToTreatmentMap);
91+
_cacheUpdaterService.updateCache(featureToTreatmentMap);
7792
_manager.updateFeatureToTreatmentMap(featureToTreatmentMap);
7893
}
7994
}

client/src/main/java/io/split/client/LocalhostSplitManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public void blockUntilReady() throws TimeoutException, InterruptedException {
7777

7878
@Override
7979
public SplitView split(String featureName) {
80-
if (!_splitAndKeyToTreatmentMap.containsKey(featureName)) {
80+
if (!_splitToTreatmentsMap.containsKey(featureName)) {
8181
return null;
8282
}
8383

0 commit comments

Comments
 (0)