Skip to content

Commit 426ea5a

Browse files
authored
Merge pull request #504 from splitio/Feature/Semver
Merge semver to dev
2 parents 7506116 + b754a5d commit 426ea5a

37 files changed

+1506
-26
lines changed

CHANGES.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
4.12.0 (XXX XX, 2024)
2-
- Added support for injecting user-defined custom headers for all outgoing HTTP calls, typically useful for proxy authentication purposes.
1+
4.12.0 (May 15, 2024)
2+
- Added support for targeting rules based on semantic versions (https://semver.org/).
3+
- Added the logic to handle correctly when the SDK receives an unsupported Matcher type.
4+
- Enhanced SDK Headers for Authorization Frameworks
5+
- Cleaned unused imports and renaming some methods
6+
- Fixed empty token handler thanks to @hpark-miovision
37

48
4.11.1 (Feb 29, 2024)
59
- Fixed deadlock in UniqueKeysTracker when sending Unique Keys.

client/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>io.split.client</groupId>
77
<artifactId>java-client-parent</artifactId>
8-
<version>4.12.0-rc3</version>
8+
<version>4.12.0</version>
99
</parent>
1010
<artifactId>java-client</artifactId>
1111
<packaging>jar</packaging>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.split;
2+
3+
public final class Spec {
4+
5+
private Spec() {
6+
// restrict instantiation
7+
}
8+
9+
public static final String SPEC_VERSION = "1.1";
10+
}
11+

client/src/main/java/io/split/client/HttpSplitChangeFetcher.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.split.client;
22

33
import com.google.common.annotations.VisibleForTesting;
4+
45
import io.split.client.dtos.SplitChange;
56
import io.split.client.dtos.SplitHttpResponse;
67
import io.split.client.exceptions.UriTooLongException;
@@ -21,6 +22,7 @@
2122
import java.net.URISyntaxException;
2223

2324
import static com.google.common.base.Preconditions.checkNotNull;
25+
import static io.split.Spec.SPEC_VERSION;
2426

2527
/**
2628
* Created by adilaijaz on 5/30/15.
@@ -31,6 +33,7 @@ public final class HttpSplitChangeFetcher implements SplitChangeFetcher {
3133
private static final String SINCE = "since";
3234
private static final String TILL = "till";
3335
private static final String SETS = "sets";
36+
private static final String SPEC = "s";
3437
private final SplitHttpClient _client;
3538
private final URI _target;
3639
private final TelemetryRuntimeProducer _telemetryRuntimeProducer;
@@ -58,13 +61,14 @@ public SplitChange fetch(long since, FetchOptions options) {
5861
long start = System.currentTimeMillis();
5962

6063
try {
61-
URIBuilder uriBuilder = new URIBuilder(_target).addParameter(SINCE, "" + since);
62-
if (options.hasCustomCN()) {
63-
uriBuilder.addParameter(TILL, "" + options.targetCN());
64-
}
64+
URIBuilder uriBuilder = new URIBuilder(_target).addParameter(SPEC, "" + SPEC_VERSION);
65+
uriBuilder.addParameter(SINCE, "" + since);
6566
if (!options.flagSetsFilter().isEmpty()) {
6667
uriBuilder.addParameter(SETS, "" + options.flagSetsFilter());
6768
}
69+
if (options.hasCustomCN()) {
70+
uriBuilder.addParameter(TILL, "" + options.targetCN());
71+
}
6872
URI uri = uriBuilder.build();
6973
SplitHttpResponse response = _client.get(uri, options, null);
7074

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.split.client.dtos;
2+
3+
/**
4+
* Metadata to support the between matcher.
5+
*
6+
* @author adil
7+
*/
8+
public class BetweenStringMatcherData {
9+
public String start;
10+
public String end;
11+
}

client/src/main/java/io/split/client/dtos/Matcher.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class Matcher {
1313
public WhitelistMatcherData whitelistMatcherData;
1414
public UnaryNumericMatcherData unaryNumericMatcherData;
1515
public BetweenMatcherData betweenMatcherData;
16+
public BetweenStringMatcherData betweenStringMatcherData;
1617
public DependencyMatcherData dependencyMatcherData;
1718
public Boolean booleanMatcherData;
1819
public String stringMatcherData;

client/src/main/java/io/split/client/dtos/MatcherType.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,12 @@ public enum MatcherType {
3030
EQUAL_TO_BOOLEAN,
3131

3232
/* Dependency Matcher */
33-
IN_SPLIT_TREATMENT
33+
IN_SPLIT_TREATMENT,
34+
35+
/* Semver matchers */
36+
EQUAL_TO_SEMVER,
37+
GREATER_THAN_OR_EQUAL_TO_SEMVER,
38+
LESS_THAN_OR_EQUAL_TO_SEMVER,
39+
IN_LIST_SEMVER,
40+
BETWEEN_SEMVER
3441
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package io.split.client.exceptions;
2+
3+
public class SemverParseException extends Exception {
4+
public SemverParseException(String message) {
5+
super(message);
6+
}
7+
}

client/src/main/java/io/split/engine/evaluator/Labels.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ public class Labels {
66
public static final String KILLED = "killed";
77
public static final String DEFINITION_NOT_FOUND = "definition not found";
88
public static final String EXCEPTION = "exception";
9-
public static final String UNSUPPORTED_MATCHER = "unsupported matcher type";
9+
public static final String UNSUPPORTED_MATCHER = "targeting rule type unsupported by sdk";
1010
}

client/src/main/java/io/split/engine/experiments/SplitParser.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.split.engine.matchers.GreaterThanOrEqualToMatcher;
2020
import io.split.engine.matchers.LessThanOrEqualToMatcher;
2121
import io.split.engine.matchers.UserDefinedSegmentMatcher;
22+
import io.split.engine.matchers.EqualToSemverMatcher;
2223
import io.split.engine.matchers.collections.ContainsAllOfSetMatcher;
2324
import io.split.engine.matchers.collections.ContainsAnyOfSetMatcher;
2425
import io.split.engine.matchers.collections.EqualToSetMatcher;
@@ -28,6 +29,11 @@
2829
import io.split.engine.matchers.strings.RegularExpressionMatcher;
2930
import io.split.engine.matchers.strings.StartsWithAnyOfMatcher;
3031
import io.split.engine.matchers.strings.WhitelistMatcher;
32+
import io.split.engine.matchers.GreaterThanOrEqualToSemverMatcher;
33+
import io.split.engine.matchers.LessThanOrEqualToSemverMatcher;
34+
import io.split.engine.matchers.InListSemverMatcher;
35+
import io.split.engine.matchers.BetweenSemverMatcher;
36+
3137
import org.slf4j.Logger;
3238
import org.slf4j.LoggerFactory;
3339

@@ -193,6 +199,26 @@ private AttributeMatcher toMatcher(Matcher matcher) {
193199
+ ". matcher.booleanMatcherData() MUST NOT BE null");
194200
delegate = new BooleanMatcher(matcher.booleanMatcherData);
195201
break;
202+
case EQUAL_TO_SEMVER:
203+
checkNotNull(matcher.stringMatcherData, "stringMatcherData is required for EQUAL_TO_SEMVER matcher type");
204+
delegate = new EqualToSemverMatcher(matcher.stringMatcherData);
205+
break;
206+
case GREATER_THAN_OR_EQUAL_TO_SEMVER:
207+
checkNotNull(matcher.stringMatcherData, "stringMatcherData is required for GREATER_THAN_OR_EQUAL_TO_SEMVER matcher type");
208+
delegate = new GreaterThanOrEqualToSemverMatcher(matcher.stringMatcherData);
209+
break;
210+
case LESS_THAN_OR_EQUAL_TO_SEMVER:
211+
checkNotNull(matcher.stringMatcherData, "stringMatcherData is required for LESS_THAN_OR_EQUAL_SEMVER matcher type");
212+
delegate = new LessThanOrEqualToSemverMatcher(matcher.stringMatcherData);
213+
break;
214+
case IN_LIST_SEMVER:
215+
checkNotNull(matcher.whitelistMatcherData, "whitelistMatcherData is required for IN_LIST_SEMVER matcher type");
216+
delegate = new InListSemverMatcher(matcher.whitelistMatcherData.whitelist);
217+
break;
218+
case BETWEEN_SEMVER:
219+
checkNotNull(matcher.betweenStringMatcherData, "betweenStringMatcherData is required for BETWEEN_SEMVER matcher type");
220+
delegate = new BetweenSemverMatcher(matcher.betweenStringMatcherData.start, matcher.betweenStringMatcherData.end);
221+
break;
196222
default:
197223
throw new IllegalArgumentException("Unknown matcher type: " + matcher.matcherType);
198224
}

0 commit comments

Comments
 (0)