2 // ProjectItemInstance.cs
5 // Rolf Bjarne Kvinge (rolf@xamarin.com)
6 // Atsushi Enomoto (atsushi@xamarin.com)
8 // Copyright (C) 2011,2013 Xamarin Inc.
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Collections.Generic;
33 using Microsoft.Build.Framework;
34 using Microsoft.Build.Evaluation;
35 using System.Collections;
36 using Microsoft.Build.Construction;
38 namespace Microsoft.Build.Execution
40 public class ProjectItemInstance
43 internal ProjectItemInstance (ProjectInstance project, ProjectItemElement xml, string evaluatedInclude)
45 this.project = project;
46 this.evaluated_include = evaluatedInclude;
47 item_type = xml.ItemType;
48 metadata = xml.Metadata.Select (m => new ProjectMetadataInstance (m.Name, m.Value)).ToList ();
51 readonly ProjectInstance project;
52 readonly string item_type;
53 string evaluated_include;
54 readonly List<ProjectMetadataInstance> metadata;
56 public ProjectMetadataInstance GetMetadata (string name)
58 return Metadata.FirstOrDefault (m => m.Name.Equals (name, StringComparison.OrdinalIgnoreCase));
61 public string GetMetadataValue (string name)
63 var m = GetMetadata (name);
64 return m != null ? m.EvaluatedValue : null;
67 public bool HasMetadata (string name)
69 return GetMetadata (name) != null;
72 public void RemoveMetadata (string metadataName)
74 var m = GetMetadata (metadataName);
79 public void SetMetadata (IEnumerable<KeyValuePair<string, string>> metadataDictionary)
81 foreach (var p in metadataDictionary)
82 SetMetadata (p.Key, p.Value);
85 public ProjectMetadataInstance SetMetadata (string name, string evaluatedValue)
87 var m = metadata.FirstOrDefault (_ => _.Name.Equals (name, StringComparison.OrdinalIgnoreCase));
90 m = new ProjectMetadataInstance (name, evaluatedValue);
95 public int DirectMetadataCount {
96 get { throw new NotImplementedException (); }
99 public string EvaluatedInclude {
100 get { return evaluated_include; }
103 throw new ArgumentNullException ("value");
104 evaluated_include = value;
108 public string ItemType {
109 get { return item_type; }
112 public IEnumerable<ProjectMetadataInstance> Metadata {
113 get { return metadata; }
116 public int MetadataCount {
117 get { return metadata.Count; }
120 public ICollection<string> MetadataNames {
121 get { return metadata.Select (m => m.Name).ToArray (); }
124 public ProjectInstance Project {
125 get { return project; }
128 internal string RecursiveDir { get; set; }
130 #region ITaskItem2 implementation
132 string ITaskItem2.GetMetadataValueEscaped (string metadataName)
134 return ProjectCollection.Escape (GetMetadataValue (metadataName));
137 void ITaskItem2.SetMetadataValueLiteral (string metadataName, string metadataValue)
139 SetMetadata (metadataName, metadataValue);
142 System.Collections.IDictionary ITaskItem2.CloneCustomMetadataEscaped ()
144 var dic = ((ITaskItem) this).CloneCustomMetadata ();
145 foreach (DictionaryEntry p in dic)
146 dic [p.Key] = ProjectCollection.Escape ((string) p.Value);
150 string ITaskItem2.EvaluatedIncludeEscaped {
151 get { return ProjectCollection.Escape (EvaluatedInclude); }
152 set { EvaluatedInclude = ProjectCollection.Unescape (value); }
157 #region ITaskItem implementation
159 IDictionary ITaskItem.CloneCustomMetadata ()
161 var dic = new Hashtable ();
162 foreach (var md in Metadata)
163 dic [md.Name] = md.EvaluatedValue;
167 void ITaskItem.CopyMetadataTo (ITaskItem destinationItem)
169 if (destinationItem == null)
170 throw new ArgumentNullException ("destinationItem");
171 foreach (var md in Metadata)
172 destinationItem.SetMetadata (md.Name, md.EvaluatedValue);
175 string ITaskItem.GetMetadata (string metadataName)
177 return GetMetadataValue (metadataName);
180 void ITaskItem.RemoveMetadata (string metadataName)
182 RemoveMetadata (metadataName);
185 void ITaskItem.SetMetadata (string metadataName, string metadataValue)
187 SetMetadata (metadataName, ProjectCollection.Unescape (metadataValue));
190 string ITaskItem.ItemSpec {
191 get { return EvaluatedInclude; }
192 set { EvaluatedInclude = value; }
195 int ITaskItem.MetadataCount {
196 get { return MetadataCount; }
199 ICollection ITaskItem.MetadataNames {
200 get { return MetadataNames.ToArray (); }