diff --git a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java index 2bc377a29..0757b6d4e 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java @@ -59,6 +59,8 @@ public class DatafileProjectConfig implements ProjectConfig { private final String accountId; private final String projectId; private final String revision; + private final String sdkKey; + private final String environmentKey; private final String version; private final boolean anonymizeIP; private final boolean sendFlagDecisions; @@ -108,6 +110,8 @@ public DatafileProjectConfig(String accountId, String projectId, String version, null, projectId, revision, + null, + null, version, attributes, audiences, @@ -127,6 +131,8 @@ public DatafileProjectConfig(String accountId, Boolean botFiltering, String projectId, String revision, + String sdkKey, + String environmentKey, String version, List attributes, List audiences, @@ -141,6 +147,8 @@ public DatafileProjectConfig(String accountId, this.projectId = projectId; this.version = version; this.revision = revision; + this.sdkKey = sdkKey; + this.environmentKey = environmentKey; this.anonymizeIP = anonymizeIP; this.sendFlagDecisions = sendFlagDecisions; this.botFiltering = botFiltering; @@ -326,6 +334,16 @@ public String getRevision() { return revision; } + @Override + public String getSdkKey() { + return sdkKey; + } + + @Override + public String getEnvironmentKey() { + return environmentKey; + } + @Override public boolean getSendFlagDecisions() { return sendFlagDecisions; } @@ -451,6 +469,8 @@ public String toString() { "accountId='" + accountId + '\'' + ", projectId='" + projectId + '\'' + ", revision='" + revision + '\'' + + ", sdkKey='" + sdkKey + '\'' + + ", environmentKey='" + environmentKey + '\'' + ", version='" + version + '\'' + ", anonymizeIP=" + anonymizeIP + ", botFiltering=" + botFiltering + diff --git a/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java index 5a85fbd4e..a6222e8b2 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java @@ -1,6 +1,6 @@ /** * - * Copyright 2016-2020, Optimizely and contributors + * Copyright 2016-2021, Optimizely and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,6 +55,10 @@ Experiment getExperimentForKey(@Nonnull String experimentKey, String getRevision(); + String getSdkKey(); + + String getEnvironmentKey(); + boolean getSendFlagDecisions(); boolean getAnonymizeIP(); diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java index 99ab71b78..26fe47330 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java @@ -1,6 +1,6 @@ /** * - * Copyright 2016-2020, Optimizely and contributors + * Copyright 2016-2021, Optimizely and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -87,6 +87,8 @@ public ProjectConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializa List featureFlags = null; List rollouts = null; Boolean botFiltering = null; + String sdkKey = null; + String environmentKey = null; boolean sendFlagDecisions = false; if (datafileVersion >= Integer.parseInt(DatafileProjectConfig.Version.V4.toString())) { Type featureFlagsType = new TypeToken>() { @@ -95,6 +97,10 @@ public ProjectConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializa Type rolloutsType = new TypeToken>() { }.getType(); rollouts = context.deserialize(jsonObject.get("rollouts").getAsJsonArray(), rolloutsType); + if (jsonObject.has("sdkKey")) + sdkKey = jsonObject.get("sdkKey").getAsString(); + if (jsonObject.has("environmentKey")) + environmentKey = jsonObject.get("environmentKey").getAsString(); if (jsonObject.has("botFiltering")) botFiltering = jsonObject.get("botFiltering").getAsBoolean(); if (jsonObject.has("sendFlagDecisions")) @@ -108,6 +114,8 @@ public ProjectConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializa botFiltering, projectId, revision, + sdkKey, + environmentKey, version, attributes, audiences, diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java index 06ae5b1a9..4cded2ecb 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java @@ -1,6 +1,6 @@ /** * - * Copyright 2016-2020, Optimizely and contributors + * Copyright 2016-2021, Optimizely and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,11 +63,19 @@ public DatafileProjectConfig deserialize(JsonParser parser, DeserializationConte List featureFlags = null; List rollouts = null; + String sdkKey = null; + String environmentKey = null; Boolean botFiltering = null; boolean sendFlagDecisions = false; if (datafileVersion >= Integer.parseInt(DatafileProjectConfig.Version.V4.toString())) { featureFlags = JacksonHelpers.arrayNodeToList(node.get("featureFlags"), FeatureFlag.class, codec); rollouts = JacksonHelpers.arrayNodeToList(node.get("rollouts"), Rollout.class, codec); + if (node.hasNonNull("sdkKey")) { + sdkKey = node.get("sdkKey").textValue(); + } + if (node.hasNonNull("environmentKey")) { + environmentKey = node.get("environmentKey").textValue(); + } if (node.hasNonNull("botFiltering")) { botFiltering = node.get("botFiltering").asBoolean(); } @@ -83,6 +91,8 @@ public DatafileProjectConfig deserialize(JsonParser parser, DeserializationConte botFiltering, projectId, revision, + sdkKey, + environmentKey, version, attributes, audiences, diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java index 5f707cb69..c33f30a68 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java @@ -1,6 +1,6 @@ /** * - * Copyright 2016-2019, 2020, Optimizely and contributors + * Copyright 2016-2021, Optimizely and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,11 +72,17 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse List featureFlags = null; List rollouts = null; + String sdkKey = null; + String environmentKey = null; Boolean botFiltering = null; boolean sendFlagDecisions = false; if (datafileVersion >= Integer.parseInt(ProjectConfig.Version.V4.toString())) { featureFlags = parseFeatureFlags(rootObject.getJSONArray("featureFlags")); rollouts = parseRollouts(rootObject.getJSONArray("rollouts")); + if (rootObject.has("sdkKey")) + sdkKey = rootObject.getString("sdkKey"); + if (rootObject.has("environmentKey")) + environmentKey = rootObject.getString("environmentKey"); if (rootObject.has("botFiltering")) botFiltering = rootObject.getBoolean("botFiltering"); if (rootObject.has("sendFlagDecisions")) @@ -90,6 +96,8 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse botFiltering, projectId, revision, + sdkKey, + environmentKey, version, attributes, audiences, @@ -100,6 +108,8 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse groups, rollouts ); + } catch (RuntimeException e) { + throw new ConfigParseException("Unable to parse datafile: " + json, e); } catch (Exception e) { throw new ConfigParseException("Unable to parse datafile: " + json, e); } diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java index b5238a356..751e651ca 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java @@ -1,6 +1,6 @@ /** * - * Copyright 2016-2019, 2020, Optimizely and contributors + * Copyright 2016-2021, Optimizely and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,6 +50,8 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse String accountId = (String) rootObject.get("accountId"); String projectId = (String) rootObject.get("projectId"); String revision = (String) rootObject.get("revision"); + String sdkKey = (String) rootObject.get("sdkKey"); + String environmentKey = (String) rootObject.get("environmentKey"); String version = (String) rootObject.get("version"); int datafileVersion = Integer.parseInt(version); @@ -97,6 +99,8 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse botFiltering, projectId, revision, + sdkKey, + environmentKey, version, attributes, audiences, diff --git a/core-api/src/main/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfig.java b/core-api/src/main/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfig.java index 3e1ab5d5b..c1640ff44 100644 --- a/core-api/src/main/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfig.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2020, Optimizely, Inc. and contributors * + * Copyright 2020-2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * @@ -16,31 +16,40 @@ package com.optimizely.ab.optimizelyconfig; +import com.fasterxml.jackson.annotation.JsonInclude; + import java.util.*; /** * Interface for OptimizleyConfig */ +@JsonInclude(JsonInclude.Include.NON_NULL) public class OptimizelyConfig { private Map experimentsMap; private Map featuresMap; private String revision; + private String sdkKey; + private String environmentKey; private String datafile; public OptimizelyConfig(Map experimentsMap, Map featuresMap, - String revision) { - this(experimentsMap, featuresMap, revision, null); + String revision, String sdkKey, String environmentKey) { + this(experimentsMap, featuresMap, revision, sdkKey, environmentKey, null); } public OptimizelyConfig(Map experimentsMap, Map featuresMap, String revision, + String sdkKey, + String environmentKey, String datafile) { this.experimentsMap = experimentsMap; this.featuresMap = featuresMap; this.revision = revision; + this.sdkKey = sdkKey; + this.environmentKey = environmentKey; this.datafile = datafile; } @@ -56,6 +65,12 @@ public String getRevision() { return revision; } + public String getSdkKey() { return sdkKey; } + + public String getEnvironmentKey() { + return environmentKey; + } + public String getDatafile() { return datafile; } diff --git a/core-api/src/main/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigService.java b/core-api/src/main/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigService.java index f739ae549..af1965ce1 100644 --- a/core-api/src/main/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigService.java +++ b/core-api/src/main/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigService.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2020, Optimizely, Inc. and contributors * + * Copyright 2020-2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * @@ -32,6 +32,8 @@ public OptimizelyConfigService(ProjectConfig projectConfig) { experimentsMap, getFeaturesMap(experimentsMap), projectConfig.getRevision(), + projectConfig.getSdkKey(), + projectConfig.getEnvironmentKey(), projectConfig.toDatafile() ); } diff --git a/core-api/src/test/java/com/optimizely/ab/config/PollingProjectConfigManagerTest.java b/core-api/src/test/java/com/optimizely/ab/config/PollingProjectConfigManagerTest.java index 5aebc884a..390c9b874 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/PollingProjectConfigManagerTest.java +++ b/core-api/src/test/java/com/optimizely/ab/config/PollingProjectConfigManagerTest.java @@ -1,6 +1,6 @@ /** * - * Copyright 2019-2020, Optimizely and contributors + * Copyright 2019-2021, Optimizely and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -156,6 +156,8 @@ public void testSetOptimizelyConfig(){ testProjectConfigManager.setConfig(projectConfig); assertEquals("1480511547", testProjectConfigManager.getOptimizelyConfig().getRevision()); + assertEquals("ValidProjectConfigV4", testProjectConfigManager.getOptimizelyConfig().getSdkKey()); + assertEquals("production", testProjectConfigManager.getOptimizelyConfig().getEnvironmentKey()); // cached config because project config is null testProjectConfigManager.setConfig(null); diff --git a/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java b/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java index 5a922452f..f8ea02231 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java +++ b/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java @@ -1,6 +1,6 @@ /** * - * Copyright 2017-2020, Optimizely and contributors + * Copyright 2017-2021, Optimizely and contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,8 @@ public class ValidProjectConfigV4 { private static final boolean BOT_FILTERING = true; private static final String PROJECT_ID = "3918735994"; private static final String REVISION = "1480511547"; + private static final String SDK_KEY = "ValidProjectConfigV4"; + private static final String ENVIRONMENT_KEY = "production"; private static final String VERSION = "4"; private static final Boolean SEND_FLAG_DECISIONS = true; @@ -1434,6 +1436,8 @@ public static ProjectConfig generateValidProjectConfigV4() { BOT_FILTERING, PROJECT_ID, REVISION, + SDK_KEY, + ENVIRONMENT_KEY, VERSION, attributes, audiences, diff --git a/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java b/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java index 4ceb0a67c..52bc06181 100644 --- a/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java +++ b/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2020, Optimizely, Inc. and contributors * + * Copyright 2020-2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * @@ -52,6 +52,18 @@ public void testRevision() { assertEquals(expectedConfig.getRevision(), revision); } + @Test + public void testSdkKey() { + String sdkKey = optimizelyConfigService.getConfig().getSdkKey(); + assertEquals(expectedConfig.getSdkKey(), sdkKey); + } + + @Test + public void testEnvironmentKey() { + String environmentKey = optimizelyConfigService.getConfig().getEnvironmentKey(); + assertEquals(expectedConfig.getEnvironmentKey(), environmentKey); + } + @Test public void testGetFeaturesMap() { Map optimizelyExperimentMap = optimizelyConfigService.getExperimentsMap(); @@ -152,6 +164,8 @@ private ProjectConfig generateOptimizelyConfig() { true, "3918735994", "1480511547", + "ValidProjectConfigV4", + "production", "4", asList( new Attribute( @@ -510,7 +524,9 @@ OptimizelyConfig getExpectedConfig() { return new OptimizelyConfig( optimizelyExperimentMap, optimizelyFeatureMap, - "1480511547" + "1480511547", + "ValidProjectConfigV4", + "production" ); } } diff --git a/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigTest.java b/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigTest.java index 3b9848a74..13b703799 100644 --- a/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigTest.java +++ b/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigTest.java @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2020, Optimizely, Inc. and contributors * + * Copyright 2020-2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * @@ -30,9 +30,13 @@ public void testOptimizelyConfig() { OptimizelyConfig optimizelyConfig = new OptimizelyConfig( generateExperimentMap(), generateFeatureMap(), - "101" + "101", + "testingSdkKey", + "development" ); assertEquals("101", optimizelyConfig.getRevision()); + assertEquals("testingSdkKey", optimizelyConfig.getSdkKey()); + assertEquals("development", optimizelyConfig.getEnvironmentKey()); // verify the experiments map Map optimizelyExperimentMap = generateExperimentMap(); assertEquals(optimizelyExperimentMap.size(), optimizelyConfig.getExperimentsMap().size()); diff --git a/core-api/src/test/resources/config/valid-project-config-v4.json b/core-api/src/test/resources/config/valid-project-config-v4.json index 88b5f815b..01c927a5c 100644 --- a/core-api/src/test/resources/config/valid-project-config-v4.json +++ b/core-api/src/test/resources/config/valid-project-config-v4.json @@ -5,6 +5,8 @@ "sendFlagDecisions": true, "projectId": "3918735994", "revision": "1480511547", + "sdkKey": "ValidProjectConfigV4", + "environmentKey": "production", "version": "4", "audiences": [ { diff --git a/core-httpclient-impl/src/test/resources/valid-project-config-v4.json b/core-httpclient-impl/src/test/resources/valid-project-config-v4.json index 4f58f4c66..5d46cbbb5 100644 --- a/core-httpclient-impl/src/test/resources/valid-project-config-v4.json +++ b/core-httpclient-impl/src/test/resources/valid-project-config-v4.json @@ -4,6 +4,8 @@ "botFiltering": true, "projectId": "3918735994", "revision": "1480511547", + "sdkKey": "ValidProjectConfigV4", + "environmentKey": "production", "version": "4", "audiences": [ {