package org.logical_paradox.rss.rcm;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.logical_paradox.rss.http.WebContents;

/**
 * ContentsQueue
 * ContentsStoreAgentが格納対象のコンテンツを共有するためのクラス<br>
 * コンテンツレジスタサービス1つに対して，1つ生成される<br>
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class ContentsQueue {
	/** ロガー */
	private static final Log log = LogFactory.getLog(ContentsQueue.class);

	protected WebContents[] queue = null;				// コンテンツ格納キュー
	protected int topIdx = 0;							// 現在の取り出し先頭位置
	protected int lastIdx = 0;							// 現在の書き込み最後尾

	/**
	 * コンストラクタ
	 */
	public ContentsQueue(int qsize) throws IllegalArgumentException {
		if(qsize < 1) {
			throw new IllegalArgumentException("不正なサイズ:" + qsize);
		}
		queue = new WebContents[qsize];
		topIdx = lastIdx = 0;

		// コンテンツキューの初期化
		for(int i = 0; i < qsize; i++) {
			queue[i] = null;
		}
	}

	/**
	 * エンキュー
	 * キューに格納できた場合はtrue，失敗した場合はfalseを返す
	 * @param lc コンテンツ
	 */
	public boolean enqueue(WebContents lc) {
		if(queue[lastIdx] != null) {
			return false;
		}

		queue[lastIdx++] = lc;
		if(lastIdx == queue.length) {
			lastIdx = 0;
		}

		log.info("エンキュー:" + lc.getURL());
		return true;
	}

	/**
	 * デキュー．
	 * 取り出しに失敗した場合はnullを返す．
	 * @return コンテンツ
	 */
	public WebContents dequeue() {
		if(queue[topIdx] == null || topIdx == lastIdx) {
			return null;
		}

		WebContents lc = queue[topIdx];
		queue[topIdx] = null;
		topIdx++;

		if(topIdx == queue.length) {
			topIdx = 0;
		}

		log.info("デキュー:" + lc.getURL());
		return lc;
	}
}
