OSDN Git Service

#30244 Visual Studio 2012 Express for Windows Desktop, StyleCop 4.7, WiX 3.6 に合わせたソース...
[wptscs/wpts.git] / Wptscs / Logics / Logger.cs
1 // ================================================================================================
2 // <summary>
3 //      ログテキストの生成を行うためのクラスソース</summary>
4 //
5 // <copyright file="Logger.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Logics
12 {
13     using System;
14     using System.Net;
15     using System.Text;
16     using Honememo.Parsers;
17     using Honememo.Utilities;
18     using Honememo.Wptscs.Properties;
19
20     /// <summary>
21     /// ログテキストの生成を行うためのクラスです。
22     /// </summary>
23     public class Logger
24     {
25         #region private変数
26
27         /// <summary>
28         /// ログテキスト。
29         /// </summary>
30         private string log = string.Empty;
31
32         #endregion
33
34         #region イベント
35
36         /// <summary>
37         /// ログ更新伝達イベント。
38         /// </summary>
39         public event EventHandler LogUpdate;
40
41         #endregion
42
43         #region プロパティ
44
45         /// <summary>
46         /// ログテキスト。
47         /// </summary>
48         protected virtual string Log
49         {
50             get
51             {
52                 return this.log;
53             }
54
55             set
56             {
57                 this.log = StringUtils.DefaultString(value);
58                 if (this.LogUpdate != null)
59                 {
60                     this.LogUpdate(this, EventArgs.Empty);
61                 }
62             }
63         }
64
65         #endregion
66
67         #region ログ登録メソッド(一般)
68         
69         /// <summary>
70         /// ログメッセージを登録する。
71         /// </summary>
72         /// <param name="message">ログメッセージ。</param>
73         public virtual void AddMessage(string message)
74         {
75             // 直前のログが改行されていない場合、改行して出力
76             this.AddNewLineIfNotEndWithNewLine();
77             this.Log += message + Environment.NewLine;
78         }
79
80         /// <summary>
81         /// ログメッセージを書式化して登録する。
82         /// </summary>
83         /// <param name="format">書式項目を含んだログメッセージ。</param>
84         /// <param name="args">書式設定対象オブジェクト配列。</param>
85         public virtual void AddMessage(string format, params object[] args)
86         {
87             // 書式化してオーバーロードメソッドをコール
88             this.AddMessage(string.Format(format, args));
89         }
90
91         /// <summary>
92         /// 応答メッセージ(「→ ~しました」のようなメッセージ)を登録する。
93         /// </summary>
94         /// <param name="response">ログメッセージ。</param>
95         public virtual void AddResponse(string response)
96         {
97             // 右矢印の後に半角スペースを空けてメッセージ出力
98             this.AddMessage(Resources.RightArrow + " " + response);
99         }
100
101         /// <summary>
102         /// 応答メッセージ(「→ ~しました」のようなメッセージ)を登録する。
103         /// </summary>
104         /// <param name="format">書式項目を含んだログメッセージ。</param>
105         /// <param name="args">書式設定対象オブジェクト配列。</param>
106         public virtual void AddResponse(string format, params object[] args)
107         {
108             // 書式化してオーバーロードメソッドをコール
109             this.AddResponse(string.Format(format, args));
110         }
111
112         /// <summary>
113         /// 例外メッセージ(「→ 通信エラー」のようなメッセージ)を登録する。
114         /// </summary>
115         /// <param name="e">例外。</param>
116         public virtual void AddError(Exception e)
117         {
118             // 応答形式で例外メッセージを出力
119             this.AddResponse(e.Message);
120             if (e is WebException && ((WebException)e).Response != null)
121             {
122                 // 出せるならエラーとなったURLも出力
123                 this.AddResponse(Resources.LogMessageErrorURL, ((WebException)e).Response.ResponseUri);
124             }
125         }
126
127         /// <summary>
128         /// ログ上の区切りを登録する。
129         /// </summary>
130         public virtual void AddSeparator()
131         {
132             // この実装では、区切りは余分な空行で表す
133             this.AddMessage(string.Empty);
134         }
135
136         #endregion
137
138         #region ログ登録メソッド(翻訳支援処理)
139
140         /// <summary>
141         /// 変換元を表すログを追加する。
142         /// </summary>
143         /// <param name="source">変換元を表す要素。</param>
144         /// <remarks>
145         /// 変換結果をログ出力する際は
146         /// <code>AddSource</code>→(<see cref="AddAlias"/>)→<see cref="AddDestination"/>
147         /// の順で一連のメソッドをコールする。
148         /// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
149         /// </remarks>
150         public virtual void AddSource(IElement source)
151         {
152             // 直前のログが改行されていない場合、改行して出力
153             this.AddNewLineIfNotEndWithNewLine();
154             this.Log += source.ToString() + " " + Resources.RightArrow + " ";
155         }
156
157         /// <summary>
158         /// 変換元の別名を表すログを追加する。
159         /// </summary>
160         /// <param name="alias">変換元の別名を表す要素。</param>
161         /// <remarks>
162         /// 変換結果をログ出力する際は
163         /// <see cref="AddSource"/>→(<code>AddAlias</code>)→<see cref="AddDestination"/>
164         /// の順で一連のメソッドをコールする。
165         /// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
166         /// </remarks>
167         public virtual void AddAlias(IElement alias)
168         {
169             this.Log += alias.ToString() + " " + Resources.RightArrow + " ";
170         }
171
172         /// <summary>
173         /// 変換先を表すログを追加する。
174         /// </summary>
175         /// <param name="destination">変換先を表す要素。</param>
176         /// <param name="cacheUsed">対訳表を使用している場合<code>true</code>。デフォルトは<code>false</code>。</param>
177         /// <remarks>
178         /// 変換結果をログ出力する際は
179         /// <see cref="AddSource"/>→(<see cref="AddAlias"/>)→<code>AddDestination</code>
180         /// の順で一連のメソッドをコールする。
181         /// 上記以外のメソッドをコールした場合、該当行の変換結果の出力は終了したものとみなす。
182         /// </remarks>
183         public virtual void AddDestination(IElement destination, bool cacheUsed = false)
184         {
185             StringBuilder b = new StringBuilder(destination.ToString());
186             if (cacheUsed)
187             {
188                 b.Append(Resources.LogMessageNoteTranslation);
189             }
190
191             b.Append(Environment.NewLine);
192             this.Log += b.ToString();
193         }
194
195         #endregion
196
197         #region ログ出力メソッド
198
199         /// <summary>
200         /// このロガーが保持するログテキストを返す。
201         /// </summary>
202         /// <returns>ログテキスト。<c>null</c>は返さない。</returns>
203         public override string ToString()
204         {
205             return this.Log;
206         }
207
208         #endregion
209
210         #region 初期化メソッド
211
212         /// <summary>
213         /// このロガーが保持する内容を初期状態に戻す。
214         /// </summary>
215         public virtual void Clear()
216         {
217             this.Log = null;
218         }
219
220         #endregion
221
222         #region 内部処理用メソッド
223
224         /// <summary>
225         /// 直前のログが改行されていない場合、改行する。
226         /// </summary>
227         protected void AddNewLineIfNotEndWithNewLine()
228         {
229             // ログが空以外で最後が改行ではない場合
230             if (!string.IsNullOrEmpty(this.Log) && !this.Log.EndsWith(Environment.NewLine))
231             {
232                 this.Log += Environment.NewLine;
233             }
234         }
235
236         #endregion
237     }
238 }