/**
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 */
package org.logical_paradox.common.util;

import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;

/**
 * キャッシュコレクションクラス
 * キャッシュされるオブジェクトを管理するコレクションクラス<br>
 * 実態は単なるLinkedListのdelegation
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version 1.0
 */
public class CacheCollection implements Collection {
	private List list = Collections.synchronizedList(new LinkedList());

	/**
	 * コレクションのサイズを返す
	 * 
	 * @return サイズ
	 */
	public int size() {
		return list.size();
	}
	/**
	 * コレクションが空かどうかを返す
	 * 
	 * @return true:空 / false:空でない
	 */
	public boolean isEmpty() {
		return list.isEmpty();
	}
	/**
	 * 指定されたオブジェクトがコレクションに含まれているかどうかを返す
	 * 
	 * @param arg0 検査対象オブジェクト
	 * @return true:あった / false:ない
	 */
	public boolean contains(Object arg0) {
		return list.contains(arg0);
	}
	/**
	 * イテレータを返す
	 * 
	 * @return イテレータ
	 */
	public Iterator iterator() {
		return list.iterator();
	}
	/**
	 * このコレクションの要素を配列で返す
	 * 
	 * @return 要素の配列
	 */
	public Object[] toArray() {
		return list.toArray();
	}
	/**
	 * このコレクションの要素を配列に格納して返す
	 * 指定された配列に格納できない場合，新しい配列を作成して返す
	 * 
	 * @param arg0 格納する配列
	 * @return 格納された配列
	 */
	public Object[] toArray(Object[] arg0) {
		return list.toArray(arg0);
	}
	/**
	 * このコレクションに新しい要素を追加する
	 * 
	 * @param arg0 追加するオブジェクト
	 * @return true:追加できた / false:追加できなかった
	 */
	public boolean add(Object arg0) {
		return list.add(arg0);
	}
	/**
	 * このコレクションに新しい要素を追加する
	 * 
	 * @param idx 挿入する位置
	 * @param arg0 追加するオブジェクト
	 * @return true:追加できた / false:追加できなかった
	 */
	public boolean add(int idx, Object arg0) {
		list.add(idx, arg0);
		return true;
	}
	/**
	 * このコレクションから指定された要素を削除する
	 * 
	 * @param arg0 削除する要素
	 * @return true:削除できた / false:削除できなかった
	 */
	public boolean remove(Object arg0) {
		return list.remove(arg0);
	}
	/**
	 * 指定された要素全てがこのコレクションに格納されているかどうかを返す
	 * 
	 * @param arg0
	 * @return true:格納されていた / false:格納されていなかった
	 */
	public boolean containsAll(Collection arg0) {
		return list.containsAll(arg0);
	}
	/**
	 * 指定されたコレクションの要素を全て追加する
	 * 
	 * @param arg0 コレクション
	 * @return true:追加できた / false:追加できなかった
	 */
	public boolean addAll(Collection arg0) {
		return list.add(arg0);
	}
	/**
	 * 指定されたコレクションの要素を全てこのコレクションから削除する
	 * 
	 * @param arg0 コレクション
	 * @return true:削除できた / false:削除できなかった
	 */
	public boolean removeAll(Collection arg0) {
		return list.removeAll(arg0);
	}
	/**
	 * 指定されたコレクションの内容以外の残して削除する
	 * 
	 * @param arg0 コレクション
	 * @return true:削除できた / false:削除できなかった
	 */
	public boolean retainAll(Collection arg0) {
		return list.retainAll(arg0);
		
	}
	/**
	 * このコレクションを空にする
	 */
	public void clear() {
		list.clear();
	}
	/**
	 * リストの先頭にある要素を削除する
	 * 
	 * @return 削除された要素
	 */
	public Object removeFirst() {
		try {
			return list.size() > 0 ? list.remove(0) : null;
		} catch(NoSuchElementException nse) {
			return null;
		}
	}
}

// end of CacheCollection.java
