// ================================================================================================ // // ログテキストの生成を行うためのクラスソース // // // 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 } }