/*
 * MosP - Mind Open Source Project         http://www.mosp.jp/
 * Copyright (C) 1987-2009 MIND Co., Ltd.  http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package jp.mosp.common.common;

import java.io.IOException;
import java.util.Properties;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;

import jp.mosp.common.dto.CmAspUserDto;
import jp.mosp.common.dto.CmUserDto;

/**
 * ログ出力に有用なメソッドを提供する。<br><br>
 * ログ出力準備から汎用ログ、エラーログの出力等を行う。<br>
 */
public final class LogUtility {
	
	/**
	 * ロガー取得。<br>
	 * cfgの設定を用いて、ログ出力の準備を行う。<br>
	 * @param cfg アプリケーション設定
	 * @return アプリケーション設定を反映したロガー
	 * @throws IOException
	 */
	private static Logger getLogger(Properties cfg) throws IOException {
		// Loggerの生成
		Logger logger = Logger.getLogger(cfg.getProperty(MospConst.PPT_LOG_NAME));
		return logger;
	}
	
	/**
	 * エラーログ出力。<br>
	 * ランタイムエラーのログ(スタックトレース)を出力する。
	 * @param ex 発生例外
	 * @param request リクエスト
	 */
	public static void outputErrorLog(
			Throwable          ex     ,
			HttpServletRequest request
	) {
		try {
			String msg = MospUtility.getStackTrace(ex);
			// ログ出力
			log(request, 6, MospConst.LOG_ERROR, msg);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	

	/**
	 * ログ出力。<br>
	 * requestに含まれる情報を用いて、ログを出力する。
	 * @param request リクエスト
	 * @param level ログレベル(0:FINEST〜6:SEVERE)
	 * @param logType ログタイプ(MospConst.LOG_...)
	 * @param message ログメッセージ
	 */
	public static void log(
			HttpServletRequest request,
			int level,
			String logType,
			String message
	) {
		try {
			// 設定ファイルの取得
			Properties cfg = (Properties)request.getAttribute(MospConst.ATT_CFG);
			// 情報の取得
			CmAspUserDto aspUser = (CmAspUserDto)request.getAttribute(MospConst.ATT_ASPUSER);
			CmUserDto user = (CmUserDto)request.getAttribute(MospConst.ATT_USER);
			String strAspUser = aspUser != null ? aspUser.getAspUserId() : "";
			String strUser = user != null ? user.getUserId() : "";
			String strCmd  = (String)request.getAttribute(MospConst.ATT_CMD);
			// ログ出力
			log(cfg, strAspUser, strUser, strCmd, level, logType, message);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * ログ出力。<br>
	 * 汎用ログ出力機能を提供する。<br>
	 * @param cfg アプリケーション設定
	 * @param strAspUser ASPユーザーコード
	 * @param strUser ユーザーコード
	 * @param strCmd コマンド
	 * @param level ログレベル(0:FINEST〜6:SEVERE)
	 * @param logType ログタイプ(MospConst.LOG_...)
	 * @param message ログメッセージ
	 */
	public static void log(
			Properties cfg,
			String strAspUser,
			String strUser,
			String strCmd,
			int level,
			String logType,
			String message
	) {
		try {
			// ロガー取得
			Logger logger = getLogger(cfg);
			// ログメッセージ作成
			StringBuffer msg = new StringBuffer();
			msg.append(logType);
			msg.append(cfg.getProperty(MospConst.PPT_LOG_SEPARATOR));
			msg.append(strAspUser);
			msg.append(cfg.getProperty(MospConst.PPT_LOG_SEPARATOR));
			msg.append(strUser);
			msg.append(cfg.getProperty(MospConst.PPT_LOG_SEPARATOR));
			msg.append(strCmd);
			msg.append(cfg.getProperty(MospConst.PPT_LOG_SEPARATOR));
			msg.append(message);
			// ログレベルの設定
			Level lvl = null;
			switch (level) {
				case 0:
					lvl = Level.FINEST;
					break;
				case 1:
					lvl = Level.FINER;
					break;
				case 2:
					lvl = Level.FINE;
					break;
				case 3:
					lvl = Level.CONFIG;
					break;
				case 4:
					lvl = Level.INFO;
					break;
				case 5:
					lvl = Level.WARNING;
					break;
				case 6:
					lvl = Level.SEVERE;
				break;
				default:
					lvl = Level.SEVERE;
			}
			// ログ出力
			logger.log(lvl, msg.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * ログ出力レベル設定。<br>
	 * cfgに設定されているロガーに対して、ログ出力レベルを設定する。
	 * @param cfg MosPアプリケーション設定
	 */
	public static void setLevel(Properties cfg) {
		// Loggerの生成
		Logger logger = Logger.getLogger(cfg.getProperty(MospConst.PPT_LOG_NAME));
		//ログの出力レベルを設定
		String lvl = cfg.getProperty(MospConst.PPT_LOG_LEVEL);
		if (lvl.equals("ALL")) {
			logger.setLevel(Level.ALL);
		} else if (lvl.equals("FINER")) {
			logger.setLevel(Level.FINER);
		} else if (lvl.equals("FINE")) {
			logger.setLevel(Level.FINE);
		} else if (lvl.equals("CONFIG")) {
			logger.setLevel(Level.CONFIG);
		} else if (lvl.equals("INFO")) {
			logger.setLevel(Level.INFO);
		} else if (lvl.equals("WARNING")) {
			logger.setLevel(Level.WARNING);
		} else if (lvl.equals("SEVERE")) {
			logger.setLevel(Level.SEVERE);
		} else {
			logger.setLevel(Level.ALL);
		}
	}


}
