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.2 release (#270)
Browse files Browse the repository at this point in the history
* (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

* make BigSegmentStoreWrapper.pollingDetectsStaleStatus test less timing-sensitive

* make LDEndToEndClientTest.test____SpecialHttpConfigurations less timing-sensitive

* make data source status tests less timing-sensitive

* use streaming JSON parsing for incoming LD data

* fix tests

* rm unused

* rm unused

* use okhttp-eventsource 2.6.0

* update eventsource to 2.6.1 to fix pom/manifest problem

* increase efficiency of summary event data structures (#335)

* make reusable EvaluationDetail instances as part of flag preprocessing (#336)

* make evaluator result object immutable and reuse instances

* comment

* avoid creating List iterators during evaluations

* remove unnecessary copy

* fix allFlagsState to not generate prereq eval events

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 Jul 21, 2022
1 parent 22eb63e commit df98fec
Show file tree
Hide file tree
Showing 29 changed files with 1,599 additions and 723 deletions.
79 changes: 43 additions & 36 deletions src/main/java/com/launchdarkly/sdk/server/DataModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@

import com.google.common.collect.ImmutableList;
import com.google.gson.annotations.JsonAdapter;
import com.launchdarkly.sdk.EvaluationReason;
import com.launchdarkly.sdk.LDValue;
import com.launchdarkly.sdk.UserAttribute;
import com.launchdarkly.sdk.server.DataModelPreprocessing.ClausePreprocessed;
import com.launchdarkly.sdk.server.DataModelPreprocessing.FlagPreprocessed;
import com.launchdarkly.sdk.server.DataModelPreprocessing.FlagRulePreprocessed;
import com.launchdarkly.sdk.server.DataModelPreprocessing.PrerequisitePreprocessed;
import com.launchdarkly.sdk.server.DataModelPreprocessing.TargetPreprocessed;
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.DataKind;
import com.launchdarkly.sdk.server.interfaces.DataStoreTypes.ItemDescriptor;

Expand All @@ -15,6 +19,35 @@
import static java.util.Collections.emptyList;
import static java.util.Collections.emptySet;

// IMPLEMENTATION NOTES:
//
// - FeatureFlag, Segment, and all other data model classes contained within them, must be package-private.
// We don't want application code to see these types, because we need to be free to change their details without
// breaking the application.
//
// - We expose our DataKind instances publicly because application code may need to reference them if it is
// implementing a custom component such as a data store. But beyond the mere fact of there being these kinds of
// data, applications should not be considered with their structure.
//
// - For all classes that can be deserialized from JSON, there must be an empty constructor, and the fields
// cannot be final. This is because of how Gson works: it creates an instance first, then sets the fields. If
// we are able to move away from using Gson reflective deserialization in the future, we can make them final.
//
// - There should also be a constructor that takes all the fields; we should use that whenever we need to
// create these objects programmatically (so that if we are able at some point to make the fields final, that
// won't break anything).
//
// - For properties that have a collection type such as List, the getter method should always include a null
// guard and return an empty collection if the field is null (so that we don't have to worry about null guards
// every time we might want to iterate over these collections). Semantically there is no difference in the data
// model between an empty list and a null list, and in some languages (particularly Go) it is easy for an
// uninitialized list to be serialized to JSON as null.
//
// - Some classes have a "preprocessed" field containing types defined in DataModelPreprocessing. These fields
// must always be marked transient, so Gson will not serialize them. They are populated when we deserialize a
// FeatureFlag or Segment, because those types implement JsonHelpers.PostProcessingDeserializable (the
// afterDeserialized() method).

/**
* Contains information about the internal data model for feature flags and user segments.
* <p>
Expand Down Expand Up @@ -104,6 +137,8 @@ static final class FeatureFlag implements VersionedData, JsonHelpers.PostProcess
private Long debugEventsUntilDate;
private boolean deleted;

transient FlagPreprocessed preprocessed;

// We need this so Gson doesn't complain in certain java environments that restrict unsafe allocation
FeatureFlag() {}

Expand Down Expand Up @@ -191,17 +226,16 @@ boolean isClientSide() {
return clientSide;
}

// Precompute some invariant values for improved efficiency during evaluations - called from JsonHelpers.PostProcessingDeserializableTypeAdapter
public void afterDeserialized() {
EvaluatorPreprocessing.preprocessFlag(this);
DataModelPreprocessing.preprocessFlag(this);
}
}

static final class Prerequisite {
private String key;
private int variation;

private transient EvaluationReason prerequisiteFailedReason;
transient PrerequisitePreprocessed preprocessed;

Prerequisite() {}

Expand All @@ -217,21 +251,14 @@ String getKey() {
int getVariation() {
return variation;
}

// This value is precomputed when we deserialize a FeatureFlag from JSON
EvaluationReason getPrerequisiteFailedReason() {
return prerequisiteFailedReason;
}

void setPrerequisiteFailedReason(EvaluationReason prerequisiteFailedReason) {
this.prerequisiteFailedReason = prerequisiteFailedReason;
}
}

static final class Target {
private Set<String> values;
private int variation;

transient TargetPreprocessed preprocessed;

Target() {}

Target(Set<String> values, int variation) {
Expand Down Expand Up @@ -259,7 +286,7 @@ static final class Rule extends VariationOrRollout {
private List<Clause> clauses;
private boolean trackEvents;

private transient EvaluationReason ruleMatchReason;
transient FlagRulePreprocessed preprocessed;

Rule() {
super();
Expand All @@ -284,15 +311,6 @@ List<Clause> getClauses() {
boolean isTrackEvents() {
return trackEvents;
}

// This value is precomputed when we deserialize a FeatureFlag from JSON
EvaluationReason getRuleMatchReason() {
return ruleMatchReason;
}

void setRuleMatchReason(EvaluationReason ruleMatchReason) {
this.ruleMatchReason = ruleMatchReason;
}
}

static final class Clause {
Expand All @@ -301,9 +319,7 @@ static final class Clause {
private List<LDValue> values; //interpreted as an OR of values
private boolean negate;

// The following property is marked transient because it is not to be serialized or deserialized;
// it is (if necessary) precomputed in FeatureFlag.afterDeserialized() to speed up evaluations.
transient EvaluatorPreprocessing.ClauseExtra preprocessed;
transient ClausePreprocessed preprocessed;

Clause() {
}
Expand Down Expand Up @@ -331,14 +347,6 @@ List<LDValue> getValues() {
boolean isNegate() {
return negate;
}

EvaluatorPreprocessing.ClauseExtra getPreprocessed() {
return preprocessed;
}

void setPreprocessed(EvaluatorPreprocessing.ClauseExtra preprocessed) {
this.preprocessed = preprocessed;
}
}

static final class Rollout {
Expand Down Expand Up @@ -508,9 +516,8 @@ public Integer getGeneration() {
return generation;
}

// Precompute some invariant values for improved efficiency during evaluations - called from JsonHelpers.PostProcessingDeserializableTypeAdapter
public void afterDeserialized() {
EvaluatorPreprocessing.preprocessSegment(this);
DataModelPreprocessing.preprocessSegment(this);
}
}

Expand Down
Loading

0 comments on commit df98fec

Please sign in to comment.