Ejemplo n.º 1
0
        /// <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);
        }