package org.itscool.weber.action;

import java.util.HashMap;
import org.itscool.commons.bean.BeanFactory;
import org.itscool.weber.controller.Globals;
import org.itscool.weber.user.RoleException;
import org.itscool.weber.user.User;
import org.itscool.weber.user.UserManager;

/**
 * ログインアクションを実行します<BR>
 * このアクションはフレームワークが標準で提供するログインアクションです<BR>
 * ログインアクションが呼ばれるとリクエストパラメータにセットされたユーザ情報
 * (org.itscool.role.User）インスタンスに対してロールチェックを行います<BR>
 * ロールチェックは以下の手順で行われます<BR>
 * <BR>
 * 　(1) リクエストパラメータよりユーザ情報の取得<BR>
 * 　　　リクエストパラメータよりorg.itscool.role.Userインスタンスを取得します<BR>
 * 　(2) フレームワークに登録されているユーザ情報の検索<BR>
 * 　　　<roles>属性に定義されているユーザ情報ファイルから登録済みのユーザ情報
 * 　　　を検索します<BR>
 * 　(3) ユーザ情報の照合<BR>
 * 　　　検索結果と入力されたユーザ情報との比較を行います<BR>
 * 　(4) ユーザ情報の登録<BR>
 * 　　　認証に成功したユーザ情報をセッションパラメータに登録します<BR>
 * <BR>
 * セッションパラメータに登録されたユーザ情報を破棄する場合はorg.itscool.weber.LogoutAction
 * を使用します。
 * 
 * @author KANO
 * @since jdk1.4.1
 * @version 1.00A 2004/11/1
 */
public class LoginAction extends Action {
    
    public String doExecute(ActionBucket bucket) throws Exception{
        try{
            User user = (User)bucket.getForm();
            
            if (!isUserCheck(bucket.getRoles(), user)) {
                return Globals.RET_ROLE_FAIL;
            } else {
                bucket.setAttributeFromSession(Globals.REQ_PARAM_USER, user);
                return Globals.RET_ROLE_SUCCESS;
            }
        }catch(RoleException re){
            throw new LoginFailedException();
        }

    }
    
    /**
     * このアクションが許可されているか検査します<br>
     * このメソッドはcheckUserRoleメソッドから呼ばれます。<br>
     * 独自の認証処理を実装する場合は、このメソッドをオーバーライド
     * して利用する事もできます。
     * @param roles 権限情報
     * @param user ユーザ
     * @return このアクションが許可されている場合はtrueを
     * 返します
     */
    public boolean isUserCheck(HashMap roles, User user){
        boolean ret = false;
        BeanFactory factory = BeanFactory.getInstance();
        UserManager manager = (UserManager)factory.createInstance("UserManager");
        ret = manager.isUserCheck(roles, user);
//modify 2007/01/28 kano 認証エラー時はGlobalExceptioにより例外扱いとする weber4.x start
        if(!ret){
            throw new RoleException();
        }
//modify 2007/01/28 kano weber4.x end

        return ret;
        
    }
}
