package io.dropwizard.jersey.caching; import org.glassfish.jersey.server.model.AnnotatedMethod; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.container.DynamicFeature; import javax.ws.rs.container.ResourceInfo; import javax.ws.rs.core.FeatureContext; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.ext.Provider; import java.io.IOException; import java.util.concurrent.TimeUnit; @Provider public class CacheControlledResponseFeature implements DynamicFeature { @Override public void configure(final ResourceInfo resourceInfo, final FeatureContext configuration) { final AnnotatedMethod am = new AnnotatedMethod(resourceInfo.getResourceMethod()); // check to see if it has cache control annotation final CacheControl cc = am.getAnnotation(CacheControl.class); if (cc != null) { configuration.register(new CacheControlledResponseFilter(cc)); } } private static class CacheControlledResponseFilter implements ContainerResponseFilter { private static final int ONE_YEAR_IN_SECONDS = (int) TimeUnit.DAYS.toSeconds(365); private String cacheResponseHeader; CacheControlledResponseFilter(CacheControl control) { final javax.ws.rs.core.CacheControl cacheControl = new javax.ws.rs.core.CacheControl(); cacheControl.setPrivate(control.isPrivate()); cacheControl.setNoCache(control.noCache()); cacheControl.setNoStore(control.noStore()); cacheControl.setNoTransform(control.noTransform()); cacheControl.setMustRevalidate(control.mustRevalidate()); cacheControl.setProxyRevalidate(control.proxyRevalidate()); cacheControl.setMaxAge((int) control.maxAgeUnit().toSeconds(control.maxAge())); cacheControl.setSMaxAge((int) control.sharedMaxAgeUnit() .toSeconds(control.sharedMaxAge())); if (control.immutable()) { cacheControl.setMaxAge(ONE_YEAR_IN_SECONDS); } cacheResponseHeader = cacheControl.toString(); } @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { if (!cacheResponseHeader.isEmpty()) { responseContext.getHeaders().add(HttpHeaders.CACHE_CONTROL, cacheResponseHeader); } } } }