using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml; using CTA.Rules.Config; using CTA.Rules.Models; using Microsoft.CodeAnalysis; namespace CTA.Rules.Actions { /// /// List of actions that can run on the project /// public class ProjectLevelActions { public Func GetArchiveFilesAction(string archiveFiles) { string func(string projectDir, ProjectType projectType) { List archived = new List(); List deleted = new List(); projectDir = Directory.GetParent(projectDir).FullName; List result = new List(); var filesToArchive = archiveFiles.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); foreach (var fileToArchive in filesToArchive) { IEnumerable files = Directory.EnumerateFiles(projectDir, fileToArchive, SearchOption.AllDirectories); if (files != null && files.Count() > 0) { result.AddRange(files); } } foreach (string s in result) { if (!s.EndsWith(".bak")) { string backupFile = string.Concat(s, ".bak"); if (File.Exists(backupFile)) { File.Delete(backupFile); deleted.Add(backupFile); } File.Move(s, string.Concat(s, ".bak")); archived.Add(s); } } return string.Concat( deleted.Count > 0 ? string.Concat("Deleted: ", string.Join(",", deleted)) : string.Empty, archived.Count > 0 ? string.Concat("Archived: ", string.Join(",", archived)) : string.Empty); } return func; } public Func GetCreateNet3FolderHierarchyAction(string _) { static string func(string projectDir, ProjectType projectType) { FolderUpdate folderUpdate = new FolderUpdate(projectDir, projectType); return folderUpdate.Run(); } return func; } public Func GetCreateNet5FolderHierarchyAction(string _) { static string func(string projectDir, ProjectType projectType) { FolderUpdate folderUpdate = new FolderUpdate(projectDir, projectType); return folderUpdate.Run(); } return func; } public Func GetCreateNet6FolderHierarchyAction(string _) { static string func(string projectDir, ProjectType projectType) { FolderUpdate folderUpdate = new FolderUpdate(projectDir, projectType); return folderUpdate.Run(); } return func; } public Func GetCreateNet7FolderHierarchyAction(string _) { static string func(string projectDir, ProjectType projectType) { FolderUpdate folderUpdate = new FolderUpdate(projectDir, projectType); return folderUpdate.Run(); } return func; } public Func GetMigrateConfigAction(string _) { static string func(string projectDir, ProjectType projectType) { ConfigMigrate configMigrate = new ConfigMigrate(projectDir, projectType); return configMigrate.Run(); } return func; } public Func GetCreateMonolithServiceAction(string namespaceString, string projectName) { string func(string projectDir, ProjectType projectType) { AddMonolithFile(namespaceString, projectName, projectDir, projectType, FileTypeCreation.MonolithServiceMvc.ToString()); return ""; } return func; } public Func GetCreateMonolithServiceWebAPIAction(string namespaceString, string projectName) { string func(string projectDir, ProjectType projectType) { AddMonolithFile(namespaceString, projectName, projectDir, projectType, FileTypeCreation.MonolithService.ToString()); return ""; } return func; } public Func GetCreateMonolithServiceCoreAction(string namespaceString, string projectName) { string func(string projectDir, ProjectType projectType) { AddMonolithFile(namespaceString, projectName, projectDir, projectType, FileTypeCreation.MonolithServiceCore.ToString(), true); return ""; } return func; } private void AddMonolithFile(string namespaceString, string projectName, string projectDir, ProjectType projectType, string templateFilename, bool isCore = false) { if (projectDir != null && projectDir.Length > 0) { if (string.Equals(Path.GetFileNameWithoutExtension(projectDir), projectName)) { // Update only in case of a framework project if (!isCore) { UpdateCsprojReference(projectDir); } var pathOnly = Path.GetDirectoryName(projectDir); var file = Path.Combine(pathOnly, string.Concat(templateFilename, ".cs")); if (File.Exists(file)) { if (File.Exists(string.Concat(file, ".bak"))) { File.Delete(string.Concat(file, ".bak")); } File.Move(file, string.Concat(file, ".bak")); } File.WriteAllText(file, TemplateHelper.GetTemplateFileContent(namespaceString, ProjectType.MonolithService, templateFilename + ".cs")); LogHelper.LogInformation(string.Format("Created {0}.cs file using {1} template", templateFilename, ProjectType.MonolithService.ToString())); } } } private void UpdateCsprojReference(string projectFile) { XmlDocument projectDoc = new XmlDocument(); projectDoc.Load(projectFile); XmlNode newService = projectDoc.CreateNode(XmlNodeType.Element, "Compile", null); XmlNode attr = projectDoc.CreateNode(XmlNodeType.Attribute, "Include", null); attr.Value = Constants.MonolithService + ".cs"; newService.Attributes.SetNamedItem(attr); var files = projectDoc.GetElementsByTagName("Compile"); files.Item(0).ParentNode.InsertBefore(newService, files.Item(0)); projectDoc.Save(projectFile); } } }