1+ package io .split .storages .pluggable .adapters ;
2+
3+ import io .split .client .dtos .RuleBasedSegment ;
4+ import io .split .client .utils .Json ;
5+ import io .split .engine .experiments .ParsedRuleBasedSegment ;
6+ import io .split .engine .experiments .RuleBasedSegmentParser ;
7+ import io .split .storages .RuleBasedSegmentCacheConsumer ;
8+ import io .split .storages .pluggable .domain .PrefixAdapter ;
9+ import io .split .storages .pluggable .domain .UserStorageWrapper ;
10+ import io .split .storages .pluggable .utils .Helper ;
11+ import org .slf4j .Logger ;
12+ import org .slf4j .LoggerFactory ;
13+ import pluggable .CustomStorageWrapper ;
14+
15+ import java .util .ArrayList ;
16+ import java .util .Collection ;
17+ import java .util .List ;
18+ import java .util .Set ;
19+ import java .util .stream .Collectors ;
20+
21+ import static com .google .common .base .Preconditions .checkNotNull ;
22+
23+ public class UserCustomRuleBasedSegmentAdapterConsumer implements RuleBasedSegmentCacheConsumer {
24+
25+ private static final Logger _log = LoggerFactory .getLogger (UserCustomRuleBasedSegmentAdapterConsumer .class );
26+
27+ private final RuleBasedSegmentParser _ruleBasedSegmentParser ;
28+ private final UserStorageWrapper _userStorageWrapper ;
29+
30+ public UserCustomRuleBasedSegmentAdapterConsumer (CustomStorageWrapper customStorageWrapper ) {
31+ _ruleBasedSegmentParser = new RuleBasedSegmentParser ();
32+ _userStorageWrapper = new UserStorageWrapper (checkNotNull (customStorageWrapper ));
33+ }
34+
35+ @ Override
36+ public long getChangeNumber () {
37+ String wrapperResponse = _userStorageWrapper .get (PrefixAdapter .buildRuleBasedSegmentChangeNumber ());
38+ return Helper .responseToLong (wrapperResponse , -1L );
39+ }
40+
41+ @ Override
42+ public ParsedRuleBasedSegment get (String name ) {
43+ String wrapperResponse = _userStorageWrapper .get (PrefixAdapter .buildRuleBasedSegmentKey (name ));
44+ if (wrapperResponse == null ) {
45+ return null ;
46+ }
47+ RuleBasedSegment ruleBasedSegment = Json .fromJson (wrapperResponse , RuleBasedSegment .class );
48+ if (ruleBasedSegment == null ) {
49+ _log .warn ("Could not parse RuleBasedSegment." );
50+ return null ;
51+ }
52+ return _ruleBasedSegmentParser .parse (ruleBasedSegment );
53+ }
54+
55+ @ Override
56+ public Collection <ParsedRuleBasedSegment > getAll () {
57+ Set <String > keys = _userStorageWrapper .getKeysByPrefix (PrefixAdapter .buildGetAllRuleBasedSegment ());
58+ if (keys == null ) {
59+ return new ArrayList <>();
60+ }
61+ List <String > wrapperResponse = _userStorageWrapper .getMany (new ArrayList <>(keys ));
62+ if (wrapperResponse == null ) {
63+ return new ArrayList <>();
64+ }
65+ return stringsToParsedRuleBasedSegments (wrapperResponse );
66+ }
67+
68+ @ Override
69+ public List <String > ruleBasedSegmentNames () {
70+ Set <String > ruleBasedSegmentNamesWithPrefix = _userStorageWrapper .getKeysByPrefix (PrefixAdapter .buildGetAllRuleBasedSegment ());
71+ ruleBasedSegmentNamesWithPrefix = ruleBasedSegmentNamesWithPrefix .stream ().
72+ map (key -> key .replace (PrefixAdapter .buildRuleBasedSegmentsPrefix (), "" )).
73+ collect (Collectors .toSet ());
74+ return new ArrayList <>(ruleBasedSegmentNamesWithPrefix );
75+ }
76+
77+ @ Override
78+ public Set <String > getSegments () {
79+ return getAll ().stream ()
80+ .flatMap (parsedRuleBasedSegment -> parsedRuleBasedSegment .
81+ getSegmentsNames ().stream ()).collect (Collectors .toSet ());
82+ }
83+
84+ private List <ParsedRuleBasedSegment > stringsToParsedRuleBasedSegments (List <String > elements ) {
85+ List <ParsedRuleBasedSegment > result = new ArrayList <>();
86+ for (String s : elements ) {
87+ if (s != null ) {
88+ result .add (_ruleBasedSegmentParser .parse (Json .fromJson (s , RuleBasedSegment .class )));
89+ continue ;
90+ }
91+ result .add (null );
92+ }
93+ return result ;
94+ }
95+ }
0 commit comments