Skip to content
This repository has been archived by the owner on May 30, 2024. It is now read-only.

Commit

Permalink
prepare 5.9.0 release (#267)
Browse files Browse the repository at this point in the history
* fix test

* make intVariation and doubleVariation non-nullable

* better unit test coverage of LDClient and FeatureFlagsState

* test coverage improvements + minor fixes

* better temp file handling in file data source tests

* revert file data source implementation change for now

* revert unnecessary change

* comment about file watching on Mac

* add slight delay to avoid timing-dependent test flakiness

* test fixes/comments

* (5.0) use simpler and more stable logger names

* better instructions

* more convenient way to set EventSource logger name

* (5.0) add HTTP default headers method + some component refactoring

* don't need to pass the whole config object to describeConfiguration()

* simplify test logic for HTTP headers

* (5.0) final test coverage improvements, for now, with enforcement

* re-simplify DataBuilder

* increase timeouts

* misc fixes

* rm unnecessary override

* indents

* update benchmark code for API change

* support loading file data from a classpath resource

* update metadata so Releaser knows about 4.x branch

* minor test fixes

* make class final

* rm beta changelog items

* test data source

* more info about coverage in CONTRIBUTING.md

* misc fixes/tests

* use java-sdk-common 1.0.0

* use okhttp-eventsource 2.3.0

* use okhttp-eventsource 2.3.1 for thread fix

* fix flaky tests due to change in EventSource error reporting

* remove support for indirect put and indirect patch

* fix typo in javadoc example code

* clean up polling logic, fix status updating after an outage, don't reinit store unnecessarily (#256)

* slightly change semantics of boolean setters, improve tests, misc cleanup

* avoid NPEs if LDUser was deserialized by Gson (#257)

* avoid NPEs if LDUser was deserialized by Gson

* add test

* fix release metadata

* prepare 4.14.1 release (#200)

* Releasing version 4.14.1

* exclude Kotlin metadata from jar + fix misc Gradle problems

* update CI and Gradle to test with newer JDKs (#259)

* update okhttp to 3.14.9 (fixes incompatibility with OpenJDK 8.0.252)

* prepare 4.14.2 release (#205)

* Releasing version 4.14.2

* update okhttp to 4.8.1 (fixes incompatibility with OpenJDK 8.0.252)

* gitignore

* Bump SnakeYAML from 1.19 to 1.26 to address CVE-2017-18640

* prepare 4.14.3 release (#209)

* Releasing version 4.14.3

* comments

* only log initialization message once in polling mode

* [ch89935] Correct some logging call format strings (#264)

Also adds debug logs for full exception information in a couple locations.

* [ch90109] Remove outdated trackMetric comment from before service support. (#265)

* Fix compatibility with Java 7.

* Remove import that is no longer used.

* add Java 7 build (#267)

* prepare 4.14.4 release (#214)

* Releasing version 4.14.4

* add and use getSocketFactory

* alignment

* add socketFactory to builder

* test socket factory builder

* preserve dummy CI config file when pushing to gh-pages (#271)

* fix concatenation when base URI has a context path (#270)

* fix shaded jar builds to exclude Jackson classes and not modify Jackson return types (#268)

* add test httpClientCanUseCustomSocketFactory for DefaultFeatureRequestor

* add httpClientCanUseCustomSocketFactory() test for DefaultEventSenderTest

* add httpClientCanUseCustomSocketFactory() test to StreamProcessorTest

* pass URI to in customSocketFactory event test

* make test less ambiguous

* copy rules to new FlagBuilder instances (#273)

* Bump guava version (#274)

* Removed the guides link

* increment versions when loading file data, so FlagTracker will work (#275)

* increment versions when loading file data, so FlagTracker will work

* update doc comment about flag change events with file data

* add ability to ignore duplicate keys in file data (#276)

* add alias events (#278)

* add alias events and function
* update tests for new functionality
* update javadoc strings

* add validation of javadoc build to CI

* update commons-codec to 1.15 (#279)

* Add support for experiment rollouts

* add tests and use seed for allocating user to partition

* test serialization and add check for isExperiment

* fix PollingProcessorTest test race condition + other test issues (#282)

* use launchdarkly-java-sdk-common 1.1.0-alpha-expalloc.2

* Update src/test/java/com/launchdarkly/sdk/server/EvaluatorTest.java

Co-authored-by: Sam Stokes <[email protected]>

* Update src/test/java/com/launchdarkly/sdk/server/EvaluatorTest.java

Co-authored-by: Sam Stokes <[email protected]>

* Update src/test/java/com/launchdarkly/sdk/server/EvaluatorTest.java

Co-authored-by: Sam Stokes <[email protected]>

* Update src/test/java/com/launchdarkly/sdk/server/EvaluatorTest.java

Co-authored-by: Sam Stokes <[email protected]>

* changes per code review comments

* Please enter the commit message for your changes. Lines starting

* fix null pointer exception

* address code review comments

* address more comments

* missed a ! for isUntracked()

* fix default boolean for json

* make untracked FALSE by default

* refactoring of bucketing logic to remove the need for an extra result object (#283)

* add comment to enum

* various JSON fixes, update common-sdk (#284)

* simlpify the logic and make it match node/.Net sdks

* Update src/main/java/com/launchdarkly/sdk/server/EventFactory.java

Co-authored-by: Sam Stokes <[email protected]>

* add the same comment as the Node SDK

* Remove outdated/meaningless doc comment. (#286)

* protect against NPEs if flag/segment JSON contains a null value

* use java-sdk-common 1.2.0

* fix Jackson-related build issues (again) (#288)

* update to okhttp-eventsource patch for stream retry bug, improve tests (#289)

* update to okhttp-eventsource patch for stream retry bug, improve test

* add test for appropriate stream retry

* add public builder for FeatureFlagsState (#290)

* add public builder for FeatureFlagsState

* javadoc fixes

* clarify FileData doc comment to say you shouldn't use offline mode (#291)

* improve validation of SDK key so we won't throw an exception that contains the key (#293)

* fix javadoc link in FileData comment (#294)

* fix PollingProcessor 401 behavior and use new HTTP test helpers (#292)

* re-fix metadata to remove Jackson dependencies, also remove Class-Path from manifest (#295)

* make FeatureFlagsState.Builder.build() public (#297)

* clean up tests using java-test-helpers 1.1.0 (#296)

* use Releaser v2 config + newer CI images (#298)

* [ch123129] Fix `PollingDataSourceBuilder` example. (#299)

* Updates docs URLs

* always use US locale when parsing HTTP dates

* use Gson 2.8.9

* don't try to send more diagnostic events after an unrecoverable HTTP error

* ensure module-info file isn't copied into our jars during build

* use Gradle 7

* update build for benchmarks

* more Gradle 7 compatibility changes for benchmark job

* test with Java 17 in CI (#307)

* test with Java 17 in CI

* also test in Java 17 for Windows

* fix choco install command

* do date comparisons as absolute times, regardless of time zone (#310)

* fix suppression of nulls in JSON representations (#311)

* fix suppression of nulls in JSON representations

* distinguish between situations where we do or do not want to suppress nulls

* fix identify/track null user key check, also don't create index event for alias

* use latest java-sdk-common

* fix setting of trackEvents/trackReason in allFlagsState data when there's an experiment

* implement contract tests (#314)

* Merge Big Segments feature branch for 5.7.0 release (#316)

Includes Big Segments implementation and contract test support for the new behavior.

* Fix for pom including SDK common library as a dependency. (#317)

* Upload JUnit XML to CircleCI on failure (#320)

Fix a bug in the CircleCI config that was only uploading JUnit XML on _success_, not failure.

* Add application tag support (#319)

* Enforce 64 character limit on application tag values (#323)

* fix "wrong type" logic in evaluations when default value is null

* Rename master to main in .ldrelease/config.yml (#325)

* Simpler way of setting base URIs in Java (#322)

Now supports the `ServiceEndpoints` config for setting custom URIs for endpoints in a single place

Co-authored-by: Eli Bishop <[email protected]>
Co-authored-by: LaunchDarklyCI <[email protected]>
Co-authored-by: LaunchDarklyCI <[email protected]>
Co-authored-by: Gavin Whelan <[email protected]>
Co-authored-by: ssrm <[email protected]>
Co-authored-by: Harpo Roeder <[email protected]>
Co-authored-by: Ben Woskow <[email protected]>
Co-authored-by: Elliot <[email protected]>
Co-authored-by: Robert J. Neal <[email protected]>
Co-authored-by: Robert J. Neal <[email protected]>
Co-authored-by: Sam Stokes <[email protected]>
Co-authored-by: LaunchDarklyReleaseBot <[email protected]>
Co-authored-by: Ember Stevens <[email protected]>
Co-authored-by: ember-stevens <[email protected]>
Co-authored-by: Alex Engelberg <[email protected]>
Co-authored-by: Alex Engelberg <[email protected]>
  • Loading branch information
17 people authored May 26, 2022
1 parent 6e0be88 commit e8f208d
Show file tree
Hide file tree
Showing 29 changed files with 682 additions and 44 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public static class SdkConfigParams {
SdkConfigEventParams events;
SdkConfigBigSegmentsParams bigSegments;
SdkConfigTagParams tags;
SdkConfigServiceEndpointParams serviceEndpoints;
}

public static class SdkConfigStreamParams {
Expand Down Expand Up @@ -55,6 +56,12 @@ public static class SdkConfigTagParams {
String applicationId;
String applicationVersion;
}

public static class SdkConfigServiceEndpointParams {
String streaming;
String polling;
String events;
}

public static class CommandParams {
String command;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.launchdarkly.sdk.server.integrations.ApplicationInfoBuilder;
import com.launchdarkly.sdk.server.integrations.BigSegmentsConfigurationBuilder;
import com.launchdarkly.sdk.server.integrations.EventProcessorBuilder;
import com.launchdarkly.sdk.server.integrations.ServiceEndpointsBuilder;
import com.launchdarkly.sdk.server.integrations.StreamingDataSourceBuilder;
import com.launchdarkly.sdk.server.interfaces.BigSegmentStoreStatusProvider;

Expand Down Expand Up @@ -247,7 +248,16 @@ private LDConfig buildSdkConfig(SdkConfigParams params) {
}
builder.applicationInfo(ab);
}


if (params.serviceEndpoints != null) {
builder.serviceEndpoints(
Components.serviceEndpoints()
.streaming(params.serviceEndpoints.streaming)
.polling(params.serviceEndpoints.polling)
.events(params.serviceEndpoints.events)
);
}

return builder.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public class TestService {
"all-flags-details-only-for-tracked-flags",
"all-flags-with-reasons",
"big-segments",
"tags"
"tags",
"service-endpoints"
};

static final Gson gson = new GsonBuilder().serializeNulls().create();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ private ClientContextImpl(
ScheduledExecutorService sharedExecutor,
DiagnosticAccumulator diagnosticAccumulator
) {
ApplicationInfo applicationInfo = configuration.applicationInfoBuilder.createApplicationInfo();
this.basicConfiguration = new BasicConfiguration(sdkKey, configuration.offline, configuration.threadPriority, applicationInfo);
this.basicConfiguration = new BasicConfiguration(sdkKey, configuration.offline, configuration.threadPriority, configuration.applicationInfo, configuration.serviceEndpoints);

this.httpConfiguration = configuration.httpConfigFactory.createHttpConfiguration(basicConfiguration);
this.loggingConfiguration = configuration.loggingConfigFactory.createLoggingConfiguration(basicConfiguration);
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/com/launchdarkly/sdk/server/Components.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.launchdarkly.sdk.server.ComponentsImpl.NullDataSourceFactory;
import com.launchdarkly.sdk.server.ComponentsImpl.PersistentDataStoreBuilderImpl;
import com.launchdarkly.sdk.server.ComponentsImpl.PollingDataSourceBuilderImpl;
import com.launchdarkly.sdk.server.ComponentsImpl.ServiceEndpointsBuilderImpl;
import com.launchdarkly.sdk.server.ComponentsImpl.StreamingDataSourceBuilderImpl;
import com.launchdarkly.sdk.server.integrations.ApplicationInfoBuilder;
import com.launchdarkly.sdk.server.integrations.BigSegmentsConfigurationBuilder;
Expand All @@ -18,6 +19,7 @@
import com.launchdarkly.sdk.server.integrations.LoggingConfigurationBuilder;
import com.launchdarkly.sdk.server.integrations.PersistentDataStoreBuilder;
import com.launchdarkly.sdk.server.integrations.PollingDataSourceBuilder;
import com.launchdarkly.sdk.server.integrations.ServiceEndpointsBuilder;
import com.launchdarkly.sdk.server.integrations.StreamingDataSourceBuilder;
import com.launchdarkly.sdk.server.interfaces.BigSegmentStoreFactory;
import com.launchdarkly.sdk.server.interfaces.DataSourceFactory;
Expand Down Expand Up @@ -344,4 +346,26 @@ public static LoggingConfigurationBuilder logging() {
public static ApplicationInfoBuilder applicationInfo() {
return new ApplicationInfoBuilder();
}

/**
* Returns a builder for configuring custom service URIs.
* <p>
* Passing this to {@link LDConfig.Builder#serviceEndpoints(com.launchdarkly.sdk.server.integrations.ServiceEndpointsBuilder)},
* after setting any desired properties on the builder, applies this configuration to the SDK.
* <pre><code>
* LDConfig config = new LDConfig.Builder()
* .serviceEndpoints(
* Components.serviceEndpoints()
* .relayProxy("http://my-relay-hostname:80")
* )
* .build();
* </code></pre>
*
* @return a builder object
* @since 5.9.0
* @see LDConfig.Builder#serviceEndpoints(com.launchdarkly.sdk.server.integrations.ServiceEndpointsBuilder)
*/
public static ServiceEndpointsBuilder serviceEndpoints() {
return new ServiceEndpointsBuilderImpl();
}
}
67 changes: 58 additions & 9 deletions src/main/java/com/launchdarkly/sdk/server/ComponentsImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.launchdarkly.sdk.server.integrations.LoggingConfigurationBuilder;
import com.launchdarkly.sdk.server.integrations.PersistentDataStoreBuilder;
import com.launchdarkly.sdk.server.integrations.PollingDataSourceBuilder;
import com.launchdarkly.sdk.server.integrations.ServiceEndpointsBuilder;
import com.launchdarkly.sdk.server.integrations.StreamingDataSourceBuilder;
import com.launchdarkly.sdk.server.interfaces.BasicConfiguration;
import com.launchdarkly.sdk.server.interfaces.ClientContext;
Expand All @@ -28,6 +29,7 @@
import com.launchdarkly.sdk.server.interfaces.LoggingConfiguration;
import com.launchdarkly.sdk.server.interfaces.PersistentDataStore;
import com.launchdarkly.sdk.server.interfaces.PersistentDataStoreFactory;
import com.launchdarkly.sdk.server.interfaces.ServiceEndpoints;

import java.io.IOException;
import java.net.InetSocketAddress;
Expand Down Expand Up @@ -139,7 +141,13 @@ public DataSource createDataSource(ClientContext context, DataSourceUpdates data

Loggers.DATA_SOURCE.info("Enabling streaming API");

URI streamUri = baseURI == null ? LDConfig.DEFAULT_STREAM_URI : baseURI;
URI streamUri = StandardEndpoints.selectBaseUri(
context.getBasic().getServiceEndpoints().getStreamingBaseUri(),
baseURI,
StandardEndpoints.DEFAULT_STREAMING_BASE_URI,
"streaming",
Loggers.MAIN
);

return new StreamProcessor(
context.getHttp(),
Expand All @@ -157,7 +165,10 @@ public LDValue describeConfiguration(BasicConfiguration basicConfiguration) {
.put(ConfigProperty.STREAMING_DISABLED.name, false)
.put(ConfigProperty.CUSTOM_BASE_URI.name, false)
.put(ConfigProperty.CUSTOM_STREAM_URI.name,
baseURI != null && !baseURI.equals(LDConfig.DEFAULT_STREAM_URI))
StandardEndpoints.isCustomBaseUri(
basicConfiguration.getServiceEndpoints().getStreamingBaseUri(),
baseURI,
StandardEndpoints.DEFAULT_STREAMING_BASE_URI))
.put(ConfigProperty.RECONNECT_TIME_MILLIS.name, initialReconnectDelay.toMillis())
.put(ConfigProperty.USING_RELAY_DAEMON.name, false)
.build();
Expand All @@ -177,11 +188,16 @@ public DataSource createDataSource(ClientContext context, DataSourceUpdates data

Loggers.DATA_SOURCE.info("Disabling streaming API");
Loggers.DATA_SOURCE.warn("You should only disable the streaming API if instructed to do so by LaunchDarkly support");

DefaultFeatureRequestor requestor = new DefaultFeatureRequestor(
context.getHttp(),
baseURI == null ? LDConfig.DEFAULT_BASE_URI : baseURI

URI pollUri = StandardEndpoints.selectBaseUri(
context.getBasic().getServiceEndpoints().getPollingBaseUri(),
baseURI,
StandardEndpoints.DEFAULT_POLLING_BASE_URI,
"polling",
Loggers.MAIN
);

DefaultFeatureRequestor requestor = new DefaultFeatureRequestor(context.getHttp(), pollUri);
return new PollingProcessor(
requestor,
dataSourceUpdates,
Expand All @@ -195,7 +211,10 @@ public LDValue describeConfiguration(BasicConfiguration basicConfiguration) {
return LDValue.buildObject()
.put(ConfigProperty.STREAMING_DISABLED.name, true)
.put(ConfigProperty.CUSTOM_BASE_URI.name,
baseURI != null && !baseURI.equals(LDConfig.DEFAULT_BASE_URI))
StandardEndpoints.isCustomBaseUri(
basicConfiguration.getServiceEndpoints().getPollingBaseUri(),
baseURI,
StandardEndpoints.DEFAULT_POLLING_BASE_URI))
.put(ConfigProperty.CUSTOM_STREAM_URI.name, false)
.put(ConfigProperty.POLLING_INTERVAL_MILLIS.name, pollInterval.toMillis())
.put(ConfigProperty.USING_RELAY_DAEMON.name, false)
Expand All @@ -210,12 +229,19 @@ public EventProcessor createEventProcessor(ClientContext context) {
EventSender eventSender =
(eventSenderFactory == null ? new DefaultEventSender.Factory() : eventSenderFactory)
.createEventSender(context.getBasic(), context.getHttp());
URI eventsUri = StandardEndpoints.selectBaseUri(
context.getBasic().getServiceEndpoints().getEventsBaseUri(),
baseURI,
StandardEndpoints.DEFAULT_EVENTS_BASE_URI,
"events",
Loggers.MAIN
);
return new DefaultEventProcessor(
new EventsConfiguration(
allAttributesPrivate,
capacity,
eventSender,
baseURI == null ? LDConfig.DEFAULT_EVENTS_URI : baseURI,
eventsUri,
flushInterval,
inlineUsersInEvents,
privateAttributes,
Expand All @@ -234,7 +260,11 @@ public EventProcessor createEventProcessor(ClientContext context) {
public LDValue describeConfiguration(BasicConfiguration basicConfiguration) {
return LDValue.buildObject()
.put(ConfigProperty.ALL_ATTRIBUTES_PRIVATE.name, allAttributesPrivate)
.put(ConfigProperty.CUSTOM_EVENTS_URI.name, baseURI != null && !baseURI.equals(LDConfig.DEFAULT_EVENTS_URI))
.put(ConfigProperty.CUSTOM_EVENTS_URI.name,
StandardEndpoints.isCustomBaseUri(
basicConfiguration.getServiceEndpoints().getEventsBaseUri(),
baseURI,
StandardEndpoints.DEFAULT_EVENTS_BASE_URI))
.put(ConfigProperty.DIAGNOSTIC_RECORDING_INTERVAL_MILLIS.name, diagnosticRecordingInterval.toMillis())
.put(ConfigProperty.EVENTS_CAPACITY.name, capacity)
.put(ConfigProperty.EVENTS_FLUSH_INTERVAL_MILLIS.name, flushInterval.toMillis())
Expand Down Expand Up @@ -333,4 +363,23 @@ public LoggingConfiguration createLoggingConfiguration(BasicConfiguration basicC
return new LoggingConfigurationImpl(logDataSourceOutageAsErrorAfter);
}
}

static final class ServiceEndpointsBuilderImpl extends ServiceEndpointsBuilder {
@Override
public ServiceEndpoints createServiceEndpoints() {
// If *any* custom URIs have been set, then we do not want to use default values for any that were not set,
// so we will leave those null. That way, if we decide later on (in other component factories, such as
// EventProcessorBuilder) that we are actually interested in one of these values, and we
// see that it is null, we can assume that there was a configuration mistake and log an
// error.
if (streamingBaseUri == null && pollingBaseUri == null && eventsBaseUri == null) {
return new ServiceEndpoints(
StandardEndpoints.DEFAULT_STREAMING_BASE_URI,
StandardEndpoints.DEFAULT_POLLING_BASE_URI,
StandardEndpoints.DEFAULT_EVENTS_BASE_URI
);
}
return new ServiceEndpoints(streamingBaseUri, pollingBaseUri, eventsBaseUri);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,14 @@ public Result sendEventData(EventDataKind kind, String data, int eventCount, URI

switch (kind) {
case ANALYTICS:
path = "bulk";
path = StandardEndpoints.ANALYTICS_EVENTS_POST_REQUEST_PATH;
String eventPayloadId = UUID.randomUUID().toString();
headersBuilder.add(EVENT_PAYLOAD_ID_HEADER, eventPayloadId);
headersBuilder.add(EVENT_SCHEMA_HEADER, EVENT_SCHEMA_VERSION);
description = String.format("%d event(s)", eventCount);
break;
case DIAGNOSTICS:
path = "diagnostic";
path = StandardEndpoints.DIAGNOSTIC_EVENTS_POST_REQUEST_PATH;
description = "diagnostic event";
break;
default:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
*/
final class DefaultFeatureRequestor implements FeatureRequestor {
private static final Logger logger = Loggers.DATA_SOURCE;
private static final String GET_LATEST_ALL_PATH = "sdk/latest-all";
private static final long MAX_HTTP_CACHE_SIZE_BYTES = 10 * 1024 * 1024; // 10 MB

@VisibleForTesting final URI baseUri;
Expand All @@ -38,7 +37,7 @@ final class DefaultFeatureRequestor implements FeatureRequestor {

DefaultFeatureRequestor(HttpConfiguration httpConfig, URI baseUri) {
this.baseUri = baseUri;
this.pollingUri = concatenateUriPath(baseUri, GET_LATEST_ALL_PATH);
this.pollingUri = concatenateUriPath(baseUri, StandardEndpoints.POLLING_REQUEST_PATH);

OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
configureHttpClientBuilder(httpConfig, httpBuilder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ final class EventsConfiguration {
this.allAttributesPrivate = allAttributesPrivate;
this.capacity = capacity;
this.eventSender = eventSender;
this.eventsUri = eventsUri == null ? LDConfig.DEFAULT_EVENTS_URI : eventsUri;
this.eventsUri = eventsUri;
this.flushInterval = flushInterval;
this.inlineUsersInEvents = inlineUsersInEvents;
this.privateAttributes = privateAttributes == null ? ImmutableSet.of() : ImmutableSet.copyOf(privateAttributes);
Expand Down
34 changes: 27 additions & 7 deletions src/main/java/com/launchdarkly/sdk/server/LDConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
import com.launchdarkly.sdk.EvaluationReason;
import com.launchdarkly.sdk.server.integrations.ApplicationInfoBuilder;
import com.launchdarkly.sdk.server.integrations.BigSegmentsConfigurationBuilder;
import com.launchdarkly.sdk.server.integrations.ServiceEndpointsBuilder;
import com.launchdarkly.sdk.server.interfaces.ApplicationInfo;
import com.launchdarkly.sdk.server.interfaces.BigSegmentStoreFactory;
import com.launchdarkly.sdk.server.interfaces.DataSourceFactory;
import com.launchdarkly.sdk.server.interfaces.DataStoreFactory;
import com.launchdarkly.sdk.server.interfaces.EventProcessor;
import com.launchdarkly.sdk.server.interfaces.EventProcessorFactory;
import com.launchdarkly.sdk.server.interfaces.HttpConfigurationFactory;
import com.launchdarkly.sdk.server.interfaces.LoggingConfigurationFactory;
import com.launchdarkly.sdk.server.interfaces.ServiceEndpoints;

import java.net.URI;
import java.time.Duration;
Expand All @@ -18,22 +21,19 @@
* This class exposes advanced configuration options for the {@link LDClient}. Instances of this class must be constructed with a {@link com.launchdarkly.sdk.server.LDConfig.Builder}.
*/
public final class LDConfig {
static final URI DEFAULT_BASE_URI = URI.create("https://app.launchdarkly.com");
static final URI DEFAULT_EVENTS_URI = URI.create("https://events.launchdarkly.com");
static final URI DEFAULT_STREAM_URI = URI.create("https://stream.launchdarkly.com");

static final Duration DEFAULT_START_WAIT = Duration.ofSeconds(5);

protected static final LDConfig DEFAULT = new Builder().build();

final ApplicationInfoBuilder applicationInfoBuilder;
final ApplicationInfo applicationInfo;
final BigSegmentsConfigurationBuilder bigSegmentsConfigBuilder;
final DataSourceFactory dataSourceFactory;
final DataStoreFactory dataStoreFactory;
final boolean diagnosticOptOut;
final EventProcessorFactory eventProcessorFactory;
final HttpConfigurationFactory httpConfigFactory;
final LoggingConfigurationFactory loggingConfigFactory;
final ServiceEndpoints serviceEndpoints;
final boolean offline;
final Duration startWait;
final int threadPriority;
Expand All @@ -48,8 +48,9 @@ protected LDConfig(Builder builder) {
this.eventProcessorFactory = builder.eventProcessorFactory == null ? Components.sendEvents() :
builder.eventProcessorFactory;
}
this.applicationInfoBuilder = builder.applicationInfoBuilder == null ? Components.applicationInfo() :
builder.applicationInfoBuilder;
this.applicationInfo = (builder.applicationInfoBuilder == null ? Components.applicationInfo() :
builder.applicationInfoBuilder)
.createApplicationInfo();
this.bigSegmentsConfigBuilder = builder.bigSegmentsConfigBuilder == null ?
Components.bigSegments(null) : builder.bigSegmentsConfigBuilder;
this.dataStoreFactory = builder.dataStoreFactory == null ? Components.inMemoryDataStore() :
Expand All @@ -60,6 +61,9 @@ protected LDConfig(Builder builder) {
this.loggingConfigFactory = builder.loggingConfigFactory == null ? Components.logging() :
builder.loggingConfigFactory;
this.offline = builder.offline;
this.serviceEndpoints = (builder.serviceEndpointsBuilder == null ? Components.serviceEndpoints() :
builder.serviceEndpointsBuilder)
.createServiceEndpoints();
this.startWait = builder.startWait;
this.threadPriority = builder.threadPriority;
}
Expand All @@ -84,6 +88,7 @@ public static class Builder {
private EventProcessorFactory eventProcessorFactory = null;
private HttpConfigurationFactory httpConfigFactory = null;
private LoggingConfigurationFactory loggingConfigFactory = null;
private ServiceEndpointsBuilder serviceEndpointsBuilder = null;
private boolean offline = false;
private Duration startWait = DEFAULT_START_WAIT;
private int threadPriority = Thread.MIN_PRIORITY;
Expand Down Expand Up @@ -263,6 +268,21 @@ public Builder offline(boolean offline) {
return this;
}

/**
* Sets the base service URIs used by SDK components.
* <p>
* This object is normally a configuration builder obtained from {@link Components#serviceEndpoints()},
* which has methods for setting each external endpoint to a custom URI.
*
* @param serviceEndpointsBuilder a configuration builder object returned by {@link Components#applicationInfo()}
* @return the builder
* @since 5.9.0
*/
public Builder serviceEndpoints(ServiceEndpointsBuilder serviceEndpointsBuilder) {
this.serviceEndpointsBuilder = serviceEndpointsBuilder;
return this;
}

/**
* Set how long the constructor will block awaiting a successful connection to LaunchDarkly.
* Setting this to a zero or negative duration will not block and cause the constructor to return immediately.
Expand Down
Loading

0 comments on commit e8f208d

Please sign in to comment.