PageRenderTime 53ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/Main/Core/Builders/DeploymentFiles/ManifestBuilder.cs

#
C# | 268 lines | 202 code | 41 blank | 25 comment | 32 complexity | 2d78ee5e6fbecc3f8919bf3f74ceb1c2 MD5 | raw file
  1. using System;
  2. using System.Collections;
  3. using System.IO;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. using System.Xml;
  7. namespace stsdev {
  8. public class ManifestBuilder {
  9. private const string nsSP = "http://schemas.microsoft.com/sharepoint/";
  10. public static void Create(string FilePath, bool AssemblyDeployment) {
  11. Create(FilePath, AssemblyDeployment, SolutionBuilder.ResetWebServer);
  12. }
  13. public static void Create(string FilePath, bool AssemblyDeployment, bool IISRESET) {
  14. // Added 081612 wictor - check if the file is read-only, if so the issue a warning that fits into Visual Studio Errors List
  15. FileInfo fileInfo = new FileInfo(FilePath);
  16. if (fileInfo.Exists && fileInfo.IsReadOnly) {
  17. Console.WriteLine(string.Format("{0}: warning : Unable to update the Manifest file. File is read-only", FilePath));
  18. return;
  19. }
  20. // End 080612 Addition
  21. // Modification 080612 wictor - added using statement to the StreamWriter
  22. using (StreamWriter manifestStream = new StreamWriter(FilePath)) {
  23. XmlWriterSettings settings = new XmlWriterSettings();
  24. settings.Encoding = Encoding.UTF8;
  25. settings.Indent = true;
  26. settings.NewLineOnAttributes = false;
  27. settings.NewLineHandling = NewLineHandling.None;
  28. XmlWriter writer = XmlWriter.Create(manifestStream, settings);
  29. writer.WriteStartDocument();
  30. writer.WriteComment("Manifest created STSDEV utility at " + DateTime.Now.ToString());
  31. writer.WriteStartElement("Solution", nsSP);
  32. // add solution ID
  33. writer.WriteAttributeString("SolutionId", SolutionBuilder.SolutionId);
  34. writer.WriteAttributeString("ResetWebServer", IISRESET.ToString());
  35. // Modified 20090722 - bphillips - Changed to search FEATURES folder for feature.xml files.
  36. if (Directory.Exists(Globals.FeaturesFolder)) {
  37. writer.WriteComment("Feature Manifest files");
  38. writer.WriteStartElement("FeatureManifests");
  39. WriteFeatureManifestFiles(writer);
  40. writer.WriteEndElement(); // </FeatureManifests>
  41. }
  42. // End of Modified 20090722
  43. if (Directory.Exists(Globals.TemplatesFolder)) {
  44. // write TEMPLATE Files
  45. writer.WriteComment("TEMPLATE files");
  46. writer.WriteStartElement("TemplateFiles");
  47. WriteTemplateFiles(writer);
  48. writer.WriteEndElement(); // </TemplateFiles>
  49. }
  50. if (Directory.Exists(Globals.IsapiFolder) || Directory.Exists(Globals.ResourcesFolder)) {
  51. // write Root Files
  52. writer.WriteComment("Root files");
  53. writer.WriteStartElement("RootFiles");
  54. WriteRootFiles(writer);
  55. writer.WriteEndElement(); // </RootFiles>
  56. }
  57. if (SolutionBuilder.AssemblyDeployment) {
  58. // write Assembly Files
  59. writer.WriteComment("Assembly files");
  60. writer.WriteStartElement("Assemblies");
  61. foreach (SolutionAssembly asm in SolutionBuilder.Assemblies) {
  62. WriteAssembly(writer, asm);
  63. }
  64. writer.WriteEndElement(); // </Assemblies>
  65. }
  66. if ((SolutionBuilder.CasPermissions) &&
  67. (SolutionBuilder.CasPermissionsNode != null)) {
  68. writer.WriteComment("Code Access Security Permissions");
  69. WriteCasPermissions(writer);
  70. }
  71. writer.WriteEndElement(); // </Solution>
  72. writer.WriteEndDocument();
  73. writer.Close();
  74. manifestStream.Close();
  75. }
  76. }
  77. static void WriteFeatureManifestFile(XmlWriter writer, string path) {
  78. writer.WriteStartElement("FeatureManifest");
  79. writer.WriteAttributeString("Location", path);
  80. writer.WriteEndElement();
  81. }
  82. static void WriteTemplateFiles(XmlWriter writer) {
  83. EnumerateTemplateDirectory(writer, Globals.TemplatesFolder);
  84. }
  85. static void EnumerateTemplateDirectory(XmlWriter writer, string path) {
  86. foreach (string file in Directory.GetFiles(path)) {
  87. // Addition 080612 wictor - ignore hidden or source control files
  88. if (isValidManifestFile(file)) {
  89. if (!IsAFeatureFile(file)) {
  90. writer.WriteStartElement("TemplateFile");
  91. writer.WriteAttributeString("Location", file.Substring((Globals.TemplatesFolder + @"\").Length));
  92. writer.WriteEndElement();
  93. }
  94. }
  95. }
  96. foreach (string folder in Directory.GetDirectories(path)) {
  97. // Addition 080612 wictor - ignore hidden folders
  98. if (isValidDirectory(folder)) {
  99. EnumerateTemplateDirectory(writer, folder);
  100. }
  101. }
  102. }
  103. public static bool IsAFeatureFile(string file) {
  104. // Modification 20090715 - bphillips - Changed to exclude feature files from the TemplateFiles node.
  105. if (file.ToLower().Contains(@"rootfiles\template\features")) {
  106. return true;
  107. }
  108. if (file.EndsWith(SolutionBuilder.PrimaryFeatureName)) return true;
  109. foreach (string f in SolutionBuilder.SecondaryFeatures) {
  110. if (file.EndsWith(f))
  111. return true;
  112. }
  113. return false;
  114. }
  115. static void WriteRootFiles(XmlWriter writer) {
  116. EnumerateRootFilesDirectory(writer, Globals.RootFilesFolder);
  117. }
  118. static void EnumerateRootFilesDirectory(XmlWriter writer, string path) {
  119. foreach (string file in Directory.GetFiles(path)) {
  120. // Addition 080612 wictor - ignore hidden or source control files
  121. if (isValidManifestFile(file)) {
  122. if (!file.Contains("TEMPLATE")) {
  123. writer.WriteStartElement("RootFile");
  124. writer.WriteAttributeString("Location", file.Substring((Globals.RootFilesFolder + @"\").Length));
  125. writer.WriteEndElement();
  126. }
  127. }
  128. }
  129. foreach (string folder in Directory.GetDirectories(path)) {
  130. // Addition 080612 wictor - ignore hidden folders
  131. if (isValidDirectory(folder)) {
  132. if (!folder.Contains("TEMPLATE")) {
  133. EnumerateRootFilesDirectory(writer, folder);
  134. }
  135. }
  136. }
  137. }
  138. static void WriteAssembly(XmlWriter writer, SolutionAssembly asm) {
  139. writer.WriteStartElement("Assembly");
  140. writer.WriteStartAttribute("Location");
  141. writer.WriteValue(asm.Location);
  142. writer.WriteEndAttribute();
  143. writer.WriteStartAttribute("DeploymentTarget");
  144. writer.WriteValue(asm.DeploymentTarget);
  145. writer.WriteEndAttribute();
  146. if (SolutionBuilder.SafeControlSettings &&
  147. asm.SafeControlEntries.Count > 0) {
  148. writer.WriteStartElement("SafeControls");
  149. foreach (SolutionSafeControlEntry entry in asm.SafeControlEntries) {
  150. writer.WriteStartElement("SafeControl");
  151. writer.WriteStartAttribute("Assembly");
  152. writer.WriteValue(entry.Assembly);
  153. writer.WriteEndAttribute();
  154. writer.WriteStartAttribute("Namespace");
  155. writer.WriteValue(entry.Namespace);
  156. writer.WriteEndAttribute();
  157. writer.WriteStartAttribute("TypeName");
  158. writer.WriteValue(entry.TypeName);
  159. writer.WriteEndAttribute();
  160. writer.WriteStartAttribute("Safe");
  161. writer.WriteValue(entry.Safe);
  162. writer.WriteEndAttribute();
  163. writer.WriteEndElement(); // </SafeControl>
  164. }
  165. writer.WriteEndElement();
  166. }
  167. writer.WriteEndElement();
  168. }
  169. static void WriteCasPermissions(XmlWriter writer) {
  170. if (SolutionBuilder.CasPermissionsNode == null) {
  171. Console.WriteLine("Solution has no CAS Permissions in SolutionConfig.xml");
  172. return;
  173. }
  174. writer.WriteStartElement("CodeAccessSecurity");
  175. writer.WriteStartElement("PolicyItem");
  176. writer.WriteStartElement("PermissionSet");
  177. writer.WriteAttributeString("class", "NamedPermissionSet");
  178. writer.WriteAttributeString("version", "1");
  179. writer.WriteAttributeString("Name", SolutionBuilder.TargetName);
  180. // write out each CAS permission as an IPermission element
  181. foreach (XmlNode child in SolutionBuilder.CasPermissionsNode) {
  182. writer.WriteStartElement("IPermission");
  183. foreach (XmlAttribute attr in child.Attributes) {
  184. writer.WriteAttributeString(attr.Name, attr.Value);
  185. }
  186. writer.WriteEndElement(); // </IPermission>
  187. }
  188. writer.WriteEndElement(); // </PermissionSet>
  189. writer.WriteStartElement("Assemblies");
  190. writer.WriteStartElement("Assembly");
  191. writer.WriteAttributeString("Name", SolutionBuilder.TargetName);
  192. writer.WriteEndElement(); // </Assembly>
  193. writer.WriteEndElement(); // </Assemblies>
  194. writer.WriteEndElement(); // </PolicyItem>
  195. writer.WriteEndElement(); // </CodeAccessSecurity>
  196. }
  197. // Added 080612 wictor - Added the methods
  198. /// <summary>
  199. /// Checks if the file is valid for inclusion in the Manifest file
  200. /// </summary>
  201. /// <param name="file">Path to the file to check</param>
  202. /// <returns>Returns false if the file is hidden or have an extension of .scc, otherwise false</returns>
  203. private static bool isValidManifestFile(string file) {
  204. FileInfo fileInfo = new FileInfo(file);
  205. // Modified 20090403 - bphillips - Ignore code files.
  206. return !(((fileInfo.Attributes & FileAttributes.Hidden) != 0)
  207. || (fileInfo.Extension.ToLower() == ".scc")
  208. || (fileInfo.Extension.ToLower() == ".cs")
  209. || (fileInfo.Extension.ToLower() == ".vb"));
  210. }
  211. private static bool isValidDirectory(string path) {
  212. DirectoryInfo directoryInfo = new DirectoryInfo(path);
  213. return !((directoryInfo.Attributes & FileAttributes.Hidden) != 0);
  214. }
  215. // End 080612 Addition
  216. // Modified 20090722 - bphillips - Changed to search FEATURES folder for feature.xml files.
  217. static void WriteFeatureManifestFiles(XmlWriter writer) {
  218. foreach (string file in Directory.GetFiles(Globals.FeaturesFolder, "*.xml", SearchOption.AllDirectories)) {
  219. if (Path.GetFileName(file).ToLower() == "feature.xml") {
  220. FileInfo featureFile = new FileInfo(file);
  221. WriteFeatureManifestFile(writer, featureFile.Directory.Name + @"\feature.xml");
  222. }
  223. }
  224. }
  225. // End of Modified 20090722
  226. }
  227. }