From e0c6ba034b03ad68fee82239f352c52b2e2fa42f Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 11 Jun 2020 17:39:16 -0700 Subject: [PATCH 1/7] add auth-datafile support --- .../com/optimizely/ab/OptimizelyFactory.java | 19 ++++++++++ .../ab/config/HttpProjectConfigManager.java | 38 +++++++++++++++++-- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java index 93c08638b..5652b7309 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java @@ -189,6 +189,25 @@ public static Optimizely newDefaultInstance(String sdkKey, String fallback) { return newDefaultInstance(builder.build(), notificationCenter); } + /** + * Returns a new Optimizely instance with authenticated datafile support. + * + * @param sdkKey SDK key used to build the ProjectConfigManager. + * @param authDatafileToken Token for authenticated datafile access. + * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. + */ + public static Optimizely newDefaultInstance(String sdkKey, String authDatafileToken, String fallback) { + NotificationCenter notificationCenter = new NotificationCenter(); + + HttpProjectConfigManager.Builder builder = HttpProjectConfigManager.builder() + .withDatafile(fallback) + .withNotificationCenter(notificationCenter) + .withSdkKey(sdkKey) + .withAuthDatafileToken(authDatafileToken); + + return newDefaultInstance(builder.build(), notificationCenter); + } + /** * Returns a new Optimizely instance based on preset configuration. * EventHandler - {@link AsyncEventHandler} diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java index f2f8a61be..3cd8a9a8b 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java @@ -54,12 +54,21 @@ public class HttpProjectConfigManager extends PollingProjectConfigManager { private final OptimizelyHttpClient httpClient; private final URI uri; + private final String authDatafileToken; private String datafileLastModified; - private HttpProjectConfigManager(long period, TimeUnit timeUnit, OptimizelyHttpClient httpClient, String url, long blockingTimeoutPeriod, TimeUnit blockingTimeoutUnit, NotificationCenter notificationCenter) { + private HttpProjectConfigManager(long period, + TimeUnit timeUnit, + OptimizelyHttpClient httpClient, + String url, + String authDatafileToken, + long blockingTimeoutPeriod, + TimeUnit blockingTimeoutUnit, + NotificationCenter notificationCenter) { super(period, timeUnit, blockingTimeoutPeriod, blockingTimeoutUnit, notificationCenter); this.httpClient = httpClient; this.uri = URI.create(url); + this.authDatafileToken = authDatafileToken; } public URI getUri() { @@ -106,6 +115,10 @@ static ProjectConfig parseProjectConfig(String datafile) throws ConfigParseExcep protected ProjectConfig poll() { HttpGet httpGet = new HttpGet(uri); + if (authDatafileToken != null) { + httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authDatafileToken); + } + if (datafileLastModified != null) { httpGet.setHeader(HttpHeaders.IF_MODIFIED_SINCE, datafileLastModified); } @@ -132,7 +145,9 @@ public static Builder builder() { public static class Builder { private String datafile; private String url; + private String authDatafileToken = null; private String format = "https://cdn.optimizely.com/datafiles/%s.json"; + private String authFormat = "https://www.optimizely-cdn.com/datafiles/auth/%s.json"; private OptimizelyHttpClient httpClient; private NotificationCenter notificationCenter; @@ -153,6 +168,11 @@ public Builder withSdkKey(String sdkKey) { return this; } + public Builder withAuthDatafileToken(String token) { + this.authDatafileToken = token; + return this; + } + public Builder withUrl(String url) { this.url = url; return this; @@ -261,14 +281,26 @@ public HttpProjectConfigManager build(boolean defer) { throw new NullPointerException("sdkKey cannot be null"); } - url = String.format(format, sdkKey); + if (authDatafileToken == null) { + url = String.format(format, sdkKey); + } else { + url = String.format(authFormat, sdkKey); + } } if (notificationCenter == null) { notificationCenter = new NotificationCenter(); } - HttpProjectConfigManager httpProjectManager = new HttpProjectConfigManager(period, timeUnit, httpClient, url, blockingTimeoutPeriod, blockingTimeoutUnit, notificationCenter); + HttpProjectConfigManager httpProjectManager = new HttpProjectConfigManager( + period, + timeUnit, + httpClient, + url, + authDatafileToken, + blockingTimeoutPeriod, + blockingTimeoutUnit, + notificationCenter); if (datafile != null) { try { From 642997b024e68fb7b691619f03fa15ec564d5baa Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Fri, 12 Jun 2020 12:00:51 -0700 Subject: [PATCH 2/7] add tests for auth-datafile --- .../ab/config/HttpProjectConfigManager.java | 24 +++++--- .../optimizely/ab/OptimizelyFactoryTest.java | 7 +++ .../config/HttpProjectConfigManagerTest.java | 56 ++++++++++++++++++- 3 files changed, 75 insertions(+), 12 deletions(-) diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java index 3cd8a9a8b..cc5a0ea61 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java @@ -113,15 +113,7 @@ static ProjectConfig parseProjectConfig(String datafile) throws ConfigParseExcep @Override protected ProjectConfig poll() { - HttpGet httpGet = new HttpGet(uri); - - if (authDatafileToken != null) { - httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authDatafileToken); - } - - if (datafileLastModified != null) { - httpGet.setHeader(HttpHeaders.IF_MODIFIED_SINCE, datafileLastModified); - } + HttpGet httpGet = createHttpRequest(); logger.debug("Fetching datafile from: {}", httpGet.getURI()); try { @@ -138,6 +130,20 @@ protected ProjectConfig poll() { return null; } + HttpGet createHttpRequest() { + HttpGet httpGet = new HttpGet(uri); + + if (authDatafileToken != null) { + httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authDatafileToken); + } + + if (datafileLastModified != null) { + httpGet.setHeader(HttpHeaders.IF_MODIFIED_SINCE, datafileLastModified); + } + + return httpGet; + } + public static Builder builder() { return new Builder(); } diff --git a/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java b/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java index 9dfe0658e..5a3f1cce6 100644 --- a/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java +++ b/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java @@ -191,6 +191,13 @@ public void newDefaultInstanceWithFallback() throws Exception { assertTrue(optimizely.isValid()); } + @Test + public void newDefaultInstanceWithAuthDatafileToken() throws Exception { + String datafileString = Resources.toString(Resources.getResource("valid-project-config-v4.json"), Charsets.UTF_8); + optimizely = OptimizelyFactory.newDefaultInstance("sdk-key", "auth-token", datafileString); + assertTrue(optimizely.isValid()); + } + @Test public void newDefaultInstanceWithProjectConfig() throws Exception { optimizely = OptimizelyFactory.newDefaultInstance(() -> null); diff --git a/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java b/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java index aa5555de4..bc52085c4 100644 --- a/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java +++ b/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java @@ -43,9 +43,7 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.junit.Assert.*; import static org.mockito.Matchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.reset; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class HttpProjectConfigManagerTest { @@ -125,6 +123,58 @@ public void testHttpGetByCustomUrl() throws Exception { assertEquals(new URI(expected), actual); } + @Test + public void testHttpGetBySdkKeyForAuthDatafile() throws Exception { + projectConfigManager = builder() + .withOptimizelyHttpClient(mockHttpClient) + .withSdkKey("sdk-key") + .withAuthDatafileToken("auth-token") + .build(); + + URI actual = projectConfigManager.getUri(); + assertEquals(new URI("https://www.optimizely-cdn.com/datafiles/auth/sdk-key.json"), actual); + } + + @Test + public void testHttpGetByCustomUrlForAuthDatafile() throws Exception { + String expected = "https://custom.optimizely.com/custom-location.json"; + + projectConfigManager = builder() + .withOptimizelyHttpClient(mockHttpClient) + .withUrl(expected) + .withSdkKey("sdk-key") + .withAuthDatafileToken("auth-token") + .build(); + + URI actual = projectConfigManager.getUri(); + assertEquals(new URI(expected), actual); + } + + @Test + public void testCreateHttpRequest() throws Exception { + projectConfigManager = builder() + .withOptimizelyHttpClient(mockHttpClient) + .withSdkKey("sdk-key") + .build(); + + HttpGet request = projectConfigManager.createHttpRequest(); + assertEquals(request.getURI().toString(), "https://cdn.optimizely.com/datafiles/sdk-key.json"); + assertEquals(request.getHeaders("Authorization").length, 0); + } + + @Test + public void testCreateHttpRequestForAuthDatafile() throws Exception { + projectConfigManager = builder() + .withOptimizelyHttpClient(mockHttpClient) + .withSdkKey("sdk-key") + .withAuthDatafileToken("auth-token") + .build(); + + HttpGet request = projectConfigManager.createHttpRequest(); + assertEquals(request.getURI().toString(), "https://www.optimizely-cdn.com/datafiles/auth/sdk-key.json"); + assertEquals(request.getHeaders("Authorization")[0].getValue(), "Bearer auth-token"); + } + @Test public void testPoll() throws Exception { projectConfigManager = builder() From 3c5e8cdc587f6768734e3840158c8730c32a98c9 Mon Sep 17 00:00:00 2001 From: Jae Kim <45045038+jaeopt@users.noreply.github.com> Date: Mon, 15 Jun 2020 17:13:46 -0700 Subject: [PATCH 3/7] Update core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java Co-authored-by: Matt Carroll --- .../java/com/optimizely/ab/config/HttpProjectConfigManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java index cc5a0ea61..2cb7f00bd 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java @@ -153,7 +153,7 @@ public static class Builder { private String url; private String authDatafileToken = null; private String format = "https://cdn.optimizely.com/datafiles/%s.json"; - private String authFormat = "https://www.optimizely-cdn.com/datafiles/auth/%s.json"; + private String authFormat = "https://config.optimizely.com/datafiles/auth/%s.json"; private OptimizelyHttpClient httpClient; private NotificationCenter notificationCenter; From b5d952e9597d8bb4641dca8fbfc19461fbca2894 Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Mon, 15 Jun 2020 17:26:24 -0700 Subject: [PATCH 4/7] fix per review --- .../com/optimizely/ab/OptimizelyFactory.java | 6 +++--- .../ab/config/HttpProjectConfigManager.java | 20 +++++++++---------- .../optimizely/ab/OptimizelyFactoryTest.java | 2 +- .../config/HttpProjectConfigManagerTest.java | 12 +++++------ 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java index 5652b7309..133d7b438 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java @@ -193,17 +193,17 @@ public static Optimizely newDefaultInstance(String sdkKey, String fallback) { * Returns a new Optimizely instance with authenticated datafile support. * * @param sdkKey SDK key used to build the ProjectConfigManager. - * @param authDatafileToken Token for authenticated datafile access. + * @param datafileAuthToken Token for authenticated datafile access. * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. */ - public static Optimizely newDefaultInstance(String sdkKey, String authDatafileToken, String fallback) { + public static Optimizely newDefaultInstance(String sdkKey, String datafileAuthToken, String fallback) { NotificationCenter notificationCenter = new NotificationCenter(); HttpProjectConfigManager.Builder builder = HttpProjectConfigManager.builder() .withDatafile(fallback) .withNotificationCenter(notificationCenter) .withSdkKey(sdkKey) - .withAuthDatafileToken(authDatafileToken); + .withDatafileAuthToken(datafileAuthToken); return newDefaultInstance(builder.build(), notificationCenter); } diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java index 2cb7f00bd..35412c3bc 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java @@ -54,21 +54,21 @@ public class HttpProjectConfigManager extends PollingProjectConfigManager { private final OptimizelyHttpClient httpClient; private final URI uri; - private final String authDatafileToken; + private final String datafileAuthToken; private String datafileLastModified; private HttpProjectConfigManager(long period, TimeUnit timeUnit, OptimizelyHttpClient httpClient, String url, - String authDatafileToken, + String datafileAuthToken, long blockingTimeoutPeriod, TimeUnit blockingTimeoutUnit, NotificationCenter notificationCenter) { super(period, timeUnit, blockingTimeoutPeriod, blockingTimeoutUnit, notificationCenter); this.httpClient = httpClient; this.uri = URI.create(url); - this.authDatafileToken = authDatafileToken; + this.datafileAuthToken = datafileAuthToken; } public URI getUri() { @@ -133,8 +133,8 @@ protected ProjectConfig poll() { HttpGet createHttpRequest() { HttpGet httpGet = new HttpGet(uri); - if (authDatafileToken != null) { - httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + authDatafileToken); + if (datafileAuthToken != null) { + httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + datafileAuthToken); } if (datafileLastModified != null) { @@ -151,7 +151,7 @@ public static Builder builder() { public static class Builder { private String datafile; private String url; - private String authDatafileToken = null; + private String datafileAuthToken = null; private String format = "https://cdn.optimizely.com/datafiles/%s.json"; private String authFormat = "https://config.optimizely.com/datafiles/auth/%s.json"; private OptimizelyHttpClient httpClient; @@ -174,8 +174,8 @@ public Builder withSdkKey(String sdkKey) { return this; } - public Builder withAuthDatafileToken(String token) { - this.authDatafileToken = token; + public Builder withDatafileAuthToken(String token) { + this.datafileAuthToken = token; return this; } @@ -287,7 +287,7 @@ public HttpProjectConfigManager build(boolean defer) { throw new NullPointerException("sdkKey cannot be null"); } - if (authDatafileToken == null) { + if (datafileAuthToken == null) { url = String.format(format, sdkKey); } else { url = String.format(authFormat, sdkKey); @@ -303,7 +303,7 @@ public HttpProjectConfigManager build(boolean defer) { timeUnit, httpClient, url, - authDatafileToken, + datafileAuthToken, blockingTimeoutPeriod, blockingTimeoutUnit, notificationCenter); diff --git a/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java b/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java index 5a3f1cce6..7eb20a5bc 100644 --- a/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java +++ b/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java @@ -192,7 +192,7 @@ public void newDefaultInstanceWithFallback() throws Exception { } @Test - public void newDefaultInstanceWithAuthDatafileToken() throws Exception { + public void newDefaultInstanceWithDatafileAuthToken() throws Exception { String datafileString = Resources.toString(Resources.getResource("valid-project-config-v4.json"), Charsets.UTF_8); optimizely = OptimizelyFactory.newDefaultInstance("sdk-key", "auth-token", datafileString); assertTrue(optimizely.isValid()); diff --git a/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java b/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java index bc52085c4..58ec86a4c 100644 --- a/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java +++ b/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java @@ -128,13 +128,13 @@ public void testHttpGetBySdkKeyForAuthDatafile() throws Exception { projectConfigManager = builder() .withOptimizelyHttpClient(mockHttpClient) .withSdkKey("sdk-key") - .withAuthDatafileToken("auth-token") + .withDatafileAuthToken("auth-token") .build(); URI actual = projectConfigManager.getUri(); - assertEquals(new URI("https://www.optimizely-cdn.com/datafiles/auth/sdk-key.json"), actual); + assertEquals(new URI("https://config.optimizely.com/datafiles/auth/sdk-key.json"), actual); } - + @Test public void testHttpGetByCustomUrlForAuthDatafile() throws Exception { String expected = "https://custom.optimizely.com/custom-location.json"; @@ -143,7 +143,7 @@ public void testHttpGetByCustomUrlForAuthDatafile() throws Exception { .withOptimizelyHttpClient(mockHttpClient) .withUrl(expected) .withSdkKey("sdk-key") - .withAuthDatafileToken("auth-token") + .withDatafileAuthToken("auth-token") .build(); URI actual = projectConfigManager.getUri(); @@ -167,11 +167,11 @@ public void testCreateHttpRequestForAuthDatafile() throws Exception { projectConfigManager = builder() .withOptimizelyHttpClient(mockHttpClient) .withSdkKey("sdk-key") - .withAuthDatafileToken("auth-token") + .withDatafileAuthToken("auth-token") .build(); HttpGet request = projectConfigManager.createHttpRequest(); - assertEquals(request.getURI().toString(), "https://www.optimizely-cdn.com/datafiles/auth/sdk-key.json"); + assertEquals(request.getURI().toString(), "https://config.optimizely.com/datafiles/auth/sdk-key.json"); assertEquals(request.getHeaders("Authorization")[0].getValue(), "Bearer auth-token"); } From 2bf13d2000520427ddaa83fa22e225ba1084973b Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Wed, 17 Jun 2020 14:20:56 -0700 Subject: [PATCH 5/7] add visibleForTesting annotation --- .../java/com/optimizely/ab/config/HttpProjectConfigManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java index 35412c3bc..c851c90da 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java @@ -18,6 +18,7 @@ import com.optimizely.ab.HttpClientUtils; import com.optimizely.ab.OptimizelyHttpClient; +import com.optimizely.ab.annotations.VisibleForTesting; import com.optimizely.ab.config.parser.ConfigParseException; import com.optimizely.ab.internal.PropertyUtils; import com.optimizely.ab.notification.NotificationCenter; @@ -130,6 +131,7 @@ protected ProjectConfig poll() { return null; } + @VisibleForTesting HttpGet createHttpRequest() { HttpGet httpGet = new HttpGet(uri); From bf85eb09a64ce4a18186ed050059c9950255d5ed Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Thu, 18 Jun 2020 09:37:45 -0700 Subject: [PATCH 6/7] add datafileAuthToken set in optimizely.properties --- .../com/optimizely/ab/OptimizelyFactory.java | 21 ++++++++----------- .../ab/config/HttpProjectConfigManager.java | 1 + .../optimizely/ab/OptimizelyFactoryTest.java | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java index 133d7b438..d4dde0962 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java @@ -179,31 +179,28 @@ public static Optimizely newDefaultInstance(String sdkKey) { * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. */ public static Optimizely newDefaultInstance(String sdkKey, String fallback) { - NotificationCenter notificationCenter = new NotificationCenter(); - - HttpProjectConfigManager.Builder builder = HttpProjectConfigManager.builder() - .withDatafile(fallback) - .withNotificationCenter(notificationCenter) - .withSdkKey(sdkKey); - - return newDefaultInstance(builder.build(), notificationCenter); + String datafileAuthToken = PropertyUtils.get(HttpProjectConfigManager.CONFIG_DATAFILE_AUTH_TOKEN); + return newDefaultInstance(sdkKey, fallback, datafileAuthToken); } /** * Returns a new Optimizely instance with authenticated datafile support. * * @param sdkKey SDK key used to build the ProjectConfigManager. - * @param datafileAuthToken Token for authenticated datafile access. * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. + * @param datafileAuthToken Token for authenticated datafile access. */ - public static Optimizely newDefaultInstance(String sdkKey, String datafileAuthToken, String fallback) { + public static Optimizely newDefaultInstance(String sdkKey, String fallback, String datafileAuthToken) { NotificationCenter notificationCenter = new NotificationCenter(); HttpProjectConfigManager.Builder builder = HttpProjectConfigManager.builder() .withDatafile(fallback) .withNotificationCenter(notificationCenter) - .withSdkKey(sdkKey) - .withDatafileAuthToken(datafileAuthToken); + .withSdkKey(sdkKey); + + if (datafileAuthToken != null) { + builder.withDatafileAuthToken(datafileAuthToken); + } return newDefaultInstance(builder.build(), notificationCenter); } diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java index c851c90da..6f32180fa 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java @@ -45,6 +45,7 @@ public class HttpProjectConfigManager extends PollingProjectConfigManager { public static final String CONFIG_BLOCKING_DURATION = "http.project.config.manager.blocking.duration"; public static final String CONFIG_BLOCKING_UNIT = "http.project.config.manager.blocking.unit"; public static final String CONFIG_SDK_KEY = "http.project.config.manager.sdk.key"; + public static final String CONFIG_DATAFILE_AUTH_TOKEN = "http.project.config.manager.datafile.auth.token"; public static final long DEFAULT_POLLING_DURATION = 5; public static final TimeUnit DEFAULT_POLLING_UNIT = TimeUnit.MINUTES; diff --git a/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java b/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java index 7eb20a5bc..392c70108 100644 --- a/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java +++ b/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java @@ -194,7 +194,7 @@ public void newDefaultInstanceWithFallback() throws Exception { @Test public void newDefaultInstanceWithDatafileAuthToken() throws Exception { String datafileString = Resources.toString(Resources.getResource("valid-project-config-v4.json"), Charsets.UTF_8); - optimizely = OptimizelyFactory.newDefaultInstance("sdk-key", "auth-token", datafileString); + optimizely = OptimizelyFactory.newDefaultInstance("sdk-key", datafileString, "auth-token"); assertTrue(optimizely.isValid()); } From e80d89e6ad0093b79122ce36191bce40ad78838b Mon Sep 17 00:00:00 2001 From: Jae Kim Date: Mon, 22 Jun 2020 13:27:56 -0700 Subject: [PATCH 7/7] change datafileAuthToken to datafileAccessToken --- .../com/optimizely/ab/OptimizelyFactory.java | 12 +++++------ .../ab/config/HttpProjectConfigManager.java | 20 +++++++++---------- .../optimizely/ab/OptimizelyFactoryTest.java | 2 +- .../config/HttpProjectConfigManagerTest.java | 6 +++--- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java index d4dde0962..989e578f0 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java @@ -179,8 +179,8 @@ public static Optimizely newDefaultInstance(String sdkKey) { * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. */ public static Optimizely newDefaultInstance(String sdkKey, String fallback) { - String datafileAuthToken = PropertyUtils.get(HttpProjectConfigManager.CONFIG_DATAFILE_AUTH_TOKEN); - return newDefaultInstance(sdkKey, fallback, datafileAuthToken); + String datafileAccessToken = PropertyUtils.get(HttpProjectConfigManager.CONFIG_DATAFILE_AUTH_TOKEN); + return newDefaultInstance(sdkKey, fallback, datafileAccessToken); } /** @@ -188,9 +188,9 @@ public static Optimizely newDefaultInstance(String sdkKey, String fallback) { * * @param sdkKey SDK key used to build the ProjectConfigManager. * @param fallback Fallback datafile string used by the ProjectConfigManager to be immediately available. - * @param datafileAuthToken Token for authenticated datafile access. + * @param datafileAccessToken Token for authenticated datafile access. */ - public static Optimizely newDefaultInstance(String sdkKey, String fallback, String datafileAuthToken) { + public static Optimizely newDefaultInstance(String sdkKey, String fallback, String datafileAccessToken) { NotificationCenter notificationCenter = new NotificationCenter(); HttpProjectConfigManager.Builder builder = HttpProjectConfigManager.builder() @@ -198,8 +198,8 @@ public static Optimizely newDefaultInstance(String sdkKey, String fallback, Stri .withNotificationCenter(notificationCenter) .withSdkKey(sdkKey); - if (datafileAuthToken != null) { - builder.withDatafileAuthToken(datafileAuthToken); + if (datafileAccessToken != null) { + builder.withDatafileAccessToken(datafileAccessToken); } return newDefaultInstance(builder.build(), notificationCenter); diff --git a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java index 6f32180fa..afe7db451 100644 --- a/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java +++ b/core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java @@ -56,21 +56,21 @@ public class HttpProjectConfigManager extends PollingProjectConfigManager { private final OptimizelyHttpClient httpClient; private final URI uri; - private final String datafileAuthToken; + private final String datafileAccessToken; private String datafileLastModified; private HttpProjectConfigManager(long period, TimeUnit timeUnit, OptimizelyHttpClient httpClient, String url, - String datafileAuthToken, + String datafileAccessToken, long blockingTimeoutPeriod, TimeUnit blockingTimeoutUnit, NotificationCenter notificationCenter) { super(period, timeUnit, blockingTimeoutPeriod, blockingTimeoutUnit, notificationCenter); this.httpClient = httpClient; this.uri = URI.create(url); - this.datafileAuthToken = datafileAuthToken; + this.datafileAccessToken = datafileAccessToken; } public URI getUri() { @@ -136,8 +136,8 @@ protected ProjectConfig poll() { HttpGet createHttpRequest() { HttpGet httpGet = new HttpGet(uri); - if (datafileAuthToken != null) { - httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + datafileAuthToken); + if (datafileAccessToken != null) { + httpGet.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + datafileAccessToken); } if (datafileLastModified != null) { @@ -154,7 +154,7 @@ public static Builder builder() { public static class Builder { private String datafile; private String url; - private String datafileAuthToken = null; + private String datafileAccessToken = null; private String format = "https://cdn.optimizely.com/datafiles/%s.json"; private String authFormat = "https://config.optimizely.com/datafiles/auth/%s.json"; private OptimizelyHttpClient httpClient; @@ -177,8 +177,8 @@ public Builder withSdkKey(String sdkKey) { return this; } - public Builder withDatafileAuthToken(String token) { - this.datafileAuthToken = token; + public Builder withDatafileAccessToken(String token) { + this.datafileAccessToken = token; return this; } @@ -290,7 +290,7 @@ public HttpProjectConfigManager build(boolean defer) { throw new NullPointerException("sdkKey cannot be null"); } - if (datafileAuthToken == null) { + if (datafileAccessToken == null) { url = String.format(format, sdkKey); } else { url = String.format(authFormat, sdkKey); @@ -306,7 +306,7 @@ public HttpProjectConfigManager build(boolean defer) { timeUnit, httpClient, url, - datafileAuthToken, + datafileAccessToken, blockingTimeoutPeriod, blockingTimeoutUnit, notificationCenter); diff --git a/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java b/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java index 392c70108..8b595a019 100644 --- a/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java +++ b/core-httpclient-impl/src/test/java/com/optimizely/ab/OptimizelyFactoryTest.java @@ -192,7 +192,7 @@ public void newDefaultInstanceWithFallback() throws Exception { } @Test - public void newDefaultInstanceWithDatafileAuthToken() throws Exception { + public void newDefaultInstanceWithDatafileAccessToken() throws Exception { String datafileString = Resources.toString(Resources.getResource("valid-project-config-v4.json"), Charsets.UTF_8); optimizely = OptimizelyFactory.newDefaultInstance("sdk-key", datafileString, "auth-token"); assertTrue(optimizely.isValid()); diff --git a/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java b/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java index 58ec86a4c..43c0d3c31 100644 --- a/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java +++ b/core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java @@ -128,7 +128,7 @@ public void testHttpGetBySdkKeyForAuthDatafile() throws Exception { projectConfigManager = builder() .withOptimizelyHttpClient(mockHttpClient) .withSdkKey("sdk-key") - .withDatafileAuthToken("auth-token") + .withDatafileAccessToken("auth-token") .build(); URI actual = projectConfigManager.getUri(); @@ -143,7 +143,7 @@ public void testHttpGetByCustomUrlForAuthDatafile() throws Exception { .withOptimizelyHttpClient(mockHttpClient) .withUrl(expected) .withSdkKey("sdk-key") - .withDatafileAuthToken("auth-token") + .withDatafileAccessToken("auth-token") .build(); URI actual = projectConfigManager.getUri(); @@ -167,7 +167,7 @@ public void testCreateHttpRequestForAuthDatafile() throws Exception { projectConfigManager = builder() .withOptimizelyHttpClient(mockHttpClient) .withSdkKey("sdk-key") - .withDatafileAuthToken("auth-token") + .withDatafileAccessToken("auth-token") .build(); HttpGet request = projectConfigManager.createHttpRequest();