Skip to content

Commit 9327053

Browse files
committed
RBS parser (#744)
1 parent 2a7a3dd commit 9327053

22 files changed

+662
-257
lines changed

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 SplitFactoryImpl.EventsTrackerProvider eventsTrackerProvider,
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: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@
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.RuleBasedSegmentStorage;
90+
import io.split.android.client.storage.rbs.RuleBasedSegmentStorageImpl;
8891
import io.split.android.client.storage.splits.SplitsStorage;
8992
import io.split.android.client.telemetry.TelemetrySynchronizer;
9093
import io.split.android.client.telemetry.TelemetrySynchronizerImpl;
@@ -93,6 +96,8 @@
9396
import io.split.android.client.telemetry.storage.TelemetryStorage;
9497
import io.split.android.client.utils.Utils;
9598
import io.split.android.client.utils.logger.Logger;
99+
import io.split.android.engine.experiments.ParserCommons;
100+
import io.split.android.engine.experiments.RuleBasedSegmentParser;
96101

97102
class SplitFactoryHelper {
98103
private static final int DB_MAGIC_CHARS_COUNT = 4;
@@ -169,6 +174,7 @@ SplitStorageContainer buildStorageContainer(UserConsent userConsentStatus,
169174
StorageFactory.getPersistentEventsStorage(splitRoomDatabase, splitCipher);
170175
PersistentImpressionsStorage persistentImpressionsStorage =
171176
StorageFactory.getPersistentImpressionsStorage(splitRoomDatabase, splitCipher);
177+
GeneralInfoStorage generalInfoStorage = StorageFactory.getGeneralInfoStorage(splitRoomDatabase);
172178
return new SplitStorageContainer(
173179
splitsStorage,
174180
StorageFactory.getMySegmentsStorage(splitRoomDatabase, splitCipher),
@@ -184,7 +190,8 @@ SplitStorageContainer buildStorageContainer(UserConsent userConsentStatus,
184190
StorageFactory.getPersistentAttributesStorage(splitRoomDatabase, splitCipher),
185191
getTelemetryStorage(shouldRecordTelemetry, telemetryStorage),
186192
StorageFactory.getImpressionsObserverCachePersistentStorage(splitRoomDatabase, observerCacheExpirationPeriod, impressionsObserverExecutor),
187-
StorageFactory.getGeneralInfoStorage(splitRoomDatabase));
193+
generalInfoStorage,
194+
StorageFactory.getPersistentRuleBasedSegmentStorage(splitRoomDatabase, splitCipher, generalInfoStorage));
188195
}
189196

190197
SplitApiFacade buildApiFacade(SplitClientConfig splitClientConfig,
@@ -462,6 +469,22 @@ ExecutorService getImpressionsLoggingTaskExecutor() {
462469
new ThreadPoolExecutor.CallerRunsPolicy());
463470
}
464471

472+
@NonNull
473+
static ParserCommons getParserCommons(SplitStorageContainer storageContainer) {
474+
ParserCommons parserCommons = new ParserCommons(
475+
storageContainer.getMySegmentsStorageContainer(),
476+
storageContainer.getMyLargeSegmentsStorageContainer());
477+
478+
RuleBasedSegmentParser ruleBasedSegmentParser = new RuleBasedSegmentParser(parserCommons);
479+
480+
RuleBasedSegmentStorage ruleBasedSegmentStorage =
481+
new RuleBasedSegmentStorageImpl(storageContainer.getPersistentRuleBasedSegmentStorage(), ruleBasedSegmentParser);
482+
483+
parserCommons.setRuleBasedSegmentStorage(ruleBasedSegmentStorage);
484+
485+
return parserCommons;
486+
}
487+
465488
private TelemetryStorage getTelemetryStorage(boolean shouldRecordTelemetry, TelemetryStorage telemetryStorage) {
466489
if (telemetryStorage != null) {
467490
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
@@ -74,6 +74,7 @@
7474
import io.split.android.client.validators.ValidationErrorInfo;
7575
import io.split.android.client.validators.ValidationMessageLogger;
7676
import io.split.android.client.validators.ValidationMessageLoggerImpl;
77+
import io.split.android.engine.experiments.ParserCommons;
7778
import io.split.android.engine.experiments.SplitParser;
7879

7980
public class SplitFactoryImpl implements SplitFactory {
@@ -284,12 +285,18 @@ private SplitFactoryImpl(@NonNull String apiToken, @NonNull Key key, @NonNull Sp
284285
streamingComponents.getNotificationProcessor(), streamingComponents.getSseAuthenticator(),
285286
mStorageContainer, mSyncManager, compressionProvider);
286287

288+
ParserCommons parserCommons = SplitFactoryHelper.getParserCommons(mStorageContainer);
289+
290+
// Create SplitParser with ParserCommons
291+
SplitParser splitParser = new SplitParser(parserCommons);
292+
287293
mClientContainer = new SplitClientContainerImpl(
288294
mDefaultClientKey.matchingKey(), this, config, mSyncManager,
289295
telemetrySynchronizer, mStorageContainer, mSplitTaskExecutor, splitApiFacade,
290296
validationLogger, keyValidator, customerImpressionListener,
291297
streamingComponents.getPushNotificationManager(), componentsRegister, workManagerWrapper,
292-
mEventsTrackerProvider, flagSetsFilter);
298+
mEventsTrackerProvider, flagSetsFilter, splitParser);
299+
293300

294301
mDestroyer = new Runnable() {
295302
public void run() {
@@ -370,10 +377,9 @@ public void run() {
370377

371378
// Initialize default client
372379
client();
373-
SplitParser mSplitParser = new SplitParser(mStorageContainer.getMySegmentsStorageContainer(), mStorageContainer.getMyLargeSegmentsStorageContainer());
374380
mManager = new SplitManagerImpl(
375381
mStorageContainer.getSplitsStorage(),
376-
new SplitValidatorImpl(), mSplitParser);
382+
new SplitValidatorImpl(), splitParser);
377383
}
378384

379385
@NonNull

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: 13 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,15 @@ public LocalhostSplitFactory(String key, Context context,
102105
Logger.i("Android SDK initialized!");
103106
}
104107

108+
@NonNull
109+
private static SplitParser getSplitParser() {
110+
ParserCommons parserCommons = new ParserCommons(
111+
new LocalhostMySegmentsStorageContainer(),
112+
new LocalhostMySegmentsStorageContainer());
113+
parserCommons.setRuleBasedSegmentStorage(new LocalhostRuleBasedSegmentsStorage());
114+
return new SplitParser(parserCommons);
115+
}
116+
105117
@VisibleForTesting
106118
LocalhostSplitFactory(@NonNull SplitsStorage splitsStorage,
107119
@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
@@ -36,6 +36,7 @@
3636
import io.split.android.client.telemetry.TelemetrySynchronizer;
3737
import io.split.android.client.validators.KeyValidator;
3838
import io.split.android.client.validators.ValidationMessageLogger;
39+
import io.split.android.engine.experiments.SplitParser;
3940

4041
public final class SplitClientContainerImpl extends BaseSplitClientContainer {
4142

@@ -73,7 +74,8 @@ public SplitClientContainerImpl(@NonNull String defaultMatchingKey,
7374
@NonNull ClientComponentsRegister clientComponentsRegister,
7475
@NonNull MySegmentsWorkManagerWrapper workManagerWrapper,
7576
@NonNull SplitFactoryImpl.EventsTrackerProvider eventsTrackerProvider,
76-
@Nullable FlagSetsFilter flagSetsFilter) {
77+
@Nullable FlagSetsFilter flagSetsFilter,
78+
@NonNull SplitParser splitParser) {
7779
mDefaultMatchingKey = checkNotNull(defaultMatchingKey);
7880
mPushNotificationManager = pushNotificationManager;
7981
mStreamingEnabled = config.streamingEnabled();
@@ -92,7 +94,8 @@ public SplitClientContainerImpl(@NonNull String defaultMatchingKey,
9294
keyValidator,
9395
eventsTrackerProvider,
9496
customerImpressionListener,
95-
flagSetsFilter
97+
flagSetsFilter,
98+
splitParser
9699
);
97100
mClientComponentsRegister = checkNotNull(clientComponentsRegister);
98101
mSplitTaskExecutor = checkNotNull(splitTaskExecutor);

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
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;
2021
import io.split.android.client.storage.splits.PersistentSplitsStorage;
2122
import io.split.android.client.storage.splits.SplitsStorage;
2223
import io.split.android.client.telemetry.storage.TelemetryStorage;
@@ -38,6 +39,7 @@ public class SplitStorageContainer {
3839
private final PersistentImpressionsUniqueStorage mPersistentImpressionsUniqueStorage;
3940
private final PersistentImpressionsObserverCacheStorage mPersistentImpressionsObserverCacheStorage;
4041
private final GeneralInfoStorage mGeneralInfoStorage;
42+
private final PersistentRuleBasedSegmentStorage mPersistentRuleBasedSegmentStorage;
4143

4244
public SplitStorageContainer(@NonNull SplitsStorage splitStorage,
4345
@NonNull MySegmentsStorageContainer mySegmentsStorageContainer,
@@ -53,7 +55,8 @@ public SplitStorageContainer(@NonNull SplitsStorage splitStorage,
5355
@NonNull PersistentAttributesStorage persistentAttributesStorage,
5456
@NonNull TelemetryStorage telemetryStorage,
5557
@NonNull PersistentImpressionsObserverCacheStorage persistentImpressionsObserverCacheStorage,
56-
@NonNull GeneralInfoStorage generalInfoStorage) {
58+
@NonNull GeneralInfoStorage generalInfoStorage,
59+
@NonNull PersistentRuleBasedSegmentStorage persistentRuleBasedSegmentStorage) {
5760

5861
mSplitStorage = checkNotNull(splitStorage);
5962
mMySegmentsStorageContainer = checkNotNull(mySegmentsStorageContainer);
@@ -70,6 +73,7 @@ public SplitStorageContainer(@NonNull SplitsStorage splitStorage,
7073
mPersistentImpressionsUniqueStorage = checkNotNull(persistentImpressionsUniqueStorage);
7174
mPersistentImpressionsObserverCacheStorage = checkNotNull(persistentImpressionsObserverCacheStorage);
7275
mGeneralInfoStorage = checkNotNull(generalInfoStorage);
76+
mPersistentRuleBasedSegmentStorage = checkNotNull(persistentRuleBasedSegmentStorage);
7377
}
7478

7579
public SplitsStorage getSplitsStorage() {
@@ -143,4 +147,8 @@ public PersistentImpressionsObserverCacheStorage getImpressionsObserverCachePers
143147
public GeneralInfoStorage getGeneralInfoStorage() {
144148
return mGeneralInfoStorage;
145149
}
150+
151+
public PersistentRuleBasedSegmentStorage getPersistentRuleBasedSegmentStorage() {
152+
return mPersistentRuleBasedSegmentStorage;
153+
}
146154
}

src/main/java/io/split/android/client/storage/db/StorageFactory.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,7 @@
3030
import io.split.android.client.storage.mysegments.MySegmentsStorageContainer;
3131
import io.split.android.client.storage.mysegments.MySegmentsStorageContainerImpl;
3232
import io.split.android.client.storage.mysegments.SqLitePersistentMySegmentsStorage;
33-
import io.split.android.client.storage.rbs.LazyRuleBasedSegmentStorageProvider;
3433
import io.split.android.client.storage.rbs.PersistentRuleBasedSegmentStorage;
35-
import io.split.android.client.storage.rbs.RuleBasedSegmentStorageProvider;
3634
import io.split.android.client.storage.rbs.SqLitePersistentRuleBasedSegmentStorageProvider;
3735
import io.split.android.client.storage.splits.PersistentSplitsStorage;
3836
import io.split.android.client.storage.splits.SplitsStorage;
@@ -162,8 +160,4 @@ public static GeneralInfoStorage getGeneralInfoStorage(SplitRoomDatabase splitRo
162160
public static PersistentRuleBasedSegmentStorage getPersistentRuleBasedSegmentStorage(SplitRoomDatabase splitRoomDatabase, SplitCipher splitCipher, GeneralInfoStorage generalInfoStorage) {
163161
return new SqLitePersistentRuleBasedSegmentStorageProvider(splitCipher, splitRoomDatabase, generalInfoStorage).get();
164162
}
165-
166-
public static RuleBasedSegmentStorageProvider getRuleBasedSegmentStorageProvider() {
167-
return new LazyRuleBasedSegmentStorageProvider();
168-
}
169163
}

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)