/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	AssignmentsRegOpen.jsp アサインメール自動ログインBeanクラス
//	変更履歴
//	2004/01/08	新規作成	柴田宗近
//
package jp.co.ntt.lms.xms.login.assignments;

import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import jp.co.ntt.lms.xmo.Assignments.AssignmentsClient;
import jp.co.ntt.lms.xmo.Base.XMSBaseClient;
import jp.co.ntt.lms.xmo.Lo.LoClient;
import jp.co.ntt.lms.xmo.Lo.LoData;
import jp.co.ntt.lms.xmo.LoRelation.LoRelationClient;
import jp.co.ntt.lms.xms.common.user.User;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsResponse;
import jp.co.ntt.lms.xms.framework.XmsScreenAction;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;
import jp.co.ntt.lms.xms.login.base.OperateSession;

/**
 * アサインメール自動ログイン処理クラス。<BR>
 * 
 * アサインメールからの自動ログイン認証処理を行います。
 * ログインID、パスワード、処理コマンド、LOIDから
 * ログイン可能かどうかを判定し、基本画面へ遷移します。<BR>
 * 
 */
public class AssignLoginAction extends XmsScreenAction {

	/**
	 * 次画面ＵＲＬ<BR>
	 */
	private String url = null;

	/**
	 * 次画面URLを取得します。<BR>
	 * @return String 次画面URL
	 */
	public String getUrl() {
		return this.url;
	}

	/**
	 * 初期化処理を行います。<BR>
	 * 処理はありません。<BR>
	 * @param xmsRequest リクエストオブジェクト
	 * @param xmsResponse レスポンスオブジェクト
	 * @return なし
	 */
	protected void initProcessRequest( XmsRequest xmsRequest, XmsResponse xmsResponse ) {}

	/**
	 * アサインメール自動ログイン処理を行います。<BR>
	 * @param xmsRequest リクエストオブジェクト
	 * @param xmsResponse レスポンスオブジェクト
	 * @return なし
	 * @exception XmsException  システムエラー
	 */
	protected void processRequest( XmsRequest xmsRequest, XmsResponse xmsResponse )
		throws XmsException {

		// リクエスト情報を取得
		HttpServletRequest request = xmsRequest.getRequest();

		// 処理コマンド
		String Cmd = request.getParameter( "CMD" );
		// ユーザーログインID
		String loginID = request.getParameter( "UID" );
		// ユーザーパスワード
		String password = request.getParameter( "PS" );
		// LOID
		String LOID = request.getParameter( "LID" );
	
		// ワーニング時の遷移先URL（ログイン画面）
		String strParamErrURL = "/xms2/";
	
		// パラメータチェック
		// 処理コマンドは「OPEN」じゃなければNG
		if( ( Cmd == null ) || ( Cmd.equals( "OPEN" ) == false ) ) {
			// コマンドが不正な場合はエラーとし、
			// エラーメッセージを表示後ログイン画面に遷移する。
			this.url = strParamErrURL;
			throw new XmsWarningException( "base.w.login.assignmentscommanderror" );
		}

		// ログインＩＤとユーザーパスワードチェック
		if( ( loginID == null ) || ( loginID.length() <= 0 ) || ( password == null ) ) {
			// ログインIDとパスワードが未設定の場合はエラーとし、
			// エラーメッセージを表示後ログイン画面に遷移する。
			this.url = strParamErrURL;
			throw new XmsWarningException( "base.w.login.assignmentsparametererror" );
		}

		// ログインIDが受け取れたかどうか
		//if( loginID.length() > 0 ) {
		//	// nullじゃない場合
		//	// シフトJISに変換
		//	loginID = this.encodeSJIS( loginID );
		//}
		// セッションを取得
		HttpSession session = request.getSession();

		// ユーザオブジェクトのインスタンス化
		User userObject = new User();

		// 画面からのログイン処理と同様のチェックを行う
		boolean checkResultLogin = userObject.checkLogin( loginID, password );


		// ログイン処理が失敗した場合は
		// 失敗した内容をチェックする。
		if( checkResultLogin == false ) {

			// 存在チェック
			if( !userObject.isExist() ) {
				// 存在しなかった場合
				this.url = strParamErrURL;
				throw new XmsWarningException( "base.w.login.assignmentsusernoexist" );
			}

			// 削除フラグチェック
			if( userObject.isDeleted() == true ) {
				// 削除されていた場合
				this.url = strParamErrURL;
				throw new XmsWarningException( "base.w.login.assignmentsusernoexist" );
			}

			// パスワードチェック
			if( userObject.isAgreePassword() == false ) {
				// パスワード不正の場合
				this.url = strParamErrURL;
				throw new XmsWarningException( "base.w.login.assimnmentsinvalidpassword" );
			}
		}

		try {
			//------------------------------------------------------------------------------------------
			// ログイン時にメール内容のLOがログインユーザにアサインされていなければ、ログインできない。
			//------------------------------------------------------------------------------------------
	
			// アサインチェック(学習・管理アサイン双方のチェック)
			boolean assignExist = AssignmentsClient.checkAssignAuth( userObject.getUserID(), 
																	  LOID, 
																	  AssignmentsClient.NON_TYPE );
		
			// アサインされているかどうか
			if( assignExist == false ) {
				// 指定LOがアサインされていない場合は
				// エラーメッセージを表示後ログイン画面に遷移する。
				this.url = strParamErrURL;
				throw new XmsWarningException( "base.w.login.assimnmentsnoroleserror" );
			}
	
			// XMSBaseを使用して、ログインユーザが使用できるLOリストを取得します。
			XMSBaseClient BaseObject = new XMSBaseClient();
			if( BaseObject.searchRootLoList( userObject.getUserID() ) == false ) {
				// LOリストの取得に失敗した場合	
				this.url = strParamErrURL;
				throw new XmsWarningException( "base.w.login.assimnmentslosearcherror" );
			}
	
			LoData[] RootLoList = BaseObject.getRootLoList();
			// ログインユーザにアサインされているLOリストを
			// 配列からベクターに入れ替える
			Vector LoIDList = new Vector();
			for( int i = 0; i < RootLoList.length; i++ ) {
				LoIDList.add( RootLoList[i].getLoID() );
			}

			if( LoIDList.size() == 0 ) {
				// 指定LOがアサインされていない場合は
				// エラーメッセージを表示後ログイン画面に遷移する。
				this.url = strParamErrURL;
				throw new XmsWarningException( "base.w.login.assimnmentsnoroleserror" );
			}
	
			//--------------------------------------------------------------------------------------
			// 基本画面でアサインされたLOのLOツリーを展開させるため、LOパスを取得する。
			// Tree.jspはそのパスに従ってツリーを展開する。
			//--------------------------------------------------------------------------------------
	
			// 展開LOパスの取得
			LoRelationClient LoRelationObject = new LoRelationClient();
			// LOフルパス
			String pathArray[] = null;
			// アサインされたLOパス
			StringBuffer strAssignPath = new StringBuffer();
		
			// 指定されたLOのフルパスの取得を行う。
			if( LoRelationObject.searchPath( LOID ) == false ) {
				this.url = strParamErrURL;
				throw new XmsWarningException( "base.w.login.assignmentsusersearcherror" );
			}
	
			// パスの取得がうまくいった場合フルパスの取得
			while( LoRelationObject.next() == true ) {
	
				// パスを取得
				pathArray = LoRelationObject.getPath();
	
				// 認証フラグ		
				boolean isAuth = false;
	
				// パスの要素数分繰り返し
				for( int i = 0; i < pathArray.length; i++ ) {
	
					//アサインされている途中のパスを検索
					if ( LoIDList.contains( pathArray[i] ) == true ) {
						isAuth = true;
					}
		
					// パスがアサインリストに含まれていた場合はその途中からURLに組み込む
					if( isAuth == true ) {
						LoClient LoObject = new LoClient();
						LoObject.setWhereLoID( pathArray[i] );
						if( LoObject.select() == false ) {
							// LOの検索失敗
							this.url = strParamErrURL;
							throw new XmsWarningException( "base.w.login.assimnmentslosearcherror" );
						}
	
						if( LoObject.next() == false ) {
							// LOの検索失敗
							this.url = strParamErrURL;
							throw new XmsWarningException( "base.w.login.assimnmentslosearcherror" );
						}
						else {
							String strLoType = LoObject.getLoType();

							//---------------------------------------------------------------------
							// コンテナかコンテナ以外かを識別するためにパスのセパレータを変更する
							// コンテナ    ：「,LOnn」（nnは数字）
							// コンテナ以外：「/LOnn」（nnは数字）
							//---------------------------------------------------------------------

							// コンテナであり、且つ、パスが最後のLOIDである場合
							if( strLoType.equals( "0" ) == true && i == pathArray.length - 1) {

								// コンテナの場合（LOタイプが「0」の場合はコンテナ）
								 strAssignPath.append( "," ).append( pathArray[i] );
							}
							else {
								// コンテナ以外の場合
								strAssignPath.append( "/" ).append( pathArray[i] );
	
							}
						}
					}
				}
		
				// パスに含まれていた場合はループを抜ける
				if( isAuth == true ) {
					break;
				}
			}
	
			// 権限が割り当てられているかどうか
			if( userObject.isRolesAssignment() == false ) {
				// 権限が割り当てられていない場合
				this.url = strParamErrURL;
				throw new XmsWarningException( "base.w.login.assimnmentsnoroleserror" );
			}
	
			// 学習者かどうかの判定
			boolean isLearner = userObject.isLearner();
	
			// URLパラメータに使う文字列
			String learner = null;
	
			//--------------------------------------------------------------
			// 学習者フラグ
			//   学習者                  ：「YES」
			//   学習者じゃない（管理者）：「NO」
			//
			// 学習者とは
			//   ユーザに割り当てられている権限（XMOEntry）のうち、
			//      学習のみを持つ場合
			//      ログ管理のみを持つ場合
			//      学習とログ管理のみを持つ場合
			//   のいずれか。  
			//--------------------------------------------------------------
			if( isLearner == true ) {
				learner = "YES";
			}
			else {
				learner = "NO";
			}
	
			// 認証結果をセッションに格納する
			OperateSession.setSessionFromAssignLogin( session, userObject, learner );
	
			// 自動ログインＵＲＬを発行する
			// 基本画面へ遷移
	
			//--------------------------------------------------------------------------
			// URLパラメータ説明
			// treepath       ：展開すべきLOのパス
			// search         ：検索時のみ設定する
			// tree_view_type ：ツリー表示タイプ（1：ユーザツリー　2：LOツリー）
			// learner        ：学習者フラグ（※１）
			// ini_menu       ：初期メニュー（※２）
			// selected_Lo    ：アサインされたLOのLOID
			//
			// ※１　学習者の場合は基本画面の振る舞いが異なる
			//       １．表示ツリー切り換えボタンを非表示にする。
			//       ２．プロパティ画面のタグを非表示にする。
			// ※２  初期メニューの用途
			//       ShowSubGroupChildren.jspまでURLパラメータとして引き継いでいるが、
			//       結局使用していない
			//--------------------------------------------------------------------------
	
			StringBuffer StrLoginURL = new StringBuffer();
			StrLoginURL.append( "../Base/frameset.vm" );
			StrLoginURL.append( "?treepath=" ).append( "/lotreeroot" ).append( strAssignPath.toString() );
			StrLoginURL.append( "&search=on" );
			StrLoginURL.append( "&tree_view_type=2" );
			StrLoginURL.append( "&learner=" ).append( learner );
			StrLoginURL.append( "&ini_menu=" );
			StrLoginURL.append( "&selected_Lo=" ).append( LOID );
		
			this.url = StrLoginURL.toString();
	
			// 返却値オブジェクトのインスタンス生成
			xmsResponse.setBusinessBeanName( "Login" );
	
			// 返却値タイプを設定　この場合はリダイレクト
			xmsResponse.setOutType( XmsResponse.REDIRECT );
	
			// リダイレクト先URLを設定
			xmsResponse.setUrl( this.url );
		}
		catch(XmsException ex) {
			throw ex;	
		}
		catch(Exception ex) {
			throw new XmsSystemException(ex);	
		}

	}


// ------------------ 内部関数 ----------------------------------
	/**
	 * 文字エンコードを"ISO-8859-1"(ユニコード文字)から"Windows-31J"に変換します
	 */
	private String encodeSJIS( String strTar ) {

		if( strTar == null ) {
			return "";
		}

		try {
			return new String( strTar.getBytes( "8859_1" ), "Windows-31J" );
		}
		catch( java.io.UnsupportedEncodingException ue ) {
		}

		// 例外発生時は元の文字列を返す
		return strTar;
	}
}