package org.logical_paradox.rss.router;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

import org.logical_paradox.rss.dsync.SyncCommand;
import org.logical_paradox.rss.util.RandomKeyGenerator;

/**
 * RoutingNodeClientImpl
 * 経路決定ノードのクライアントインターフェース(実装)
 * @author satoshi akabane@logical-paradox
 * @version $Revision: 1.2 $
 */
public class RoutingNodeClientImpl extends UnicastRemoteObject implements RoutingNodeClient {
	/** シリアルバージョンUID */
	private static final long serialVersionUID = 8983895250691567089L;
	/** このクライアントがexportされている探索ノードのID */
	private String robotKey = null;
	/** このクライアントを生成したファクトリの参照 */
	private RNodeClientFactoryImpl parent = null;

	/**
	 * コンストラクタ．
	 * @param p ファクトリ
	 */
	public RoutingNodeClientImpl(RNodeClientFactoryImpl p) throws RemoteException {
		parent = p;
		robotKey = "SNODE:" + RandomKeyGenerator.getUniqKey();
	}

	/**
	 * このクライアントに結合されている探索ノードの名称を返す
	 * @return 探索ノードのID
	 */
	public String getNodeId() throws RemoteException {
		return robotKey;
	}

	/**
	 * このクライアントの親ノードIDの名称を返す
	 * @return 経路決定ノードのID
	 */
	public String getParentNodeId() throws RemoteException {
		return parent.getNodeId();
	}

	/**
	 * 他の探索ノードや経路決定ノードから渡されてきた探索ロックの差分情報を持ち帰る
	 * このメソッドは，探索ノードによってクライアントインターフェース(RoutingNodeClient)を介して呼び出される
	 * 取得されたデータは，破棄される
	 */
	public SyncCommand[] getSyncData() throws RemoteException {
		SyncCommand[] e = null;
		try {
			e = parent.getModifiedSyncData(robotKey);
		} catch(Exception se) {
			se.printStackTrace();		// #####
			throw new RemoteException(se.getMessage());
		}
		return e;
	}

	/**
	 * 他のノードから転送されてきた探索ロックの差分情報を適用する
	 * 探索ノードからの探索ロック差分情報は，このクライアントインターフェースを管轄する
	 * 経路決定ノードクライアントに格納され，そっちでまとめて処理をされる
	 */
	public void sync(SyncCommand[] locks) throws Exception {
		parent.sync(locks);
	}

	/*
	 * 探索の許可されているIPアドレスの範囲
	 */
	public String[] getAllowedRoutingIPRanges() throws Exception {
		return parent.getAllowedRoutingIPRanges();
	}
}

// end of RoutingNodeClientImpl.java
