#include "StdAfx.h"
#include "AccessLogFilter.h"
#include "TextTools.h"
#include "TextFormatter.h"

//!	モジュール名
static TCHAR _MODULE_NAME[] = _T("AccessLogFilter");

CAccessLogFilter::CAccessLogFilter(void)
{
}

CAccessLogFilter::~CAccessLogFilter(void)
{
}


/*!
	フィルタ名取得
*/
LPCTSTR CAccessLogFilter::GetFilterName()
{
	return _MODULE_NAME;
};


/*!
	初期化
*/
void CAccessLogFilter::StartFactory(IServerToolPtr serverTool)
{
	//	初期化済み？
	if(m_init)
		return;
	m_init = TRUE;

	//	コピー、初期化
	m_serverTool = serverTool;
	m_logManager = m_serverTool->GetILogManager();

	//	設定取得
	m_setting = m_serverTool->GetFilterSetting(m_setting.GetSettingName());
	m_logFilePath = m_setting.GetAccessLogFilePath();
	m_logFormat = m_setting.GetAccessLogFormat();
	CTextTools::GetAllToken(m_setting.GetIgnorePath(), m_ignorePath, ",", TRUE);
}


/*!
	停止
*/
void CAccessLogFilter::StopFactory()
{
	//	初期化チェック
	if(!m_init)
		return;
	m_init = FALSE;
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	停止
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	切断時にログ出力
*/
void CAccessLogFilter::Stop(IFilterContextPtr filterContext)
{
	CContext			context = filterContext->GetContxet();

	//	無効かチェック
	if(IsIgnore(context.GetRequestInfo().GetObject()))
		return;

	//	出力
	m_logManager->WriteAccessLog(GetLogFilePath(context), GetLog(context));
}

//////////////////////////////////////////////////////////////////////////////////////////////
//	ログ出力
//////////////////////////////////////////////////////////////////////////////////////////////
/*!
	無効かチェック
*/
int CAccessLogFilter::IsIgnore(CString serverPath)
{
	SCOPE_LOCK();

	//	無効アドレスチェック
	for(int i=0;i<m_ignorePath.GetSize();i++)
		if(CTextTools::WildCompare(m_ignorePath[i], serverPath))
			return(1);
	return(0);
}


/*!
	名前取得
*/
CString	CAccessLogFilter::GetLogFilePath(CContext &context)
{
	//	時刻取得
	CTime	time(context.GetStartTime().GetTIME_T());

	//	ログ整形クラス
	CTextFormatter	formatter;

	//	基本追加
	formatter.AddKeyFromWorkspace(context.GetStartTime());

	//	時刻詳細
	formatter.AddKey("Year",time.Format("%Y"));
	formatter.AddKey("Month",time.Format("%m"));
	formatter.AddKey("Day",time.Format("%d"));
	formatter.AddKey("DayOfWeek",time.Format("%w"));

	formatter.AddKey("MonthString",time.Format("%b"));
	formatter.AddKey("DayOfWeekString",time.Format("%a"));

	formatter.AddKey("Hour",time.Format("%H"));
	formatter.AddKey("Minute",time.Format("%M"));
	formatter.AddKey("Second",time.Format("%S"));

	//	書式実行
	return(formatter.GetFormattedString(m_logFilePath, "%"));
}

/*!
	ログ取得
*/
CString	CAccessLogFilter::GetLog(CContext &context)
{
	//	ログ整形クラス
	CTextFormatter	formatter;

	//	禁止文字
	formatter.AddEscape("\r", "_");
	formatter.AddEscape("\n", "_");

	//	コンテキスト基本情報
	formatter.AddKeyFromWorkspace(context);

	//	開始時刻
	formatter.AddKeyFromWorkspace(context.GetStartTime());

	//	クライアント情報
	formatter.AddKeyFromWorkspace(context.GetClientInfo());

	//	リクエスト情報
	formatter.AddKeyFromWorkspace(context.GetRequestInfo());
	formatter.AddKeyFromWorkspace(context.GetRequestInfo().GetRequestOption(), "Req:");

	//	レスポンス情報
	formatter.AddKeyFromWorkspace(context.GetResponseInfo());
	formatter.AddKeyFromWorkspace(context.GetResponseInfo().GetResponseOption(), "Res:");

	//	ターゲット情報
//	formatter.AddKeyFromWorkspace(context.GetTargetInfo());

	//	書式実行
	return(formatter.GetFormattedString(m_logFormat, "%"));
}
