/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 * $Id: Lookup.java,v 1.9 2006/01/28 03:37:06 rampil Exp $
 */
package org.logical_paradox.rss.lookup;

import java.rmi.RemoteException;

import org.logical_paradox.rss.Service;
import org.logical_paradox.rss.dsr.RSSDistributedServiceRegistry;

/**
 * 広域分散リソースネットワーク発見サービス
 * 広域分散されたリソースを，名前によって発見するサービスです．<br>
 * 分散されたサービスがどのようなインフラの上に構築され，どのような仕組みで発見されるかは<br>
 * このインターフェースを実装するベンダーに依存します．
 * 
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.9 $
 */
public interface Lookup {
	/**
	 * 分散サービスをバインドします．
	 * バインド先は，広域分散リソースネットワークが決定します．
	 * @param type サービスのタイプ
	 * @param o 登録したいオブジェクト
	 * @return 実際にバインドされた際の識別文字列
	 * @throws Exception バインドに失敗した
	 */
	public String bind(int type, Object o) throws Exception;
	/**
	 * 分散サービスをアンバインドします．
	 * @param type サービスのタイプ
	 * @param name 登録解除したいノード名
	 * @throws Exception アンバインドに失敗した
	 */
	public void unbind(int type, String name) throws Exception;
	/**
	 * DSRをレジストリに登録する
	 * @param dsr DSRのインスタンス
	 * @throws Exception 登録に失敗した
	 */
	public void register(RSSDistributedServiceRegistry dsr) throws Exception;
	/**
	 * 広域分散リソースネットワークから，特定の種類のサービスを発見します．
	 * @param type 発見するサービスの種類
	 * @return 発見されたサービスのスタブ
	 * @throws Exception 発見に失敗した
	 */
	public Object lookup(int type) throws Exception;
	/**
	 * 指定ノードIDのサービスを返します．
	 * @param nodeId ノードID
	 * @return サービスのスタプ
	 * @throws Exception ルックアップに失敗した
	 */
	public Service lookup(String nodeId) throws Exception;
	/**
	 * サービス名のリストを取得する
	 * @param type サービスのタイプ
	 * @return サービス名の配列
	 * @throws Exception 一覧処理に失敗した際に発生する例外
	 */
	public String[] services(int type) throws Exception;
	/**
	 * この発見サービスのバインドターゲット(接続先ノード)名を返す
	 * @return バインドターゲット名
	 */
	public String getBindTargetName();
	/**
	 * この発見サービスのバインドターゲットに対して、ルーティングテーブルの更新を指示する
	 * @throws Exception 更新処理中に発生した例外
	 */
	public void configure() throws Exception;
	/**
	 * リモート参照をお互いに共有する
	 * @param stub 登録してもらうスタブ
	 * @throws RemoteException 登録に失敗した
	 */
	public Service hug(Service stub) throws Exception;
	/**
	 * リモート参照をお互いに共有する
	 * 登録名を明示的に指定できる
	 * @param stub 登録してもらうスタブ
	 * @param name サービス名
	 * @return RemoteException 登録に失敗した
	 */
	public Service hug(String name, Service stub) throws Exception;
}
