package com.udapsoft.waf.system.session;

import java.util.Hashtable;

import javax.servlet.http.HttpSession;

import kr.co.hsnc.common.util.ValueObject;


/**
 * 로그인한 사용자의 HttpSession을 관리한다.
 * this.KEY 변수를 KEY로 사용자를 구분한다.
 * 
 * @author Sunyoup
 *
 */
public class SignOnSession {

    private static String KEY = "USER_ID";

    private static Object session = null;

    /**
     * HttpSession을 보관하는 Hanshtable
     * key : USER_ID(String)
     * value : UserInfo(ValueObject) 
     */
    private Hashtable<String, HttpSession> session_hash = null;

    /**
     * USER_ID 를 보관하는 Hashtable
     * key : SessionID(String)
     * value : USER_ID(String)
     */
    private Hashtable<String, String> user_id_hash = null;
    
    /**
     * 생성자 - private
     * Singleton Patterns 사용
     */
    private SignOnSession() {
    	this.session_hash = new Hashtable<String, HttpSession>();
    	this.user_id_hash = new Hashtable<String, String>();
    }

    /**
     * SignOnSession에 Instance를 리턴한다.
     * Singleton Patterns 사용
     * @return
     */
    public synchronized static SignOnSession getInstance() {
        if( session == null ) {
            session = new SignOnSession();
        }
        return (SignOnSession)session;
    }

    /**
     * KEY name을 리턴
     * @return
     */
    public static String getKeyName() {
    	return KEY;
    }
    
    /**
     * 사용자 정보를 KEY로 하는 세션이 존재 여부를 리턴
     * @param user
     * @return boolean
     */
    public boolean isExistSession(ValueObject user) {
        return this.session_hash.containsKey(user.get(KEY));
    }

    /**
     * 사용자 정보를 KEY로 하는 세션이 존재 여부를 리턴
     * @param user
     * @return boolean
     */
    public boolean isExistUserId(String sessionId) {
        return this.user_id_hash.containsKey(sessionId);
    }
    
    /**
     * 해당 사용자의 HttpSession을 리턴한다.
     * @param user
     * @return
     */
    public HttpSession getSession(ValueObject user) {
        if( isExistSession(user) ) {
            return (HttpSession)this.session_hash.get(user.get(KEY));
        }
        return null;
    }

    /**
     * SessionId에 해당하는 USER_ID를 리턴
     * @param sessionId
     * @return
     */
    public String getUserId(String sessionId) {
        if( isExistUserId(sessionId) ) {
            return (String)this.user_id_hash.get(sessionId);
        }
        return null;
    }
    
    /**
     * 사용자의 HttpSession 을 Add한다.
     * @param user
     * @param session
     */
    public void addSession(ValueObject user, HttpSession session) {
        if( !isExistSession(user) ) {
        	this.session_hash.put(user.get(KEY), session);
        }
        if( !isExistUserId(session.getId()) ) {
        	this.user_id_hash.put(session.getId(), user.get(KEY));
        }
    }

    /**
     * 사용자의 HttpSession Remove 한다.
     * @param user
     */
    public void delSession(ValueObject user, String sessionId) {
        if( user != null ) {
        	this.session_hash.remove(user.get(KEY));
        	this.user_id_hash.remove(sessionId);
        }
    }
}
