Skip to content

Commit c507649

Browse files
authored
[FSSDK-9432] fix: fix to support arbitrary client names to be included in logx and odp events. (#524)
Fix to support arbitrary client names to be included in logx and odp events. - The previous implementation allows only a fixed set of values (java-sdk, android-sdk, and android-tv-sdk) with enum. - We need to make it more flexible to support other sdks too (flutter, react-native, etc) wrapping the android-sdk and java-sdk cores. - Old methods for enum access are all deprecated. Downgrade jackson library version down to 2.13.5 (2.14+ uses Java8 langs not supported in Android)
1 parent 3ca11a9 commit c507649

File tree

10 files changed

+75
-29
lines changed

10 files changed

+75
-29
lines changed

core-api/src/main/java/com/optimizely/ab/Optimizely.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -1633,10 +1633,20 @@ public Builder withUserProfileService(UserProfileService userProfileService) {
16331633
/**
16341634
* Override the SDK name and version (for client SDKs like android-sdk wrapping the core java-sdk) to be included in events.
16351635
*
1636-
* @param clientEngine the client engine type.
1636+
* @param clientEngineName the client engine name ("java-sdk", "android-sdk", "flutter-sdk", etc.).
16371637
* @param clientVersion the client SDK version.
16381638
* @return An Optimizely builder
16391639
*/
1640+
public Builder withClientInfo(String clientEngineName, String clientVersion) {
1641+
ClientEngineInfo.setClientEngineName(clientEngineName);
1642+
BuildVersionInfo.setClientVersion(clientVersion);
1643+
return this;
1644+
}
1645+
1646+
/**
1647+
* @deprecated in favor of {@link withClientInfo(String, String)} which can set with arbitrary client names.
1648+
*/
1649+
@Deprecated
16401650
public Builder withClientInfo(EventBatch.ClientEngine clientEngine, String clientVersion) {
16411651
ClientEngineInfo.setClientEngine(clientEngine);
16421652
BuildVersionInfo.setClientVersion(clientVersion);

core-api/src/main/java/com/optimizely/ab/event/internal/BuildVersionInfo.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ public final class BuildVersionInfo {
3737
@Deprecated
3838
public final static String VERSION = readVersionNumber();
3939

40+
public final static String DEFAULT_VERSION = readVersionNumber();
4041
// can be overridden by other wrapper client (android-sdk, etc)
41-
42-
private static String clientVersion = readVersionNumber();
42+
private static String clientVersion = DEFAULT_VERSION;
4343

4444
public static void setClientVersion(String version) {
4545
if (version == null || version.isEmpty()) {

core-api/src/main/java/com/optimizely/ab/event/internal/ClientEngineInfo.java

+34-2
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,13 @@
1717
package com.optimizely.ab.event.internal;
1818

1919
import com.optimizely.ab.event.internal.payload.EventBatch;
20+
import com.optimizely.ab.notification.DecisionNotification;
2021
import org.slf4j.Logger;
2122
import org.slf4j.LoggerFactory;
2223

24+
import javax.annotation.Nonnull;
25+
import javax.annotation.Nullable;
26+
2327
/**
2428
* ClientEngineInfo is a utility to globally get and set the ClientEngine used in
2529
* event tracking. The ClientEngine defaults to JAVA_SDK but can be overridden at
@@ -28,9 +32,34 @@
2832
public class ClientEngineInfo {
2933
private static final Logger logger = LoggerFactory.getLogger(ClientEngineInfo.class);
3034

35+
public static final String DEFAULT_NAME = "java-sdk";
36+
private static String clientEngineName = DEFAULT_NAME;
37+
38+
public static void setClientEngineName(@Nullable String name) {
39+
if (name == null || name.isEmpty()) {
40+
logger.warn("ClientEngineName cannot be empty, defaulting to {}", ClientEngineInfo.clientEngineName);
41+
return;
42+
}
43+
ClientEngineInfo.clientEngineName = name;
44+
}
45+
46+
@Nonnull
47+
public static String getClientEngineName() {
48+
return clientEngineName;
49+
}
50+
51+
private ClientEngineInfo() {
52+
}
53+
54+
@Deprecated
3155
public static final EventBatch.ClientEngine DEFAULT = EventBatch.ClientEngine.JAVA_SDK;
56+
@Deprecated
3257
private static EventBatch.ClientEngine clientEngine = DEFAULT;
3358

59+
/**
60+
* @deprecated in favor of {@link #setClientEngineName(String)} which can set with arbitrary client names.
61+
*/
62+
@Deprecated
3463
public static void setClientEngine(EventBatch.ClientEngine clientEngine) {
3564
if (clientEngine == null) {
3665
logger.warn("ClientEngine cannot be null, defaulting to {}", ClientEngineInfo.clientEngine.getClientEngineValue());
@@ -39,12 +68,15 @@ public static void setClientEngine(EventBatch.ClientEngine clientEngine) {
3968

4069
logger.info("Setting Optimizely client engine to {}", clientEngine.getClientEngineValue());
4170
ClientEngineInfo.clientEngine = clientEngine;
71+
ClientEngineInfo.clientEngineName = clientEngine.getClientEngineValue();
4272
}
4373

74+
/**
75+
* @deprecated in favor of {@link #getClientEngineName()}.
76+
*/
77+
@Deprecated
4478
public static EventBatch.ClientEngine getClientEngine() {
4579
return clientEngine;
4680
}
4781

48-
private ClientEngineInfo() {
49-
}
5082
}

core-api/src/main/java/com/optimizely/ab/event/internal/EventFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public static LogEvent createLogEvent(List<UserEvent> userEvents) {
7272
ProjectConfig projectConfig = userContext.getProjectConfig();
7373

7474
builder
75-
.setClientName(ClientEngineInfo.getClientEngine().getClientEngineValue())
75+
.setClientName(ClientEngineInfo.getClientEngineName())
7676
.setClientVersion(BuildVersionInfo.getClientVersion())
7777
.setAccountId(projectConfig.getAccountId())
7878
.setAnonymizeIp(projectConfig.getAnonymizeIP())

core-api/src/main/java/com/optimizely/ab/event/internal/payload/EventBatch.java

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import java.util.List;
2525

2626
public class EventBatch {
27+
28+
@Deprecated
2729
public enum ClientEngine {
2830
JAVA_SDK("java-sdk"),
2931
ANDROID_SDK("android-sdk"),

core-api/src/main/java/com/optimizely/ab/odp/ODPEventManager.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ protected Map<String, Object> augmentCommonData(Map<String, Object> sourceData)
148148
Map<String, Object> data = new HashMap<>();
149149
data.put("idempotence_id", UUID.randomUUID().toString());
150150
data.put("data_source_type", "sdk");
151-
data.put("data_source", ClientEngineInfo.getClientEngine().getClientEngineValue());
151+
data.put("data_source", ClientEngineInfo.getClientEngineName());
152152
data.put("data_source_version", BuildVersionInfo.getClientVersion());
153153

154154
data.putAll(userCommonData);

core-api/src/test/java/com/optimizely/ab/OptimizelyBuilderTest.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ public void withClientInfo() throws Exception {
224224

225225
reset(eventHandler);
226226
optimizely = Optimizely.builder(validConfigJsonV4(), eventHandler)
227-
.withClientInfo(null, null)
228227
.build();
229228
optimizely.track("basic_event", "tester");
230229

@@ -245,8 +244,8 @@ public void withClientInfo() throws Exception {
245244
assertEquals(argument.getValue().getEventBatch().getClientVersion(), "1.2.3");
246245

247246
// restore the default values for other tests
248-
ClientEngineInfo.setClientEngine(ClientEngineInfo.DEFAULT);
249-
BuildVersionInfo.setClientVersion(BuildVersionInfo.VERSION);
247+
ClientEngineInfo.setClientEngineName(ClientEngineInfo.DEFAULT_NAME);
248+
BuildVersionInfo.setClientVersion(BuildVersionInfo.DEFAULT_VERSION);
250249
}
251250

252251
@Test

core-api/src/test/java/com/optimizely/ab/event/internal/ClientEngineInfoTest.java

+11-9
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,21 @@ public class ClientEngineInfoTest {
2626

2727
@After
2828
public void tearDown() throws Exception {
29-
ClientEngineInfo.setClientEngine(ClientEngineInfo.DEFAULT);
29+
ClientEngineInfo.setClientEngineName(ClientEngineInfo.DEFAULT_NAME);
3030
}
3131

3232
@Test
3333
public void testSetAndGetClientEngine() {
34-
for (EventBatch.ClientEngine expected: EventBatch.ClientEngine.values()) {
35-
ClientEngineInfo.setClientEngine(expected);
36-
assertEquals(expected, ClientEngineInfo.getClientEngine());
37-
}
38-
}
34+
// default "java-sdk" name
35+
assertEquals("java-sdk", ClientEngineInfo.getClientEngineName());
3936

40-
@Test
41-
public void testDefaultValue() {
42-
assertEquals(ClientEngineInfo.DEFAULT, ClientEngineInfo.getClientEngine());
37+
ClientEngineInfo.setClientEngineName(null);
38+
assertEquals("java-sdk", ClientEngineInfo.getClientEngineName());
39+
40+
ClientEngineInfo.setClientEngineName("");
41+
assertEquals("java-sdk", ClientEngineInfo.getClientEngineName());
42+
43+
ClientEngineInfo.setClientEngineName("test-name");
44+
assertEquals("test-name", ClientEngineInfo.getClientEngineName());
4345
}
4446
}

core-api/src/test/java/com/optimizely/ab/event/internal/EventFactoryTest.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public EventFactoryTest(int datafileVersion,
8787

8888
@After
8989
public void tearDown() {
90-
ClientEngineInfo.setClientEngine(EventBatch.ClientEngine.JAVA_SDK);
90+
ClientEngineInfo.setClientEngineName(ClientEngineInfo.DEFAULT_NAME);
9191
}
9292

9393
/**
@@ -554,7 +554,7 @@ public void createImpressionEventIgnoresNullAttributes() {
554554
*/
555555
@Test
556556
public void createImpressionEventAndroidClientEngineClientVersion() throws Exception {
557-
ClientEngineInfo.setClientEngine(EventBatch.ClientEngine.ANDROID_SDK);
557+
ClientEngineInfo.setClientEngineName("android-sdk");
558558
ProjectConfig projectConfig = validProjectConfigV2();
559559
Experiment activatedExperiment = projectConfig.getExperiments().get(0);
560560
Variation bucketedVariation = activatedExperiment.getVariations().get(0);
@@ -566,7 +566,7 @@ public void createImpressionEventAndroidClientEngineClientVersion() throws Excep
566566
userId, attributeMap);
567567
EventBatch impression = gson.fromJson(impressionEvent.getBody(), EventBatch.class);
568568

569-
assertThat(impression.getClientName(), is(EventBatch.ClientEngine.ANDROID_SDK.getClientEngineValue()));
569+
assertThat(impression.getClientName(), is("android-sdk"));
570570
// assertThat(impression.getClientVersion(), is("0.0.0"));
571571
}
572572

@@ -577,7 +577,7 @@ public void createImpressionEventAndroidClientEngineClientVersion() throws Excep
577577
@Test
578578
public void createImpressionEventAndroidTVClientEngineClientVersion() throws Exception {
579579
String clientVersion = "0.0.0";
580-
ClientEngineInfo.setClientEngine(EventBatch.ClientEngine.ANDROID_TV_SDK);
580+
ClientEngineInfo.setClientEngineName("android-tv-sdk");
581581
ProjectConfig projectConfig = validProjectConfigV2();
582582
Experiment activatedExperiment = projectConfig.getExperiments().get(0);
583583
Variation bucketedVariation = activatedExperiment.getVariations().get(0);
@@ -589,7 +589,7 @@ public void createImpressionEventAndroidTVClientEngineClientVersion() throws Exc
589589
userId, attributeMap);
590590
EventBatch impression = gson.fromJson(impressionEvent.getBody(), EventBatch.class);
591591

592-
assertThat(impression.getClientName(), is(EventBatch.ClientEngine.ANDROID_TV_SDK.getClientEngineValue()));
592+
assertThat(impression.getClientName(), is("android-tv-sdk"));
593593
// assertThat(impression.getClientVersion(), is(clientVersion));
594594
}
595595

@@ -816,7 +816,7 @@ public void createConversionEventExperimentStatusPrecedesForcedVariation() {
816816
*/
817817
@Test
818818
public void createConversionEventAndroidClientEngineClientVersion() throws Exception {
819-
ClientEngineInfo.setClientEngine(EventBatch.ClientEngine.ANDROID_SDK);
819+
ClientEngineInfo.setClientEngineName("android-sdk");
820820
Attribute attribute = validProjectConfig.getAttributes().get(0);
821821
EventType eventType = validProjectConfig.getEventTypes().get(0);
822822

@@ -838,7 +838,7 @@ public void createConversionEventAndroidClientEngineClientVersion() throws Excep
838838

839839
EventBatch conversion = gson.fromJson(conversionEvent.getBody(), EventBatch.class);
840840

841-
assertThat(conversion.getClientName(), is(EventBatch.ClientEngine.ANDROID_SDK.getClientEngineValue()));
841+
assertThat(conversion.getClientName(), is("android-sdk"));
842842
// assertThat(conversion.getClientVersion(), is("0.0.0"));
843843
}
844844

@@ -849,7 +849,7 @@ public void createConversionEventAndroidClientEngineClientVersion() throws Excep
849849
@Test
850850
public void createConversionEventAndroidTVClientEngineClientVersion() throws Exception {
851851
String clientVersion = "0.0.0";
852-
ClientEngineInfo.setClientEngine(EventBatch.ClientEngine.ANDROID_TV_SDK);
852+
ClientEngineInfo.setClientEngineName("android-tv-sdk");
853853
ProjectConfig projectConfig = validProjectConfigV2();
854854
Attribute attribute = projectConfig.getAttributes().get(0);
855855
EventType eventType = projectConfig.getEventTypes().get(0);
@@ -873,7 +873,7 @@ public void createConversionEventAndroidTVClientEngineClientVersion() throws Exc
873873

874874
EventBatch conversion = gson.fromJson(conversionEvent.getBody(), EventBatch.class);
875875

876-
assertThat(conversion.getClientName(), is(EventBatch.ClientEngine.ANDROID_TV_SDK.getClientEngineValue()));
876+
assertThat(conversion.getClientName(), is("android-tv-sdk"));
877877
// assertThat(conversion.getClientVersion(), is(clientVersion));
878878
}
879879

gradle.properties

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ org.gradle.parallel = true
1313
gsonVersion = 2.10.1
1414
guavaVersion = 22.0
1515
hamcrestVersion = 1.3
16-
jacksonVersion = 2.15.2
16+
# NOTE: jackson 2.14+ uses Java8 stream apis not supported in android
17+
jacksonVersion = 2.13.5
1718
jsonVersion = 20190722
1819
jsonSimpleVersion = 1.1.1
1920
logbackVersion = 1.2.3

0 commit comments

Comments
 (0)