Skip to content

Commit 02c4c98

Browse files
committed
Refactor initializer/synchronizer builder context.
1 parent ae39996 commit 02c4c98

File tree

6 files changed

+164
-26
lines changed

6 files changed

+164
-26
lines changed

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

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

33
import com.launchdarkly.sdk.server.datasources.Initializer;
4-
import com.launchdarkly.sdk.server.datasources.SelectorSource;
54
import com.launchdarkly.sdk.server.datasources.Synchronizer;
65
import com.launchdarkly.sdk.server.integrations.FDv2PollingInitializerBuilder;
76
import com.launchdarkly.sdk.server.integrations.FDv2PollingSynchronizerBuilder;
87
import com.launchdarkly.sdk.server.integrations.FDv2StreamingSynchronizerBuilder;
98
import com.launchdarkly.sdk.server.integrations.PollingDataSourceBuilder;
109
import com.launchdarkly.sdk.server.interfaces.ServiceEndpoints;
11-
import com.launchdarkly.sdk.server.subsystems.ClientContext;
10+
import com.launchdarkly.sdk.server.subsystems.DataSourceBuilderContext;
1211

1312
import java.net.URI;
1413

@@ -25,7 +24,7 @@ public final class DataSystemComponents {
2524

2625
static class FDv2PollingInitializerBuilderImpl extends FDv2PollingInitializerBuilder {
2726
@Override
28-
public Initializer build(ClientContext context, SelectorSource selectorSource) {
27+
public Initializer build(DataSourceBuilderContext context) {
2928
ServiceEndpoints endpoints = serviceEndpointsOverride != null
3029
? serviceEndpointsOverride
3130
: context.getServiceEndpoints();
@@ -44,14 +43,14 @@ public Initializer build(ClientContext context, SelectorSource selectorSource) {
4443
return new PollingInitializerImpl(
4544
requestor,
4645
context.getBaseLogger(),
47-
selectorSource
46+
context.getSelectorSource()
4847
);
4948
}
5049
}
5150

5251
static class FDv2PollingSynchronizerBuilderImpl extends FDv2PollingSynchronizerBuilder {
5352
@Override
54-
public Synchronizer build(ClientContext context, SelectorSource selectorSource) {
53+
public Synchronizer build(DataSourceBuilderContext context) {
5554
ServiceEndpoints endpoints = serviceEndpointsOverride != null
5655
? serviceEndpointsOverride
5756
: context.getServiceEndpoints();
@@ -70,16 +69,16 @@ public Synchronizer build(ClientContext context, SelectorSource selectorSource)
7069
return new PollingSynchronizerImpl(
7170
requestor,
7271
context.getBaseLogger(),
73-
selectorSource,
74-
ClientContextImpl.get(context).sharedExecutor,
72+
context.getSelectorSource(),
73+
context.getSharedExecutor(),
7574
pollInterval
7675
);
7776
}
7877
}
7978

8079
static class FDv2StreamingSynchronizerBuilderImpl extends FDv2StreamingSynchronizerBuilder {
8180
@Override
82-
public Synchronizer build(ClientContext context, SelectorSource selectorSource) {
81+
public Synchronizer build(DataSourceBuilderContext context) {
8382
ServiceEndpoints endpoints = serviceEndpointsOverride != null
8483
? serviceEndpointsOverride
8584
: context.getServiceEndpoints();
@@ -94,7 +93,7 @@ public Synchronizer build(ClientContext context, SelectorSource selectorSource)
9493
configuredBaseUri,
9594
StandardEndpoints.FDV2_STREAMING_REQUEST_PATH,
9695
context.getBaseLogger(),
97-
selectorSource,
96+
context.getSelectorSource(),
9897
null,
9998
initialReconnectDelay
10099
);

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

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import java.util.LinkedList;
1717
import java.util.concurrent.Future;
1818

19+
import static com.launchdarkly.sdk.server.ComponentsImpl.toHttpProperties;
20+
1921
/**
2022
* Internal implementation of the FDv2 data system.
2123
* <p>
@@ -50,36 +52,32 @@ private FDv2DataSystem(
5052
private static class SynchronizerFactoryWrapper implements FDv2DataSource.SynchronizerFactory {
5153

5254
private final SynchronizerBuilder builder;
53-
private final ClientContext context;
54-
private final SelectorSource selectorSource;
55+
private final DataSourceBuilderContext context;
5556

56-
public SynchronizerFactoryWrapper(SynchronizerBuilder builder, ClientContext context, SelectorSource selectorSource) {
57+
public SynchronizerFactoryWrapper(SynchronizerBuilder builder, DataSourceBuilderContext context) {
5758
this.builder = builder;
5859
this.context = context;
59-
this.selectorSource = selectorSource;
6060
}
6161

6262
@Override
6363
public Synchronizer build() {
64-
return builder.build(context, selectorSource);
64+
return builder.build(context);
6565
}
6666
}
6767

6868
private static class InitializerFactoryWrapper implements FDv2DataSource.InitializerFactory {
6969

7070
private final InitializerBuilder builder;
71-
private final ClientContext context;
72-
private final SelectorSource selectorSource;
71+
private final DataSourceBuilderContext context;
7372

74-
public InitializerFactoryWrapper(InitializerBuilder builder, ClientContext context, SelectorSource selectorSource) {
73+
public InitializerFactoryWrapper(InitializerBuilder builder, DataSourceBuilderContext context) {
7574
this.builder = builder;
7675
this.context = context;
77-
this.selectorSource = selectorSource;
7876
}
7977

8078
@Override
8179
public Initializer build() {
82-
return builder.build(context, selectorSource);
80+
return builder.build(context);
8381
}
8482
}
8583

@@ -132,12 +130,23 @@ static FDv2DataSystem create(
132130
DataSystemConfiguration dataSystemConfiguration = config.dataSystem.build();
133131
SelectorSource selectorSource = new SelectorSourceFacade(store);
134132

133+
DataSourceBuilderContext builderContext = new DataSourceBuilderContext(
134+
clientContext.getBaseLogger(),
135+
clientContext.getThreadPriority(),
136+
dataSourceUpdates,
137+
clientContext.getServiceEndpoints(),
138+
clientContext.getHttp(),
139+
clientContext.sharedExecutor,
140+
clientContext.diagnosticStore,
141+
selectorSource
142+
);
143+
135144
ImmutableList<FDv2DataSource.InitializerFactory> initializerFactories = dataSystemConfiguration.getInitializers().stream()
136-
.map(initializer -> new InitializerFactoryWrapper(initializer, clientContext, selectorSource))
145+
.map(initializer -> new InitializerFactoryWrapper(initializer, builderContext))
137146
.collect(ImmutableList.toImmutableList());
138147

139148
ImmutableList<FDv2DataSource.SynchronizerFactory> synchronizerFactories = dataSystemConfiguration.getSynchronizers().stream()
140-
.map(synchronizer -> new SynchronizerFactoryWrapper(synchronizer, clientContext, selectorSource))
149+
.map(synchronizer -> new SynchronizerFactoryWrapper(synchronizer, builderContext))
141150
.collect(ImmutableList.toImmutableList());
142151

143152
DataSource dataSource = new FDv2DataSource(
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package com.launchdarkly.sdk.server.subsystems;
2+
3+
import com.launchdarkly.logging.LDLogger;
4+
import com.launchdarkly.sdk.internal.events.DiagnosticStore;
5+
import com.launchdarkly.sdk.server.datasources.SelectorSource;
6+
import com.launchdarkly.sdk.server.interfaces.ServiceEndpoints;
7+
8+
import java.util.concurrent.ScheduledExecutorService;
9+
10+
/**
11+
* Context information provided to initializer and synchronizer builders.
12+
* <p>
13+
* This class is not stable, and not subject to any backwards compatibility guarantees or semantic versioning.
14+
* It is in early access. If you want access to this feature, please join the EAP. https://launchdarkly.com/docs/sdk/features/data-saving-mode
15+
* <p>
16+
* This consolidates all the parameters needed to construct data source components,
17+
* including HTTP configuration, logging, scheduling, and selector state.
18+
*/
19+
public final class DataSourceBuilderContext {
20+
private final LDLogger baseLogger;
21+
private final int threadPriority;
22+
private final DataSourceUpdateSink dataSourceUpdates;
23+
private final ServiceEndpoints serviceEndpoints;
24+
private final HttpConfiguration http;
25+
private final ScheduledExecutorService sharedExecutor;
26+
private final DiagnosticStore diagnosticStore;
27+
private final SelectorSource selectorSource;
28+
29+
/**
30+
* Constructs a DataSourceBuilderContext.
31+
*
32+
* @param baseLogger the base logger instance
33+
* @param threadPriority the thread priority for worker threads
34+
* @param dataSourceUpdates the data source update sink
35+
* @param serviceEndpoints the service endpoint URIs
36+
* @param http HTTP configuration properties
37+
* @param sharedExecutor shared executor service for scheduling
38+
* @param diagnosticStore diagnostic data accumulator (may be null)
39+
* @param selectorSource source for obtaining selectors
40+
*/
41+
public DataSourceBuilderContext(
42+
LDLogger baseLogger,
43+
int threadPriority,
44+
DataSourceUpdateSink dataSourceUpdates,
45+
ServiceEndpoints serviceEndpoints,
46+
HttpConfiguration http,
47+
ScheduledExecutorService sharedExecutor,
48+
DiagnosticStore diagnosticStore,
49+
SelectorSource selectorSource
50+
) {
51+
this.baseLogger = baseLogger;
52+
this.threadPriority = threadPriority;
53+
this.dataSourceUpdates = dataSourceUpdates;
54+
this.serviceEndpoints = serviceEndpoints;
55+
this.http = http;
56+
this.sharedExecutor = sharedExecutor;
57+
this.diagnosticStore = diagnosticStore;
58+
this.selectorSource = selectorSource;
59+
}
60+
61+
/**
62+
* Returns the base logger instance.
63+
*
64+
* @return the base logger
65+
*/
66+
public LDLogger getBaseLogger() {
67+
return baseLogger;
68+
}
69+
70+
/**
71+
* Returns the thread priority for worker threads.
72+
*
73+
* @return the thread priority
74+
*/
75+
public int getThreadPriority() {
76+
return threadPriority;
77+
}
78+
79+
/**
80+
* Returns the data source update sink.
81+
*
82+
* @return the data source update sink
83+
*/
84+
public DataSourceUpdateSink getDataSourceUpdates() {
85+
return dataSourceUpdates;
86+
}
87+
88+
/**
89+
* Returns the service endpoint URIs.
90+
*
91+
* @return the service endpoints
92+
*/
93+
public ServiceEndpoints getServiceEndpoints() {
94+
return serviceEndpoints;
95+
}
96+
97+
/**
98+
* Returns the HTTP configuration properties.
99+
*
100+
* @return the HTTP configuration
101+
*/
102+
public HttpConfiguration getHttp() {
103+
return http;
104+
}
105+
106+
/**
107+
* Returns the shared executor service for scheduling.
108+
*
109+
* @return the shared executor
110+
*/
111+
public ScheduledExecutorService getSharedExecutor() {
112+
return sharedExecutor;
113+
}
114+
115+
/**
116+
* Returns the diagnostic data accumulator.
117+
*
118+
* @return the diagnostic store, or null if diagnostics are disabled
119+
*/
120+
public DiagnosticStore getDiagnosticStore() {
121+
return diagnosticStore;
122+
}
123+
124+
/**
125+
* Returns the selector source.
126+
*
127+
* @return the selector source
128+
*/
129+
public SelectorSource getSelectorSource() {
130+
return selectorSource;
131+
}
132+
}
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.launchdarkly.sdk.server.subsystems;
22

33
import com.launchdarkly.sdk.server.datasources.Initializer;
4-
import com.launchdarkly.sdk.server.datasources.SelectorSource;
54

65
public interface InitializerBuilder {
7-
Initializer build(ClientContext context, SelectorSource selectorSource);
6+
Initializer build(DataSourceBuilderContext context);
87
}
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.launchdarkly.sdk.server.subsystems;
22

3-
import com.launchdarkly.sdk.server.datasources.SelectorSource;
43
import com.launchdarkly.sdk.server.datasources.Synchronizer;
54

65
public interface SynchronizerBuilder {
7-
Synchronizer build(ClientContext context, SelectorSource selectorSource);
6+
Synchronizer build(DataSourceBuilderContext context);
87
}

lib/sdk/server/src/test/java/com/launchdarkly/sdk/server/DefaultFDv2RequestorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public void requestWithComplexBasisState() throws Exception {
190190

191191
RequestInfo req = server.getRecorder().requireRequest();
192192
assertEquals(REQUEST_PATH, req.getPath());
193-
assertThat(req.getQuery(), containsString("basis=%28p%3FindAmy-payload%3A200%29"));
193+
assertThat(req.getQuery(), containsString("basis=%28p%3Amy-payload%3A200%29"));
194194
}
195195
}
196196
}

0 commit comments

Comments
 (0)