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