// ================================================================================================
//
// ログテキストの生成を行うためのクラスソース
//
//
// Copyright (C) 2012 Honeplus. All rights reserved.
//
// Honeplus
// ================================================================================================
namespace Honememo.Wptscs.Logics
{
using System;
using System.Net;
using System.Text;
using Honememo.Parsers;
using Honememo.Utilities;
using Honememo.Wptscs.Properties;
///
/// ログテキストの生成を行うためのクラスです。
///
public class Logger
{
#region private変数
///
/// ログテキスト。
///
private string log = String.Empty;
#endregion
#region イベント
///
/// ログ更新伝達イベント。
///
public event EventHandler LogUpdate;
#endregion
#region プロパティ
///
/// ログテキスト。
///
protected virtual string Log
{
get
{
return this.log;
}
set
{
this.log = StringUtils.DefaultString(value);
if (this.LogUpdate != null)
{
this.LogUpdate(this, EventArgs.Empty);
}
}
}
#endregion
#region ログ登録メソッド(一般)
///
/// ログメッセージを登録する。
///
/// ログメッセージ。
public virtual void AddMessage(string message)
{
// 直前のログが改行されていない場合、改行して出力
this.AddNewLineIfNotEndWithNewLine();
this.Log += message + Environment.NewLine;
}
///
/// ログメッセージを書式化して登録する。
///
/// 書式項目を含んだログメッセージ。
/// 書式設定対象オブジェクト配列。
public virtual void AddMessage(string format, params object[] args)
{
// 書式化してオーバーロードメソッドをコール
this.AddMessage(String.Format(format, args));
}
///
/// 応答メッセージ(「→ ~しました」のようなメッセージ)を登録する。
///
/// ログメッセージ。
public virtual void AddResponse(string response)
{
// 右矢印の後に半角スペースを空けてメッセージ出力
this.AddMessage(Resources.RightArrow + " " + response);
}
///
/// 応答メッセージ(「→ ~しました」のようなメッセージ)を登録する。
///
/// 書式項目を含んだログメッセージ。
/// 書式設定対象オブジェクト配列。
public virtual void AddResponse(string format, params object[] args)
{
// 書式化してオーバーロードメソッドをコール
this.AddResponse(String.Format(format, args));
}
///
/// 例外メッセージ(「→ 通信エラー」のようなメッセージ)を登録する。
///
/// 例外。
public virtual void AddError(Exception e)
{
// 応答形式で例外メッセージを出力
this.AddResponse(e.Message);
if (e is WebException && ((WebException)e).Response != null)
{
// 出せるならエラーとなったURLも出力
this.AddResponse(Resources.LogMessageErrorURL, ((WebException)e).Response.ResponseUri);
}
}
///
/// ログ上の区切りを登録する。
///
public virtual void AddSeparator()
{
// この実装では、区切りは余分な空行で表す
this.AddMessage(String.Empty);
}
#endregion
#region ログ登録メソッド(翻訳支援処理)
///
/// 変換元を表すログを追加する。
///
/// 変換元を表す要素。
///
/// 変換結果をログ出力する際は
/// AddSource
→()→
/// の順で一連のメソッドをコールする。
/// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
///
public virtual void AddSource(IElement source)
{
// 直前のログが改行されていない場合、改行して出力
this.AddNewLineIfNotEndWithNewLine();
this.Log += source.ToString() + " " + Resources.RightArrow + " ";
}
///
/// 変換元の別名を表すログを追加する。
///
/// 変換元の別名を表す要素。
///
/// 変換結果をログ出力する際は
/// →(AddAlias
)→
/// の順で一連のメソッドをコールする。
/// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
///
public virtual void AddAlias(IElement alias)
{
this.Log += alias.ToString() + " " + Resources.RightArrow + " ";
}
///
/// 変換先を表すログを追加する。
///
/// 変換先を表す要素。
/// 対訳表を使用している場合true
。デフォルトはfalse
。
///
/// 変換結果をログ出力する際は
/// →()→AddDestination
/// の順で一連のメソッドをコールする。
/// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
///
public virtual void AddDestination(IElement destination, bool cacheUsed = false)
{
StringBuilder b = new StringBuilder(destination.ToString());
if (cacheUsed)
{
b.Append(Resources.LogMessageNoteTranslation);
}
b.Append(Environment.NewLine);
this.Log += b.ToString();
}
#endregion
#region ログ出力メソッド
///
/// このロガーが保持するログテキストを返す。
///
/// ログテキスト。nullは返さない。
public override string ToString()
{
return this.Log;
}
#endregion
#region 初期化メソッド
///
/// このロガーが保持する内容を初期状態に戻す。
///
public virtual void Clear()
{
this.Log = null;
}
#endregion
#region 内部処理用メソッド
///
/// 直前のログが改行されていない場合、改行する。
///
protected void AddNewLineIfNotEndWithNewLine()
{
// ログが空以外で最後が改行ではない場合
if (!String.IsNullOrEmpty(this.Log) && !this.Log.EndsWith(Environment.NewLine))
{
this.Log += Environment.NewLine;
}
}
#endregion
}
}