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

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jp.co.ntt.lms.xmo.util.ChangeEncode;
import jp.co.ntt.lms.xmo.util.DebugLog;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xms.common.user.User;
import jp.co.ntt.lms.xms.common.util.StringUtil;


/**
 * 画面振分処理クラス。<br>
 * 業務振分の処理に結果に基づいて、振り分ける画面を決定し、
 * その画面を生成するためのアクションとフォワードするＪＳＰを選定する。
 * 選定したアクションを起動し、その後、ＪＳＰにフォワードする。
 * 
 * @author T.Nishiki
 */
public class XmsScreenControl {

	/**
	 * 結果データの出力先。<br>
	 */
	private static File CSV_OUTPUT_DIR;

	/**
	 * データ・ダウンロードのバッファサイズ。<br>
	 */
	private final static int DOWNLOAD_BUFFER_SIZE;

	/**
	 * イニシャライザ。<br>
	 * staticフィールドの初期化。
	 */
	static {

		DebugLog.write(
			XmsScreenControl.class,
			"HEAD XmsScreenControl.static-initilizer",
			DebugLog.ROW);
		// データ・ダウンロードのバッファサイズ
		DOWNLOAD_BUFFER_SIZE = 1024;

		DebugLog.write(
			XmsScreenControl.class,
			"TAIL XmsScreenControl.static-initilizer",
			DebugLog.ROW);
	}

	/**
	 * 画面情報の取得するアクションクラスを起動する。<br>
	 * 実行するアクションクラス名称を画面振分定義ファイルから取得する。
	 * 名称を取得できた場合、ロードして実行する。
	 * ＪＳＰにフォワードするか、ダウンロードを実施するかを判定し、
	 * 適切な方法で終了する。
	 * 
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param xmsResponse レスポンス・オブジェクト。
	 * @throws XmsException 処理中に例外が発生した場合。
	 */
	public void processRequest(XmsRequest xmsRequest, XmsResponse xmsResponse)
		throws XmsException {
		DebugLog.write(
			XmsScreenControl.class,
			"HEAD processRequest()",
			DebugLog.ROW);

		// 実行する処理（CSV判定用）
		String mode = null;
		// CSVダウンロード完了時にtrue
		boolean requestCSV = false;
		// 起動するアクションクラス
		XmsScreenAction action = null;

		HttpServletRequest request = null;
		XmsScreenBean bean = null;

		try {
			request = xmsRequest.getRequest();
			// モードを取得し、CSVダウンロードであれば、
			// ファイルの読み込み＋ダウンロードを試みる。			
			mode = xmsRequest.getParameter(Constant.REQUEST_MODE);
			if ((mode != null)
				&& (mode.equals(Constant.REQUEST_VALUE_MODE_CSV))) {
				requestCSV = doRequestCsv(xmsRequest, xmsResponse);
			}
			// CSVダウンロードできない、あるいは、
			// 要求がCSVダウンロードではない場合、
			// アクションクラスを起動する。
			if (requestCSV == false) {
				////////////////////////////////////////////////////////////////
				// 実行するクラスの選定
				action = getScreenAction(xmsRequest, xmsResponse);
				if (action != null) {
					// 処理を実行
					action.perform(xmsRequest, xmsResponse);

					// 返却値オブジェクトから画面情報を取り出す。
					bean = xmsResponse.getScreenBean();

					// スコープによる画面情報オブジェクトの設定
					if (bean != null) {
						request = xmsRequest.getRequest();
						// スコープがセッションの場合
						if (xmsResponse.getScope() == XmsResponse.SESSION) {
							HttpSession session = request.getSession();
							session.setAttribute(
								xmsResponse.getScreenBeanName(),
								bean);
						}
						// スコープがリクエストの場合
						else if (
							xmsResponse.getScope() == XmsResponse.REQUEST) {
							request.setAttribute(
								xmsResponse.getScreenBeanName(),
								bean);
						}
					}
				}
				////////////////////////////////////////////////////////////////
				// ＣＳＶ変換保存処理
				int type = xmsResponse.getOutType();
				if (type == XmsResponse.JSP_CSV) {
					makeCsvFile(xmsRequest, xmsResponse, action);
				}
				////////////////////////////////////////////////////////////////
				// このサーブレット処理の終了方法の分岐
				if (type == XmsResponse.DOWNLOAD) {
					terminateWithCsvDownload(xmsRequest, xmsResponse, action);
				} else {
					terminateWithForward(xmsRequest, xmsResponse);
				}
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		} finally {
			DebugLog.write(
				XmsScreenControl.class,
				"TAIL processRequest()",
				DebugLog.ROW);
		}

	}

	/**
	 * XmsWarningException発生用ＪＳＰフォワードでもって、処理を終了する。<br>
	 * 各アクションで指定しているXmsWarningExceptionにJSPにフォワードする。
	 * 引数で指定されたexceptionは、Constant.KEY_ERRORをキーに
	 * リクエスト属性として設定する。
	 * 例外が発生した場合は、terminateWithThrowableを呼び出す。
	 * 
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param xmsResponse レスポンス・オブジェクト。
	 * @param exception エラーの原因となった例外オブジェクト。
	 * @see #terminateWithThrowable(XmsRequest, XmsResponse, Throwable)
	 * @see Constant#KEY_ERROR
	 * @see XmsWarningException
	 */
	void terminateWithWarningException(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse,
		XmsWarningException exception) {

		// HTTP リクエスト
		HttpServletRequest request = null;
		// アクションＩＤ
		String actionId = null;
		// フォワードするＵＲＬ
		String url = null;

		try {
			request = xmsRequest.getRequest();
			// フォワードするＪＳＰのパスを取得
			actionId = xmsRequest.getParameter(Constant.REQUEST_ACTION_ID);
			url = XmsScreenXMLPerser.getWarningExceptiontJspPath(actionId);
			// エラー原因の例外をセット
			request.setAttribute(Constant.KEY_ERROR, exception);

			forward(xmsRequest, url);
		} catch (Exception e) {
			terminateWithThrowable(xmsRequest, xmsResponse, exception);
		}
	}

	/**
	 * XmsSystemException発生用ＪＳＰフォワードでもって、処理を終了する。<br>
	 * 各アクションで指定しているXmsSystemExceptionにJSPにフォワードする。
	 * 引数で指定されたexceptionは、Constant.KEY_ERRORをキーに
	 * リクエスト属性として設定する。
	 * 例外が発生した場合は、terminateWithThrowableを呼び出す。
	 * 
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param xmsResponse レスポンス・オブジェクト。
	 * @param exception エラーの原因となった例外オブジェクト。
	 * @see #terminateWithThrowable(XmsRequest, XmsResponse, Throwable)
	 * @see Constant#KEY_ERROR
	 * @see XmsSystemException
	 */
	void terminateWithSystemException(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse,
		XmsSystemException exception) {

		// HTTP リクエスト
		HttpServletRequest request = null;
		// アクションＩＤ
		String actionId = null;
		// フォワードするＵＲＬ
		String url = null;

		try {
			request = xmsRequest.getRequest();
			// フォワードするＪＳＰのパスを取得
			actionId = xmsRequest.getParameter(Constant.REQUEST_ACTION_ID);
			url = XmsScreenXMLPerser.getSystemExceptiontJspPath(actionId);
			// エラー原因の例外をセット
			request.setAttribute(Constant.KEY_ERROR, exception);

			forward(xmsRequest, url);
		} catch (Exception e) {
			terminateWithThrowable(xmsRequest, xmsResponse, exception);
		}
	}

	/**
	 * XmsInnerException発生用ＪＳＰフォワードでもって、処理を終了する。<br>
	 * 各アクションで指定しているXmsInnerExceptionにJSPにフォワードする。
	 * 引数で指定されたexceptionは、Constant.KEY_ERRORをキーに
	 * リクエスト属性として設定する。
	 * 例外が発生した場合は、terminateWithThrowableを呼び出す。
	 * 
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param xmsResponse レスポンス・オブジェクト。
	 * @param exception エラーの原因となった例外オブジェクト。
	 * @see #terminateWithThrowable(XmsRequest, XmsResponse, Throwable)
	 * @see Constant#KEY_ERROR
	 * @see XmsInnerException
	 */
	void terminateWithInnerException(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse,
		XmsInnerException exception) {

		// HTTP リクエスト
		HttpServletRequest request = null;
		// アクションＩＤ
		String actionId = null;
		// フォワードするＵＲＬ
		String url = null;

		try {
			request = xmsRequest.getRequest();
			// フォワードするＪＳＰのパスを取得
			actionId = xmsRequest.getParameter(Constant.REQUEST_ACTION_ID);
			url = XmsScreenXMLPerser.getInnerExceptiontJspPath(actionId);
			// エラー原因の例外をセット
			request.setAttribute(Constant.KEY_ERROR, exception);

			forward(xmsRequest, url);
		} catch (Exception e) {
			terminateWithThrowable(xmsRequest, xmsResponse, exception);
		}
	}

	/**
	 * 共通エラーＪＳＰへのフォワードでもって、処理を終了する。<br>
	 * 引数で指定されたexceptionは、Constant.KEY_ERRORをキーに
	 * リクエスト属性として設定する。
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param xmsResponse レスポンス・オブジェクト。
	 * @param throwable エラーの原因となった例外／エラーオブジェクト。
	 * @see Constant#KEY_ERROR
	 */
	void terminateWithThrowable(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse,
		Throwable throwable) {

		// HTTP リクエスト
		HttpServletRequest request = null;
		// フォワードするＵＲＬ
		String url = null;

		try {
			request = xmsRequest.getRequest();
			// フォワードするＪＳＰのパスを取得
			url = XmsScreenXMLPerser.getThrowableJspPath();
			// エラー原因の例外をセット
			request.setAttribute(Constant.KEY_ERROR, throwable);
			forward(xmsRequest, url);
		} catch (Throwable th) {
			DebugLog.write(XmsScreenControl.class, th, DebugLog.HIGHT);
		}
	}

	/**
	 * ＣＳＶダウンロードが要求された場合の処理。<br>
	 * 指定したＣＳＶファイルがファイルシステム上にあれば、
	 * ダウンロードのレスポンスをクライアントに実行する。
	 * @param xmsRequest  HTTPリクエスト。
	 * @param xmsResponse HTTPレスポンス。
	 * @return boolean このメソッドでＣＳＶダウンロードが完了すればtrue、
	 *                  ダウンロードしない場合はfalseを戻す。
	 */
	private boolean doRequestCsv(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse)
		throws XmsException {

		HttpServletResponse response = null;
		String fileName = null;
		String downloadFileName = null;
		InputStream is = null;
		boolean returnValue = false;
		boolean exceptionFlag = false;
		
		XmsScreenAction action = null;
		try {
			response = xmsRequest.getResponse();
			// 指定したファイルがある場合は、ダウンロード・レスポンスを実行する。
			fileName = xmsRequest.getParameter(Constant.REQUEST_FILENAME);
			if (fileName != null) {
				File csvFile = new File(getOutputDir(), fileName);
				if (csvFile.isFile() == true) {
					// ダウンロードダイアログに表示するファイル名を選定
					action = getScreenAction(xmsRequest, xmsResponse);
					downloadFileName = action.getDownloadFileName(xmsRequest,xmsResponse);
					if ( StringUtil.isNullString(downloadFileName) == true ) {
						downloadFileName = getDownloadFileName(xmsRequest);
					}
					// ファイルのストリームを開く
					is = new BufferedInputStream(new FileInputStream(csvFile));
					responseForFileDownload(response, is, downloadFileName);
					// ダウロード完了。
					returnValue = true;
				}
			}
			exceptionFlag = true;
		} catch (Exception e) {
			throw new XmsSystemException(e);

		} finally {
			// 入力ストリームのクローズ
			if (is != null) {
				try {
					is.close();
				} catch (Exception e) {
					if (exceptionFlag == true) {
						throw new XmsSystemException(e);
					}
				} finally {
					is = null;
				}
			}
		}

		return returnValue;
	}

	/**
	 * ダウンロード・レスポンスを実行する。<br>
	 * @param response HTTPレスポンス。
	 * @param is       ダウロードするデータの取得元となる入力ストリーム。
	 * @param fileName ダウンロード・ファイル名。
	 * @throws XmsException ダウンロード処理中にエラーが発生した場合。
	 */
	private void responseForFileDownload(
		HttpServletResponse response,
		InputStream is,
		String fileName)
		throws XmsException {

		// レスポンスへの出力ストリーム
		OutputStream responseStream = null;
		// 出力バッファ
		byte[] buffer = null;
		// 読み込みサイズ
		int bufferLength = 0;
		// 例外発生クラス
		boolean exceptionFlag = false;

		try {
			// レスポンス用にヘッダを設定
			response.setHeader(
				"Content-Disposition",
				"filename=\"" + new String(fileName.getBytes(),"ISO8859-1") + "\"");
			response.setContentType("text/unknown");
			//出力ストリームを取得。
			responseStream = response.getOutputStream();
			// ダウンロード処理を実行。
			buffer = new byte[DOWNLOAD_BUFFER_SIZE];
			while (true) {
				bufferLength = is.read(buffer);
				if (bufferLength <= 0) {
					break;
				}
				responseStream.write(buffer, 0, bufferLength);
			}
			exceptionFlag = true;

		} catch (Exception e) {
			throw new XmsSystemException(e);
		} finally {
			// レスポンスへの出力ストリームのクローズ
			try {
				responseStream.close();
			} catch (Exception e) {
				if (exceptionFlag == true) {
					throw new XmsSystemException(e);
				}
			} finally {
				responseStream = null;
			}
		}
	}

	/**
	 * ダウンロード・レスポンスを実行する。<br>
	 * @param response HTTPレスポンス。
	 * @param data     ダウロードするデータ文字列。
	 * @param fileName ダウンロード・ファイル名。
	 * @throws XmsException ダウンロード処理中にエラーが発生した場合。
	 * @see #responseForFileDownload(HttpServletResponse, InputStream, String)
	 */
	private void responseForFileDownload(
		HttpServletResponse response,
		String data,
		String fileName)
		throws XmsException,Exception {
		// 文字列をストリームに変換して、オーバーロードメソッドを呼ぶ。
		ByteArrayInputStream is = null;
		try {
			Environment objEnv = new Environment();
			String lsCsvEncode = objEnv.getCsvEncode();
			is = new ByteArrayInputStream(data.getBytes(lsCsvEncode));
		} catch(Exception e) {
			throw e;
		}

		responseForFileDownload(response, is, fileName);
	}

	/**
	 * ＣＳＶファイルを生成する。<br>
	 * アクション結果クラスを、それを生成したアクションクラスによって、
	 * ＣＳＶデータに変換し、ファイルに保存する。
	 * 保存するファイル名はResultFileListに保存され、
	 * ResultFileListそのものはセッション登録される。
	 * セッションが無効になった時点で、ResultFileListに登録した
	 * ファイル名に合致するファイルは削除される。
	 * また、ファイル名はbeanにも登録する。
	 * 
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param xmsResponse レスポンス・オブジェクト。
	 * @param action beanを生成し、ＣＳＶ変換が可能なアクション・クラス。
	 * @throws XmsException 変換・出力中にエラーが発生した場合。
	 * @see ResultFileList
	 */
	private void makeCsvFile(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse,
		XmsScreenAction action)
		throws XmsException {
		// HTTPリクエスト
		HttpServletRequest request = null;

		XmsScreenBean bean = null;
		// ＣＳＶデータ
		String csv = null;
		// ファイル名
		String fileName = null;
		// ファイルへの出力ストリーム
		OutputStream os = null;
		// セッション・オブジェクト
		HttpSession session = null;
		// ファイル名保存用
		ResultFileList resultFileList = null;
		// 例外発生フラグ
		boolean exceptionFlag = false;
		try {
			request = xmsRequest.getRequest();
			bean = xmsResponse.getScreenBean();
			csv = action.convertToCSV(bean);

			// CSVをファイルに保存
			fileName = makeCsvFileName(xmsRequest);
			File csvFile = new File(getOutputDir(), fileName);
			os = new BufferedOutputStream(new FileOutputStream(csvFile));

			Environment objEnv = new Environment();
			String lsCsvEncode = objEnv.getCsvEncode();
			os.write(csv.getBytes(lsCsvEncode));
			
			// ファイル名をセッションに登録
			session = request.getSession(true);
			resultFileList =
				(ResultFileList) session.getAttribute(
					Constant.KEY_RESULT_FILE_LIST);
			if (resultFileList == null) {
				resultFileList = new ResultFileList(getOutputDir());
				session.setAttribute(
					Constant.KEY_RESULT_FILE_LIST,
					resultFileList);
			}
			resultFileList.add(fileName);

			// ファイル名をBeanに追加登録
			bean.setResultFileName(fileName);
			exceptionFlag = true;
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		} finally {
			// 出力ストリームのクローズ
			if (os != null) {
				try {
					os.close();
				} catch (Exception e) {
					if (exceptionFlag == true) {
						throw new XmsSystemException(e);
					}
				} finally {
					os = null;
				}
			}
		}

	}

	/**
	 * ＣＳＶダウロードをもって、処理を終了する。
	 * @param xmsRequest HTTPリクエス。
	 * @param xmsResponse HTTPレスポンス。
	 * @param action beanを生成し、ＣＳＶ変換が可能なアクション・クラス。
	 * @throws XmsException ダウンロード処理中にエラーが発生した場合。
	 */
	private void terminateWithCsvDownload(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse,
		XmsScreenAction action)
		throws XmsException {

		// HTTPレスポンス
		HttpServletResponse response = null;
		// 画面表示用Bean
		XmsScreenBean bean = null;
		// ＣＳＶデータ
		String csv = null;
		// ＣＳＶファイル名
		String fileName = null;

		try {
			response = xmsRequest.getResponse();
			bean = xmsResponse.getScreenBean();

			// ＣＳＶデータの取得
			csv = action.convertToCSV(bean);

			// ダウンロードファイルの決定
			// アクションに独自の決まりがあれば、その名前を使用し、
			// なければ作成する。
			fileName = action.getDownloadFileName(xmsRequest, xmsResponse);
			if (StringUtil.isNullString(fileName) == true) {
				fileName = getDownloadFileName(xmsRequest);
			}
			responseForFileDownload(response, csv, fileName);
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		} finally {
		}
	}

	/**
	 * ＪＳＰまたは他のリソースへのフォワードでもって、処理を終了する。
	 * @param xmsRequest HTTPリクエスト。
	 * @param xmsResponse HTTPレスポンス。
	 * @throws XmsException フォワード処理中にエラーが発生した場合。
	 */
	private void terminateWithForward(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse)
		throws XmsException {

		// アクションＩＤ
		String actionId = null;
		// フォワードするＵＲＩ
		String uri = null;
		// 更新系処理実行結果
		String businessStatus = null;

		try {
			// フォワードするURIを取得
			actionId = xmsRequest.getParameter(Constant.REQUEST_ACTION_ID);
			businessStatus = xmsResponse.getBusinessStatus();
			int type = xmsResponse.getOutType();
			uri = XmsScreenXMLPerser.getUriToForward(
				actionId, businessStatus, type);
			forward(xmsRequest, uri);
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * フォワードを実行する。
	 * @param xmsRequest リクエスト・オブジェクト。
	 * @param uri フォワード先となるURI。
	 * @throws XmsException フォワード処理中にエラーが発生した場合。
	 */
	private void forward(XmsRequest xmsRequest, String uri)
		throws XmsException {

		// HTTP リクエスト
		HttpServletRequest request = null;
		// HTTPレスポンス
		HttpServletResponse response = null;
		RequestDispatcher dispatcher = null;
		try {
			request = xmsRequest.getRequest();
			response = xmsRequest.getResponse();
			dispatcher = request.getRequestDispatcher(uri);
			dispatcher.forward(request, response);
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
	}

	/**
	 * ＣＳＶファイル名を戻す。<br>
	 * ユーザログインID
	 * + システム日時（YYYYMMddHHmmss形式）＋&quot;.csv&quot;を戻す。
	 * 
	 * @return String 決定したファイル名。
	 */
	private String makeCsvFileName(XmsRequest xmsRequest) throws XmsException {
		// システム日時
		Date systemDate = null;
		// HTTPリクエスト
		HttpServletRequest request = null;
		// ユーザID
		String userId = null;
		// このメソッドの戻り値用バッファ
		StringBuffer fileNameBuffer = null;

		// HTTPセッション
		HttpSession session = null;
		// ユーザオブジェクト
		User user = null;

		try {
			fileNameBuffer = new StringBuffer();

			// ユーザID
			request = xmsRequest.getRequest();
			session = request.getSession(false);
			if ( session != null ) {
				// ユーザオブジェクトを取得
				user = (User)session.getAttribute(Constant.KEY_USER);
				if ( user != null ) {
					userId = user.getLoginID();
				}
			}
			if (StringUtil.isNullString(userId) == false) {
				fileNameBuffer.append(ChangeEncode.setHttpChar(userId));
			}
			// システム日時
			systemDate = new Date();
			fileNameBuffer.append(Constant.DATE_FORMATTER.format(systemDate));
			// 拡張子
			fileNameBuffer.append(".csv");
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}

		return fileNameBuffer.toString();
	}

	/**
	 * ダウンロードダイアログに初期表示するファイル名を戻す。<br>
	 * ユーザログインID + &quot;-&quot;
	 * + システム日時（YYYYMMddHHmmss形式）＋&quot;.csv&quot;を戻す。
	 * 
	 * @return String 決定したファイル名。
	 */
	private String getDownloadFileName(XmsRequest xmsRequest) throws XmsException {
		String fileName = null;
		
		fileName = makeCsvFileName(xmsRequest);
		
		return fileName;
	}
	/**
	 * リクエストに対応するアクションクラスを取得する。<br>
	 * 指定したリクエストからアクションIDを取得し、
	 * 対応するアクションクラス・インスタンスを生成し、返却する。
	 * 
	 * @param xmsRequest HTTPリクエスト。
	 * @param xmsResponse HTTPレスポンス。
	 * @return XmsScreenAction アクションIDに対応するアクションクラス。
	 * @throws XmsException アクションIDが含まれない場合、
	 * 対応するアクションクラスが存在しない場合。
	 */
	private XmsScreenAction getScreenAction(
		XmsRequest xmsRequest,
		XmsResponse xmsResponse)
		throws XmsException {

		// アクションＩＤ
		String actionId = null;
		// アクションクラス名
		String className = null;
		// アクションクラスロード用
		Class actionClass = null;
		// 起動するアクションクラス
		XmsScreenAction action = null;

		try {
			// アクションＩＤを取得。
			actionId = xmsRequest.getParameter(Constant.REQUEST_ACTION_ID);
			// 実行するクラスの選定
			className =
				XmsScreenXMLPerser.getScreenActionName(
					actionId,
					xmsResponse.getBusinessStatus());
			if (StringUtil.isNullString(className) == false) {
				actionClass = Class.forName(className);
				action = (XmsScreenAction) actionClass.newInstance();
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		DebugLog.write(this.getClass(), action, DebugLog.MID);
		return action;
	}

	/**
	 * 結果データの出力先を戻します。<br>
	 * @return 結果データの出力先ディレクトリを表すFileオブジェクト。
	 */
	private synchronized static File getOutputDir() throws XmsException {

		String strJspRootDir = null;
		try {
			if (CSV_OUTPUT_DIR == null) {
				strJspRootDir = XmsScreenXMLPerser.getOutputDirectory();
				DebugLog.write(
					XmsScreenControl.class,
					"strJspRootDir==null:" + (strJspRootDir == null),
					DebugLog.ROW);

				CSV_OUTPUT_DIR = new File(strJspRootDir);
			}
		} catch (XmsException e) {
			throw e;
		} catch (Exception e) {
			throw new XmsSystemException(e);
		}
		return CSV_OUTPUT_DIR;
	}
}
