package org.logical_paradox.rss.router.algorithm;

import java.util.HashMap;

/**
 * AllocatingAlgorithm
 * 探索させるサイトを複数のノードへ分配するためのアルゴリズム
 * このクラスと全てのサブクラスは，デフォルトコンストラクタをもっている必要がある
 * 分配先のノードが探索ノードか経路決定ノードかに関係なく，利用できる構造にする(予定)．
 */
public abstract class AllocatingAlgorithm {
	private RoutingAlgorithm algo;
	protected HashMap<String, String> childNode;				// 選択可能なノードIDの辞書

	/**
	 * コンストラクタ．
	 */
	public AllocatingAlgorithm() {
		childNode = new HashMap<String, String>();
		algo = null;
	}
	/**
	 * 選択先ノードを追加する
 	 */
	public void addChildNode(String nodeId) {
		synchronized(childNode) {
			childNode.put(nodeId, nodeId);
		}
	}
	/**
	 * 選択先ノードをいっぺんに追加する．
	 */
	public void addChildNode(String[] nodeId) {
		for(int i = 0; i < nodeId.length; i++) {
			addChildNode(nodeId[i]);
		}
	}
	/**
	 * 指定されたIDのノードを削除する
	 */
	public void removeChildNode(String nodeId) {
		childNode.remove(nodeId);
	}

	/**
	 * 分配先を取得する
	 */
	public abstract String allocate(String url) throws AllocationException;

	/**
	 * 経路決定アルゴリズムの設定
	 */
	public void setRoutingAlgorithm(RoutingAlgorithm ra) {
		algo = ra;
	}
	public void removeRoutingAlgorithm() {
		algo = null;
	}

	public boolean hasRoutingAlgorithm() {
		return algo == null ? false : true;
	}
}
