1d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/* 2d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Copyright (C) 2011 The Android Open Source Project 3d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 4d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License"); 5d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * you may not use this file except in compliance with the License. 6d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * You may obtain a copy of the License at 7d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 8d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * http://www.apache.org/licenses/LICENSE-2.0 9d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * 10d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software 11d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS, 12d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * See the License for the specific language governing permissions and 14d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * limitations under the License. 15d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 16d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 17d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupackage com.android.volley; 18d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 19e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queruimport java.util.Collections; 20e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queruimport java.util.Map; 21e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru 22d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru/** 23d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * An interface for a cache keyed by a String with a byte array as data. 24d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 25d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Querupublic interface Cache { 26d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 27d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Retrieves an entry from the cache. 28d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param key Cache key 29d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @return An {@link Entry} or null in the event of a cache miss 30d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 31d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public Entry get(String key); 32d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 33d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 34d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Adds or replaces an entry to the cache. 35d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param key Cache key 36d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param entry Data to store and metadata for cache coherency, TTL, etc. 37d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 38d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void put(String key, Entry entry); 39d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 40d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 41d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Performs any potentially long-running actions needed to initialize the cache; 42d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * will be called from a worker thread. 43d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 44d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void initialize(); 45d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 46d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 47d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Invalidates an entry in the cache. 48d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param key Cache key 49d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param fullExpire True to fully expire the entry, false to soft expire 50d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 51d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void invalidate(String key, boolean fullExpire); 52d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 53d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 54d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Removes an entry from the cache. 55d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * @param key Cache key 56d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 57d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void remove(String key); 58d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 59d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 60d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Empties the cache. 61d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 62d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public void clear(); 63d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 64d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** 65d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru * Data and metadata for an entry returned by the cache. 66d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru */ 67d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public static class Entry { 68d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** The data returned from cache. */ 69d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public byte[] data; 70d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 71d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** ETag for cache coherency. */ 72d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public String etag; 73d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 74d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** Date of this response as reported by the server. */ 75d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public long serverDate; 76d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 779324df1b8046548587ffec89ec755264f6fbb097Ralph Bergmann /** The last modified date for the requested object. */ 789324df1b8046548587ffec89ec755264f6fbb097Ralph Bergmann public long lastModified; 799324df1b8046548587ffec89ec755264f6fbb097Ralph Bergmann 80d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** TTL for this record. */ 81d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public long ttl; 82d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 83d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** Soft TTL for this record. */ 84d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public long softTtl; 85d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 86e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru /** Immutable response headers as received from server; must be non-null. */ 87e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru public Map<String, String> responseHeaders = Collections.emptyMap(); 88e48f4430bfd3030350aa5ba827b449c37e2fadc9Jean-Baptiste Queru 89d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** True if the entry is expired. */ 90d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public boolean isExpired() { 91d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru return this.ttl < System.currentTimeMillis(); 92d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 93d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 94d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru /** True if a refresh is needed from the original data source. */ 95d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru public boolean refreshNeeded() { 96d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru return this.softTtl < System.currentTimeMillis(); 97d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 98d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru } 99d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru 100d56b88ae161057e848e7410d1b9ce5b0b8c427fcJean-Baptiste Queru} 101