Skip to content

Commit 0cbde4c

Browse files
committed
RBS parser
1 parent cfa0c6c commit 0cbde4c

21 files changed

Lines changed: 684 additions & 252 deletions

src/main/java/io/split/android/client/SplitClientFactoryImpl.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ public class SplitClientFactoryImpl implements SplitClientFactory {
3636
private final SplitFactory mSplitFactory;
3737
private final SplitClientContainer mClientContainer;
3838
private final SplitClientConfig mConfig;
39-
private final SyncManager mSyncManager;
4039

4140
private final TelemetrySynchronizer mTelemetrySynchronizer;
4241
private final SplitStorageContainer mStorageContainer;
@@ -58,11 +57,11 @@ public SplitClientFactoryImpl(@NonNull SplitFactory splitFactory,
5857
@NonNull KeyValidator keyValidator,
5958
@NonNull EventsTracker eventsTracker,
6059
@NonNull ImpressionListener.FederatedImpressionListener customerImpressionListener,
61-
@Nullable FlagSetsFilter flagSetsFilter) {
60+
@Nullable FlagSetsFilter flagSetsFilter,
61+
@NonNull SplitParser splitParser) {
6262
mSplitFactory = checkNotNull(splitFactory);
6363
mClientContainer = checkNotNull(clientContainer);
6464
mConfig = checkNotNull(config);
65-
mSyncManager = checkNotNull(syncManager);
6665

6766
mStorageContainer = checkNotNull(storageContainer);
6867
mTelemetrySynchronizer = checkNotNull(telemetrySynchronizer);
@@ -73,7 +72,7 @@ public SplitClientFactoryImpl(@NonNull SplitFactory splitFactory,
7372
validationLogger,
7473
splitTaskExecutor,
7574
mStorageContainer.getPersistentAttributesStorage());
76-
mSplitParser = new SplitParser(mStorageContainer.getMySegmentsStorageContainer(), mStorageContainer.getMyLargeSegmentsStorageContainer());
75+
mSplitParser = splitParser;
7776
mSplitValidator = new SplitValidatorImpl();
7877
SplitsStorage splitsStorage = mStorageContainer.getSplitsStorage();
7978
mTreatmentManagerFactory = new TreatmentManagerFactoryImpl(

src/main/java/io/split/android/client/SplitFactoryHelper.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,12 @@
8484
import io.split.android.client.storage.db.SplitRoomDatabase;
8585
import io.split.android.client.storage.db.StorageFactory;
8686
import io.split.android.client.storage.events.PersistentEventsStorage;
87+
import io.split.android.client.storage.general.GeneralInfoStorage;
8788
import io.split.android.client.storage.impressions.PersistentImpressionsStorage;
89+
import io.split.android.client.storage.rbs.LazyRuleBasedSegmentStorageProvider;
90+
import io.split.android.client.storage.rbs.RuleBasedSegmentStorage;
91+
import io.split.android.client.storage.rbs.RuleBasedSegmentStorageImpl;
92+
import io.split.android.client.storage.rbs.RuleBasedSegmentStorageProvider;
8893
import io.split.android.client.storage.splits.SplitsStorage;
8994
import io.split.android.client.telemetry.TelemetrySynchronizer;
9095
import io.split.android.client.telemetry.TelemetrySynchronizerImpl;
@@ -93,6 +98,8 @@
9398
import io.split.android.client.telemetry.storage.TelemetryStorage;
9499
import io.split.android.client.utils.Utils;
95100
import io.split.android.client.utils.logger.Logger;
101+
import io.split.android.engine.experiments.ParserCommons;
102+
import io.split.android.engine.experiments.RuleBasedSegmentParser;
96103

97104
class SplitFactoryHelper {
98105
private static final int DB_MAGIC_CHARS_COUNT = 4;
@@ -169,6 +176,7 @@ SplitStorageContainer buildStorageContainer(UserConsent userConsentStatus,
169176
StorageFactory.getPersistentEventsStorage(splitRoomDatabase, splitCipher);
170177
PersistentImpressionsStorage persistentImpressionsStorage =
171178
StorageFactory.getPersistentImpressionsStorage(splitRoomDatabase, splitCipher);
179+
GeneralInfoStorage generalInfoStorage = StorageFactory.getGeneralInfoStorage(splitRoomDatabase);
172180
return new SplitStorageContainer(
173181
StorageFactory.getSplitsStorage(splitRoomDatabase, splitCipher),
174182
StorageFactory.getMySegmentsStorage(splitRoomDatabase, splitCipher),
@@ -184,7 +192,9 @@ SplitStorageContainer buildStorageContainer(UserConsent userConsentStatus,
184192
StorageFactory.getPersistentAttributesStorage(splitRoomDatabase, splitCipher),
185193
getTelemetryStorage(shouldRecordTelemetry, telemetryStorage),
186194
StorageFactory.getImpressionsObserverCachePersistentStorage(splitRoomDatabase, observerCacheExpirationPeriod, impressionsObserverExecutor),
187-
StorageFactory.getGeneralInfoStorage(splitRoomDatabase));
195+
generalInfoStorage,
196+
StorageFactory.getRuleBasedSegmentStorageProvider(),
197+
StorageFactory.getPersistentRuleBasedSegmentStorage(splitRoomDatabase, splitCipher, generalInfoStorage));
188198
}
189199

190200
SplitApiFacade buildApiFacade(SplitClientConfig splitClientConfig,
@@ -462,6 +472,21 @@ ExecutorService getImpressionsLoggingTaskExecutor() {
462472
new ThreadPoolExecutor.CallerRunsPolicy());
463473
}
464474

475+
@NonNull
476+
static ParserCommons getParserCommons(SplitStorageContainer storageContainer) {
477+
RuleBasedSegmentStorageProvider ruleBasedSegmentStorageProvider = storageContainer.getRuleBasedSegmentStorageProvider();
478+
ParserCommons parserCommons = new ParserCommons(
479+
storageContainer.getMySegmentsStorageContainer(),
480+
storageContainer.getMyLargeSegmentsStorageContainer(),
481+
ruleBasedSegmentStorageProvider);
482+
RuleBasedSegmentParser ruleBasedSegmentParser = new RuleBasedSegmentParser(parserCommons);
483+
484+
RuleBasedSegmentStorage ruleBasedSegmentStorage =
485+
new RuleBasedSegmentStorageImpl(storageContainer.getPersistentRuleBasedSegmentStorage(), ruleBasedSegmentParser);
486+
((LazyRuleBasedSegmentStorageProvider) ruleBasedSegmentStorageProvider).set(ruleBasedSegmentStorage);
487+
return parserCommons;
488+
}
489+
465490
private TelemetryStorage getTelemetryStorage(boolean shouldRecordTelemetry, TelemetryStorage telemetryStorage) {
466491
if (telemetryStorage != null) {
467492
return telemetryStorage;

src/main/java/io/split/android/client/SplitFactoryImpl.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import io.split.android.client.validators.ValidationErrorInfo;
7272
import io.split.android.client.validators.ValidationMessageLogger;
7373
import io.split.android.client.validators.ValidationMessageLoggerImpl;
74+
import io.split.android.engine.experiments.ParserCommons;
7475
import io.split.android.engine.experiments.SplitParser;
7576

7677
public class SplitFactoryImpl implements SplitFactory {
@@ -272,12 +273,18 @@ private SplitFactoryImpl(@NonNull String apiToken, @NonNull Key key, @NonNull Sp
272273
mEventsManagerCoordinator, mSynchronizer, streamingComponents.getNotificationParser(),
273274
streamingComponents.getNotificationProcessor(), streamingComponents.getSseAuthenticator(),
274275
mStorageContainer, mSyncManager, compressionProvider);
276+
277+
ParserCommons parserCommons = SplitFactoryHelper.getParserCommons(mStorageContainer);
278+
279+
// Create SplitParser with ParserCommons
280+
SplitParser splitParser = new SplitParser(parserCommons);
281+
275282
mClientContainer = new SplitClientContainerImpl(
276283
mDefaultClientKey.matchingKey(), this, config, mSyncManager,
277284
telemetrySynchronizer, mStorageContainer, splitTaskExecutor, splitApiFacade,
278285
validationLogger, keyValidator, customerImpressionListener,
279286
streamingComponents.getPushNotificationManager(), componentsRegister, workManagerWrapper,
280-
eventsTracker, flagSetsFilter);
287+
eventsTracker, flagSetsFilter, splitParser);
281288
mDestroyer = new Runnable() {
282289
public void run() {
283290
mInitLock.lock();
@@ -355,10 +362,9 @@ public void run() {
355362

356363
// Initialize default client
357364
client();
358-
SplitParser mSplitParser = new SplitParser(mStorageContainer.getMySegmentsStorageContainer(), mStorageContainer.getMyLargeSegmentsStorageContainer());
359365
mManager = new SplitManagerImpl(
360366
mStorageContainer.getSplitsStorage(),
361-
new SplitValidatorImpl(), mSplitParser);
367+
new SplitValidatorImpl(), splitParser);
362368

363369
}
364370

src/main/java/io/split/android/client/dtos/Excluded.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.gson.annotations.SerializedName;
44

5+
import java.util.HashSet;
56
import java.util.Set;
67

78
public class Excluded {
@@ -19,4 +20,11 @@ public Set<String> getSegments() {
1920
public Set<String> getKeys() {
2021
return mKeys;
2122
}
23+
24+
public static Excluded createEmpty() {
25+
Excluded excluded = new Excluded();
26+
excluded.mKeys = new HashSet<>();
27+
excluded.mSegments = new HashSet<>();
28+
return excluded;
29+
}
2230
}

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.split.android.client.validators.AttributesValidatorImpl;
3535
import io.split.android.client.validators.SplitValidatorImpl;
3636
import io.split.android.client.validators.ValidationMessageLoggerImpl;
37+
import io.split.android.engine.experiments.ParserCommons;
3738
import io.split.android.engine.experiments.SplitParser;
3839

3940
/**
@@ -66,7 +67,9 @@ public LocalhostSplitFactory(String key, Context context,
6667
EventsManagerCoordinator eventsManagerCoordinator = new EventsManagerCoordinator();
6768
FileStorage fileStorage = new FileStorage(context.getCacheDir(), ServiceConstants.LOCALHOST_FOLDER);
6869
SplitsStorage splitsStorage = new LocalhostSplitsStorage(mLocalhostFileName, context, fileStorage, eventsManagerCoordinator);
69-
SplitParser splitParser = new SplitParser(new LocalhostMySegmentsStorageContainer(), new LocalhostMySegmentsStorageContainer());
70+
71+
SplitParser splitParser = getSplitParser();
72+
7073
SplitTaskExecutorImpl taskExecutor = new SplitTaskExecutorImpl();
7174
AttributesManagerFactory attributesManagerFactory = new AttributesManagerFactoryImpl(new AttributesValidatorImpl(), new ValidationMessageLoggerImpl());
7275

@@ -102,6 +105,14 @@ public LocalhostSplitFactory(String key, Context context,
102105
Logger.i("Android SDK initialized!");
103106
}
104107

108+
@NonNull
109+
private static SplitParser getSplitParser() {
110+
return new SplitParser(new ParserCommons(
111+
new LocalhostMySegmentsStorageContainer(),
112+
new LocalhostMySegmentsStorageContainer(),
113+
new LocalhostRuleBasedSegmentsStorageProvider(new LocalhostRuleBasedSegmentsStorage())));
114+
}
115+
105116
@VisibleForTesting
106117
LocalhostSplitFactory(@NonNull SplitsStorage splitsStorage,
107118
@NonNull SplitParser splitParser,

src/main/java/io/split/android/client/shared/SplitClientContainerImpl.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import io.split.android.client.telemetry.TelemetrySynchronizer;
3838
import io.split.android.client.validators.KeyValidator;
3939
import io.split.android.client.validators.ValidationMessageLogger;
40+
import io.split.android.engine.experiments.SplitParser;
4041

4142
public final class SplitClientContainerImpl extends BaseSplitClientContainer {
4243

@@ -74,7 +75,8 @@ public SplitClientContainerImpl(@NonNull String defaultMatchingKey,
7475
@NonNull ClientComponentsRegister clientComponentsRegister,
7576
@NonNull MySegmentsWorkManagerWrapper workManagerWrapper,
7677
@NonNull EventsTracker eventsTracker,
77-
@Nullable FlagSetsFilter flagSetsFilter) {
78+
@Nullable FlagSetsFilter flagSetsFilter,
79+
@NonNull SplitParser splitParser) {
7880
mDefaultMatchingKey = checkNotNull(defaultMatchingKey);
7981
mPushNotificationManager = pushNotificationManager;
8082
mStreamingEnabled = config.streamingEnabled();
@@ -93,7 +95,8 @@ public SplitClientContainerImpl(@NonNull String defaultMatchingKey,
9395
keyValidator,
9496
eventsTracker,
9597
customerImpressionListener,
96-
flagSetsFilter
98+
flagSetsFilter,
99+
splitParser
97100
);
98101
mClientComponentsRegister = checkNotNull(clientComponentsRegister);
99102
mSplitTaskExecutor = checkNotNull(splitTaskExecutor);

src/main/java/io/split/android/client/storage/common/SplitStorageContainer.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import io.split.android.client.storage.impressions.PersistentImpressionsUniqueStorage;
1818
import io.split.android.client.storage.mysegments.MySegmentsStorage;
1919
import io.split.android.client.storage.mysegments.MySegmentsStorageContainer;
20+
import io.split.android.client.storage.rbs.PersistentRuleBasedSegmentStorage;
21+
import io.split.android.client.storage.rbs.RuleBasedSegmentStorageProvider;
2022
import io.split.android.client.storage.splits.PersistentSplitsStorage;
2123
import io.split.android.client.storage.splits.SplitsStorage;
2224
import io.split.android.client.telemetry.storage.TelemetryStorage;
@@ -38,6 +40,8 @@ public class SplitStorageContainer {
3840
private final PersistentImpressionsUniqueStorage mPersistentImpressionsUniqueStorage;
3941
private final PersistentImpressionsObserverCacheStorage mPersistentImpressionsObserverCacheStorage;
4042
private final GeneralInfoStorage mGeneralInfoStorage;
43+
private final RuleBasedSegmentStorageProvider mRuleBasedSegmentStorageProvider;
44+
private final PersistentRuleBasedSegmentStorage mPersistentRuleBasedSegmentStorage;
4145

4246
public SplitStorageContainer(@NonNull SplitsStorage splitStorage,
4347
@NonNull MySegmentsStorageContainer mySegmentsStorageContainer,
@@ -53,7 +57,9 @@ public SplitStorageContainer(@NonNull SplitsStorage splitStorage,
5357
@NonNull PersistentAttributesStorage persistentAttributesStorage,
5458
@NonNull TelemetryStorage telemetryStorage,
5559
@NonNull PersistentImpressionsObserverCacheStorage persistentImpressionsObserverCacheStorage,
56-
@NonNull GeneralInfoStorage generalInfoStorage) {
60+
@NonNull GeneralInfoStorage generalInfoStorage,
61+
@NonNull RuleBasedSegmentStorageProvider ruleBasedSegmentStorageProvider,
62+
@NonNull PersistentRuleBasedSegmentStorage persistentRuleBasedSegmentStorage) {
5763

5864
mSplitStorage = checkNotNull(splitStorage);
5965
mMySegmentsStorageContainer = checkNotNull(mySegmentsStorageContainer);
@@ -70,6 +76,8 @@ public SplitStorageContainer(@NonNull SplitsStorage splitStorage,
7076
mPersistentImpressionsUniqueStorage = checkNotNull(persistentImpressionsUniqueStorage);
7177
mPersistentImpressionsObserverCacheStorage = checkNotNull(persistentImpressionsObserverCacheStorage);
7278
mGeneralInfoStorage = checkNotNull(generalInfoStorage);
79+
mRuleBasedSegmentStorageProvider = checkNotNull(ruleBasedSegmentStorageProvider);
80+
mPersistentRuleBasedSegmentStorage = checkNotNull(persistentRuleBasedSegmentStorage);
7381
}
7482

7583
public SplitsStorage getSplitsStorage() {
@@ -143,4 +151,12 @@ public PersistentImpressionsObserverCacheStorage getImpressionsObserverCachePers
143151
public GeneralInfoStorage getGeneralInfoStorage() {
144152
return mGeneralInfoStorage;
145153
}
154+
155+
public RuleBasedSegmentStorageProvider getRuleBasedSegmentStorageProvider() {
156+
return mRuleBasedSegmentStorageProvider;
157+
}
158+
159+
public PersistentRuleBasedSegmentStorage getPersistentRuleBasedSegmentStorage() {
160+
return mPersistentRuleBasedSegmentStorage;
161+
}
146162
}

src/main/java/io/split/android/client/storage/rbs/RuleBasedSegmentStorageImpl.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
import io.split.android.client.dtos.RuleBasedSegment;
1414
import io.split.android.engine.experiments.ParsedRuleBasedSegment;
15+
import io.split.android.engine.experiments.RuleBasedSegmentParser;
1516

1617
public class RuleBasedSegmentStorageImpl implements RuleBasedSegmentStorage {
1718

@@ -99,11 +100,4 @@ public void clear() {
99100
mChangeNumber = -1;
100101
mPersistentStorage.clear();
101102
}
102-
103-
// stub class
104-
static final class RuleBasedSegmentParser {
105-
ParsedRuleBasedSegment parse(RuleBasedSegment segment, String matchingKey) {
106-
return null;
107-
}
108-
}
109103
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.split.android.engine.experiments;
2+
3+
import androidx.annotation.Nullable;
4+
5+
interface Parser<I, O> {
6+
7+
@Nullable
8+
O parse(I input, String matchingKey);
9+
}

0 commit comments

Comments
 (0)