using System; using System.Collections.Generic; using System.IO; using Codelyzer.Analysis; using Codelyzer.Analysis.Build; using CTA.Rules.Config; using CTA.Rules.Models; using CTA.Rules.Update; using Microsoft.CodeAnalysis.CSharp; namespace CTA.Rules.PortCore { /// /// Runs rule updates on a Project /// public class WCFProjectRewriter : ProjectRewriter { /// /// Initializes a new instance of ProjectRewriter using an existing analysis /// /// The analysis results of the project /// ProjectConfiguration for this project public WCFProjectRewriter(AnalyzerResult analyzerResult, ProjectConfiguration projectConfiguration) : base(analyzerResult, projectConfiguration) { } public WCFProjectRewriter(IDEProjectResult projectResult, ProjectConfiguration projectConfiguration) : base(projectResult, projectConfiguration) { } /// /// Initializes the ProjectRewriter then runs it /// public override ProjectResult Run() { var projectResult = Initialize(); return Run(projectResult.ProjectActions); } /// /// Runs the project rewriter using a previously initialized analysis /// /// public override ProjectResult Run(ProjectActions projectActions) { base.Run(projectActions); // After running all other actions, run WCF-specific changes if (ProjectConfiguration.PortCode) { RunWCFChanges(); } return _projectResult; } public override List RunIncremental(List updatedFiles, RootNodes projectRules) { base.RunIncremental(updatedFiles, projectRules); var ideFileActions = new List(); // After running all other actions, run WCF-specific changes if (ProjectConfiguration.PortCode) { RunWCFChanges(); } return ideFileActions; } private void RunWCFChanges() { var projectDir = Path.GetDirectoryName(ProjectConfiguration.ProjectPath); var programFile = Path.Combine(projectDir, FileTypeCreation.Program.ToString() + ".cs"); WCFServicePort wcfServicePort = new WCFServicePort(projectDir, ProjectConfiguration.ProjectType, _analyzerResult); try { if (File.Exists(programFile)) { var programFileTree = CSharpSyntaxTree.ParseText(File.ReadAllText(programFile)); var newRootNode = wcfServicePort.ReplaceProgramFile(programFileTree); File.WriteAllText(programFile, newRootNode.ToFullString()); } } catch (Exception e) { LogHelper.LogError($"{Constants.WCFErrorTag}Error while writing to Program.cs file: ", e.Message); } var startupFile = Path.Combine(projectDir, FileTypeCreation.Startup.ToString() + ".cs"); try { if (File.Exists(startupFile)) { var newStartupFileText = wcfServicePort.ReplaceStartupFile(startupFile); File.WriteAllText(startupFile, newStartupFileText); } } catch (Exception e) { LogHelper.LogError($"{Constants.WCFErrorTag}Error while writing to Startup file: ", e.Message); } try { if (ProjectConfiguration.ProjectType == ProjectType.WCFConfigBasedService) { var newConfigFileText = wcfServicePort.GetNewConfigFile(); var newConfigPath = Path.Combine(projectDir, PortCore.WCF.Constants.PortedConfigFileName); if (newConfigFileText != null) { File.WriteAllText(newConfigPath, newConfigFileText); } var configFilePath = wcfServicePort.GetConfigFilePath(); string backupFile = string.Concat(configFilePath, ".bak"); if (File.Exists(backupFile)) { File.Delete(backupFile); } File.Move(configFilePath, backupFile); } } catch (Exception e) { LogHelper.LogError($"{Constants.WCFErrorTag}Error while creating config file: ", e.Message); } } } }