/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: StatusReportCommand.java,v 1.2 2005/09/07 13:38:06 rampil Exp $
 */
package org.logical_paradox.vsan.dac.command.handler;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.logical_paradox.common.session.IllegalSessionStateException;
import org.logical_paradox.common.session.Session;
import org.logical_paradox.vsan.dac.DacConstant;
import org.logical_paradox.vsan.dac.NodeContext;
import org.logical_paradox.vsan.dac.Response;
import org.logical_paradox.vsan.dac.ResponseCode;
import org.logical_paradox.vsan.dac.command.exception.CommandExecutionException;
import org.logical_paradox.vsan.dac.command.exception.SessionTerminationException;
import org.logical_paradox.vsan.node.Database;

/**
 * ステータスレポートコマンド
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class StatusReportCommand implements DacCommand {
	/** ロガー */
	private static final Log log = LogFactory.getLog(StatusReportCommand.class);

	/**
	 * コマンドを実行する
	 * @param session 実行するセッション
	 * @return 更新されたセッション
	 * @throws CommandExecutionException コマンド実行中に発生した例外
	 * @throws SessionTerminationException 接続終了時に発生する例外
	 */
	public Session execute(Session session) throws CommandExecutionException, SessionTerminationException {
		try {
			NodeContext context = (NodeContext)session.getAttribute(DacConstant.SKEY_NODE_CONTEXT);
			Database db = context.getDatabase();

			StringBuffer sb = new StringBuffer();
			sb.append("NODE NAME [ " + context.getNodeId() + "@" + db.getDomain() + " ]\n");
			sb.append("DOMAIN DATABASE INFORMATION FILE [ " + db.getFilename() + " ]\n");
			sb.append("DATAFILE FORMAT VERSION [ " + db.getMajorVersion() + "." + db.getMinorVersion() + " ]\n");
			sb.append("RECORD SIZE [ " + db.getRecordSize() + " ]\n");
			sb.append("LAST OPTIMIZE DATETIME [ " + db.getLastOptimizeTime() + " ]\n");

			String[] filespecs = db.getDatafileSpec();
			sb.append("NUMBER OF DATAFILES [ " + filespecs.length + " ]\n");
			if(filespecs.length > 0) {
				sb.append("-----------------\n");
				for(int i = 0; i < filespecs.length; i++) {
					sb.append("No." + (i+1) + ": " + filespecs[i] + "\n");
				}
				sb.append("-----------------\n");
			}

			// セッションに回答を格納する
			session.setAttribute(DacConstant.SKEY_DAC_RESPONSE, new Response(ResponseCode.OK, sb.toString().getBytes()));
		} catch (IllegalSessionStateException e) {
			// セッションが継続可能な状態でない場合，当該セッションを終了する
			log.warn("ステータスレポートが要求されましたが、セッションが持続可能な状態ではありませんでした。");
			log.warn("セッションを破棄します。");
			throw new SessionTerminationException(e);
		}
		return session;
	}

}
