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);
}
}
}