1+ // Copyright (c) Jeff Kluge. All rights reserved.
2+ //
3+ // Licensed under the MIT license.
4+
5+ using Microsoft . Build . Framework ;
6+ using Microsoft . Build . Logging ;
7+ using System ;
8+ using System . Collections . Concurrent ;
9+ using System . Collections . Generic ;
10+ using System . Linq ;
11+ using System . Text ;
12+
13+ namespace Microsoft . Build . Utilities . ProjectCreation
14+ {
15+ /// <summary>
16+ /// Represents a collection of <see cref="BuildEventArgs"/> objects.
17+ /// </summary>
18+ public abstract class BuildEventArgsCollection : IDisposable
19+ {
20+ /// <summary>
21+ /// Stores the errors that were logged.
22+ /// </summary>
23+ private readonly List < BuildErrorEventArgs > _errorEvents = new List < BuildErrorEventArgs > ( ) ;
24+
25+ /// <summary>
26+ /// Stores the messages that were logged.
27+ /// </summary>
28+ private readonly List < BuildMessageEventArgs > _messageEvents = new List < BuildMessageEventArgs > ( 50 ) ;
29+
30+ /// <summary>
31+ /// Stores the warnings that were logged.
32+ /// </summary>
33+ private readonly List < BuildWarningEventArgs > _warningEvents = new List < BuildWarningEventArgs > ( ) ;
34+
35+ /// <summary>
36+ /// Stores all build events.
37+ /// </summary>
38+ private ConcurrentQueue < BuildEventArgs > _allEvents = new ConcurrentQueue < BuildEventArgs > ( ) ;
39+
40+ /// <summary>
41+ /// Initializes a new instance of the <see cref="BuildEventArgsCollection"/> class.
42+ /// </summary>
43+ protected BuildEventArgsCollection ( )
44+ {
45+ MessageEvents = new BuildMessageEventArgsCollection ( _messageEvents ) ;
46+ Messages = new BuildMessageCollection ( this ) ;
47+ }
48+
49+ /// <summary>
50+ /// Gets all events that were logged.
51+ /// </summary>
52+ public IReadOnlyCollection < BuildEventArgs > AllEvents => _allEvents ;
53+
54+ /// <summary>
55+ /// Gets the error events that were logged.
56+ /// </summary>
57+ public IReadOnlyCollection < BuildErrorEventArgs > ErrorEvents => _errorEvents ;
58+
59+ /// <summary>
60+ /// Gets the error messages that were logged.
61+ /// </summary>
62+ public IReadOnlyCollection < string > Errors => _errorEvents . Select ( i => i . Message ) . ToList ( ) ;
63+
64+ /// <summary>
65+ /// Gets the messages that were logged.
66+ /// </summary>
67+ public BuildMessageEventArgsCollection MessageEvents { get ; }
68+
69+ /// <summary>
70+ /// Gets a <see cref="BuildMessageCollection"/> object that gets the messages from the build.
71+ /// </summary>
72+ public BuildMessageCollection Messages { get ; }
73+
74+ /// <summary>
75+ /// Gets the warning events that were logged.
76+ /// </summary>
77+ public IReadOnlyCollection < BuildWarningEventArgs > WarningEvents => _warningEvents ;
78+
79+ /// <summary>
80+ /// Gets the warning messages that were logged.
81+ /// </summary>
82+ public IReadOnlyCollection < string > Warnings => _warningEvents . Select ( i => i . Message ) . ToList ( ) ;
83+
84+ /// <inheritdoc cref="IDisposable.Dispose"/>
85+ public virtual void Dispose ( )
86+ {
87+ _errorEvents . Clear ( ) ;
88+ _messageEvents . Clear ( ) ;
89+ _warningEvents . Clear ( ) ;
90+ _allEvents = null ;
91+ }
92+
93+ /// <summary>
94+ /// Gets the current build output in the format of a console log.
95+ /// </summary>
96+ /// <param name="verbosity">The logger verbosity to use.</param>
97+ /// <returns>The build output in the format of a console log.</returns>
98+ public string GetConsoleLog ( LoggerVerbosity verbosity = LoggerVerbosity . Normal )
99+ {
100+ StringBuilder sb = new StringBuilder ( AllEvents . Count * 300 ) ;
101+
102+ ConsoleLogger logger = new ConsoleLogger ( verbosity , message => sb . Append ( message ) , color => { } , ( ) => { } ) ;
103+
104+ foreach ( BuildEventArgs buildEventArgs in AllEvents )
105+ {
106+ switch ( buildEventArgs )
107+ {
108+ case BuildMessageEventArgs buildMessageEventArgs :
109+ logger . MessageHandler ( logger , buildMessageEventArgs ) ;
110+ break ;
111+
112+ case BuildErrorEventArgs buildErrorEventArgs :
113+ logger . ErrorHandler ( logger , buildErrorEventArgs ) ;
114+ break ;
115+
116+ case BuildWarningEventArgs buildWarningEventArgs :
117+ logger . WarningHandler ( logger , buildWarningEventArgs ) ;
118+ break ;
119+
120+ case BuildStartedEventArgs buildStartedEventArgs :
121+ logger . BuildStartedHandler ( logger , buildStartedEventArgs ) ;
122+ break ;
123+
124+ case BuildFinishedEventArgs buildFinishedEventArgs :
125+ logger . BuildFinishedHandler ( logger , buildFinishedEventArgs ) ;
126+ break ;
127+
128+ case ProjectStartedEventArgs projectStartedEventArgs :
129+ logger . ProjectStartedHandler ( logger , projectStartedEventArgs ) ;
130+ break ;
131+
132+ case ProjectFinishedEventArgs projectFinishedEventArgs :
133+ logger . ProjectFinishedHandler ( logger , projectFinishedEventArgs ) ;
134+ break ;
135+
136+ case TargetStartedEventArgs targetStartedEventArgs :
137+ logger . TargetStartedHandler ( logger , targetStartedEventArgs ) ;
138+ break ;
139+
140+ case TargetFinishedEventArgs targetFinishedEventArgs :
141+ logger . TargetFinishedHandler ( logger , targetFinishedEventArgs ) ;
142+ break ;
143+
144+ case TaskStartedEventArgs taskStartedEventArgs :
145+ logger . TaskStartedHandler ( logger , taskStartedEventArgs ) ;
146+ break ;
147+
148+ case TaskFinishedEventArgs taskFinishedEventArgs :
149+ logger . TaskFinishedHandler ( logger , taskFinishedEventArgs ) ;
150+ break ;
151+
152+ case CustomBuildEventArgs customBuildEventArgs :
153+ logger . CustomEventHandler ( logger , customBuildEventArgs ) ;
154+ break ;
155+ }
156+ }
157+
158+ return sb . ToString ( ) ;
159+ }
160+
161+ /// <summary>
162+ /// Adds a build event.
163+ /// </summary>
164+ /// <param name="buildEventArgs">A <see cref="BuildEventArgs"/> object to add.</param>
165+ protected void Add ( BuildEventArgs buildEventArgs )
166+ {
167+ _allEvents . Enqueue ( buildEventArgs ) ;
168+
169+ switch ( buildEventArgs )
170+ {
171+ case BuildMessageEventArgs buildMessageEventArgs :
172+ _messageEvents . Add ( buildMessageEventArgs ) ;
173+ break ;
174+
175+ case BuildWarningEventArgs buildWarningEventArgs :
176+ _warningEvents . Add ( buildWarningEventArgs ) ;
177+ break ;
178+
179+ case BuildErrorEventArgs buildErrorEventArgs :
180+ _errorEvents . Add ( buildErrorEventArgs ) ;
181+ break ;
182+ }
183+ }
184+ }
185+ }
0 commit comments