/*******************************************************************************
 * 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();

	public CacheManager(ICacheEntryCreator creator, int maxSize) {
		_creator = creator;
		_maxSize = maxSize;
		if (_maxSize <= 0) {
			_maxSize = 10;
		}
	}

	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;
		} else {
			_keys.remove(key);
			_keys.addLast(key);
			return result;
		}
	}

	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();
	}
}
