/*
 * @(#)UserServiceWrapper.java
 *
 * Copyright 2006 Sony Corporation
 */
package info.dragonlady.cluster;

import info.dragonlady.sso.helper.LoginManager;
import info.dragonlady.sso.helper.SSOServletConfig;
import info.dragonlady.sso.message.SSOMessageResource;

import java.rmi.ConnectException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.util.Map;

/**
 * ユーザ管理サービスクライアントラッパー。
 * 
 * @author Hiroshi.Ebata(INFOCITY)
 * @version $Revision: 1.7 $ $Date: 2006/06/12 13:27:57 $
 */
public class UserServiceWrapper {

	/**
	 * コンストラクタ。
	 */
	public UserServiceWrapper() {
	}

	/**
	 * ローカルサーバ及びクラスタリングサーバのユーザ管理情報に指定ユーザを追加。
	 * 
	 * @param user ユーザ名
	 * @param relationId ユーザと紐づくID
	 * @throws UserServiceException
	 */
	public static final void add(String user, String relationId) throws UserServiceException {
		try {
			Friend[] friends = SSOServletConfig.getFriends();
			for(int i = 0; i < friends.length; i++) {
				String[] args = {friends[i].getHost(), friends[i].getPort()};
				try {
					// リモートサーバにユーザ追加
					String name = SSOServletConfig.getServiceName(args[0], args[1], UserService.SERVICE_NAME);
					UserService service = (UserService)Naming.lookup(name);
					service.add(user, relationId);
				} catch(ConnectException e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				} catch(NotBoundException e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				} catch(Exception e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			String message = SSOMessageResource.getMessage("");
			throw new UserServiceException(message, e);
		}
	}

	/**
	 * ローカルサーバ及びクラスタリングサーバのユーザ管理情報から指定ユーザを削除。
	 * 
	 * @param user ユーザ名
	 * @throws UserServiceException
	 */
	public static final void remove(String user) throws UserServiceException {
		try {
			Friend[] friends = SSOServletConfig.getFriends();
			for(int i = 0; i < friends.length; i++) {
				String[] args = {friends[i].getHost(), friends[i].getPort()};
				try {
					// リモートサーバからユーザ削除
					String name = SSOServletConfig.getServiceName(args[0], args[1], UserService.SERVICE_NAME);
					UserService service = (UserService)Naming.lookup(name);
					service.remove(user);
				} catch(ConnectException e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				} catch(NotBoundException e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				} catch(Exception e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			String message = SSOMessageResource.getMessage("");
			throw new UserServiceException(message, e);
		}
	}

	/**
	 * ローカルサーバ及びクラスタリングサーバのユーザ管理情報から指定ユーザを削除。
	 * 
	 * @param relationId ユーザに紐づくID
	 * @throws UserServiceException
	 */
	public static final void removeByRelationId(String relationId) throws UserServiceException {
		try {
			Friend[] friends = SSOServletConfig.getFriends();
			for(int i = 0; i < friends.length; i++) {
				String[] args = {friends[i].getHost(), friends[i].getPort()};
				try {
					// リモートサーバからユーザ削除
					String name = SSOServletConfig.getServiceName(args[0], args[1], UserService.SERVICE_NAME);
					UserService service = (UserService)Naming.lookup(name);
					service.removeByRelationId(relationId);
				} catch(ConnectException e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				} catch(NotBoundException e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				} catch(Exception e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			String message = SSOMessageResource.getMessage("");
			throw new UserServiceException(message, e);
		}
	}

	/**
	 * ローカルサーバのユーザ情報をクラスタリングサーバのユーザ情報と同期化。
	 * 
	 * @throws UserServiceException
	 */
	public static final void synchronize() throws UserServiceException {
		try {
			Friend[] friends = SSOServletConfig.getFriends();
			for(int i = 0; i < friends.length; i++) {
				String[] args = {friends[i].getHost(), friends[i].getPort()};
				try {
					// リモートサーバからユーザ一覧取得
					String name = SSOServletConfig.getServiceName(args[0], args[1], UserService.SERVICE_NAME);
					UserService service = (UserService)Naming.lookup(name);
					Map map = service.get();
					if(map != null) {
						// ローカルサーバに一覧を設定
						LoginManager lm = LoginManager.getInstance();
						lm.setMap(map);
						break;
					}
				} catch(ConnectException e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				} catch(NotBoundException e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				} catch(Exception e) {
					// 失敗したホスト名とポート番号をログ出力
					String message = SSOMessageResource.getMessage("", args);
					System.out.println(message);
					e.printStackTrace();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			String message = SSOMessageResource.getMessage("");
			throw new UserServiceException(message, e);
		}
	}

}
