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