841d3aab355140864d542f47075fbbd1cc4fe816
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / BuildProperty.cs
1 //
2 // BuildProperty.cs: Represents a property
3 //
4 // Author:
5 //   Marek Sieradzki (marek.sieradzki@gmail.com)
6 // 
7 // (C) 2005 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.Text;
32 using System.Xml;
33
34 using Microsoft.Build.Framework;
35
36 namespace Microsoft.Build.BuildEngine {
37         public class BuildProperty {
38         
39                 XmlElement      propertyElement;
40                 string          finalValue;
41                 bool            isImported;
42                 string          value;
43                 string          name;
44                 Project         parentProject;
45                 PropertyType    propertyType;
46
47                 BuildProperty ()
48                 {
49                 }
50
51                 public BuildProperty (string propertyName, string propertyValue)
52                         : this (propertyName, propertyValue, PropertyType.Normal)
53                 {
54                         if (propertyName == null)
55                                 throw new ArgumentNullException ("propertyName");
56                         if (propertyValue == null)
57                                 throw new ArgumentNullException ("propertyValue");
58                 }
59
60                 internal BuildProperty (string propertyName,
61                                 string propertyValue, PropertyType propertyType)
62                 {
63                         this.name = propertyName;
64                         this.value = propertyValue;
65                         this.finalValue = propertyValue;
66                         this.propertyType = propertyType;
67                         this.isImported = false;
68                 }
69
70                 internal BuildProperty (Project parentProject, XmlElement propertyElement)
71                 {
72                         if (propertyElement == null)
73                                 throw new ArgumentNullException ("propertyElement");
74
75                         this.propertyElement = propertyElement;
76                         this.propertyType = PropertyType.Normal;
77                         this.parentProject = parentProject;
78                         this.name = propertyElement.Name;
79                         this.value = propertyElement.InnerXml;
80                         this.isImported = false;
81                 }
82
83                 [MonoTODO]
84                 public BuildProperty Clone (bool deepClone)
85                 {
86                         if (deepClone) {
87                                 if (FromXml) 
88                                         throw new NotImplementedException ();
89                                 else
90                                         return (BuildProperty) this.MemberwiseClone ();
91                         } else {
92                                 if (FromXml)
93                                         throw new NotImplementedException ();
94                                 else
95                                         throw new InvalidOperationException ("A shallow clone of this object cannot be created.");
96                         }
97                 }
98
99                 public static explicit operator string (BuildProperty propertyToCast)
100                 {
101                         if (propertyToCast == null)
102                                 return String.Empty;
103                         else
104                                 return propertyToCast.ToString ();
105                 }
106
107                 public override string ToString ()
108                 {
109                         if (finalValue != null)
110                                 return finalValue;
111                         else
112                                 return Value;
113                 }
114
115                 internal void Evaluate ()
116                 {
117                         BuildProperty evaluated = new BuildProperty (Name, Value);
118
119                         Expression exp = new Expression ();
120                         exp.Parse (Value, false, false);
121                         evaluated.finalValue = (string) exp.ConvertTo (parentProject, typeof (string));
122
123                         parentProject.EvaluatedProperties.AddProperty (evaluated);
124                 }
125
126                 internal string ConvertToString (Project project)
127                 {
128                         Expression exp = new Expression ();
129                         exp.Parse (Value, true, false);
130
131                         return (string) exp.ConvertTo (project, typeof (string));
132                 }
133
134                 internal ITaskItem[] ConvertToITaskItemArray (Project project)
135                 {
136                         Expression exp = new Expression ();
137                         exp.Parse (Value, true, false);
138
139                         return (ITaskItem[]) exp.ConvertTo (project, typeof (ITaskItem[]));
140                 }
141
142                 internal bool FromXml {
143                         get {
144                                 return propertyElement != null;
145                         }
146                 }
147         
148                 public string Condition {
149                         get {
150                                 if (FromXml)
151                                         return propertyElement.GetAttribute ("Condition");
152                                 else
153                                         return String.Empty;
154                         }
155                         set {
156                                 if (FromXml)
157                                         propertyElement.SetAttribute ("Condition", value);
158                                 else
159                                         throw new InvalidOperationException ("Cannot set a condition on an object not represented by an XML element in the project file.");
160                         }
161                 }
162
163                 public string FinalValue {
164                         get {
165                                 if (finalValue == null)
166                                         return this.@value;
167                                 else
168                                         return finalValue;
169                         }
170                 }
171                 
172                 public bool IsImported {
173                         get { return isImported; }
174                 }
175
176                 public string Name {
177                         get { return name; }
178                 }
179
180                 public string Value {
181                         get {
182                                 return value;
183                         }
184                         set {
185                                 this.@value = value;
186                                 if (FromXml) {
187                                         propertyElement.InnerXml = value;
188                                 } else {
189                                         finalValue = value;
190                                 }
191                         }
192                 }
193
194                 internal PropertyType PropertyType {
195                         get {
196                                 return propertyType;
197                         }
198                 }
199
200                 internal XmlElement XmlElement {
201                         get { return propertyElement; }
202                 }
203         }
204
205         internal enum PropertyType {
206                 Reserved,
207                 Global,
208                 Normal,
209                 Environment
210         }
211 }
212
213 #endif