/*  OpenOlap viewer
 *  パッケージ名：openolap.viewer.controller
 *  ファイル：SaveClientReportStatusCommand.java
 *  説明：レポートをデータベースに保存する。
 *
 *  作成日: 2004/01/14
 */
package openolap.viewer.controller;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.servlet.ServletException;

import openolap.viewer.Report;
import openolap.viewer.common.CommonSettings;
import openolap.viewer.dao.AxisDAO;
import openolap.viewer.dao.ColorDAO;
import openolap.viewer.dao.DAOFactory;
import openolap.viewer.dao.ReportDAO;

/**
 *  クラス：SaveClientReportStatusCommand
 *  説明：レポートをデータベースに保存する。
 */
public class SaveClientReportStatusCommand implements Command {

	// ********** インスタンス変数 **********

	/** RequestHelperオブジェクト */
	private RequestHelper requestHelper = null;

	/**
	 * クライアントから取得した下記情報をもとにサーバー側のモデルを更新後、レポートの保存処理を行う。<br>
	 *    −色設定情報
	 *    −軸メンバのドリル状況
	 *    −レポート情報（レポート名、親フォルダーID）
	 * レポート保存処理は全ての処理が完了した場合にcommitをおこない、失敗した処理がある場合はrollbackする。
	 * キューブから作成中のレポートであれば、DBへの保存処理終了後に新規レポートをあらわすフラグisNewReportをfalseに変更する。
	 * レポートの保存完了を意味し、完了メッセージをalertで表示するページを戻す。
	 * @param helper RequestHelperオブジェクト
	 * @param commonSettings アプリケーションの共通設定オブジェクト
	 * @return dispatch先のJSP/HTMLのパス
	 * @exception ServletException 処理中に例外が発生した
	 * @exception IOException 処理中に例外が発生した
	 */
	public String execute(RequestHelper helper, CommonSettings commonSettings)
		throws ServletException, IOException {

		String reportName = (String)helper.getRequest().getParameter("reportName");
		String folderID = (String)helper.getRequest().getParameter("folderID");

		// レポートを保存場所指定付きで保存
		if ( (!reportName.equals("")) && (!folderID.equals("")) ) {
			helper.getRequest().setAttribute("mode", "saveNewReport");
		}

		Connection conn = null;
		DAOFactory daoFactory = DAOFactory.getDAOFactory();
		conn = daoFactory.getConnection();

		// =========================================
		// Server側で保持しているレポートモデルを更新
		// =========================================

		// 色設定情報を更新
		ColorDAO colorDAO = daoFactory.getColorDAO(null);
		colorDAO.registColor(helper, commonSettings);

		// 軸メンバのドリル状況
		AxisDAO axisDAO = daoFactory.getAxisDAO(null);
		axisDAO.registSelectedMemberAndDrillStat(helper, commonSettings);

		// レポート情報（レポート名、親フォルダーID）を更新
		ReportDAO reportDAO = daoFactory.getReportDAO(null);
		reportDAO.registReport(helper, commonSettings);

		// =========================================
		// レポート設定を永続化
		// =========================================
		Report report = (Report) helper.getRequest().getSession().getAttribute("report");
		try {
			conn.setAutoCommit(false);
			report.saveReport(conn);
			conn.commit();
		} catch (SQLException e) {
			try {
				if (conn != null){
					conn.rollback();
				}
				e.printStackTrace();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} catch (Exception e) {
			try {
				if (conn != null){
					conn.rollback();
				}
				e.printStackTrace();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		} finally {
			try {
				if (conn != null) {
					conn.close();
				}

			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}

		// =========================================
		// 終了処理
		// =========================================
		if(report.isNewReport()) {
			report.setNewReport(false);
		}

		return "/spread/saveFinalize.jsp";
	}

}
