Skip to content

Commit f1f42f8

Browse files
authored
feat: commonizes several FDv2 related types in Server (#144)
This PR is the third installment of commonizing FDv2 related types. There should be no behavioral changes in this PR. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Broad refactor across data-source and data-store update paths to switch to shared `com.launchdarkly.sdk.fdv2` types plus an internal dependency bump, which could surface integration/compatibility issues despite intended no behavior change. > > **Overview** > **Commonizes FDv2 model types** by switching server SDK code from internal/`DataStoreTypes` FDv2 classes to shared `com.launchdarkly.sdk.fdv2` types (`Selector`, `ChangeSet`, `ChangeSetType`, `SourceResultType`, `SourceSignal`) and deleting `DataStoreTypes.ChangeSet`/`ChangeSetType`. > > Updates all affected interfaces/implementations and adapters (`TransactionalDataStore`, `TransactionalDataSourceUpdateSink`, `FDv2SourceResult`, polling/streaming/file/test sources) to use the new `ChangeSet` generic shape, and adjusts minor edge-case handling (e.g., `sortChangeset` null-data guard; polling 304 now emits an empty data list). > > Build changes bump `launchdarkly-java-sdk-internal` to `1.9.0` and include `com.launchdarkly.sdk.fdv2` in the package list used for OSGi/shading; tests are updated accordingly. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit aeda35a. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> BEGIN_COMMIT_OVERRIDE feat: commonizes several FDv2 related types END_COMMIT_OVERRIDE
1 parent 0144e2b commit f1f42f8

42 files changed

Lines changed: 517 additions & 603 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

lib/sdk/server/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ ext.versions = [
7171
"guava": "32.0.1-jre",
7272
"jackson": "2.11.2",
7373
"launchdarklyJavaSdkCommon": "2.3.0",
74-
"launchdarklyJavaSdkInternal": "1.7.0",
74+
"launchdarklyJavaSdkInternal": "1.9.0",
7575
"launchdarklyLogging": "1.1.0",
7676
"okhttp": "4.12.0", // specify this for the SDK build instead of relying on the transitive dependency from okhttp-eventsource
7777
"okhttpEventsource": "4.2.0",
@@ -291,7 +291,7 @@ javadoc {
291291
// enclosing packages like "com" that don't have any classes in them.
292292
def getAllSdkPackages() {
293293
// base package classes come from launchdarkly-java-sdk-common
294-
def names = [ "com.launchdarkly.sdk", "com.launchdarkly.sdk.json", "com.launchdarkly.logging" ]
294+
def names = [ "com.launchdarkly.sdk", "com.launchdarkly.sdk.json", "com.launchdarkly.sdk.fdv2", "com.launchdarkly.logging" ]
295295
project.convention.getPlugin(JavaPluginConvention).sourceSets.main.output.each { baseDir ->
296296
if (baseDir.getPath().contains("classes" + File.separator + "java" + File.separator + "main")) {
297297
baseDir.eachFileRecurse { f ->
8 KB
Binary file not shown.

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/DataModelDependencies.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import com.google.common.collect.Iterables;
77
import com.launchdarkly.sdk.LDValue;
88
import com.launchdarkly.sdk.server.DataModel.Operator;
9-
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ChangeSet;
10-
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ChangeSetType;
9+
import com.launchdarkly.sdk.fdv2.ChangeSet;
10+
import com.launchdarkly.sdk.fdv2.ChangeSetType;
1111
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.DataKind;
1212
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.FullDataSet;
1313
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ItemDescriptor;
@@ -141,7 +141,10 @@ public static FullDataSet<ItemDescriptor> sortAllCollections(FullDataSet<ItemDes
141141
* @param inSet the changeset to sort
142142
* @return a sorted copy of the changeset
143143
*/
144-
public static ChangeSet<ItemDescriptor> sortChangeset(ChangeSet<ItemDescriptor> inSet) {
144+
public static ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> sortChangeset(ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> inSet) {
145+
if (inSet.getData() == null) {
146+
return inSet;
147+
}
145148
ImmutableSortedMap.Builder<DataKind, KeyedItems<ItemDescriptor>> builder =
146149
ImmutableSortedMap.orderedBy(dataKindPriorityOrder);
147150
for (Map.Entry<DataKind, KeyedItems<ItemDescriptor>> entry: inSet.getData()) {

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/DataSourceSynchronizerAdapter.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package com.launchdarkly.sdk.server;
22

33
import com.launchdarkly.sdk.internal.collections.IterableAsyncQueue;
4-
import com.launchdarkly.sdk.internal.fdv2.sources.Selector;
4+
import com.launchdarkly.sdk.fdv2.Selector;
55
import com.launchdarkly.sdk.server.datasources.FDv2SourceResult;
66
import com.launchdarkly.sdk.server.datasources.Synchronizer;
77
import com.launchdarkly.sdk.server.interfaces.DataSourceStatusProvider;
88
import com.launchdarkly.sdk.server.interfaces.DataStoreStatusProvider;
99
import com.launchdarkly.sdk.server.subsystems.DataSource;
1010
import com.launchdarkly.sdk.server.subsystems.DataSourceUpdateSink;
11+
import com.launchdarkly.sdk.fdv2.ChangeSet;
12+
import com.launchdarkly.sdk.fdv2.ChangeSetType;
1113
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes;
14+
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.DataKind;
15+
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ItemDescriptor;
16+
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.KeyedItems;
1217

1318
import java.io.IOException;
1419
import java.time.Instant;
@@ -127,11 +132,11 @@ public ConvertingUpdateSink(IterableAsyncQueue<FDv2SourceResult> resultQueue) {
127132
}
128133

129134
@Override
130-
public boolean init(DataStoreTypes.FullDataSet<DataStoreTypes.ItemDescriptor> allData) {
135+
public boolean init(DataStoreTypes.FullDataSet<ItemDescriptor> allData) {
131136
// Convert the full data set into a ChangeSet and emit it
132-
DataStoreTypes.ChangeSet<DataStoreTypes.ItemDescriptor> changeSet =
133-
new DataStoreTypes.ChangeSet<>(
134-
DataStoreTypes.ChangeSetType.Full,
137+
ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet =
138+
new ChangeSet<>(
139+
ChangeSetType.Full,
135140
Selector.EMPTY,
136141
allData.getData(),
137142
null,
@@ -142,18 +147,18 @@ public boolean init(DataStoreTypes.FullDataSet<DataStoreTypes.ItemDescriptor> al
142147
}
143148

144149
@Override
145-
public boolean upsert(DataStoreTypes.DataKind kind, String key, DataStoreTypes.ItemDescriptor item) {
150+
public boolean upsert(DataKind kind, String key, ItemDescriptor item) {
146151
// Convert the upsert into a ChangeSet with a single item and emit it
147-
DataStoreTypes.KeyedItems<DataStoreTypes.ItemDescriptor> items =
148-
new DataStoreTypes.KeyedItems<>(Collections.<Map.Entry<String, DataStoreTypes.ItemDescriptor>>singletonList(
152+
KeyedItems<ItemDescriptor> items =
153+
new KeyedItems<>(Collections.<Map.Entry<String, ItemDescriptor>>singletonList(
149154
new AbstractMap.SimpleEntry<>(key, item)));
150-
Iterable<Map.Entry<DataStoreTypes.DataKind, DataStoreTypes.KeyedItems<DataStoreTypes.ItemDescriptor>>> data =
151-
Collections.<Map.Entry<DataStoreTypes.DataKind, DataStoreTypes.KeyedItems<DataStoreTypes.ItemDescriptor>>>singletonList(
155+
Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>> data =
156+
Collections.<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>singletonList(
152157
new AbstractMap.SimpleEntry<>(kind, items));
153158

154-
DataStoreTypes.ChangeSet<DataStoreTypes.ItemDescriptor> changeSet =
155-
new DataStoreTypes.ChangeSet<>(
156-
DataStoreTypes.ChangeSetType.Partial,
159+
ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet =
160+
new ChangeSet<>(
161+
ChangeSetType.Partial,
157162
Selector.EMPTY,
158163
data,
159164
null,

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/DataSourceUpdatesImpl.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import com.launchdarkly.sdk.server.subsystems.DataSourceUpdateSink;
1515
import com.launchdarkly.sdk.server.subsystems.DataSourceUpdateSinkV2;
1616
import com.launchdarkly.sdk.server.subsystems.DataStore;
17-
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ChangeSet;
17+
import com.launchdarkly.sdk.fdv2.ChangeSet;
1818
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.DataKind;
1919
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.FullDataSet;
2020
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ItemDescriptor;
@@ -370,7 +370,7 @@ private static String describeErrorCount(Map.Entry<ErrorInfo, Integer> entry) {
370370
}
371371

372372
@Override
373-
public boolean apply(ChangeSet<ItemDescriptor> changeSet) {
373+
public boolean apply(ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet) {
374374
if (store instanceof TransactionalDataStore) {
375375
return applyToTransactionalStore((TransactionalDataStore) store, changeSet);
376376
}
@@ -380,7 +380,7 @@ public boolean apply(ChangeSet<ItemDescriptor> changeSet) {
380380
}
381381

382382
private boolean applyToTransactionalStore(TransactionalDataStore transactionalDataStore,
383-
ChangeSet<ItemDescriptor> changeSet) {
383+
ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet) {
384384
Map<DataKind, Map<String, ItemDescriptor>> oldData;
385385
// Getting the old values requires accessing the store, which can fail.
386386
// If there is a failure to read the store, then we stop treating it as a failure.
@@ -391,7 +391,7 @@ private boolean applyToTransactionalStore(TransactionalDataStore transactionalDa
391391
return false;
392392
}
393393

394-
ChangeSet<ItemDescriptor> sortedChangeSet = DataModelDependencies.sortChangeset(changeSet);
394+
ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> sortedChangeSet = DataModelDependencies.sortChangeset(changeSet);
395395

396396
try {
397397
transactionalDataStore.apply(sortedChangeSet);
@@ -415,7 +415,7 @@ private boolean applyToTransactionalStore(TransactionalDataStore transactionalDa
415415
return true;
416416
}
417417

418-
private boolean applyToLegacyStore(ChangeSet<ItemDescriptor> sortedChangeSet) {
418+
private boolean applyToLegacyStore(ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> sortedChangeSet) {
419419
switch (sortedChangeSet.getType()) {
420420
case Full:
421421
return applyFullChangeSetToLegacyStore(sortedChangeSet);
@@ -427,16 +427,16 @@ private boolean applyToLegacyStore(ChangeSet<ItemDescriptor> sortedChangeSet) {
427427
}
428428
}
429429

430-
private boolean applyFullChangeSetToLegacyStore(ChangeSet<ItemDescriptor> unsortedChangeset) {
430+
private boolean applyFullChangeSetToLegacyStore(ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> unsortedChangeset) {
431431
// Convert ChangeSet to FullDataSet for legacy init path, preserving shouldPersist flag
432432
return init(new FullDataSet<>(unsortedChangeset.getData(), unsortedChangeset.shouldPersist()));
433433
}
434434

435-
private boolean applyPartialChangeSetToLegacyStore(ChangeSet<ItemDescriptor> changeSet) {
435+
private boolean applyPartialChangeSetToLegacyStore(ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet) {
436436
// Sorting isn't strictly required here, as upsert behavior didn't traditionally have it,
437437
// but it also doesn't hurt, and there could be cases where it results in slightly
438438
// greater store consistency for persistent stores.
439-
ChangeSet<ItemDescriptor> sortedChangeset = DataModelDependencies.sortChangeset(changeSet);
439+
ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> sortedChangeset = DataModelDependencies.sortChangeset(changeSet);
440440

441441
for (Map.Entry<DataKind, KeyedItems<ItemDescriptor>> kindItemsPair: sortedChangeset.getData()) {
442442
for (Map.Entry<String, ItemDescriptor> item: kindItemsPair.getValue().getItems()) {
@@ -471,7 +471,7 @@ private Map<DataKind, Map<String, ItemDescriptor>> getOldDataIfFlagChangeListene
471471
}
472472
}
473473

474-
private Map<DataKind, Map<String, ItemDescriptor>> changeSetToMap(ChangeSet<ItemDescriptor> changeSet) {
474+
private Map<DataKind, Map<String, ItemDescriptor>> changeSetToMap(ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet) {
475475
Map<DataKind, Map<String, ItemDescriptor>> ret = new HashMap<>();
476476
for (Map.Entry<DataKind, KeyedItems<ItemDescriptor>> e: changeSet.getData()) {
477477
ret.put(e.getKey(), ImmutableMap.copyOf(e.getValue().getItems()));
@@ -481,7 +481,7 @@ private Map<DataKind, Map<String, ItemDescriptor>> changeSetToMap(ChangeSet<Item
481481

482482
private Set<KindAndKey> updateDependencyTrackerForChangesetAndDetermineChanges(
483483
Map<DataKind, Map<String, ItemDescriptor>> oldDataMap,
484-
ChangeSet<ItemDescriptor> changeSet) {
484+
ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet) {
485485
switch (changeSet.getType()) {
486486
case Full:
487487
return handleFullChangeset(oldDataMap, changeSet);
@@ -496,7 +496,7 @@ private Set<KindAndKey> updateDependencyTrackerForChangesetAndDetermineChanges(
496496

497497
private Set<KindAndKey> handleFullChangeset(
498498
Map<DataKind, Map<String, ItemDescriptor>> oldDataMap,
499-
ChangeSet<ItemDescriptor> changeSet) {
499+
ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet) {
500500
dependencyTracker.reset();
501501
for (Map.Entry<DataKind, KeyedItems<ItemDescriptor>> kindEntry: changeSet.getData()) {
502502
DataKind kind = kindEntry.getKey();
@@ -516,7 +516,7 @@ private Set<KindAndKey> handleFullChangeset(
516516

517517
private Set<KindAndKey> handlePartialChangeset(
518518
Map<DataKind, Map<String, ItemDescriptor>> oldDataMap,
519-
ChangeSet<ItemDescriptor> changeSet) {
519+
ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet) {
520520
if (oldDataMap == null) {
521521
// Update dependencies but don't track changes when no listeners
522522
for (Map.Entry<DataKind, KeyedItems<ItemDescriptor>> kindEntry: changeSet.getData()) {

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/DefaultFDv2Requestor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.launchdarkly.logging.LDLogger;
44
import com.launchdarkly.sdk.internal.fdv2.payloads.FDv2Event;
5-
import com.launchdarkly.sdk.internal.fdv2.sources.Selector;
5+
import com.launchdarkly.sdk.fdv2.Selector;
66
import com.launchdarkly.sdk.internal.http.HttpHelpers;
77
import com.launchdarkly.sdk.internal.http.HttpProperties;
88

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/FDv2ChangeSetTranslator.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import com.launchdarkly.sdk.internal.fdv2.sources.FDv2ChangeSet;
66
import com.launchdarkly.sdk.internal.fdv2.sources.FDv2ChangeSet.FDv2Change;
77
import com.launchdarkly.sdk.internal.fdv2.sources.FDv2ChangeSet.FDv2ChangeType;
8+
import com.launchdarkly.sdk.fdv2.ChangeSet;
9+
import com.launchdarkly.sdk.fdv2.ChangeSetType;
810
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes;
9-
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ChangeSetType;
1011
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.DataKind;
1112
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ItemDescriptor;
1213
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.KeyedItems;
@@ -25,16 +26,16 @@ private FDv2ChangeSetTranslator() {
2526
}
2627

2728
/**
28-
* Converts an FDv2ChangeSet to a DataStoreTypes.ChangeSet.
29+
* Converts an FDv2ChangeSet to a ChangeSet.
2930
*
3031
* @param changeset the FDv2 changeset to convert
3132
* @param logger logger for diagnostic messages
3233
* @param environmentId the environment ID to include in the changeset (may be null)
3334
* @param shouldPersist true if the data should be persisted to persistent stores, false otherwise
34-
* @return a DataStoreTypes.ChangeSet containing the converted data
35+
* @return a ChangeSet containing the converted data
3536
* @throws IllegalArgumentException if the changeset type is unknown
3637
*/
37-
public static DataStoreTypes.ChangeSet<ItemDescriptor> toChangeSet(
38+
public static ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> toChangeSet(
3839
FDv2ChangeSet changeset,
3940
LDLogger logger,
4041
String environmentId,
@@ -101,7 +102,7 @@ public static DataStoreTypes.ChangeSet<ItemDescriptor> toChangeSet(
101102
));
102103
}
103104

104-
return new DataStoreTypes.ChangeSet<>(
105+
return new ChangeSet<>(
105106
changeSetType,
106107
changeset.getSelector(),
107108
dataBuilder.build(),

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/FDv2DataSourceConditions.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.launchdarkly.sdk.server;
22

3+
import com.launchdarkly.sdk.fdv2.SourceResultType;
4+
import com.launchdarkly.sdk.fdv2.SourceSignal;
35
import com.launchdarkly.sdk.server.datasources.FDv2SourceResult;
46

57
import java.io.Closeable;
@@ -120,13 +122,13 @@ public FallbackCondition(ScheduledExecutorService sharedExecutor, long timeoutSe
120122

121123
@Override
122124
public void inform(FDv2SourceResult sourceResult) {
123-
if (sourceResult.getResultType() == FDv2SourceResult.ResultType.CHANGE_SET) {
125+
if (sourceResult.getResultType() == SourceResultType.CHANGE_SET) {
124126
if (timerFuture != null) {
125127
timerFuture.cancel(false);
126128
timerFuture = null;
127129
}
128130
}
129-
if (sourceResult.getResultType() == FDv2SourceResult.ResultType.STATUS && sourceResult.getStatus().getState() == FDv2SourceResult.State.INTERRUPTED) {
131+
if (sourceResult.getResultType() == SourceResultType.STATUS && sourceResult.getStatus().getState() == SourceSignal.INTERRUPTED) {
130132
if (timerFuture == null) {
131133
timerFuture = sharedExecutor.schedule(() -> {
132134
resultFuture.complete(this);

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/FDv2Requestor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.launchdarkly.sdk.server;
22

33
import com.launchdarkly.sdk.internal.fdv2.payloads.FDv2Event;
4-
import com.launchdarkly.sdk.internal.fdv2.sources.Selector;
4+
import com.launchdarkly.sdk.fdv2.Selector;
55
import okhttp3.Headers;
66

77
import java.util.List;

lib/sdk/server/src/main/java/com/launchdarkly/sdk/server/InMemoryDataStore.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
import com.google.common.collect.ImmutableList;
44
import com.google.common.collect.ImmutableMap;
5-
import com.launchdarkly.sdk.internal.fdv2.sources.Selector;
5+
import com.launchdarkly.sdk.fdv2.Selector;
66
import com.launchdarkly.sdk.server.interfaces.DataStoreStatusProvider.CacheStats;
77
import com.launchdarkly.sdk.server.subsystems.DataStore;
8-
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ChangeSet;
9-
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ChangeSetType;
8+
import com.launchdarkly.sdk.fdv2.ChangeSet;
9+
import com.launchdarkly.sdk.fdv2.ChangeSetType;
1010
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.DataKind;
1111
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.FullDataSet;
1212
import com.launchdarkly.sdk.server.subsystems.DataStoreTypes.ItemDescriptor;
@@ -122,7 +122,7 @@ public void close() throws IOException {
122122
}
123123

124124
@Override
125-
public void apply(ChangeSet<ItemDescriptor> changeSet) {
125+
public void apply(ChangeSet<Iterable<Map.Entry<DataKind, KeyedItems<ItemDescriptor>>>> changeSet) {
126126
switch (changeSet.getType()) {
127127
case Full:
128128
applyFullPayload(changeSet.getData(), changeSet.getEnvironmentId(), changeSet.getSelector(), changeSet.shouldPersist());

0 commit comments

Comments
 (0)