001: /*--
002:
003: Copyright (C) 2000-2003 Anthony Eden.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The name "EdenLib" must not be used to endorse or promote products
019: derived from this software without prior written permission. For
020: written permission, please contact me@anthonyeden.com.
021:
022: 4. Products derived from this software may not be called "EdenLib", nor
023: may "EdenLib" appear in their name, without prior written permission
024: from Anthony Eden (me@anthonyeden.com).
025:
026: In addition, I request (but do not require) that you include in the
027: end-user documentation provided with the redistribution and/or in the
028: software itself an acknowledgement equivalent to the following:
029: "This product includes software developed by
030: Anthony Eden (http://www.anthonyeden.com/)."
031:
032: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
033: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
034: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
035: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
036: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
037: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
038: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
039: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
040: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
041: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
042: POSSIBILITY OF SUCH DAMAGE.
043:
044: For more information on EdenLib, please see <http://edenlib.sf.net/>.
045:
046: */
047:
048: package com.anthonyeden.lib.cache;
049:
050: import java.util.HashMap;
051:
052: import com.anthonyeden.lib.config.Configuration;
053: import com.anthonyeden.lib.config.ConfigurationException;
054:
055: /** Cache implementation which stores the cached values in memory.
056:
057: @author Anthony Eden
058: @since 1.1
059: */
060:
061: public class InMemoryCache extends AbstractCache {
062:
063: private HashMap cache;
064:
065: /** Construct a new InMemoryCache. */
066:
067: public InMemoryCache() {
068: cache = new HashMap();
069: }
070:
071: /** Get the value for the given key from the cache. This method may
072: return null if there is no value or the value is expired.
073:
074: @param key The key
075: @return The value or null
076: */
077:
078: public synchronized Object get(Object key) {
079: CacheEntry cacheEntry = (CacheEntry) cache.get(key);
080: Object value = null;
081: if (cacheEntry != null) {
082: if (isExpired(cacheEntry)) {
083: remove(key);
084: return null;
085: } else {
086: return cacheEntry.getObject();
087: }
088: }
089: return null;
090: }
091:
092: /** Insert a value into the cache.
093:
094: @param key The key
095: @param value The value
096: */
097:
098: public synchronized void put(Object key, Object value) {
099: cache.put(key,
100: new CacheEntry(value, System.currentTimeMillis()));
101: }
102:
103: /** Insert a value into the cache with the specified time to live.
104: The specified time to live overrides the default time to live.
105: A value less than 0 is be considered as "infinate".
106:
107: @param key The key
108: @param value The value
109: @param ttl The time to live
110: */
111:
112: public synchronized void put(Object key, Object value, int ttl) {
113: cache.put(key, new CacheEntry(value,
114: System.currentTimeMillis(), ttl));
115: }
116:
117: /** Remove a value from the cache.
118:
119: @param key The key
120: */
121:
122: public synchronized void remove(Object key) {
123: cache.remove(key);
124: }
125:
126: /** Load the Cache's configuration from the given Configuration object.
127:
128: @param configuration The Configuration object
129: @throws ConfigurationException
130: */
131:
132: public void loadConfiguration(Configuration configuration)
133: throws ConfigurationException {
134: setTTL(configuration.getChildValue("ttl"));
135: }
136:
137: }
|