/*
このファイルの中身は、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) ______________________________________.
*/

//
//	Assignments 管理 アサイン有効・無効判定リスト クラス
//			変更履歴
//				2004.01.08	二條智文  新規作成
//
package jp.co.ntt.lms.xmo.Assignments;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * 複数のアサイン判定オブジェクトを束ねます。<BR>
 * 束ねるキーとして、ユーザIDとLOIDを使用します。
 * このクラスに2つ以上のアサイン判定オブジェクトが含まれるのは兼務ユーザに同一のLOが
 * アサインされた場合です。<BR>
 * 複数アサインが存在した場合に、有効・無効の判定は複数の判定結果の論理和を取ります。
 * @author T.Nijou
 */
public final class AssignUsableList implements Serializable {
	
	/** 兼務ユーザの同一のアサイン判定オブジェクトを保持する。 */
	private ArrayList list = new ArrayList();
	
	/** このアサイン判定オブジェクトのチェック対象UserID */
	private String userID;
	/** このアサイン判定オブジェクトのチェック対象LOID */
	private String loID;

	/**
	 * コンストラクタ
	 */
	public AssignUsableList() {
		
	}
	
	/**
	 * Returns the loID.
	 * @return String
	 */
	public String getLoID() {
		return loID;
	}

	/**
	 * Returns the userID.
	 * @return String
	 */
	public String getUserID() {
		return userID;
	}

	/**
	 * Sets the loID.
	 * @param loID The loID to set
	 */
	public void setLoID(String loID) {
		this.loID = loID;
		// 配列中のすべてのArrayListにも同一のLOIDを格納する
		for( int i = 0; i < list.size(); i++ ) {
			AssignUsable usable = (AssignUsable)list.get(i);
			
			usable.setLoID( loID );
		}		
	}

	/**
	 * Sets the userID.
	 * @param userID The userID to set
	 */
	public void setUserID(String userID) {
		this.userID = userID;
		// 配列中のすべてのArrayListにも同一のユーザIDを格納する
		for( int i = 0; i < list.size(); i++ ) {
			AssignUsable usable = (AssignUsable)list.get(i);
			
			usable.setUserID( userID );
		}		
	}

	/**
	 * アサイン有効・無効判定オブジェクトをリストに追加する。
	 * @param assingUsable アサイン有効・無効判定オブジェクト
	 */
	public void add( AssignUsable assignUsable ) {
		list.add( assignUsable );
	}
	
	/**
	 * すべてのリスト内のアサイン判定オブジェクトに対して
	 * チェック対象日時のセットを行う。
	 */
	public void setCheckDate( Date checkDate ) {
		for( int i = 0; i < list.size(); i++ ) {
			AssignUsable usable = (AssignUsable)list.get(i);
			
			usable.setCheckDate(checkDate);
		}		
	}
	
	/**
	 * アサインが存在するかどうかを返す。<BR>
	 * リスト中にアサイン判定オブジェクトが存在しない場合は
	 * アサインも存在しない。
	 * @return boolean true: 存在する false: 存在しない
	 */
	public boolean isExistAssign() {
		return (list.size() > 0);	
	}
	
	/**
	 * リスト中のAssignUsableにアクセスするためのIteratorを返す。
	 * @return Iterator
	 */
	public Iterator iterator() {
		return list.iterator();	
	}

	/**
	 * アサイン有効・無効判定を行う。<BR>
	 * リスト中のすべてのアサイン判定オブジェクトの
	 * アサイン判定結果の論理和(OR)を返す。
	 * @return boolean true: 有効　false: 無効
	 */
	public boolean isUsable() {

		// リストが空の場合は無条件でアサインが存在しないたため無効とする。
		if( list.size() == 0 ) {
			return false;	
		}

		boolean blUsable = false;

		// リスト分ループして有効・無効の判定を行う
		// 1つでも有効なら、有効とする。
		for( int i = 0; i < list.size(); i++ ) {

			AssignUsable usable = (AssignUsable)list.get(i);

			blUsable = usable.isUsable();

			if( blUsable ) {
				// 1つでも有効な場合は有効とするため
				// 処理終了
				break;	
			}
		}

		return blUsable;

	}
	
	/**
	 * 引数で渡されたリストに自身の内容をコピーします。<BR>
	 * リスト内は新規のAssignUsableに置き換えられます。
	 * ユーザIDとLOIDは保持しているユーザIDとLOIDに置き換えます。
	 * @param copyList
	 */
	public void copyList(AssignUsableList copyList) {

		// コピー先のリストの初期化
		copyList.list = new ArrayList();
		
		for( int i = 0; i < this.list.size(); i++ ) {
			AssignUsable usable = (AssignUsable)list.get(i);
			copyList.list.add( usable.getCopy() );
		}
		
	}
	
	/**
	 * 内部に保持しているアサイン判定オブジェクトのユーザIDとLOID
	 * を保持しているユーザIDとLOIDで更新します。
	 */
	public void syncID() {
		// 配列中のすべてのArrayListにも同一のユーザID、LOIDを格納する
		for( int i = 0; i < list.size(); i++ ) {
			AssignUsable usable = (AssignUsable)list.get(i);
			
			usable.setUserID( userID );
			usable.setLoID( loID );
		}			
	}

	// debug
	public String toString() {
		StringBuffer sb = new StringBuffer();
		sb.append( "AssignUsableList -------- size -- " + list.size() + "\n" );
		for( int i = 0; i < list.size(); i++ ) {
			AssignUsable usable = (AssignUsable)list.get(i);
			sb.append( usable.toString() + "\n" );
			
		}
		
		return sb.toString();
	}

	/**
	 * アサイン有効・無効判定を行う。 <BR>
	 * リスト中のすべてのアサイン判定オブジェクトの アサイン判定結果の論理和(OR)を返す。
	 * 
	 * @return boolean true: 有効 false: 無効
	 */
	public boolean isManagerType() {

		// リストが空の場合は無条件でアサインが存在しないたため無効とする。
		if ( list.size() == 0 ) {
			return false;
		}
		String managementAuthority = null;
		boolean blUsable = false;
		// リスト分ループして有効・無効の判定を行う
		// 1つでも有効なら、有効とする。
		for ( int i = 0; i < list.size(); i++ ) {
			AssignUsable usable = ( AssignUsable ) list.get( i );
			managementAuthority = usable.getManagementAuthority();
			if ( managementAuthority.equals( "1" ) ) {
				// 1つでも有効な場合は有効とするため
				// 処理終了
				blUsable = true;
				break;
			}
		}
		return blUsable;
	}

}
