/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.tools;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jp.co.sint.config.SIConfig;

import org.apache.log4j.Category;

/**
 * @version $Id: SISessionUtil.java,v 1.0 2004/12/01 Exp $
 * @author  Akao Shinya
 * <br>Description: セッション関連utitliesのクラス
 * <p>History</p>
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Akao Shinya    2004/12/01  Original
 */

public class SISessionUtil {
  //ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  /**
   * <b>SIUtil</b>
   * コンストラクタ
   * @param なし
   * @return なし
   * @throws なし
   */
  public SISessionUtil() {
  }

  /**
   * <b>sessionRenew</b>
   * 旧セッションのデータを保持しつつ、セッションIDを変更します
   * @param  HttpServletRequest
   * @return HttpSession
   * @throws なし
   */
  public static HttpSession sessionRenew(HttpServletRequest lRequest, HttpServletResponse lResponse) {
    HttpSession session = lRequest.getSession(true);
    //現在のセッションで保持しているオブジェクトのリスト取得
    Enumeration attNamesEnum = session.getAttributeNames();
    HashMap objMap = new HashMap();
    String attName;
    Object obj;
    while (attNamesEnum.hasMoreElements()){
      attName = (String)attNamesEnum.nextElement();
      obj = session.getAttribute(attName);
      //オブジェクトの退避
      if (obj != null) {
        objMap.put(attName, obj);
      }
    }
    //セッションの廃棄
    session.invalidate();
    //新しいセッションの取得
    session = lRequest.getSession(true);

    //Cokkieの"secure"を設定(no secure)
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setPath(lRequest.getContextPath());
    cookie.setMaxAge(-1);
    cookie.setSecure(false);
    lResponse.addCookie(cookie);
    //退避していたデータの再セット
    Iterator attNamesIta = objMap.keySet().iterator();
    while (attNamesIta.hasNext()){
      attName = (String)attNamesIta.next();
      session.setAttribute(attName, objMap.get(attName));
    }
    return session;
  }
}