/*
このファイルの中身は、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 新規作成 A.Shimoma
//
package jp.co.ntt.lms.xms.logsumup;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import jp.co.ntt.lms.xms.framework.Constant;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsInnerException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsResponse;
import jp.co.ntt.lms.xms.framework.XmsScreenBean;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.base.AbstractRmiAction;
import jp.co.ntt.lms.xms.framework.base.ActionResultBean;
import jp.co.ntt.lms.xms.framework.base.Logic;

/**
 * ＬＯ利用数一覧結果フレーム用アクション・クラス。<br>
 * 
 * @author shimoma
 */
public class LoLogMaterialUseAction extends AbstractRmiAction {

	/**
	 * リスエストされたグループID
	 */
	private String groupId;

	/**
	 * リクエストされた基本LoID
	 */
	private String LoID;

	/**
	 * リクエストされた配下フラグ
	 */
	private String subordinate_flg;

	/**
	 * リクエストされたCSV出力用期間_from
	 */
	private String csvTermFrom;

	/**
	 * リクエストされたCSV出力用期間_to
	 */
	private String csvTermTo;

	/**
	 * リクエストされた期間_from
	 */
	private String termFrom;

	/**
	 * リクエストされた期間_to
	 */
	private String termTo;

	/**
	 * リクエストされた期間単位
	 */
	private String termUnit;

	/**
	 * リクエストされたカウント単位
	 */
	private String countUnit;

	/**
	 * ロジッククラス配列を戻す。<br>
	 * @param request リクエストオブジェクト。
	 * @return LoLogMaterialUseLogicクラスオブジェクト１要素だけの配列。
	 * @see LoLogMaterialUseLogic
	 */
	protected Logic[] getLogics(XmsRequest request) throws XmsException {

		Logic[] logSumUps = null;
		logSumUps = new Logic[1];
		// Logicクラスの派生クラスを生成
		logSumUps[0] =
			new LoLogMaterialUseLogic(
				groupId,
				LoID,
				subordinate_flg,
				termFrom,
				termTo,
				termUnit,
				countUnit,
				csvTermFrom,
				csvTermTo);

		return logSumUps;

	}

	/**
	 * リクエスト初期化処理。<br>
	 * 
	 * @param xmsRequest   HTTPリスエスト
	 * @param xmsResponse  HTTPレスポンス
	 * @see jp.co.ntt.lms.xms.framework.base.AbstractRmiAction#initProsessRequest(XmsRequest)
	 */
	public void initProcessRequest(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse)
		throws XmsException {

		try {

			HttpServletRequest request = null;

			request = xmsRequest.getRequest();

			// ログ共通用Commonクラスの生成
			LoLogCommon_inc cominc = new LoLogCommon_inc();

			// グループIDを取得
			groupId = cominc.charEncode(request.getParameter("userId"));

			// LoIdの取得
			LoID = cominc.charEncode(request.getParameter("LoID"));

			// パラメータチェック
			if (groupId == null || LoID == null) {
				throw new XmsInnerException("parameter is null.");
			}

			// 配下フラグのセット 配下フラグがnullであればデフォルトでoff(直下になる)	
			subordinate_flg =
				cominc.charEncode(request.getParameter("subordinate_flg"))
					== null
					? "off"
					: cominc.charEncode(request.getParameter("subordinate_flg"));

			// 初期表示時は null
			// csv用期間_from
			csvTermFrom = cominc.charEncode(request.getParameter("term_from"));
			// csv用期間_to
			csvTermTo = cominc.charEncode(request.getParameter("term_to"));
			// 期間_from
			termFrom =
				cominc.charEncode(request.getParameter("param_term_from"));
			// 期間_to
			termTo = cominc.charEncode(request.getParameter("param_term_to"));
			// 期間単位
			termUnit = cominc.charEncode(request.getParameter("term_unit"));
			// カウント単位
			countUnit = cominc.charEncode(request.getParameter("count_unit"));

		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * 検索結果をＣＳＶ文字列に変換する。<br>
	 * このクラスでは空文字列（&quot;&quot;）を戻すように定義する。
	 * サブクラスにて適宜修正する。
	 * このメソッドは渡されるbeanがActionResultBeanであり、
	 * 内部にLoLogGroupCompareResultを保持していることを期待しています。
	 * 
	 * @param bean アクション実行結果オブジェクト。
	 * @return beanの中からLoLogMaterialUseResultを取得し、CSVに変換した文字列。
	 * @see ActionResultBean
	 * @see LoLogMaterialUseResult
	 * @throws 渡されたbeanが不正などCSV変換に問題が発生した場合。
	 */
	public String convertToCSV(XmsScreenBean bean) {

		// 戻り値
		String retVal = null;
		// 戻り値作成用バッファ
		StringBuffer buffer = null;

		ActionResultBean resultBean = null;
		// グループログ集計結果専用クラス
		LoLogMaterialUseResult logResult = null;

		try {
			buffer = new StringBuffer();
			resultBean = (ActionResultBean) bean;
			// 先頭要素となっているロジック結果を取得
			logResult = (LoLogMaterialUseResult) resultBean.getFirstLogResult();

			// =================================================================
			// レポート部
			// #レポート
			buffer.append(LoLogConstant.STR_REPORT_o + ":");
			// ＬＯ利用数一覧
			buffer.append(LoLogConstant.WIN_TITLE_MAT_ACCESS_LOG_LIST_o);
			buffer.append(",");
			// ＬＯ
			buffer.append(LoLogConstant.STR_LO_o + ":");
			// LO名
			buffer.append(logResult.getLoName());
			// LO外部ID
			buffer.append("(" + logResult.getLoForeignId() + ")");
			buffer.append(",");
			// グループ
			buffer.append(LoLogConstant.STR_GROUP_o + ":");
			// グループ名
			buffer.append(logResult.getGroupName());
			// グループ外部ID
			buffer.append("(" + logResult.getForeignId() + ")");
			buffer.append(",");

			// 集計対象者数
			buffer.append(LoLogConstant.STR_CANDIDATE_TOTAL_COUNT_o + ":");
			// 配下or直下のユーザ
			buffer.append(logResult.getCondidateTotalMassage());
			// 人数
			buffer.append(logResult.getUserCount());
			// 人
			buffer.append(LoLogConstant.STR_USER_UNIT_o);
			buffer.append(",");
			// 検索期間
			buffer.append(LoLogConstant.STR_SEARCH_TERM_o + ":");
			// 検索期間 from
			buffer.append(logResult.getCsvFromDate());
			// 〜
			buffer.append(LoLogConstant.STR_TERM_o);
			// 検索期間 to
			buffer.append(logResult.getCsvToDate());
			buffer.append(",");

			// 粒度
			buffer.append(LoLogConstant.STR_TERM_UNIT_o + ":");
			// 粒度の単位
			buffer.append(logResult.getTermUnit());
			buffer.append(",");

			// 対象
			buffer.append(LoLogConstant.STR_TARGET_o + ":");
			// 対象の単位
			buffer.append(logResult.getCountUnit());

			// 行区切り文字
			buffer.append(Constant.LINE_SEPARATOR);

			// 個別ヘッダ部
			// LO名
			buffer.append(LoLogConstant.STR_LO_NAME_o);
			buffer.append(",");
			// 外部ID
			buffer.append(LoLogConstant.STR_FOREIGN_ID_o);
			buffer.append(",");

			// ヘッダタイトル項目の取得
			String[] titleItems = logResult.getTitleItems();

			for (int i = 1; i < titleItems.length; i++) {

				// 各ヘッダタイトル
				buffer.append(titleItems[i]);
				if (i != titleItems.length - 1) {
					buffer.append(",");
				}
			}
			// 行区切り文字
			buffer.append(Constant.LINE_SEPARATOR);

			// =================================================================
			// データ部
			List LoNameList = logResult.getLoNameList();
			List LoForeignIdList = logResult.getLoForeignIdList();
			// カーソルを先頭行の直前の行に移動する
			logResult.beforeFirst();
			// ログ検索結果データ部を取得する
			List logDataList = logResult.getLogDataList();

			// レコードの数だけループ
			for (int i = 0; i < logDataList.size(); i++) {
				long[] logData = (long[])logDataList.get(i);
				// LO名
				buffer.append(LoNameList.get(i));
				buffer.append(",");
				// LO外部ID
				buffer.append(LoForeignIdList.get(i));
				buffer.append(",");

				// 項目数の数だけループ
				for (int j = 0; j < logData.length; j++) {

					// 各データ
					buffer.append(logData[j]);
					// 最終項目以外は ｢,｣ で区切る
					if (j != logData.length - 1) {
						buffer.append(",");
					}
				}
				// 行区切り文字
				buffer.append(Constant.LINE_SEPARATOR);
			}

			long[] totalCol = logResult.getTotalCol();

			// 計部
			// 計
			buffer.append(LoLogConstant.STR_TOTAL_o);
			buffer.append(",");
			buffer.append(",");

			// 計のカラムの数だけループ
			for (int i = 0; i < totalCol.length; i++) {

				// 各合計
				buffer.append(totalCol[i]);
				// 最終項目以外は ｢,｣ で区切る
				if (i != totalCol.length - 1) {
					buffer.append(",");
				}
			}

			// カーソルを先頭行の直前の行に移動する。
			logResult.beforeFirst();

			// 取得したBufferを文字列に変換
			retVal = buffer.toString();

		} catch (Exception e) {
			e.printStackTrace();
			retVal = "";
		}

		return retVal;
	}

}
