/*
 * $Id: ServiceList.java,v 1.5 2005/07/20 16:40:18 rampil Exp $
 * Copyright (c) 2005 LOGICAL-PARADOX.ORG
 */
package org.logical_paradox.rss.dsr;

import java.rmi.Remote;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;

import org.logical_paradox.rss.Service;
import org.logical_paradox.rss.dsr.algorithm.ServiceBindingAlgorithm;

/**
 * ServiceList
 * サービス名称のリスト
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.5 $
 */
public class ServiceList {
	/** サービス名のリスト */
	protected final Hashtable list;
	/** サービス割り当てのためのアルゴリズム */
	protected final ServiceBindingAlgorithm bindingAlgorithm;

	/**
	 * コンストラクタ
	 * @param ba サービスバインディングアルゴリズム
	 */
	public ServiceList(ServiceBindingAlgorithm ba) {
		list = new Hashtable();
		bindingAlgorithm = ba;
	}
	/**
	 * コンストラクタ
	 * @param org 既存のリスト
	 * @param ba サービスバインディングアルゴリズム
	 */
	public ServiceList(Hashtable org, ServiceBindingAlgorithm ba) {
		list = org;
		bindingAlgorithm = ba;
	}

	/**
	 * 選択可能なリモートサービスを追加する
	 * @param name ノードID
	 * @param 公開されたサービスのスタブ
	 */
	public void add(String name, Remote stub) {
		list.put(name, stub);
	}

	/**
	 * 選択可能なリモートサービスを削除する(サービスが停止した場合など)
	 * @param name ノードID
	 */
	public void remove(String name) {
		list.remove(name);
	}

	/**
	 * 選択可能なリモートサービス名のイテレータを返す
	 * @return サービスのリストをポイントしているイテレータ
	 */
	public Iterator iterator() {
		return list.keySet().iterator();
	}

	/**
	 * 格納されているサービスのノードIDのリストを返す
	 * @return ノードIDのリスト
	 */
	public String[] serviceNames() {
		synchronized(list) {
			return (String[])list.keySet().toArray(new String[0]);
		}
	}

	/**
	 * 指定された名称のサービスが登録されているかどうかを返す
	 * @param serviceName ノードID
	 * @return true:あった / false:なかった
	 */
	public boolean contains(String serviceName) {
		return list.containsKey(serviceName);
	}

	/**
	 * 格納されているサービスのリストから，適切なサービスのスタブを選択して返す
	 * @return 選択されたサービス
	 */
	public Service getService() {
		String serviceName = bindingAlgorithm.getService(this);
		if(serviceName != null) {
			return (Service)list.get(serviceName);
		} else {
			return null;
		}
	}

	/**
	 * 格納されているサービスのリストから，適切なサービスのスタブを選択して返す
	 * @param serviceName サービス名
	 * @return 選択されたサービス
	 */
	public Service getService(String serviceName) {
		Service service = (Service)list.get(serviceName);
		return service;
	}
	/**
	 * 格納されている全てのサービスを返す
	 * @return 全てのサービス
	 */
	public Collection values() {
		return list.values();
	}
}

// end of ServiceList.java
