Skip to content

Commit 80c6e28

Browse files
author
Mike Davis
authored
Improve usability of the HttpProjectConfigManager. (#301)
* Prevent NPE in HttpProjectConfigManager.Builder. * Move addNotificationHandler into NotificationCenter
1 parent 03ba62c commit 80c6e28

File tree

6 files changed

+63
-31
lines changed

6 files changed

+63
-31
lines changed

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

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -971,20 +971,12 @@ public int addUpdateConfigNotificationHandler(NotificationHandler<UpdateConfigNo
971971
}
972972

973973
/**
974-
* Convenience method for adding UpdateConfigNotification Handlers
974+
* Convenience method for adding NotificationHandlers
975975
*/
976-
private <T> int addNotificationHandler(Class<T> clazz, NotificationHandler<T> handler) {
977-
NotificationManager<T> notificationManager = notificationCenter.getNotificationManager(clazz);
978-
979-
if (notificationManager == null) {
980-
logger.warn("{} not supported by the NotificationCenter.", clazz);
981-
return -1;
982-
}
983-
984-
return notificationManager.addHandler(handler);
976+
public <T> int addNotificationHandler(Class<T> clazz, NotificationHandler<T> handler) {
977+
return notificationCenter.addNotificationHandler(clazz, handler);
985978
}
986979

987-
988980
//======== Builder ========//
989981
@Deprecated
990982
public static Builder builder(@Nonnull String datafile,
@@ -1062,6 +1054,11 @@ public Builder withConfigManager(ProjectConfigManager projectConfigManager) {
10621054
return this;
10631055
}
10641056

1057+
public Builder withNotificationCenter(NotificationCenter notificationCenter) {
1058+
this.notificationCenter = notificationCenter;
1059+
return this;
1060+
}
1061+
10651062
// Helper function for making testing easier
10661063
protected Builder withBucketing(Bucketer bucketer) {
10671064
this.bucketer = bucketer;
@@ -1083,11 +1080,6 @@ protected Builder withEventBuilder(EventFactory eventFactory) {
10831080
return this;
10841081
}
10851082

1086-
protected Builder withNotificationCenter(NotificationCenter notificationCenter) {
1087-
this.notificationCenter = notificationCenter;
1088-
return this;
1089-
}
1090-
10911083
public Optimizely build() {
10921084

10931085
if (clientEngine == null) {

core-api/src/main/java/com/optimizely/ab/notification/NotificationCenter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ public <T> NotificationManager<T> getNotificationManager(Class clazz) {
104104
return notifierMap.get(clazz);
105105
}
106106

107+
public <T> int addNotificationHandler(Class<T> clazz, NotificationHandler<T> handler) {
108+
NotificationManager<T> notificationManager = getNotificationManager(clazz);
109+
110+
if (notificationManager == null) {
111+
logger.warn("{} not supported by the NotificationCenter.", clazz);
112+
return -1;
113+
}
114+
115+
return notificationManager.addHandler(handler);
116+
}
117+
107118
/**
108119
* Convenience method to support lambdas as callbacks in later version of Java (8+).
109120
*

core-api/src/test/java/com/optimizely/ab/notification/NotificationCenterTest.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import org.junit.Test;
2929

3030
import javax.annotation.Nonnull;
31-
import java.util.ArrayList;
3231
import java.util.List;
3332
import java.util.Map;
3433

@@ -64,7 +63,6 @@ public void testAddWrongTrackNotificationListener() {
6463
logbackVerifier.expectMessage(Level.WARN, "Notification listener was the wrong type. It was not added to the notification center.");
6564
assertEquals(-1, notificationId);
6665
assertFalse(notificationCenter.removeNotificationListener(notificationId));
67-
6866
}
6967

7068
@Test
@@ -120,7 +118,7 @@ public void testAddDecisionNotification() {
120118
NotificationManager<DecisionNotification> manager = notificationCenter.getNotificationManager(DecisionNotification.class);
121119
int notificationId = manager.addHandler(decisionNotification -> { });
122120
assertNotSame(-1, notificationId);
123-
assertTrue(notificationCenter.removeNotificationListener(notificationId));
121+
assertTrue(manager.remove(notificationId));
124122
}
125123

126124
@Test
@@ -174,6 +172,20 @@ public void onActivate(@Nonnull Experiment experiment, @Nonnull String userId, @
174172
assertTrue(notificationCenter.removeNotificationListener(notificationId));
175173
}
176174

175+
@Test
176+
public void testAddValidNotificationHandler() {
177+
assertEquals(1, notificationCenter.addNotificationHandler(ActivateNotification.class, x -> {}));
178+
assertEquals(2, notificationCenter.addNotificationHandler(DecisionNotification.class, x -> {}));
179+
assertEquals(3, notificationCenter.addNotificationHandler(TrackNotification.class, x -> {}));
180+
assertEquals(4, notificationCenter.addNotificationHandler(UpdateConfigNotification.class, x -> {}));
181+
}
182+
183+
@Test
184+
public void testAddInvalidNotificationHandler() {
185+
int actual = notificationCenter.addNotificationHandler(Integer.class, i -> {});
186+
assertEquals(-1, actual);
187+
}
188+
177189
@Test
178190
@Deprecated
179191
public void testClearNotificationByActivateType() {
@@ -232,6 +244,5 @@ private void testSendWithNotification(Object notification) {
232244
List messages = handler.getMessages();
233245
assertEquals(1, messages.size());
234246
assertEquals(notification, messages.get(0));
235-
236247
}
237248
}

core-httpclient-impl/src/main/java/com/optimizely/ab/OptimizelyFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public static void setEventQueueParams(int queueCapacity, int numberWorkers) {
6666

6767
/**
6868
* Convenience method for setting the blocking timeout.
69-
* {@link HttpProjectConfigManager.Builder#withBlockingTimeout(long, TimeUnit)}
69+
* {@link HttpProjectConfigManager.Builder#withBlockingTimeout(Long, TimeUnit)}
7070
*/
7171
public static void setBlockingTimeout(long blockingDuration, TimeUnit blockingTimeout) {
7272
if (blockingTimeout == null) {
@@ -85,7 +85,7 @@ public static void setBlockingTimeout(long blockingDuration, TimeUnit blockingTi
8585

8686
/**
8787
* Convenience method for setting the polling interval on System properties.
88-
* {@link HttpProjectConfigManager.Builder#withPollingInterval(long, TimeUnit)}
88+
* {@link HttpProjectConfigManager.Builder#withPollingInterval(Long, TimeUnit)}
8989
*/
9090
public static void setPollingInterval(long pollingDuration, TimeUnit pollingTimeout) {
9191
if (pollingTimeout == null) {

core-httpclient-impl/src/main/java/com/optimizely/ab/config/HttpProjectConfigManager.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,17 @@ public Builder withOptimizelyHttpClient(OptimizelyHttpClient httpClient) {
174174
* PollingProjectConfigManager will begin returning null immediately until the call to Poll
175175
* succeeds.
176176
*/
177-
public Builder withBlockingTimeout(long period, TimeUnit timeUnit) {
177+
public Builder withBlockingTimeout(Long period, TimeUnit timeUnit) {
178178
if (timeUnit == null) {
179179
logger.warn("TimeUnit cannot be null. Keeping default period: {} and time unit: {}", this.blockingTimeoutPeriod, this.blockingTimeoutUnit);
180180
return this;
181181
}
182182

183+
if (period == null) {
184+
logger.warn("Timeout cannot be null. Keeping default period: {} and time unit: {}", this.blockingTimeoutPeriod, this.blockingTimeoutUnit);
185+
return this;
186+
}
187+
183188
if (period <= 0) {
184189
logger.warn("Timeout cannot be <= 0. Keeping default period: {} and time unit: {}", this.blockingTimeoutPeriod, this.blockingTimeoutUnit);
185190
return this;
@@ -191,12 +196,17 @@ public Builder withBlockingTimeout(long period, TimeUnit timeUnit) {
191196
return this;
192197
}
193198

194-
public Builder withPollingInterval(long period, TimeUnit timeUnit) {
199+
public Builder withPollingInterval(Long period, TimeUnit timeUnit) {
195200
if (timeUnit == null) {
196201
logger.warn("TimeUnit cannot be null. Keeping default period: {} and time unit: {}", this.period, this.timeUnit);
197202
return this;
198203
}
199204

205+
if (period == null) {
206+
logger.warn("Interval cannot be null. Keeping default period: {} and time unit: {}", this.period, this.timeUnit);
207+
return this;
208+
}
209+
200210
if (period <= 0) {
201211
logger.warn("Interval cannot be <= 0. Keeping default period: {} and time unit: {}", this.period, this.timeUnit);
202212
return this;

core-httpclient-impl/src/test/java/com/optimizely/ab/config/HttpProjectConfigManagerTest.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,19 @@ public void testInvalidPollingInterval() {
147147
long expectedPeriod = builder.period;
148148
TimeUnit expectedTimeUnit = builder.timeUnit;
149149

150-
builder.withPollingInterval(-1, SECONDS);
150+
builder.withPollingInterval(null, SECONDS);
151151
assertEquals(expectedPeriod, builder.period);
152152
assertEquals(expectedTimeUnit, builder.timeUnit);
153153

154-
builder.withPollingInterval(10, null);
154+
builder.withPollingInterval(-1L, SECONDS);
155155
assertEquals(expectedPeriod, builder.period);
156156
assertEquals(expectedTimeUnit, builder.timeUnit);
157157

158-
builder.withPollingInterval(10, SECONDS);
158+
builder.withPollingInterval(10L, null);
159+
assertEquals(expectedPeriod, builder.period);
160+
assertEquals(expectedTimeUnit, builder.timeUnit);
161+
162+
builder.withPollingInterval(10L, SECONDS);
159163
assertEquals(10, builder.period);
160164
assertEquals(SECONDS, builder.timeUnit);
161165
}
@@ -166,15 +170,19 @@ public void testInvalidBlockingTimeout() {
166170
long expectedPeriod = builder.blockingTimeoutPeriod;
167171
TimeUnit expectedTimeUnit = builder.blockingTimeoutUnit;
168172

169-
builder.withBlockingTimeout(-1, SECONDS);
173+
builder.withBlockingTimeout(null, SECONDS);
174+
assertEquals(expectedPeriod, builder.blockingTimeoutPeriod);
175+
assertEquals(expectedTimeUnit, builder.blockingTimeoutUnit);
176+
177+
builder.withBlockingTimeout(-1L, SECONDS);
170178
assertEquals(expectedPeriod, builder.blockingTimeoutPeriod);
171179
assertEquals(expectedTimeUnit, builder.blockingTimeoutUnit);
172180

173-
builder.withBlockingTimeout(10, null);
181+
builder.withBlockingTimeout(10L, null);
174182
assertEquals(expectedPeriod, builder.blockingTimeoutPeriod);
175183
assertEquals(expectedTimeUnit, builder.blockingTimeoutUnit);
176184

177-
builder.withBlockingTimeout(10, SECONDS);
185+
builder.withBlockingTimeout(10L, SECONDS);
178186
assertEquals(10, builder.blockingTimeoutPeriod);
179187
assertEquals(SECONDS, builder.blockingTimeoutUnit);
180188
}
@@ -243,7 +251,7 @@ public void testInvalidPayload() throws Exception {
243251
projectConfigManager = builder()
244252
.withOptimizelyHttpClient(mockHttpClient)
245253
.withSdkKey("sdk-key")
246-
.withBlockingTimeout(10, TimeUnit.MILLISECONDS)
254+
.withBlockingTimeout(10L, TimeUnit.MILLISECONDS)
247255
.build();
248256

249257
assertNull(projectConfigManager.getConfig());

0 commit comments

Comments
 (0)