Skip to content
This repository was archived by the owner on May 30, 2024. It is now read-only.

Commit 8746374

Browse files
committed
Support for indirect patch events
1 parent 91b188e commit 8746374

File tree

3 files changed

+28
-16
lines changed

3 files changed

+28
-16
lines changed

src/main/java/com/launchdarkly/client/LDClient.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public LDClient(String apiKey, LDConfig config) {
5353

5454
if (config.stream) {
5555
logger.debug("Enabling streaming API");
56-
this.streamProcessor = createStreamProcessor(apiKey, config);
56+
this.streamProcessor = createStreamProcessor(apiKey, config, requestor);
5757
this.streamProcessor.subscribe();
5858
} else {
5959
logger.debug("Streaming API disabled");
@@ -69,8 +69,8 @@ protected EventProcessor createEventProcessor(String apiKey, LDConfig config) {
6969
return new EventProcessor(apiKey, config);
7070
}
7171

72-
protected StreamProcessor createStreamProcessor(String apiKey, LDConfig config) {
73-
return new StreamProcessor(apiKey, config);
72+
protected StreamProcessor createStreamProcessor(String apiKey, LDConfig config, FeatureRequestor requestor) {
73+
return new StreamProcessor(apiKey, config, requestor);
7474
}
7575

7676

src/main/java/com/launchdarkly/client/StreamProcessor.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import org.glassfish.jersey.internal.util.collection.StringKeyIgnoreCaseMultivaluedMap;
66
import org.glassfish.jersey.media.sse.InboundEvent;
77
import org.glassfish.jersey.media.sse.SseFeature;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
810

911
import javax.ws.rs.client.Client;
1012
import javax.ws.rs.client.ClientBuilder;
@@ -19,18 +21,23 @@ class StreamProcessor implements Closeable {
1921
private static final String PUT = "put";
2022
private static final String PATCH = "patch";
2123
private static final String DELETE = "delete";
24+
private static final String INDIRECT_PATCH = "indirect/patch";
25+
private static final Logger logger = LoggerFactory.getLogger(StreamProcessor.class);
2226

2327
private final Client client;
2428
private final FeatureStore store;
2529
private final LDConfig config;
2630
private final String apiKey;
31+
private final FeatureRequestor requestor;
2732
private EventSource es;
2833

29-
StreamProcessor(String apiKey, LDConfig config) {
34+
35+
StreamProcessor(String apiKey, LDConfig config, FeatureRequestor requestor) {
3036
this.client = ClientBuilder.newBuilder().register(SseFeature.class).build();
3137
this.store = new InMemoryFeatureStore();
3238
this.config = config;
3339
this.apiKey = apiKey;
40+
this.requestor = requestor;
3441
}
3542

3643
void subscribe() {
@@ -58,8 +65,17 @@ else if (event.getName().equals(DELETE)) {
5865
FeatureDeleteData data = gson.fromJson(event.readData(), FeatureDeleteData.class);
5966
store.delete(data.key(), data.version());
6067
}
68+
else if (event.getName().equals(INDIRECT_PATCH)) {
69+
String key = gson.fromJson(event.readData(), String.class);
70+
try {
71+
FeatureRep<?> feature = requestor.makeRequest(key, true);
72+
store.upsert(key, feature);
73+
} catch (IOException e) {
74+
logger.error("Encountered exception in LaunchDarkly client", e);
75+
}
76+
}
6177
else {
62-
// TODO log an error
78+
logger.warn("Unexpected event found in stream: " + event.getName());
6379
}
6480
}
6581
};

src/test/java/com/launchdarkly/client/LDClientTest.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,24 @@ public class LDClientTest extends EasyMockSupport {
2020

2121
private CloseableHttpClient httpClient = createMock(CloseableHttpClient.class);
2222

23-
private EventProcessor eventProcessor = createMock(EventProcessor.class);
23+
private FeatureRequestor requestor = createMock(FeatureRequestor.class);
2424

2525
LDClient client = new LDClient("API_KEY") {
26-
@Override
27-
protected CloseableHttpClient createClient() {
28-
return httpClient;
29-
}
3026

3127
@Override
32-
protected EventProcessor createEventProcessor(String apiKey, LDConfig config) {
33-
return eventProcessor;
28+
protected FeatureRequestor createFeatureRequestor(String apiKey, LDConfig config) {
29+
return requestor;
3430
}
3531
};
3632

3733
@Test
3834
public void testExceptionThrownByHttpClientReturnsDefaultValue() throws IOException {
3935

40-
expect(httpClient.execute(anyObject(HttpUriRequest.class), anyObject(HttpContext.class))).andThrow(new RuntimeException());
41-
replay(httpClient);
36+
expect(requestor.makeRequest(anyString(), anyBoolean())).andThrow(new IOException());
37+
replay(requestor);
4238

43-
boolean result = client.getFlag("test", new LDUser("test.key"), true);
39+
boolean result = client.toggle("test", new LDUser("test.key"), true);
4440
assertEquals(true, result);
45-
verify(httpClient);
41+
verify(requestor);
4642
}
4743
}

0 commit comments

Comments
 (0)