private static void ConvertSettings(string fileNameAndFilePath)
        {
            esSettings2010 settings2010 = new esSettings2010();

            settings2010.Load(fileNameAndFilePath);

            esSettings settings = settings2010.To2011();

            esSettingsDriverInfo info = new esSettingsDriverInfo();

            info.ConnectionString = settings2010.ConnectionString;
            info.Driver           = settings2010.Driver;

            settings.DriverInfoCollection.Add(info);

            try
            {
                AdjustPathsBasedOnPriorVersions(settings, @"Software\EntitySpaces 2009", "ES2009", false);
                AdjustPathsBasedOnPriorVersions(settings, @"Software\EntitySpaces 2010", "ES2010", false);
                AdjustPathsBasedOnPriorVersions(settings, @"Software\EntitySpaces 2011", "ES2011", false);
                AdjustPathsBasedOnPriorVersions(settings, @"Software\EntitySpaces 2011", "ES2012", true);
            }
            catch { }

            FileInfo fileInfo = new FileInfo(fileNameAndFilePath);

            string backup = fileInfo.Name.Replace(fileInfo.Extension, "");

            backup += "_original" + fileInfo.Extension;
            backup  = fileInfo.DirectoryName + "\\" + backup;

            File.Copy(fileNameAndFilePath, backup, true);

            settings.Save(fileNameAndFilePath);
        }
        public void Load(string fileNameAndFilePath, esSettings mainSettings)
        {
            userSettings = mainSettings;

            RootNode = null;

            Dictionary <int, IProjectNode> parents = new Dictionary <int, IProjectNode>();

            using (XmlTextReader reader = new XmlTextReader(fileNameAndFilePath))
            {
                projectFilePath           = fileNameAndFilePath;
                reader.WhitespaceHandling = WhitespaceHandling.None;

                IProjectNode currentNode = null;

                reader.Read();
                reader.Read();

                if (reader.Name != "EntitySpacesProject")
                {
                    throw new Exception("Invalid Project File: '" + fileNameAndFilePath + "'");
                }

                reader.Read();

                currentNode      = new esProjectNode2010();
                currentNode.Name = reader.GetAttribute("Name");
                RootNode         = currentNode;

                parents[reader.Depth] = currentNode;

                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        switch (reader.LocalName)
                        {
                        case "Folder":

                            currentNode      = new esProjectNode();
                            currentNode.Name = reader.GetAttribute("Name");

                            parents[reader.Depth - 1].Children.Add(currentNode);
                            parents[reader.Depth] = currentNode;
                            break;

                        case "RecordedTemplate":

                            currentNode          = new esProjectNode();
                            currentNode.Name     = reader.GetAttribute("Name");
                            currentNode.IsFolder = false;

                            int depth = reader.Depth;

                            // <Template>
                            reader.Read();
                            currentNode.Template = new Template();

                            // Path fixup to the template
                            string path = reader.GetAttribute("Path");
                            path = path.Replace("{fixup}", userSettings.TemplatePath);
                            path = path.Replace("\\\\", "\\");

                            currentNode.Template.Parse(path);

                            // <Input>
                            reader.Read();
                            XmlReader input = reader.ReadSubtree();
                            input.Read();

                            currentNode.Input = new Hashtable();

                            while (input.Read())
                            {
                                string type  = input.GetAttribute("Type");
                                string key   = input.GetAttribute("Key");
                                string value = input.GetAttribute("Value");

                                if (key == "OutputPath")
                                {
                                    value = FixupTheFixup(this.projectFilePath, value);
                                }

                                switch (type)
                                {
                                case "(null)":
                                    currentNode.Input[key] = null;
                                    break;

                                case "System.String":
                                    currentNode.Input[key] = value;
                                    break;

                                case "System.Char":
                                    currentNode.Input[key] = Convert.ToChar(value);
                                    break;

                                case "System.DateTime":
                                    currentNode.Input[key] = Convert.ToDateTime(value);
                                    break;

                                case "System.Decimal":
                                    currentNode.Input[key] = Convert.ToDecimal(value);
                                    break;

                                case "System.Double":
                                    currentNode.Input[key] = Convert.ToDouble(value);
                                    break;

                                case "System.Boolean":
                                    currentNode.Input[key] = Convert.ToBoolean(value);
                                    break;

                                case "System.Int16":
                                    currentNode.Input[key] = Convert.ToInt16(value);
                                    break;

                                case "System.Int32":
                                    currentNode.Input[key] = Convert.ToInt32(value);
                                    break;

                                case "System.Int64":
                                    currentNode.Input[key] = Convert.ToInt64(value);
                                    break;

                                case "System.Collections.ArrayList":

                                    ArrayList list  = new ArrayList();
                                    string[]  items = value.Split(',');

                                    foreach (string item in items)
                                    {
                                        list.Add(item);
                                    }

                                    currentNode.Input[key] = list;
                                    break;
                                }
                            }

                            // <Settings>
                            reader.Read();
                            XmlReader settings = reader.ReadSubtree();

                            esSettings2010 theSettings = new esSettings2010();
                            theSettings.Load(settings);
                            currentNode.Settings = theSettings;

                            // Fixup Settings ...
                            currentNode.Settings.TemplatePath         = userSettings.TemplatePath;
                            currentNode.Settings.OutputPath           = userSettings.OutputPath;
                            currentNode.Settings.UIAssemblyPath       = userSettings.UIAssemblyPath;
                            currentNode.Settings.CompilerAssemblyPath = userSettings.CompilerAssemblyPath;
                            currentNode.Settings.LanguageMappingFile  = userSettings.LanguageMappingFile;
                            currentNode.Settings.UserMetadataFile     = userSettings.UserMetadataFile;

                            parents[depth - 1].Children.Add(currentNode);
                            break;
                        }
                    }
                }
            }
        }