2 // BuildTask.cs: Represents a Task element in a project.
5 // Marek Sieradzki (marek.sieradzki@gmail.com)
7 // (C) 2006 Marek Sieradzki
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Collections;
32 using System.Collections.Generic;
33 using System.Collections.Specialized;
34 using System.Reflection;
36 using Microsoft.Build.Framework;
37 using Microsoft.Build.Utilities;
39 namespace Microsoft.Build.BuildEngine {
40 public class BuildTask {
44 XmlElement taskElement;
47 internal BuildTask (XmlElement taskElement, Target parentTarget)
49 if (taskElement == null)
50 throw new ArgumentNullException ("taskElement");
51 if (parentTarget == null)
52 throw new ArgumentNullException ("parentTarget");
54 this.taskElement = taskElement;
55 this.parentTarget = parentTarget;
59 public void AddOutputItem (string taskParameter,
65 public void AddOutputProperty (string taskParameter,
71 public bool Execute ()
74 TaskEngine taskEngine;
78 taskEngine = new TaskEngine (parentTarget.Project);
80 taskEngine.Prepare (InitializeTask (), this.taskElement, GetParameters (), this.Type);
82 result = taskEngine.Execute ();
84 taskEngine.PublishOutput ();
86 LogTaskFinished (result);
92 public string[] GetParameterNames ()
94 List <string> tempNames = new List <string> ();
96 foreach (XmlAttribute xmlAttribute in taskElement.Attributes) {
97 if (xmlAttribute.Name == "Condition")
99 if (xmlAttribute.Name == "ContinueOnError")
101 tempNames.Add (xmlAttribute.Name);
104 return tempNames.ToArray ();
107 public string GetParameterValue (string attributeName)
109 if (attributeName == "Condition")
110 throw new ArgumentException ("Condition attribute cannot be accessed using this method.");
111 if (attributeName == "ContinueOnError")
112 throw new ArgumentException ("ContinueOnError attribute cannot be accessed using this method.");
114 return taskElement.GetAttribute (attributeName);
117 public void SetParameterValue (string parameterName,
118 string parameterValue)
120 SetParameterValue (parameterName, parameterValue, false);
123 public void SetParameterValue (string parameterName,
124 string parameterValue,
125 bool treatParameterValueAsLiteral)
127 if (treatParameterValueAsLiteral)
128 taskElement.SetAttribute (parameterName, Utilities.Escape (parameterValue));
130 taskElement.SetAttribute (parameterName, parameterValue);
133 private void LogTaskStarted ()
135 TaskStartedEventArgs tsea = new TaskStartedEventArgs ("Task started.", null, parentTarget.Project.FullFileName,
136 parentTarget.Project.FullFileName, taskElement.Name);
137 parentTarget.Project.ParentEngine.EventSource.FireTaskStarted (this, tsea);
140 private void LogTaskFinished (bool succeeded)
142 TaskFinishedEventArgs tfea = new TaskFinishedEventArgs ("Task finished.", null, parentTarget.Project.FullFileName,
143 parentTarget.Project.FullFileName, taskElement.Name, succeeded);
144 parentTarget.Project.ParentEngine.EventSource.FireTaskFinished (this, tfea);
147 private ITask InitializeTask ()
151 task = (ITask)Activator.CreateInstance (this.Type);
152 task.BuildEngine = new BuildEngine (parentTarget.Project.ParentEngine, 0, 0, ContinueOnError,
153 parentTarget.Project.FullFileName);
158 private IDictionary <string, string> GetParameters ()
160 Dictionary <string, string> parameters = new Dictionary <string, string> ();
162 string[] parameterNames = GetParameterNames ();
164 foreach (string s in parameterNames) {
165 parameters.Add (s, GetParameterValue (s));
171 public string Condition {
173 return taskElement.GetAttribute ("Condition");
176 taskElement.SetAttribute ("Condition", value);
181 public bool ContinueOnError {
183 string str = taskElement.GetAttribute ("ContinueOnError");
184 if (str == String.Empty)
187 OldExpression exp = new OldExpression (parentTarget.Project);
188 exp.ParseSource (str);
189 return (bool) exp.ConvertTo (typeof (bool));
193 taskElement.SetAttribute ("ContinueOnError", value.ToString ());
198 public ITaskHost HostObject {
199 get { return hostObject; }
200 set { hostObject = value; }
204 get { return taskElement.Name; }
207 internal Target ParentTarget {
208 get { return parentTarget; }
209 set { parentTarget = value; }
212 internal XmlElement TaskElement {
213 get { return taskElement; }
214 set { taskElement = value; }
219 get { return parentTarget.Project.TaskDatabase.GetTypeFromClassName (Name); }