Skip to content

Commit d24eb30

Browse files
committed
add simple cache filter
1 parent 53a185a commit d24eb30

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

src/main/java/com/graphhopper/converter/ConverterApplication.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.graphhopper.converter;
22

3+
import com.graphhopper.converter.api.CacheFilter;
34
import com.graphhopper.converter.api.IPFilter;
45
import com.graphhopper.converter.health.NominatimHealthCheck;
56
import com.graphhopper.converter.resources.*;
@@ -53,6 +54,8 @@ public void run(ConverterConfiguration converterConfiguration, Environment envir
5354
final Client client = new JerseyClientBuilder(environment).using(cfg)
5455
.build(getName());
5556

57+
environment.jersey().register(new CacheFilter());
58+
5659
if (converterConfiguration.isNominatim()) {
5760
final ConverterResourceNominatim resource = new ConverterResourceNominatim(
5861
converterConfiguration.getNominatimURL(),
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.graphhopper.converter.api;
2+
3+
import com.google.common.cache.Cache;
4+
import com.google.common.cache.CacheBuilder;
5+
6+
import javax.ws.rs.container.ContainerRequestContext;
7+
import javax.ws.rs.container.ContainerResponseContext;
8+
import javax.ws.rs.container.ContainerResponseFilter;
9+
import javax.ws.rs.container.PreMatching;
10+
import javax.ws.rs.core.Response;
11+
import javax.ws.rs.ext.Provider;
12+
import java.io.IOException;
13+
import java.util.concurrent.TimeUnit;
14+
15+
@Provider
16+
@PreMatching
17+
public class CacheFilter implements ContainerResponseFilter {
18+
19+
private static final Cache<String, Response> cache = CacheBuilder.newBuilder()
20+
.maximumSize(1000)
21+
.expireAfterWrite(10, TimeUnit.MINUTES)
22+
.build();
23+
24+
@Override
25+
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
26+
if (!"GET".equalsIgnoreCase(requestContext.getMethod())) {
27+
return; // Only cache GET requests
28+
}
29+
30+
// TODO headers are ignored. shouldn't be a problem
31+
32+
String requestKey = requestContext.getUriInfo().getRequestUri().toString();
33+
Response cachedResponse = cache.getIfPresent(requestKey);
34+
if (cachedResponse != null) {
35+
// LoggerFactory.getLogger(getClass()).info("now accessing cache");
36+
responseContext.setStatus(cachedResponse.getStatus());
37+
responseContext.setEntity(cachedResponse.getEntity());
38+
return;
39+
}
40+
41+
cache.put(requestKey, Response.status(responseContext.getStatus())
42+
.entity(responseContext.getEntity())
43+
.build());
44+
}
45+
}

0 commit comments

Comments
 (0)