package org.jboss.resteasy.plugins.cache.server; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * An HTTP cache that behaves somewhat the same way as a proxy (like Squid) * * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ * * @deprecated See org.jboss.resteasy.plugins.cache.server.InfinispanCache. * @See org.jboss.resteasy.plugins.cache.server.InfinispanCache */ @Deprecated public class SimpleServerCache implements ServerCache { public static class CacheEntry implements Entry { private final byte[] cached; private final int expires; private final long timestamp = System.currentTimeMillis(); private final MultivaluedMap<String, Object> headers; private String etag; private final MultivaluedMap<String, String> varyHeaders; private CacheEntry(MultivaluedMap<String, Object> headers, byte[] cached, int expires, String etag, MultivaluedMap<String, String> varyHeaders) { this.cached = cached; this.expires = expires; this.headers = headers; this.etag = etag; this.varyHeaders = varyHeaders; } public int getExpirationInSeconds() { return expires - (int) ((System.currentTimeMillis() - timestamp) / 1000); } public boolean isExpired() { return System.currentTimeMillis() - timestamp >= expires * 1000L; } public String getEtag() { return etag; } public MultivaluedMap<String, Object> getHeaders() { return headers; } public MultivaluedMap<String, String> getVaryHeaders() { return varyHeaders; } public byte[] getCached() { return cached; } } private Map<String, Map<MediaType, CacheEntry>> cache = new ConcurrentHashMap<String, Map<MediaType, CacheEntry>>(); public Entry get(String uri, MediaType accept, MultivaluedMap<String, String> headers) { Map<MediaType, CacheEntry> entry = cache.get(uri); if (entry == null || entry.isEmpty()) return null; for (Map.Entry<MediaType, CacheEntry> produce : entry.entrySet()) { if (accept.isCompatible(produce.getKey()) && !ServerCache.mayVary(produce.getValue(), headers)) return produce.getValue(); } return null; } public Entry add(String uri, MediaType mediaType, CacheControl cc, MultivaluedMap<String, Object> headers, byte[] entity, String etag, MultivaluedMap<String, String> varyHeaders) { CacheEntry cacheEntry = new CacheEntry(headers, entity, cc.getMaxAge(), etag, varyHeaders); Map<MediaType, CacheEntry> entry = cache.get(uri); if (entry == null) { entry = new ConcurrentHashMap<MediaType, CacheEntry>(); cache.put(uri, entry); } entry.put(mediaType, cacheEntry); return cacheEntry; } public void remove(String key) { cache.remove(key); } public void clear() { cache.clear(); } }