/*
 * $Id: RSSDistributedServiceRegistry.java,v 1.10 2005/07/18 05:36:16 rampil Exp $
 * Copyright (c) 2005 LOGICAL-PARADOX.ORG
 */
package org.logical_paradox.rss.dsr;

import java.rmi.RemoteException;

import org.logical_paradox.rss.Service;

/**
 * RSSDistributedServiceRegistry
 * 分散サービスレジストリ(インターフェース)
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.10 $
 */
public interface RSSDistributedServiceRegistry extends Service {
	/** サービスID: 分散サービスレジストリ */
	public static final int RSS_SERVID_SERVICE_LOCATER = 1;
	/** サービスID: 経路決定ノード */
	public static final int RSS_SERVID_ROUTING_NODE_CLIENT_FACTORY = 10;
	/** サービスID: コンテンツ管理システム */
	public static final int RSS_SERVID_REMOTE_CONTENTS_MGR = 20;
	/** サービスID: インデックスシステム */
	public static final int RSS_SERVID_INDEX_SERVER = 30;
	/** サービスID: キューシステム */
	public static final int RSS_SERVID_OQS4R = 40;

	/**
	 * コンフィグを返す
	 * @return コンフィグレーション
	 * @throws RemoteException コンフィグの取得に失敗
	 */
	public RSSDSRConfig getConfig() throws RemoteException;
	/**
	 * リモートサービスを登録する
	 * @param type サービスタイプ
	 * @param stub 登録するリモートサービス
	 * @return 生成されたID
	 * @throws RemoteException 登録に失敗した際に発生する例外
	 */
	public String bind(int type, Service stub) throws RemoteException;
	/**
	 * リモートサービスを登録する
	 * サービスIDを明示的に指定できる
	 * @param type サービスタイプ
	 * @param name サービスID
	 * @param stub 登録するリモートサービス
	 * @return 生成されたID(nameと同じ値)
	 * @throws RemoteException 登録に失敗した際に発生する例外
	 */
	public String bind(int type, String name, Service stub) throws RemoteException;
	/**
	 * 指定されたサービスの登録を解除する
	 * @param type サービスタイプ
	 * @param nodeId 切り離すノードID
	 * @throws RemoteException 登録解除に失敗した際に発生する例外
	 */
	public void unbind(int type, String nodeId) throws RemoteException;
	/**
	 * 指定されたサービス名のスタブを返す
	 * @param name 検索するサービス名
	 * @return 検索にヒットしたサービスのスタブ
	 * @throws RemoteException 検索に失敗した
	 */
	public Service getService(String name) throws RemoteException;
	/**
	 * 指定されたサービス名のスタブを返す
	 * @param name 検索するサービス名
	 * @param traceLevel サービス探索深度
	 * @return 検索にヒットしたサービスのスタブ
	 * @throws RemoteException 検索に失敗した
	 */
	public Service getService(String name, int traceLevel) throws RemoteException;
	/**
	 * 指定されたサービスに対応するスタブを返す
	 * @param type サービスタイプ
	 * @return スタブ
	 * @throws RemoteException サービスの取得に失敗
	 */
	public Service getService(int type) throws RemoteException;
	/**
	 * サービス名を一覧化する
	 * @param type 種類
	 * @return 登録されているサービス名の配列
	 */
	public String[] services(int type) throws RemoteException;
	/**
	 * 指定ノードに対してpingを打つ
	 * @return 相手先ノードがメッセージを受信した時間(time in millis)
	 * @throws RemoteException pingが到達しなかった
	 */
	public long ping() throws RemoteException;
	/**
	 * DSR間のリンクを再構築する
	 * @throws RemoteException 再構築処理に失敗
	 */
	public void configure() throws RemoteException;
	/**
	 * 指定されたタイプのサービスを分散ネットワークから検索し,スタブを返す
	 * @param msg 探索条件
	 * @return 指定探索範囲で発見されたサービスのスタブ
	 */
	public Service[] discover(Message msg) throws RemoteException;
	/**
	 * 指定名称のサービスに到達するまでの経路をトレースし、経路情報を返す
	 * @param name サービス名
	 * @return トレース情報
	 * @throws RemoteException トレースに失敗した際に発生する例外
	 */
	public Message trace(String name) throws RemoteException;
}

// end of RSSDistributedServiceRegistry.java
