blob: 5483281777922bef94fc3aa8217fd0b55293780a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.utils;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
/**
* This is a cache manager. It will use the ICacheEntryCreator interface to
* manage creating new item and dispose old item.
*
* @author mengbo
* @version 1.5
*/
public class CacheManager {
ICacheEntryCreator _creator;
int _maxSize;
// key --> value
Map _map = new HashMap();
// keep track of LRU
LinkedList _keys = new LinkedList();
/**
* @param creator
* @param maxSize
*/
public CacheManager(ICacheEntryCreator creator, int maxSize) {
_creator = creator;
_maxSize = maxSize;
if (_maxSize <= 0) {
_maxSize = 10;
}
}
/**
* @param key
* @return the cache entry for key
*/
public Object getEntry(Object key) {
Object result = _map.get(key);
if (result == null) {
// not existed yet.
if (_map.size() >= _maxSize) {
// we need to remove the oldest one.
Object keyRemove = _keys.removeFirst();
Object objToRemove = _map.remove(keyRemove);
_creator.dispose(keyRemove, objToRemove);
}
result = _creator.createEntry(key);
_keys.addLast(key);
_map.put(key, result);
return result;
}
_keys.remove(key);
_keys.addLast(key);
return result;
}
/**
* Dispose the cache
*/
public void disposeAll() {
_keys.clear();
for (Iterator iter = _map.keySet().iterator(); iter.hasNext();) {
Object key = iter.next();
Object entry = _map.get(key);
_creator.dispose(key, entry);
}
_map.clear();
}
}