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

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

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

import org.apache.log4j.Logger;

/**
 * ユーザ管理サービスクライアントラッパー。
 * 
 * @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 = SSOConfig.getFriends();
			for(int i = 0; i < friends.length; i++) {
				String[] args = {friends[i].getHost(), friends[i].getPort()};
				try {
					// リモートサーバにユーザ追加
					String name = SSOConfig.getServiceName(args[0], args[1], UserService.SERVICE_NAME);
					UserService service = (UserService)Naming.lookup(name);
					if(service.add(user, relationId)) {
						Logger.getRootLogger().info(SSOMessageResource.getMessage("6320", new Object[]{args, user, relationId}));
					} else {
						Logger.getRootLogger().warn(SSOMessageResource.getMessage("6301", args));
					}
				} catch(ConnectException e) {
					// 失敗したホスト名とポート番号をログ出力
					Logger.getRootLogger().warn(SSOMessageResource.getMessage("6302", args), e);
				} catch(NotBoundException e) {
					// 失敗したホスト名とポート番号をログ出力
					Logger.getRootLogger().warn(SSOMessageResource.getMessage("6303", args), e);
				} catch(Exception e) {
					// 失敗したホスト名とポート番号をログ出力
					Logger.getRootLogger().warn(SSOMessageResource.getMessage("6304", args), e);
				}
			}
		} catch (Exception e) {
			String message = SSOMessageResource.getMessage("6305");
			Logger.getRootLogger().error(message, e);
			throw new UserServiceException(message, e);
		}
	}

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

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

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

}
