/*******************************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 ********************************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム構築
 *	モジュール名	：CRW05806SFLogic
 *	ソースファイル名：CRW05806SFLogic.java
 *	作成者			：富士通
 *	日付			：2011年12月20日
 *＜機能概要＞
 *	カテゴリーアップロードビューロジック
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	ｖ1.00.00
 *
 ********************************************************************************/

package eo.web.webview.CRW05806SF;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.HashMap;

import com.fujitsu.futurity.web.x31.X31CID;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x33.X33SException;

import eo.common.constant.JCRStrConst;
import eo.common.constant.JPCModelConstant;
import eo.web.webview.JCCWebBusinessLogic;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;
import eo.web.webview.common.JCCScreenConst;
import eo.web.webview.common.JCCWebCommon;
import eo.web.webview.common.JCRScreenConst;
import eo.web.webview.common.JCRWebCommon;
import eo.web.webview.mapping.CRSV0249_CRSV0249OPDBMapper;

/**
 * カテゴリーアップロードビューロジック.<p>
 * <BR>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class CRW05806SFLogic extends JCCWebBusinessLogic
{

	/**
	 * ダブルクォーテーション
	 */
	private static final String DOUBLE_QUOT = "\"";

	/**
	 * 親クラスX31BWebBusinessLogicのreceiveMessageWebを
	 * オーバーライドして自動生成されたメソッドです。
	 * @param arg0 (I) イベント情報
	 * @param arg1 (I) WebFWでは使用しません
	 * @param arg2 (I) WebFWでは使用しません
	 * @return 処理結果（true:正常終了、false:エラー）
	 * @throws X33SException X33SException
	 */
	@Override
	protected boolean receiveMessageWeb(X31CID arg0, Object arg1,
			EventObject arg2) throws X33SException
	{
		return false;
	}

	/**
	 * 初期表示を行う。<br>
	 * <br>
	 * カテゴリーアップロード画面の初期表示を行います。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean initUpload() throws Exception
	{

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共有フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// -------------------------------------------------- //
		// (1)引継情報の取得
		// -------------------------------------------------- //
		// なし。

		// -------------------------------------------------- //
		// (2)サービスフォームBeanの設定
		// -------------------------------------------------- //
		// (a)サービスフォームBeanの内容をクリアする
		clearBean();

		// (b)システム日付取得
		String sysDate = JCCWebCommon.getSysDate();

		// (c)初期値設定
		bean.sendMessageString(CRW05806SFConst.ACTIVATE_YEAR, X31CWebConst.DATABEAN_SET_VALUE, JCRWebCommon.toYearFromYmd(sysDate));
		bean.sendMessageString(CRW05806SFConst.ACTIVATE_MON, X31CWebConst.DATABEAN_SET_VALUE, JCRWebCommon.toMonthFromYmd(sysDate));
		bean.sendMessageString(CRW05806SFConst.ACTIVATE_DAY, X31CWebConst.DATABEAN_SET_VALUE, JCRWebCommon.toDayFromYmd(sysDate));
		bean.sendMessageString(CRW05806SFConst.FILE_NM, X31CWebConst.DATABEAN_SET_VALUE, "file_nm");

		// -------------------------------------------------- //
		// (3)サービス呼出処理
		// -------------------------------------------------- //
		// なし。

		// -------------------------------------------------- //
		// (4)サービス処理結果の設定
		// -------------------------------------------------- //
		// なし。

		// -------------------------------------------------- //
		// (5)引継情報の設定
		// -------------------------------------------------- //
		// なし。

		// -------------------------------------------------- //
		// (6)共有フォームBeanの設定
		// -------------------------------------------------- //
		// 遷移先画面IDを共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_ID_CRW05806);

		// 遷移先画面名を共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JCRScreenConst.SCREEN_NAME_CRW05806);

		return true;
	}

	/**
	 * 登録処理を行う。<br>
	 * <br>
	 * カテゴリーアップロード処理を実行する。
	 * 
	 * @return boolean
	 * @throws Exception Exception
	 */
	public boolean insert() throws Exception
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 共有フォームBeanの内容を取得
		X31SDataBeanAccess commoninfoBean = getCommonInfoBean();

		// -------------------------------------------------- //
		// (1)引継情報の取得
		// -------------------------------------------------- //
		// なし。

		// -------------------------------------------------- //
		// (2)サービスフォームBeanの設定
		// -------------------------------------------------- //
		// (a)アップロード一時ファイル情報取得
		ArrayList<HashMap<String, Object>> fileInfoArray = JCCWebCommon.getFileInfoArray(this);

		// 一時ファイルキー
		String fileKey = "";

		if (fileInfoArray != null && fileInfoArray.size() > 0)
		{
			// アップロードファイル一時ファイルキーを取得
			fileKey = (String)fileInfoArray.get(0).get("fileKey");

			// (b)アップロードファイルの入力チェック
			if (!inputCheck(fileInfoArray))
			{
				// アップロードファイルの電子ファイル管理番号(一時ファイル番号)を元に、
				// アップロード一時ファイル削除部品(JCCWebCommon.deleteFile)を使用し、一時ファイルの削除を行う。
				JCRWebCommon.deleteFile(this, fileKey);

				// エラーの場合は、カテゴリーアップロード画面に戻る
				// 遷移先画面IDを共有フォームBeanに設定
				commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
						JCRScreenConst.SCREEN_ID_CRW05806);

				// 遷移先画面名を共有フォームBeanに設定
				commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
						JCRScreenConst.SCREEN_NAME_CRW05806);
				return true;
			}

		}

		// (c)アップロードファイルの内容をStringで取得
		String fileString = getUploadFileString(fileInfoArray);

		// -------------------------------------------------- //
		// (3)サービス呼出処理
		// -------------------------------------------------- //
		// (a)アップロードファイルの内容をbyte配列に変換
		byte[] fileByte = fileString.getBytes(JCRStrConst.MOJI_CD_MS932);

		// 電子ファイル用のMap
		HashMap<String, Object> attachMap = new HashMap<String, Object>();

		// ディレイド処理依頼登録サービスインターフェースに引き渡す情報を設定する。
		setEfileMap(attachMap, fileByte);

		// ユースケースID格納用Map
		HashMap<Object, String> paramMap = new HashMap<Object, String>();

		// ユースケースID格納
		paramMap.put(X31CWebConst.TELEGRAM_INFO_USECASE_ID, "CRSV0249");

		// マッピング用Map
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		// マッピングクラスを使用する為、配列化
		X31SDataBeanAccess[] paramBean = {bean};

		// マッピングクラス
		CRSV0249_CRSV0249OPDBMapper mapper = new CRSV0249_CRSV0249OPDBMapper();

		// サービス実行結果データ用Map
		HashMap<String, Object> outputMap = new HashMap<String, Object>();

		// マッピング処理（上り）
		mapper.setCRSV024901SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);
		mapper.setCRSV024902SC(paramBean, dataMap, JPCModelConstant.FUNC_CD_1);

		// (b)サービス実行
		invokeService(paramMap, dataMap, outputMap, attachMap);	

		// -------------------------------------------------- //
		// (4)サービス処理結果の設定
		// -------------------------------------------------- //
		// なし。

		// -------------------------------------------------- //
		// (5)引継情報の設定
		// -------------------------------------------------- //
		// なし。

		// -------------------------------------------------- //
		// (6)共有フォームBeanの設定
		// -------------------------------------------------- //
		// 遷移先画面IDを共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_ID, X31CWebConst.DATABEAN_SET_VALUE,
				JCCScreenConst.SCREEN_ID_CCW00105);

		// 遷移先画面名を共有フォームBeanに設定
		commoninfoBean.sendMessageString(CommonInfoCFConst.NEXT_SCREEN_NAME, X31CWebConst.DATABEAN_SET_VALUE,
				JCCScreenConst.SCREEN_NAME_CCW00105);

		// アップロードファイルの電子ファイル管理番号(一時ファイル番号)を元に、
		// アップロード一時ファイル削除部品(JCCWebCommon.deleteFile)を使用し、一時ファイルの削除を行う。
		JCRWebCommon.deleteFile(this, fileKey);

		return true;
	}

	/**
	 * アップロードファイルチェック処理。
	 * <br>
	 * アップロードファイルのチェックを行う。
	 * 
	 * @param fileInfoArray アップロードファイル情報
	 * @return boolean
	 * @throws Exception Exception
	 */
	private boolean inputCheck(ArrayList<HashMap<String, Object>> fileInfoArray) throws Exception
	{
		// アップロードファイル情報
		HashMap<String, Object>fileInfoMap = fileInfoArray.get(0);

		// オブジェクト名
		String objName = (String)fileInfoMap.get("nameValue");

		// アップロードファイルチェック
		if (!JCRWebCommon.dispFileErrMsg(this, fileInfoArray, objName))
		{
			return false;
		}

		return true;
	}

	/**
	 * アップロードファイル情報の取得を行う。
	 * <br>
	 * 読み込んだ一時ファイルに、カテゴリー反映日を付加した（改行コード付き）
	 * 内容の文字列を返す。
	 * 
	 * @param fileInfoArray アップロードファイル情報
	 * @return ファイル情報文字列
	 */
	private String getUploadFileString(ArrayList<HashMap<String, Object>> fileInfoArray) throws UnsupportedEncodingException
	{

		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// 1行目の内容を作成
		StringBuilder line1 = new StringBuilder();

		if (fileInfoArray != null && fileInfoArray.size() > 0)
		{
			// ファイル名を取得し、サービスフォームBeanにセット
			String fileNm = fileInfoArray.get(0).get("fileName").toString();
			bean.sendMessageString(CRW05806SFConst.FILE_NM, X31CWebConst.DATABEAN_SET_VALUE, fileNm);

			// 一時ファイルキーを取得
			String fileKey = (String)fileInfoArray.get(0).get("fileKey");

			// アップロード一時ファイル取得部品(JCCWebCommon.getFile)を使用し、一時ファイルをbyte配列で保持する。
			byte[] fileByte = JCRWebCommon.getFile(this, fileKey);

			// 一時ファイルの内容をStringへ変換
			String file = new String(fileByte, JCRStrConst.MOJI_CD_MS932);

			// カテゴリー反映日
			String activateYear = bean.sendMessageString(CRW05806SFConst.ACTIVATE_YEAR, X31CWebConst.DATABEAN_GET_VALUE);
			String activateMonth = bean.sendMessageString(CRW05806SFConst.ACTIVATE_MON, X31CWebConst.DATABEAN_GET_VALUE);
			String activateDay = bean.sendMessageString(CRW05806SFConst.ACTIVATE_DAY, X31CWebConst.DATABEAN_GET_VALUE);

			line1.append(DOUBLE_QUOT)
				.append(activateYear)
				.append(activateMonth)
				.append(activateDay)
				.append(DOUBLE_QUOT)
				.append(JCRStrConst.KAIGYO_CD)
				.append(file);
		}

		return line1.toString();
	}

	/**
	 * 電子ファイルデータMap設定処理。
	 * <br>
	 * 電子ファイルデータをMapに設定する。
	 * 
	 * @param attachMap アップロードファイル格納マップ
	 * @param eFileData アップロードファイルデータ
	 */
	private void setEfileMap(HashMap<String, Object> attachMap, byte[] eFileData)
	{
		HashMap<Object, Object> fileMap = new HashMap<Object, Object>();

		fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_IDENTIFUCD, "identifyCD");
		fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_LIST_NAMAE, "list_name");
		fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_ITEM_NAMAE, "item_name");
		fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_INDEX, "index");
		fileMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_FILE, eFileData);

		ArrayList<HashMap<Object, Object>> fileList = new ArrayList<HashMap<Object, Object>>();

		// ファイルが取得できた場合のみリストに追加
		if (eFileData != null)
		{
			fileList.add(fileMap);
		}
		attachMap.put(X31CWebConst.TELEGRAM_INFO_ATTACH_FILE_LIST, fileList);
	}

	/**
	 * サービスフォームBeanのクリアを行う。<br>
	 * <br>
	 * サービスフォームBeanの引継ぎ項目以外の値をクリアします。
	 * 引継ぎ項目：なし
	 * 
	 */
	private void clearBean()
	{
		// サービスフォームBeanの内容の取得
		X31SDataBeanAccess bean = getServiceFormBean();

		// サービスフォームBeanの項目をクリアする。
		bean.sendMessage(CRW05806SFConst.ACTIVATE_YEAR, X31CWebConst.DATABEAN_CLEAR);
		bean.sendMessage(CRW05806SFConst.ACTIVATE_MON, X31CWebConst.DATABEAN_CLEAR);
		bean.sendMessage(CRW05806SFConst.ACTIVATE_DAY, X31CWebConst.DATABEAN_CLEAR);
		bean.sendMessage(CRW05806SFConst.FILE_NM, X31CWebConst.DATABEAN_CLEAR);

	}

}
