/*
このファイルの中身は、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) ______________________________________.
*/

//
//	XMO共通 ログ出力クラス
//			変更履歴
//				2004.01.08	新規作成	二條智文
//
package jp.co.ntt.lms.xmo.util;

import java.util.*;
import java.io.*;
import java.text.*;
import jp.co.ntt.lms.xmo.Environment;

/**
 * XMO共通 ログ出力クラス。<BR>
 * このクラスはXMO共通のログ出力クラスです。<BR>
 * 設定ファイル(XMS.ini)のlog_pathフィールドに設定されたフォルダに
 * XMSyyyymmdd.logというファイル名でログを出力します。<BR>
 * また、ログレベルによりログ出力を制限します。<BR>
 * ログレベルは設定ファイル(XMS.ini)のlog_levelフィールドに以下のように
 * 設定してください。
 * <PRE>
 * 		 0: ログはださない
 *		 1: 例外のみ出力
 *		 5: 通常レベル
 *		10: デバックレベル
 * </PRE>
 * ログの内容は以下のとおりです。
 * <PRE>
 *		yyyy/MM/dd HH:mm:ss クラス名 ログ内容
 * </PRE>
 * @author T.Nijou
 * @version 0.0.0.1 2004.01.08
 */
public class DebugLog {

	static String LOG_DIR	= "";
	static String LOG_FILE	= "";

	private static String FILE_NAME = "XMS";

	/** ログレベル低 */
	public static final int ROW = 10;

	/** ログレベル中 */
	public static final int MID = 5;

	/** ログレベル高 */
	public static final int HIGHT = 1;


	/**
	 * フォルダパスとファイル名を指定してログを出力します
	 * @param strDirPath フォルダパス
	 * @param strFileName ファイル名
	 * @param objClass ログを出力するクラス
	 * @param objOut ログ情報
	 */
	synchronized static private void write(	String	strDirPath,
								String	strFileName,
								Class	objClass,
								Object	objOut )
	{
		try {
			String strFilePath = "";
			if(strDirPath.equals("")) {
				strDirPath = LOG_DIR;
			}
			if(strFileName.equals("")) {
				strFileName = LOG_FILE;
			}
			strFilePath = strDirPath + "/" + strFileName;
			File objFile = new File(strDirPath);
			if(objFile.exists() == false)
			{
				objFile.mkdirs();
			}
			objFile = new File(strFilePath);
			if (objFile.exists() == false)
			{
				objFile.createNewFile();
			}

			String strClassName = objClass.getName();

			//  ファイルストリームオブジェクトの作成
			FileOutputStream objDebugStream = new FileOutputStream(strFilePath, true);
			OutputStreamWriter objOutputWriter = null;
			
			Environment objEnv = new Environment();
			String lsCsvEncode = objEnv.getCsvEncode();
			objOutputWriter = new OutputStreamWriter(objDebugStream,lsCsvEncode);
			PrintWriter objPrint = new PrintWriter(objOutputWriter);

			SimpleDateFormat objFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
			Date objNow = new Date();
			String strDate = objFormat.format(objNow);								//現在時刻取得

			if( objOut instanceof Exception ) {
				Exception e = (Exception)objOut;
				// 例外時の処理
				objPrint.print( strDate );
				objPrint.print( "- " );
				objPrint.print( strClassName );
				objPrint.print( "\n" );
				e.printStackTrace( objPrint );
			}
			else {
				//	情報を出力
				objPrint.print(strDate);
				objPrint.print("- ");
				objPrint.print(strClassName);
				objPrint.print("- ");
				objPrint.print( objOut );
				objPrint.println("");
			}
			objPrint.close();

			try {
				objOutputWriter.close();
				objDebugStream.close();
			}
			catch( IOException Ex ) {
				//  エラーは無視
			}
		}
		catch( FileNotFoundException Ex ) {
			Ex.printStackTrace();
			//  ここでエラーが発生した場合は、対処方法がないので無視する
		}
		catch( Exception Ex) {
			Ex.printStackTrace();
		}
	}

	/**
	 * フォルダパスを設定ファイルから読み込みファイル名をXMSyyyymmdd.logとして
	 * ログを出力します。
	 * @param objClass ログを出力するクラス
	 * @param objOut ログ情報
	 * @param intLogLevel ログレベル
	 */
	static public void write( Class objClass, Object objOut, int intLogLevel ) {

		// ログレベル設定用
		int intLogLevelTemp = 0;
		// フォルダ設定用
		String strDirPath = "";
		try {
			// 環境設定ファイル読み込みクラスをインスタンス化
			Environment objEnv = new Environment();

			// ログレベルの取得
			String strLogLevel = objEnv.getLogLevel();
			intLogLevelTemp = new Integer( strLogLevel ).intValue();

			if( intLogLevelTemp == 0 || intLogLevel > intLogLevelTemp ) {
				// 設定されたログレベルが0または設定よりも大きい場合は何もしない
				return;
			}

			// フォルダパス取得
			strDirPath = objEnv.getLogPath();

			// 現在の日付を取得してファイル名を決定します
			SimpleDateFormat objFormat = new SimpleDateFormat( "yyyyMMdd" );
			Date objToday = new Date();
			String strToday = objFormat.format( objToday );

			String strFileName = "";
			if( objOut instanceof Exception ) {
				strFileName = FILE_NAME + "Err" + strToday + ".log";
			}
			else {
				strFileName = FILE_NAME + strToday + ".log";
			}
			// ログ出力をします
			write( strDirPath, strFileName, objClass, objOut );

		}
		catch( Exception e ) {
			e.printStackTrace();
			// 例外発生時は何もしない。
			return ;
		}
	}

	/**
	 * ログファイル名を設定します(実際にはファイル名+yyyymmddになります)
	 * @param strFileName ファイル名
	 */
	public static void setFileName( String strFileName ) {
		FILE_NAME = strFileName;
	}
}
