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

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

import java.rmi.RemoteException;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
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 UserServiceImpl extends UnicastRemoteObject implements UserService {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6535611897365424355L;

	/**
	 * コンストラクタ。
	 */
	public UserServiceImpl() throws RemoteException {
		super();
	}

	/**
	 * コンストラクタ。
	 * 
	 * @param port リモートオブジェクトが呼び出しを受信するポートの番号
	 * @throws RemoteException
	 */
	public UserServiceImpl(int port) throws RemoteException {
		super(port);
	}

	/**
	 * コンストラクタ。
	 * 
	 * @param port リモートオブジェクトが呼び出しを受信するポートの番号
	 * @param csf リモートオブジェクトの呼び出しに使用する、クライアント側ソケットファクトリ
	 * @param ssf リモートオブジェクト呼び出しを受信する、サーバ側ソケットファクトリ
	 * @throws RemoteException
	 */
	public UserServiceImpl(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException {
		super(port, csf, ssf);
	}

	/**
	 * ユーザ追加。
	 * 
	 * @param userName ユーザ名
	 * @param relationId ユーザと紐づくID
	 * @return boolean true：追加成功／false：追加失敗
	 * @throws RemoteException
	 * @see com.sony.ecg.ecg0100.pim.cluster.UserService#add(java.lang.String, java.lang.String)
	 */
	public synchronized boolean add(String userName, String relationId) throws RemoteException {
		try {
			LoginManager lm = LoginManager.getInstance();
			if(!lm.isLoggedIn(userName)) {
				lm.add(userName, relationId);
			}
			Logger.getRootLogger().info(SSOMessageResource.getMessage("6206"));
			return true;
		} catch(Exception e) {
			String message = SSOMessageResource.getMessage("6201");
			Logger.getRootLogger().error(message, e);
			throw new RemoteException(message, e);
		}
	}

	/**
	 * ユーザ削除。
	 * 
	 * @param userName ユーザ名
	 * @return boolean true：削除成功／false：削除失敗
	 * @throws RemoteException
	 * @see com.sony.ecg.ecg0100.pim.cluster.UserService#remove(java.lang.String)
	 */
	public synchronized boolean remove(String userName) throws RemoteException {
		try {
			LoginManager lm = LoginManager.getInstance();
			if(lm.isLoggedIn(userName)) {
				lm.remove(userName);
			}
			Logger.getRootLogger().info(SSOMessageResource.getMessage("6207"));
			return true;
		} catch(Exception e) {
			String message = SSOMessageResource.getMessage("6202");
			Logger.getRootLogger().error(message, e);
			throw new RemoteException(message, e);
		}
	}

	/**
	 * ユーザに紐づく管理用IDでユーザを削除。
	 * 
	 * @param relationId ユーザに紐づくID
	 * @return boolean true：削除成功／false：削除失敗
	 * @throws RemoteException
	 */
	public boolean removeByRelationId(String relationId) throws RemoteException {
		try {
			LoginManager lm = LoginManager.getInstance();
			lm.removeById(relationId);
			Logger.getRootLogger().info(SSOMessageResource.getMessage("6208"));
			return true;
		} catch(Exception e) {
			String message = SSOMessageResource.getMessage("6203");
			Logger.getRootLogger().error(message, e);
			throw new RemoteException(message, e);
		}
	}

	/**
	 * ユーザ管理マップ取得。
	 * 
	 * @return Map ユーザ管理マップ（key:ユーザ名、value:関連するID）
	 * @throws RemoteException
	 * @see com.sony.ecg.ecg0100.pim.cluster.UserService#get()
	 */
	public synchronized Map<String, String> get() throws RemoteException {
		try {
			LoginManager lm = LoginManager.getInstance();
			Map<String, String> map = lm.getMap();
			Logger.getRootLogger().info(SSOMessageResource.getMessage("6209"));
			return map;
		} catch(Exception e) {
			String message = SSOMessageResource.getMessage("6204");
			Logger.getRootLogger().error(message, e);
			throw new RemoteException(message, e);
		}
	}

	/**
	 * ユーザ一覧設定。
	 * 
	 * @param users ユーザ管理マップ（key:ユーザ名、value:関連するID）
	 * @throws RemoteException
	 * @see com.sony.ecg.ecg0100.pim.cluster.UserService#set(java.util.Map)
	 */
	public synchronized void set(Map<String, String> users) throws RemoteException {
		try {
			LoginManager lm = LoginManager.getInstance();
			lm.setMap(users);
			Logger.getRootLogger().info(SSOMessageResource.getMessage("6210"));
		} catch(Exception e) {
			String message = SSOMessageResource.getMessage("6205");
			Logger.getRootLogger().error(message, e);
			throw new RemoteException(message, e);
		}
	}

}
