/*  OpenOlap viewer
 *  パッケージ名：openolap.viewer.controller
 *  ファイル：GetReportHeaderCommand.java
 *  説明：レポートオブジェクトを作成しSessionに保存し、レポートヘッダーフレーム部表示ページへdispatchします。
 *
 *  作成日: 2004/02/15
 */
package openolap.viewer.controller;

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

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import openolap.viewer.Report;
import openolap.viewer.common.CommonSettings;
import openolap.viewer.common.Messages;
import openolap.viewer.dao.DAOFactory;
import openolap.viewer.dao.ReportDAO;

/**
 *  クラス：GetReportHeaderCommand
 *  説明：レポートオブジェクトを作成しSessionに保存し、レポートヘッダーフレーム部表示ページへdispatchします。
 */
public class GetReportHeaderCommand implements Command {

	/**
	 * レポートオブジェクトを作成しSessionに保存し、レポートヘッダーフレーム部表示ページへdispatchします。<br>
	 * "cubeSeq"パラメータが与えられた場合、キューブをもとに新規にレポートオブジェクトを作成します。<br>
	 * "seqId"パラメータが与えられた場合、既存のレポート情報をもとにレポートオブジェクトを作成します。<br>
	 * パラメータが与えられていないが、Sessionに既にreportオブジェクトが存在する場合、何も行いません。<br>
	 * パラメータが与えられていなく、Sessionにreportオブジェクトも存在しない場合、IllegalStateExceptionをthrowする。<br>
	 * @param helper RequestHelperオブジェクト
	 * @param commonSettings アプリケーションの共通設定オブジェクト
	 * @return dispatch先のJSP/HTMLのパス
	 * @exception ServletException 処理中に例外が発生した
	 * @exception IOException 処理中に例外が発生した
	 */
	public String execute(RequestHelper helper, CommonSettings commonSettings)
		throws ServletException, IOException {

			HttpServletRequest request = helper.getRequest();
			HttpSession session = helper.getRequest().getSession();

			String cubeSeq = request.getParameter("cubeSeq");
			String reportId = request.getParameter("seqId");

			if((cubeSeq == null) && (reportId == null) && (session.getAttribute("report") == null) ) { throw new IllegalStateException(); }
			if((cubeSeq != null) && (reportId != null)) { throw new IllegalStateException(); }

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

			Report report = null;
			
			try {
				// Reportをセッションへ登録
				ReportDAO reportDAO = daoFactory.getReportDAO(conn);
				if(request.getParameter("cubeSeq") != null) {
					report = reportDAO.getInitialReport(cubeSeq, commonSettings);
					session.setAttribute("report",report);
				} else if (request.getParameter("seqId") !=null) {
					report = reportDAO.getExistingReport(reportId, helper, commonSettings);

					// キューブが存在しない
					if(report == null) {
						String errorMessage = Messages.getString("GetReportHeaderCommand.cubeNotExistMSG"); //$NON-NLS-1$
						helper.getRequest().setAttribute("errorMessage", errorMessage);
					}

					session.setAttribute("report",report);
				} else {
					if (session.getAttribute("report") != null) {
						report = (Report) session.getAttribute("report");
					} else {
						throw new IllegalStateException();
					}
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}  finally {
				if(conn != null){
					try {
						conn.close();
					} catch (SQLException e) {
						e.printStackTrace();
					}
				}
			}

		return "/spread/spreadHeader.jsp";
	}

}
