2010-03-17 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / class / Microsoft.Build.Engine / Microsoft.Build.BuildEngine / Import.cs
1 //
2 // Import.cs: Represents a single Import element in an MSBuild 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.IO;
32 using System.Xml;
33
34 namespace Microsoft.Build.BuildEngine {
35         public class Import {
36                 XmlElement      importElement;
37                 Project         project;
38                 ImportedProject originalProject;
39                 string          evaluatedProjectPath;
40         
41                 internal Import (XmlElement importElement, Project project, ImportedProject originalProject)
42                 {
43                         if (importElement == null)
44                                 throw new ArgumentNullException ("importElement");
45                         if (project == null)
46                                 throw new ArgumentNullException ("project");
47                 
48                         this.project = project;
49                         this.importElement = importElement;
50                         this.originalProject = originalProject;
51
52                         if (ProjectPath == String.Empty)
53                                 throw new InvalidProjectFileException ("The required attribute \"Project\" is missing from element <Import>.");
54                         evaluatedProjectPath = EvaluateProjectPath (ProjectPath);
55                         evaluatedProjectPath = GetFullPath ();
56                         if (EvaluatedProjectPath == String.Empty)
57                                 throw new InvalidProjectFileException ("The required attribute \"Project\" is missing from element <Import>.");
58                 }
59
60                 // FIXME: condition
61                 internal void Evaluate (bool ignoreMissingImports)
62                 {
63                         string filename = evaluatedProjectPath;
64                         // NOTE: it's a hack to transform Microsoft.CSharp.Targets to Microsoft.CSharp.targets
65                         if (Path.HasExtension (filename))
66                                 filename = Path.ChangeExtension (filename, Path.GetExtension (filename));
67                         
68                         if (!File.Exists (filename)) {
69                                 if (ignoreMissingImports) {
70                                         project.LogWarning (project.FullFileName, "Could not find project file {0}, to import. Ignoring.", filename);
71                                         return;
72                                 } else {
73                                         throw new InvalidProjectFileException (String.Format ("Imported project: \"{0}\" does not exist.", filename));
74                                 }
75                         }
76                         
77                         ImportedProject importedProject = new ImportedProject ();
78                         importedProject.Load (filename);
79
80                         project.ProcessElements (importedProject.XmlDocument.DocumentElement, importedProject);
81                 }
82
83                 string EvaluateProjectPath (string file)
84                 {
85                         Expression exp;
86
87                         exp = new Expression ();
88                         exp.Parse (file, ParseOptions.Split);
89                         return (string) exp.ConvertTo (project, typeof (string));
90                 }
91
92                 string GetFullPath ()
93                 {
94                         string file = EvaluatedProjectPath;
95
96                         if (!Path.IsPathRooted (EvaluatedProjectPath)) {
97                                 string dir = null;
98                                 if (originalProject == null) {
99                                         if (project.FullFileName != String.Empty) // Path.GetDirectoryName throws exception on String.Empty
100                                                 dir = Path.GetDirectoryName (project.FullFileName);
101                                 } else {
102                                         if (originalProject.FullFileName != String.Empty)
103                                                 dir = Path.GetDirectoryName (originalProject.FullFileName);
104                                 }
105                                 if (dir != null)
106                                         file = Path.Combine (dir, EvaluatedProjectPath);
107                         }
108                         
109                         return Utilities.FromMSBuildPath (file);
110                 }
111                 
112                 public string Condition {
113                         get {
114                                 string s = importElement.GetAttribute ("Condition");
115                                 return s == String.Empty ? null : s;
116                         }
117                 }
118                 
119                 public string EvaluatedProjectPath {
120                         get { return evaluatedProjectPath; }
121                 }
122                 
123                 public bool IsImported {
124                         get { return originalProject != null; }
125                 }
126                 
127                 public string ProjectPath {
128                         get { return importElement.GetAttribute ("Project"); }
129                 }
130         }
131 }
132
133 #endif