/*
 * $Id: FIFORoutingAlgorithm.java,v 1.2 2006/01/27 16:39:03 rampil Exp $
 * Copyright (c) 2006 LOGICAL-PARADOX.ORG
 */
package org.logical_paradox.rss.router.algorithm;
import java.net.MalformedURLException;
import java.util.Iterator;

import org.logical_paradox.rss.http.URLPool;

/**
 * FIFORoutingAlgorithm
 * サイト探索のための標準的なアルゴリズム<br>
 * 何も考えないで，FIFOで返すだけ<br>
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class FIFORoutingAlgorithm extends RoutingAlgorithm {
	/**
	 * コンストラクタ．
	 */
	public FIFORoutingAlgorithm() {
		super();
	}

	/**
	 * アルゴリズムの名称を返す．
	 * @return アルゴリズムの名称
	 */
	public String getAlgorithmName() {
		return "Simple Fast In Fast Out Routing Algorithm";
	}

	/**
	 * 次の1つを決定するためのアルゴリズム(実装)
	 * @param urls URLプール
	 * @return 最適URL
	 */
	public String nextURL(URLPool urls) {
		String rc = null;

		synchronized(urls) {
			boolean exitf = true;
			do {
				if(urls.size() == 0) {
					// もうない
					rc = null;
					exitf = false;
				} else {
					// 未処理URLのプールからURLを1つ取得する
					// 前回返したものとは(多くの場合)違うサイトのURLを返す
					String[] domains = urls.domains();
					int p = (int)(Math.random() * domains.length);
					Iterator i = urls.getURLIterator(domains[p]);
					if(i == null) {
						return null;
					}
					rc = (String)i.next();
					try {
						urls.remove(rc);
					} catch(MalformedURLException e) {
					}

					if(history.isTraced(rc) == false) {
						// まだトレースしていないURLだった場合
						// 探索履歴に追加する
						history.add(rc);

						exitf = false;
					}
				}
			} while(exitf == true);
		}

		return rc;
	}
}
