/**
 * FIFORoutingAlgorithm
 * サイト探索のための標準的なアルゴリズム
 * 何も考えないで，FIFOで返すだけ
 */
package org.logical_paradox.rss.router.algorithm;
import java.net.MalformedURLException;
import java.util.Iterator;

import org.logical_paradox.rss.http.URLPool;

public class FIFORoutingAlgorithm extends RoutingAlgorithm {
	public FIFORoutingAlgorithm() {
		super();
	}

	// このメソッドを実装すること
	/**
	 * アルゴリズムの名称を返す
	 */
	public String getAlgorithmName() {
		return "Simple Fast In Fast Out Routing Algorithm";
	}

	/**
	 * 次の1つを決定するためのアルゴリズム(実装)
	 */
	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;
	}
}

// end of FIFORoutingAlgorithm.java

