merge -r 60439:60440
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / BuildTask.cs
1 //
2 // BuildTask.cs: Represents a Task element in a project.
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 // 
7 // (C) 2006 Marek Sieradzki
8 //
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:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
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.
27
28 #if NET_2_0
29
30 using System;
31 using System.Collections;
32 using System.Collections.Specialized;
33 using System.Reflection;
34 using System.Xml;
35 using Microsoft.Build.Framework;
36 using Microsoft.Build.Utilities;
37
38 namespace Microsoft.Build.BuildEngine {
39         public class BuildTask {
40         
41                 ITaskHost               hostObject;
42                 Target                  parentTarget;
43                 XmlElement              taskElement;
44         
45                 // FIXME: implement
46                 internal BuildTask (XmlElement taskElement, Target parentTarget)
47                 {
48                         if (taskElement == null)
49                                 throw new ArgumentNullException ("taskElement");
50                         if (parentTarget == null)
51                                 throw new ArgumentNullException ("parentTarget");
52
53                         this.taskElement =  taskElement;
54                         this.parentTarget = parentTarget;
55                 }
56                 
57                 [MonoTODO]
58                 public void AddOutputItem (string taskParameter,
59                                            string itemName)
60                 {
61                 }
62                 
63                 [MonoTODO]
64                 public void AddOutputProperty (string taskParameter,
65                                                string propertyName)
66                 {
67                 }
68                 
69                 [MonoTODO]
70                 public bool Execute ()
71                 {
72                         bool            result;
73                         TaskEngine      taskEngine;
74
75                         LogTaskStarted ();
76                         
77                         taskEngine = new TaskEngine (parentTarget.Project);
78                         
79                         taskEngine.Prepare (InitializeTask (), this.taskElement,GetParameters (), this.Type);
80                         
81                         result = taskEngine.Execute ();
82                         
83                         taskEngine.PublishOutput ();
84                         
85                         LogTaskFinished (result);
86                 
87                         return result;
88                 }
89
90
91                 [MonoTODO]
92                 public string[] GetParameterNames ()
93                 {
94                         int attributesCount = 0;
95                         ArrayList tempNames = new ArrayList ();
96                         string[] names;
97                         
98                         foreach (XmlAttribute xmlAttribute in taskElement.Attributes) {
99                                 if (xmlAttribute.Name == "Condition")
100                                         continue;
101                                 if (xmlAttribute.Name == "ContinueOnError")
102                                         continue;
103                                 tempNames.Add (xmlAttribute.Name);
104                         }
105                         names = new string [tempNames.Count];
106                         foreach (string name in tempNames)
107                                 names [attributesCount++] = name;
108                         return names;
109                 }
110                 
111                 [MonoTODO]
112                 public string GetParameterValue (string attributeName)
113                 {
114                         return taskElement.GetAttribute (attributeName);
115                 }
116                 
117                 [MonoTODO]
118                 public void SetParameterValue (string parameterName,
119                                                string parameterValue)
120                 {
121                         SetParameterValue (parameterName, parameterValue, false);
122                 }
123                 
124                 [MonoTODO]
125                 public void SetParameterValue (string parameterName,
126                                                string parameterValue,
127                                                bool treatParameterValueAsLiteral)
128                 {
129                         // FIXME: use expression for parameterValue
130                         taskElement.SetAttribute (parameterName, parameterValue);
131                 }
132                 
133                 private void LogTaskStarted ()
134                 {
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);
138                 }
139                 
140                 private void LogTaskFinished (bool succeeded)
141                 {
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);
145                 }
146                 
147                 private ITask InitializeTask ()
148                 {
149                         ITask task;
150                         
151                         task = (ITask)Activator.CreateInstance (this.Type);
152                         task.BuildEngine = new BuildEngine (parentTarget.Project.ParentEngine, 0, 0, ContinueOnError,
153                                 parentTarget.Project.FullFileName);
154                         
155                         return task;
156                 }
157                 
158                 private IDictionary GetParameters ()
159                 {
160                         IDictionary parameters = new Hashtable ();
161                         
162                         string[] parameterNames = GetParameterNames ();
163                         
164                         foreach (string s in parameterNames) {
165                                 parameters.Add (s, GetParameterValue (s));
166                         }
167                         
168                         return parameters;
169                 }
170                 
171                 [MonoTODO]
172                 public string Condition {
173                         get {
174                                 return taskElement.GetAttribute ("Condition");
175                         }
176                         set {
177                                 taskElement.SetAttribute ("Condition", value);
178                         }
179                 }
180
181                 [MonoTODO]
182                 public bool ContinueOnError {
183                         get {
184                                 string str = taskElement.GetAttribute ("ContinueOnError");
185                                 if (str == String.Empty) {
186                                         return false;
187                                 } else {
188                                         return Boolean.Parse (str);
189                                 }
190                         }
191                         set {
192                                 taskElement.SetAttribute ("ContinueOnError", value.ToString ());
193                         }
194                 }
195                 
196                 [MonoTODO]
197                 public ITaskHost HostObject {
198                         get { return hostObject; }
199                         set { hostObject = value; }
200                 }
201                 
202                 public string Name {
203                         get { return taskElement.Name; }
204                 }
205                 
206                 internal Target ParentTarget {
207                         get { return parentTarget; }
208                         set { parentTarget = value; }
209                 }
210                 
211                 internal XmlElement TaskElement {
212                         get { return taskElement; }
213                         set { taskElement = value; }
214                 }
215                 
216                 [MonoTODO]
217                 public Type Type {
218                         get { return parentTarget.Project.TaskDatabase.GetTypeFromClassName (Name); }
219                 }
220                 
221         }
222 }
223
224 #endif