/*
 * @(#)ArtifactReceiverServlet.java
 *
 * Copyright (C) 2006 Infocity Inc. All Rights Reserved.
 */
package info.dragonlady.sso.servlet;

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

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

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

import info.dragonlady.sso.ArtifactReceiver;
import info.dragonlady.sso.SSOConfig;
import info.dragonlady.sso.SSOException;

/**
 * アーティファクト受信処理サーブレット。
 * 
 * @author Hiroshi.Ebata(INFOCITY)
 * @version $Revision: 1.0 $ $Date: 2006/10/19 17:39:32 $
 */
public class ArtifactReceiverServlet extends SSOBaseServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4961766901123080450L;

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

	/**
	 * アーティファクト受信処理。
	 * 
	 * @param request HTTP要求オブジェクト
	 * @param response HTTP応答オブジェクト
	 * @throws ServletException
	 * @throws IOException
	 * @see info.dragonlady.sso.servlet.SSOBaseServlet#process(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	protected void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			ArtifactReceiver receiver = new ArtifactReceiver(request, response);
			// 受信した要求パラメータのアーティファクトをSAML要求に含めて送信し、対応するアサーションを取得する
			receiver.receive();
			// アサーションから抽出した認証ID、属性情報を元に、目的サイトへの転送を許可するか確認する
			String authId = receiver.getAuthId();
			Map attributes = receiver.getAttributes();

			// 取得した認証ID、その他の属性情報をログインセッションに格納
			HttpSession session = request.getSession();
			session.setAttribute(SSOConfig.getLoginKey(), authId);
			if(attributes != null) {
				Iterator itr = attributes.keySet().iterator();
				while(itr.hasNext()) {
					Object key = itr.next();
					session.setAttribute((String)key, attributes.get(key));
				}
			}
			// ログイン管理情報に認証IDを追加
			LoginManager.getInstance().add(authId, session.getId());
			// 分散環境時のログイン情報共有
			if(!SSOConfig.isClusterStandalone()) {
				UserServiceWrapper.add(authId, session.getId());
			}

			// 目的サイトへリダイレクト
			receiver.redirectToTarget();
		} catch(SSOException e) {
			processException(SSOMessageResource.getMessage("5201"), e, response, HttpServletResponse.SC_FORBIDDEN);
		} catch(Exception e) {
			processException(SSOMessageResource.getMessage("5202"), e, response, HttpServletResponse.SC_NOT_FOUND);
		}
	}

}
