/// <summary>
        /// Logs the target file header information via an IRenderConfigLogger.
        /// </summary>
        /// <param name="targetFile">The target file.</param>
        /// <param name="Log">The log.</param>
        public static void LogTargetFileHeader(string source, string destination, string sourceDir, string destinationDir, IRenderConfigLogger Log)
        {
            FileInfo destinationFile;
            FileInfo sourceFile = new FileInfo(source);
            if (string.IsNullOrEmpty(sourceDir))
            {
                sourceDir = string.Empty;
            }
            if (string.IsNullOrEmpty(destinationDir))
            {
                destinationDir = string.Empty;
            }

            if (String.IsNullOrEmpty(destination))
            {
                destinationFile = new FileInfo(source);
            }
            else
            {
                destinationFile = new FileInfo(destination);
            }
          
            Log.LogMessage(MessageImportance.High, "SOURCE = ".PadLeft(15) + Path.Combine(sourceDir,sourceFile.Name));
            Log.LogMessage("TARGET = ".PadLeft(15) + Path.Combine(destinationDir, destinationFile.Name));
        }
Beispiel #2
0
        /// <summary>
        /// Logs the target file header information via an IRenderConfigLogger.
        /// </summary>
        /// <param name="targetFile">The target file.</param>
        /// <param name="Log">The log.</param>
        public static void LogTargetFileHeader(string source, string destination, string sourceDir, string destinationDir, IRenderConfigLogger Log)
        {
            FileInfo destinationFile;
            FileInfo sourceFile = new FileInfo(source);

            if (string.IsNullOrEmpty(sourceDir))
            {
                sourceDir = string.Empty;
            }
            if (string.IsNullOrEmpty(destinationDir))
            {
                destinationDir = string.Empty;
            }

            if (String.IsNullOrEmpty(destination))
            {
                destinationFile = new FileInfo(source);
            }
            else
            {
                destinationFile = new FileInfo(destination);
            }

            Log.LogMessage(MessageImportance.High, "SOURCE = ".PadLeft(15) + Path.Combine(sourceDir, sourceFile.Name));
            Log.LogMessage("TARGET = ".PadLeft(15) + Path.Combine(destinationDir, destinationFile.Name));
        }
Beispiel #3
0
        /// <summary>
        /// Applies the specified config by passing through each set of modifications (in order, deterministic).
        /// </summary>
        /// <param name="config">The config.</param>
        /// <param name="inputLog">The input log.</param>
        /// <returns></returns>
        public Boolean Apply(RenderConfigConfig config, IRenderConfigLogger inputLog)
        {
            log = inputLog;
            Boolean returnCode = true;

            foreach (XmlTargetFile file in TargetFiles.XML)
            {
                CheckAndModifySourceAndDestination(config, file);
                //If we arent doing anything else, we are doing a straight copy...
                if (file.Add == null & file.Delete == null && file.Update == null && file.Replace == null)
                {
                    log.LogMessage(MessageImportance.High, "TYPE = ".PadLeft(27) + "substitute");
                    RenderConfigEngine.Substitute(file, config.OutputDirectory);
                }
                else
                {
                    IFileModifier fileModifier = new XmlFileModifier(file, RenderConfigEngine.ResolveAndCopyDestinationFilename(file, config.OutputDirectory, true), log, config);
                    fileModifier.Run();
                }
            }

            foreach (IniTargetFile file in TargetFiles.INI)
            {
                CheckAndModifySourceAndDestination(config, file);
                //If we arent doing anything else, we are doing a straight copy...
                //TODO possibly add all these checks as a boolean get{} on the partial class..so if (file.IsSimpleCopy)
                if (file.Add == null & file.Delete == null && file.Update == null && file.Replace == null)
                {
                    log.LogMessage(MessageImportance.High, "TYPE = ".PadLeft(27) + "substitute");
                    RenderConfigEngine.Substitute(file, config.OutputDirectory);
                }
                else
                {
                    IFileModifier fileModifier = new IniFileModifier(file, RenderConfigEngine.ResolveAndCopyDestinationFilename(file, config.OutputDirectory, true), log, config);
                    fileModifier.Run();
                }
            }

            foreach (TxtTargetFile file in TargetFiles.TXT)
            {
                CheckAndModifySourceAndDestination(config, file);
                //If we arent doing anything else, we are doing a straight copy...
                if (file.Replace == null)
                {
                    log.LogMessage(MessageImportance.High, "TYPE = ".PadLeft(27) + "substitute");
                    RenderConfigEngine.Substitute(file, config.OutputDirectory);
                }
                else
                {
                    IFileModifier fileModifier = new TxtFileModifier(file, RenderConfigEngine.ResolveAndCopyDestinationFilename(file, config.OutputDirectory, true), log, config);
                    fileModifier.Run();
                }
            }

            return(returnCode);
        }
        /// <summary>
        /// Applies the specified config by passing through each set of modifications (in order, deterministic).
        /// </summary>
        /// <param name="config">The config.</param>
        /// <param name="inputLog">The input log.</param>
        /// <returns></returns>
        public Boolean Apply(RenderConfigConfig config, IRenderConfigLogger inputLog)
        {
            log = inputLog;
            Boolean returnCode = true;

            foreach (XmlTargetFile file in TargetFiles.XML)
            {
                CheckAndModifySourceAndDestination(config, file);
                //If we arent doing anything else, we are doing a straight copy...
                if (file.Add == null & file.Delete == null && file.Update == null && file.Replace == null)
                {
                    log.LogMessage(MessageImportance.High, "TYPE = ".PadLeft(27) + "substitute");
                    RenderConfigEngine.Substitute(file, config.OutputDirectory);
                }
                else
                {
                    IFileModifier fileModifier = new XmlFileModifier(file, RenderConfigEngine.ResolveAndCopyDestinationFilename(file, config.OutputDirectory, true), log, config);
                    fileModifier.Run();
                }
            }

            foreach (IniTargetFile file in TargetFiles.INI)
            {
                CheckAndModifySourceAndDestination(config, file);
                //If we arent doing anything else, we are doing a straight copy...
                //TODO possibly add all these checks as a boolean get{} on the partial class..so if (file.IsSimpleCopy)
                if (file.Add == null & file.Delete == null && file.Update == null && file.Replace == null)
                {
                    log.LogMessage(MessageImportance.High, "TYPE = ".PadLeft(27) + "substitute");
                    RenderConfigEngine.Substitute(file, config.OutputDirectory);
                }
                else
                {
                    IFileModifier fileModifier = new IniFileModifier(file, RenderConfigEngine.ResolveAndCopyDestinationFilename(file, config.OutputDirectory, true), log, config);
                    fileModifier.Run();
                }
            }

            foreach (TxtTargetFile file in TargetFiles.TXT)
            {
                CheckAndModifySourceAndDestination(config, file);
                //If we arent doing anything else, we are doing a straight copy...
                if (file.Replace == null)
                {
                    log.LogMessage(MessageImportance.High, "TYPE = ".PadLeft(27) + "substitute");
                    RenderConfigEngine.Substitute(file, config.OutputDirectory);
                }
                else
                {
                    IFileModifier fileModifier = new TxtFileModifier(file, RenderConfigEngine.ResolveAndCopyDestinationFilename(file, config.OutputDirectory, true), log, config);
                    fileModifier.Run();
                }
            }

            return returnCode;
        }
Beispiel #5
0
        /// <summary>
        /// Logs an int as a count.
        /// </summary>
        /// <param name="count">The count.</param>
        /// <param name="log">The log.</param>
        public static void LogCount(int count, IRenderConfigLogger log)
        {
            if (count == 0)
            {
                log.LogMessage(MessageImportance.High, "COUNT = ".PadLeft(27) + count);
            }
            else
            {
                log.LogMessage("COUNT = ".PadLeft(27) + count);
            }

            log.LogMessage("");
        }
        /// <summary>
        /// Generates the node list.
        /// </summary>
        /// <param name="configs">The configs.</param>
        private static List <Node <string> > GenerateNodeList(RenderConfig renderConfig, IRenderConfigLogger log)
        {
            //Create list of all nodes, without dependencies
            log.LogMessage("Generating Node List...");
            List <Node <string> > nodes = CreateInitialNodeList(renderConfig);

            foreach (Configuration config in renderConfig.Configurations)
            {
                //Split the dependencies, and then for each of them find a node in nodeList, and add as a dependency
                if (!String.IsNullOrEmpty(config.Depends))
                {
                    string[] dependencies = config.Depends.Split(',', ';');
                    foreach (string depends in dependencies)
                    {
                        Node <string> dependencyNode = SearchForNodeByIdentity(nodes, depends.Trim());
                        if (dependencyNode == null)
                        {
                            throw new ApplicationException("Error in configuration, cannot resolve dependency " + depends);
                        }
                        else
                        {
                            SearchForNodeByIdentity(nodes, config.Name).Dependencies.Add(dependencyNode);
                        }
                    }
                }
            }

            return(nodes);
        }
Beispiel #7
0
        /// <summary>
        /// Parses an XMLDocument and returns an XML namespace manager.
        /// </summary>
        /// <param name="document">The document.</param>
        /// <param name="log">The log.</param>
        /// <returns></returns>
        private static XmlNamespaceManager ParseAndReturnXmlNamespaceManager(XmlDocument document, IRenderConfigLogger log)
        {
            Regex               namespaces = new Regex(@"xmlns:?(?<ns>[a-zA-Z]*)=""(?<url>((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*))""");
            MatchCollection     matches    = namespaces.Matches(document.OuterXml);
            XmlNamespaceManager manager    = new XmlNamespaceManager(document.NameTable);

            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                {
                    if (!manager.HasNamespace(match.Groups["ns"].ToString()))
                    {
                        //We will use "r" as our pretend namespace
                        string ns = "r";
                        if (!String.IsNullOrEmpty(match.Groups["ns"].Value))
                        {
                            ns = match.Groups["ns"].ToString();
                        }

                        log.LogMessage(MessageImportance.High, string.Concat("Adding XML Namespace : ".PadLeft(27) + ns + " = " + match.Groups["url"]));
                        manager.AddNamespace(ns, match.Groups["url"].ToString());
                    }
                }
            }
            return(manager);
        }
Beispiel #8
0
        /// <summary>
        /// Returns the matching nodes.
        /// </summary>
        /// <returns></returns>
        private XmlNodeList ReturnMatchingNodes(string xpath)
        {
            XmlNodeList nodes = document.SelectNodes(xpath);

            if (nodes.Count == 0)
            {
                //Resolve any XML namespaces.  These are the spawn of the devil.
                XmlNamespaceManager nameSpaces = ParseAndReturnXmlNamespaceManager(document, log);
                xpath = ModifyXPathWithNamespace(xpath, nameSpaces);
                log.LogMessage(MessageImportance.High, string.Concat("Attempting match with modified XPATH = ".PadLeft(27), xpath));
                nodes = document.SelectNodes(xpath, nameSpaces);
            }

            LogNodeCount(nodes, config.BreakOnNoMatch);

            return(nodes);
        }
        /// <summary>
        /// Renders the configuration specified.
        /// </summary>
        /// <returns></returns>
        public bool Render()
        {
            LogUtilities.LogSettings(config, log);
            nodeList = new List <Node <string> >();
            Boolean returnCode = true;

            if (File.Exists(config.ConfigFile))
            {
                log.LogMessage("Reading in configuration file...");
                RenderConfig renderConfig = ReadConfigurationFile();


                if (renderConfig != null)
                {
                    //HACK We should be using a deep copy so that all this becomes "variableStack = dependencyStack.Clone();"
                    //Get the list of nodes
                    nodeList = GenerateNodeList(renderConfig, log);
                    if (SearchForNodeByIdentity(nodeList, config.Configuration) == null)
                    {
                        throw new ApplicationException("Could not find Configuration : " + config.Configuration);
                    }
                    List <Node <string> > n2 = GenerateNodeList(renderConfig, log);
                    //Generate the dependency path
                    DepthFirstSearch <string> dfs  = new DepthFirstSearch <string>(nodeList);
                    DepthFirstSearch <string> dfs2 = new DepthFirstSearch <string>(n2);
                    dependencyStack = dfs.GetDependencyPath(config.Configuration);
                    //HACK Need to write a deep copy Queue Clone to get rid of this...
                    variableStack = dfs2.GetDependencyPath(config.Configuration);
                }
                if (Directory.Exists(config.OutputDirectory))
                {
                    if (config.DeleteOutputDirectory)
                    {
                        log.LogMessage("Deleting and recreating output directory...");
                        Directory.Delete(config.OutputDirectory, true);
                        Directory.CreateDirectory(config.OutputDirectory);
                    }
                }
                else
                {
                    log.LogMessage("Creating output directory...");
                    Directory.CreateDirectory(config.OutputDirectory);
                }


                //Create a queue of mods to run and a queue of EnvironmentVariables to implement
                //Variables have to be put in place before the mods...
                log.LogMessage("Building dependency queue...");
                Queue <Configuration> configsToRun = CreateConfigProcessQueue(renderConfig, dependencyStack);
                //HACK This is ugly, needs a deep copy here....
                Queue <Configuration> envQueue = CreateConfigProcessQueue(renderConfig, variableStack);

                while (envQueue.Count > 0)
                {
                    Configuration varConfig = envQueue.Dequeue();

                    //First, we need to get all the Variables and create them.

                    foreach (EnvironmentVariable variable in varConfig.EnvironmentVariables)
                    {
                        Environment.SetEnvironmentVariable(variable.variable, variable.Value);
                    }
                }

                while (configsToRun.Count > 0)
                {
                    Configuration currentConfig = configsToRun.Dequeue();
                    log.LogMessage(MessageImportance.High, "Running modification: " + currentConfig.Name);

                    if (currentConfig.TargetFiles != null)
                    {
                        if (!currentConfig.Apply(config, log))
                        {
                            log.LogError("Failed to apply configuration: " + currentConfig.Name);
                            returnCode = false;
                        }
                    }
                }
            }
            else
            {
                log.LogError("Could not find configuration file: " + config.ConfigFile);
                returnCode = false;
            }

            //Let 'em know
            if (returnCode)
            {
                log.LogMessage(MessageImportance.High, "Configuration rendered!");
            }
            else
            {
                log.LogError("Failed to render configuration.");
            }

            return(returnCode);
        }
Beispiel #10
0
 /// <summary>
 /// Logs the RenderConfigConfig settings provided to the IRenderConfigLogger instance passed in.
 /// </summary>
 /// <param name="config">The config.</param>
 /// <param name="log">The log.</param>
 public static void LogSettings(RenderConfigConfig config, IRenderConfigLogger log)
 {
     log.LogMessage("--------------------------------------------------------");
     log.LogMessage(string.Concat("Config File = ".PadLeft(30) + config.ConfigFile));
     log.LogMessage(string.Concat("Configuration = ".PadLeft(30) + config.Configuration));
     log.LogMessage(string.Concat("Input Directory = ".PadLeft(30) + config.InputDirectory));
     log.LogMessage(string.Concat("Output Directory = ".PadLeft(30) + config.OutputDirectory));
     log.LogMessage(string.Concat("Delete Output Directory = ".PadLeft(30) + config.DeleteOutputDirectory));
     log.LogMessage(string.Concat("Break On No Match = ".PadLeft(30) + config.BreakOnNoMatch));
     log.LogMessage(string.Concat("Clean XML Output = ".PadLeft(30) + config.CleanOutput));
     log.LogMessage(string.Concat("Preserve Source Structure = ".PadLeft(30) + config.PreserveSourceStructure));
     log.LogMessage(string.Concat("Subdirectory per Config = ".PadLeft(30) + config.SubDirectoryEachConfiguration));
     log.LogMessage("--------------------------------------------------------");
 }
Beispiel #11
0
 /// <summary>
 /// Logs a key value pair as "Key = Value".
 /// </summary>
 /// <param name="key">The key.</param>
 /// <param name="value">The value.</param>
 /// <param name="padding">The padding.</param>
 /// <param name="importance">The importance.</param>
 /// <param name="log">The log.</param>
 public static void LogKeyValue(string key, string value, int padding, MessageImportance importance, IRenderConfigLogger log)
 {
     log.LogMessage(importance, string.Concat(string.Concat(key, " = ").PadLeft(padding), value));
 }
 /// <summary>
 /// Logs an int as a count.
 /// </summary>
 /// <param name="count">The count.</param>
 /// <param name="log">The log.</param>
 public static void LogCount(int count, IRenderConfigLogger log)
 {
     if (count == 0)
     {
         log.LogMessage(MessageImportance.High,"COUNT = ".PadLeft(27) + count);
     }
     else
     {
         log.LogMessage("COUNT = ".PadLeft(27) + count);
     }
     
     log.LogMessage("");
 }
 /// <summary>
 /// Logs the RenderConfigConfig settings provided to the IRenderConfigLogger instance passed in.
 /// </summary>
 /// <param name="config">The config.</param>
 /// <param name="log">The log.</param>
 public static void LogSettings(RenderConfigConfig config, IRenderConfigLogger log)
 {
     log.LogMessage("--------------------------------------------------------");
     log.LogMessage(string.Concat("Config File = ".PadLeft(30) + config.ConfigFile));
     log.LogMessage(string.Concat("Configuration = ".PadLeft(30) + config.Configuration));
     log.LogMessage(string.Concat("Input Directory = ".PadLeft(30) + config.InputDirectory));
     log.LogMessage(string.Concat("Output Directory = ".PadLeft(30) + config.OutputDirectory));
     log.LogMessage(string.Concat("Delete Output Directory = ".PadLeft(30) + config.DeleteOutputDirectory));
     log.LogMessage(string.Concat("Break On No Match = ".PadLeft(30) + config.BreakOnNoMatch));
     log.LogMessage(string.Concat("Clean XML Output = ".PadLeft(30) + config.CleanOutput));
     log.LogMessage(string.Concat("Preserve Source Structure = ".PadLeft(30) + config.PreserveSourceStructure));
     log.LogMessage(string.Concat("Subdirectory per Config = ".PadLeft(30) + config.SubDirectoryEachConfiguration));
     log.LogMessage("--------------------------------------------------------");
 }
 /// <summary>
 /// Logs a key value pair as "Key = Value".
 /// </summary>
 /// <param name="key">The key.</param>
 /// <param name="value">The value.</param>
 /// <param name="padding">The padding.</param>
 /// <param name="importance">The importance.</param>
 /// <param name="log">The log.</param>
 public static void LogKeyValue(string key, string value, int padding, MessageImportance importance, IRenderConfigLogger log)
 {
     log.LogMessage(importance, string.Concat(string.Concat(key, " = ").PadLeft(padding), value));
 }
        /// <summary>
        /// Parses an XMLDocument and returns an XML namespace manager.
        /// </summary>
        /// <param name="document">The document.</param>
        /// <param name="log">The log.</param>
        /// <returns></returns>
        private static XmlNamespaceManager ParseAndReturnXmlNamespaceManager(XmlDocument document, IRenderConfigLogger log)
        {
            Regex namespaces = new Regex(@"xmlns:?(?<ns>[a-zA-Z]*)=""(?<url>((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*))""");
            MatchCollection matches = namespaces.Matches(document.OuterXml);
            XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);

            if (matches.Count > 0)
            {
                foreach (Match match in matches)
                {
                    if (!manager.HasNamespace(match.Groups["ns"].ToString()))
                    {
                        //We will use "r" as our pretend namespace
                        string ns = "r";
                        if (!String.IsNullOrEmpty(match.Groups["ns"].Value))
                        {
                            ns = match.Groups["ns"].ToString();
                        }

                        log.LogMessage(MessageImportance.High, string.Concat("Adding XML Namespace : ".PadLeft(27) + ns + " = " + match.Groups["url"]));
                        manager.AddNamespace(ns, match.Groups["url"].ToString());
                    }
                }
            }
            return manager;
        }
        /// <summary>
        /// Generates the node list.
        /// </summary>
        /// <param name="configs">The configs.</param>
        private static List<Node<string>> GenerateNodeList(RenderConfig renderConfig, IRenderConfigLogger log)
        {
            //Create list of all nodes, without dependencies
            log.LogMessage("Generating Node List...");
            List<Node<string>> nodes = CreateInitialNodeList(renderConfig);

            foreach (Configuration config in renderConfig.Configurations)
            {
                //Split the dependencies, and then for each of them find a node in nodeList, and add as a dependency
                if (!String.IsNullOrEmpty(config.Depends))
                {
                    string[] dependencies = config.Depends.Split(',', ';');
                    foreach (string depends in dependencies)
                    {
                        Node<string> dependencyNode = SearchForNodeByIdentity(nodes, depends.Trim());
                        if (dependencyNode == null)
                        {
                            throw new ApplicationException("Error in configuration, cannot resolve dependency " + depends);
                        }
                        else
                        {
                            SearchForNodeByIdentity(nodes, config.Name).Dependencies.Add(dependencyNode);
                        }
                    }
                }
            }

            return nodes;
        }