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

Commit ac3fcb2

Browse files
committed
Support for indirect put events
1 parent dbe4cf8 commit ac3fcb2

File tree

2 files changed

+80
-33
lines changed

2 files changed

+80
-33
lines changed

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

Lines changed: 70 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@
1818

1919
import java.io.IOException;
2020
import java.lang.reflect.Type;
21+
import java.util.Map;
2122

22-
/**
23-
* Created by jkodumal on 11/2/15.
24-
*/
2523
class FeatureRequestor {
2624

2725
private final String apiKey;
@@ -60,50 +58,90 @@ protected CloseableHttpClient createClient() {
6058
return client;
6159
}
6260

63-
<T> FeatureRep<T> makeRequest(String featureKey, boolean latest) throws IOException {
61+
Map<String, FeatureRep<?>> makeAllRequest(boolean latest) throws IOException {
6462
Gson gson = new Gson();
6563
HttpCacheContext context = HttpCacheContext.create();
6664

67-
String resource = latest ? "/api/eval/latest-features/" : "/api/eval/features/";
65+
String resource = latest ? "/api/eval/latest-features" : "/api/eval/features";
6866

69-
HttpGet request = config.getRequest(apiKey,resource + featureKey);
67+
HttpGet request = config.getRequest(apiKey, resource);
7068

7169
CloseableHttpResponse response = null;
7270
try {
7371
response = client.execute(request, context);
7472

75-
CacheResponseStatus responseStatus = context.getCacheResponseStatus();
76-
77-
switch (responseStatus) {
78-
case CACHE_HIT:
79-
logger.debug("A response was generated from the cache with " +
80-
"no requests sent upstream");
81-
break;
82-
case CACHE_MODULE_RESPONSE:
83-
logger.debug("The response was generated directly by the " +
84-
"caching module");
85-
break;
86-
case CACHE_MISS:
87-
logger.debug("The response came from an upstream server");
88-
break;
89-
case VALIDATED:
90-
logger.debug("The response was generated from the cache " +
91-
"after validating the entry with the origin server");
92-
break;
73+
logCacheResponse(context.getCacheResponseStatus());
74+
75+
handleResponseStatus(response.getStatusLine().getStatusCode(), null);
76+
77+
Type type = new TypeToken<Map<String, FeatureRep<?>>>() {}.getType();
78+
79+
Map<String, FeatureRep<?>> result = gson.fromJson(EntityUtils.toString(response.getEntity()), type);
80+
return result;
81+
}
82+
finally {
83+
try {
84+
if (response != null) response.close();
85+
} catch (IOException e) {
9386
}
87+
}
88+
}
9489

95-
int status = response.getStatusLine().getStatusCode();
90+
void logCacheResponse(CacheResponseStatus status) {
91+
switch (status) {
92+
case CACHE_HIT:
93+
logger.debug("A response was generated from the cache with " +
94+
"no requests sent upstream");
95+
break;
96+
case CACHE_MODULE_RESPONSE:
97+
logger.debug("The response was generated directly by the " +
98+
"caching module");
99+
break;
100+
case CACHE_MISS:
101+
logger.debug("The response came from an upstream server");
102+
break;
103+
case VALIDATED:
104+
logger.debug("The response was generated from the cache " +
105+
"after validating the entry with the origin server");
106+
break;
107+
}
108+
}
96109

97-
if (status != HttpStatus.SC_OK) {
98-
if (status == HttpStatus.SC_UNAUTHORIZED) {
99-
logger.error("Invalid API key");
100-
} else if (status == HttpStatus.SC_NOT_FOUND) {
110+
void handleResponseStatus(int status, String featureKey) throws IOException {
111+
112+
if (status != HttpStatus.SC_OK) {
113+
if (status == HttpStatus.SC_UNAUTHORIZED) {
114+
logger.error("Invalid API key");
115+
} else if (status == HttpStatus.SC_NOT_FOUND) {
116+
if (featureKey != null) {
101117
logger.error("Unknown feature key: " + featureKey);
102-
} else {
103-
logger.error("Unexpected status code: " + status);
104118
}
105-
throw new IOException("Failed to fetch flag");
119+
else {
120+
logger.error("Resource not found");
121+
}
122+
} else {
123+
logger.error("Unexpected status code: " + status);
106124
}
125+
throw new IOException("Failed to fetch flag");
126+
}
127+
128+
}
129+
130+
<T> FeatureRep<T> makeRequest(String featureKey, boolean latest) throws IOException {
131+
Gson gson = new Gson();
132+
HttpCacheContext context = HttpCacheContext.create();
133+
134+
String resource = latest ? "/api/eval/latest-features/" : "/api/eval/features/";
135+
136+
HttpGet request = config.getRequest(apiKey,resource + featureKey);
137+
138+
CloseableHttpResponse response = null;
139+
try {
140+
response = client.execute(request, context);
141+
142+
logCacheResponse(context.getCacheResponseStatus());
143+
144+
handleResponseStatus(response.getStatusLine().getStatusCode(), featureKey);
107145

108146
Type type = new TypeToken<FeatureRep<T>>() {}.getType();
109147

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class StreamProcessor implements Closeable {
2121
private static final String PUT = "put";
2222
private static final String PATCH = "patch";
2323
private static final String DELETE = "delete";
24+
private static final String INDIRECT_PUT = "indirect/put";
2425
private static final String INDIRECT_PATCH = "indirect/patch";
2526
private static final Logger logger = LoggerFactory.getLogger(StreamProcessor.class);
2627

@@ -65,8 +66,16 @@ else if (event.getName().equals(DELETE)) {
6566
FeatureDeleteData data = gson.fromJson(event.readData(), FeatureDeleteData.class);
6667
store.delete(data.key(), data.version());
6768
}
69+
else if (event.getName().equals(INDIRECT_PUT)) {
70+
try {
71+
Map<String, FeatureRep<?>> features = requestor.makeAllRequest(true);
72+
store.init(features);
73+
} catch (IOException e) {
74+
logger.error("Encountered exception in LaunchDarkly client", e);
75+
}
76+
}
6877
else if (event.getName().equals(INDIRECT_PATCH)) {
69-
String key = gson.fromJson(event.readData(), String.class);
78+
String key = event.readData();
7079
try {
7180
FeatureRep<?> feature = requestor.makeRequest(key, true);
7281
store.upsert(key, feature);

0 commit comments

Comments
 (0)