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

//
//	ロール登録時の権限相関チェッククラス
//			変更履歴
//				2004.01.08	新規作成	五木田　泰史
//
package jp.co.ntt.lms.xmo.Roles;

import jp.co.ntt.lms.xmo.Base.XMSBaseClient;

import java.util.Vector;

import org.apache.commons.lang.StringEscapeUtils;

public class RolesRelationCheck
{
	/** 権限リスト **/
	private Vector mvecRoleList;
	
	/** 権限エラーXMO名 **/
	private String mstrRoleErrorXmoName;
	
	/** 関連エラーXMO名 **/
	private String mstrRelationErrorXmoName;
	
	/**
	 * コンストラクタ
	 */
	public RolesRelationCheck(){}
	
	/**
	 * 権限チェック
	 * @return boolean 正常or失敗
	 */
	public boolean checkXmoRelation()
		throws Exception
	{
		boolean boolRet = false;
		for(int i = 0; i < mvecRoleList.size(); i++)
		{
			String strRoleXmoID = (String)mvecRoleList.get(i);					// 権限リストからXMOID取得
			Vector vecRelationList = getXmoRelationList(strRoleXmoID);			// 関連XMOIDリスト取得
			// 権限XMOIDリストから関連XMOID検索処理
			for(int j = 0; j < vecRelationList.size(); j++)
			{
				String strRelationXmoID = (String)vecRelationList.get(j);
				boolRet = searchXmoRelation(strRelationXmoID);
				// 関連XMOIDが見つからなかった時点でエラーとする
				if(!boolRet)
				{
					// エラーメッセージ生成
					makeErrorMessage(strRoleXmoID, vecRelationList);
					return boolRet;
				}
			}
		}
		boolRet = true;
		return boolRet;
	}
	
	/**
	 * 関連XMOIDリスト取得処理
	 * @param String 権限リストのXMOID
	 * @return Vector 関連XMOIDリスト
	 */
	private Vector getXmoRelationList(String strRoleXmoID)
		throws Exception
	{
		Vector vecRet = new Vector();
		RolesClient objRolesClient = new RolesClient();
		objRolesClient.setXmoID(strRoleXmoID);
		objRolesClient.setWhereXmoID(strRoleXmoID);
		if(!objRolesClient.selectXmoRelation())
		{
			// エラーです
			mstrRoleErrorXmoName = null;
			mstrRelationErrorXmoName = null;
			return vecRet;
		}
		if(objRolesClient.next())
		{
			int intCount = objRolesClient.getRelatedIDCount();
			for(int i = 0; i < intCount; i++)
			{
				String strRelatedID = objRolesClient.getRelatedID(i);
				vecRet.add(strRelatedID);
			}
		}
		return vecRet;
	}
	
	/**
	 * 権限リストから関連XMOIDを検索する
	 * @param String 権限リストのXMOID
	 * @return boolean 見つかった場合ture、見つからなかった場合false
	 */
	private boolean searchXmoRelation(String strRelationXmoID)
		throws Exception
	{
		for(int i = 0; i < mvecRoleList.size(); i++)
		{
			String strRoleXmoID = (String)mvecRoleList.get(i);
			if(strRelationXmoID.equals(strRoleXmoID))
			{
				// 見つかった場合
				return true;
			}
		}
		// 見つからなかった場合
		return false;
	}
	
	/**
	 * エラーメッセージを作成する
	 * @param String 権限リストのXMOID
	 * @param Vector 関連XMOIDリスト
	 */
	private void makeErrorMessage(String strRoleXmoID, Vector vecRelationList)
		throws Exception
	{
		// DBから権限XMOIDをキーにXMO名を取得する
		Vector vecRoleXmoNameList = new Vector();
		XMSBaseClient objXmoClient = new XMSBaseClient();
		objXmoClient.setWhereXmoID(strRoleXmoID);
		if(!objXmoClient.select())
		{
			// エラーです
			return;
		}
		
		// 権限XMO名リストを取得する。
		while(objXmoClient.next())
		{
			vecRoleXmoNameList.add(objXmoClient.getXmoName());
		}
		mstrRoleErrorXmoName = (String)vecRoleXmoNameList.get(0);
		objXmoClient.clear();
		
		// DBから関連XMOIDをキーにXMO名リストを取得する
		Vector vecRelationXmoNameList = new Vector();
		StringBuffer strSQL = new StringBuffer();
		// WHERE句作成
		for(int i = 0; i < vecRelationList.size(); i++)
		{
			String strRelationXmoID = (String)vecRelationList.get(i);
			strSQL.append("xmo_id");
			strSQL.append("='");
			strSQL.append(StringEscapeUtils.escapeSql(strRelationXmoID));
			strSQL.append("' ");
			if(i != vecRelationList.size() - 1)
			{
				strSQL.append(" OR ");
			}
		}
		objXmoClient.setCondition(strSQL.toString());
		if(!objXmoClient.select())
		{
			return;
		}
		// 関連XMO名リストを取得する。
		while(objXmoClient.next())
		{
			vecRelationXmoNameList.add(objXmoClient.getXmoName());
		}
		StringBuffer strRelationName = new StringBuffer();
		for(int j = 0; j < vecRelationXmoNameList.size(); j++)
		{
			String strRelationXmoName = (String)vecRelationXmoNameList.get(j);
			strRelationName.append(strRelationXmoName);
			if(j != vecRelationXmoNameList.size() - 1)
			{
				strRelationName.append("と");
			}
		}
		mstrRelationErrorXmoName = strRelationName.toString();
	}
	
	/**
	 * 権限リスト設定
	 * @param Vector 権限リスト
	 */
	public void setRoleList(Vector vecRoleList)
	{
		mvecRoleList = vecRoleList;
	}
	
	/**
	 * 権限エラーXMO名取得
	 * @return String 権限エラーXMO名
	 */
	public String getRoleErrorXmoName()
	{
		return mstrRoleErrorXmoName;
	}
	
	/**
	 * 関連エラーXMO名取得
	 * @return String 権限エラーXMO名
	 */
	public String getRelationErrorXmoName()
	{
		return mstrRelationErrorXmoName;
	}
}
