/// <summary>
        /// Backups the specified settings provider.
        /// </summary>
        /// <param name="zipFileName">The zip file name where to store the backup.</param>
        /// <param name="settingsStorageProvider">The source settings provider.</param>
        /// <param name="knownNamespaces">The currently known page namespaces.</param>
        /// <param name="knownPlugins">The currently known plugins.</param>
        /// <returns><c>true</c> if the backup file has been succesfully created.</returns>
        public static bool BackupSettingsStorageProvider(string zipFileName, ISettingsStorageProviderV30 settingsStorageProvider, string[] knownNamespaces, string[] knownPlugins)
        {
            SettingsBackup settingsBackup = new SettingsBackup();

            // Settings
            settingsBackup.Settings = (Dictionary <string, string>)settingsStorageProvider.GetAllSettings();

            // Plugins Status and Configuration
            settingsBackup.PluginsFileNames = knownPlugins.ToList();
            Dictionary <string, bool>   pluginsStatus        = new Dictionary <string, bool>();
            Dictionary <string, string> pluginsConfiguration = new Dictionary <string, string>();

            foreach (string plugin in knownPlugins)
            {
                pluginsStatus[plugin]        = settingsStorageProvider.GetPluginStatus(plugin);
                pluginsConfiguration[plugin] = settingsStorageProvider.GetPluginConfiguration(plugin);
            }
            settingsBackup.PluginsStatus        = pluginsStatus;
            settingsBackup.PluginsConfiguration = pluginsConfiguration;

            // Metadata
            List <MetaData> metadataList = new List <MetaData>();

            // Meta-data (global)
            metadataList.Add(new MetaData()
            {
                Item    = MetaDataItem.AccountActivationMessage,
                Tag     = null,
                Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.AccountActivationMessage, null)
            });
            metadataList.Add(new MetaData()
            {
                Item = MetaDataItem.PasswordResetProcedureMessage, Tag = null, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.PasswordResetProcedureMessage, null)
            });
            metadataList.Add(new MetaData()
            {
                Item = MetaDataItem.LoginNotice, Tag = null, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.LoginNotice, null)
            });
            metadataList.Add(new MetaData()
            {
                Item = MetaDataItem.PageChangeMessage, Tag = null, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.PageChangeMessage, null)
            });
            metadataList.Add(new MetaData()
            {
                Item = MetaDataItem.DiscussionChangeMessage, Tag = null, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.DiscussionChangeMessage, null)
            });
            // Meta-data (ns-specific)
            List <string> namespacesToProcess = new List <string>();

            namespacesToProcess.Add("");
            namespacesToProcess.AddRange(knownNamespaces);
            foreach (string nspace in namespacesToProcess)
            {
                metadataList.Add(new MetaData()
                {
                    Item = MetaDataItem.EditNotice, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.EditNotice, nspace)
                });
                metadataList.Add(new MetaData()
                {
                    Item = MetaDataItem.Footer, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.Footer, nspace)
                });
                metadataList.Add(new MetaData()
                {
                    Item = MetaDataItem.Header, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.Header, nspace)
                });
                metadataList.Add(new MetaData()
                {
                    Item = MetaDataItem.HtmlHead, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.HtmlHead, nspace)
                });
                metadataList.Add(new MetaData()
                {
                    Item = MetaDataItem.PageFooter, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.PageFooter, nspace)
                });
                metadataList.Add(new MetaData()
                {
                    Item = MetaDataItem.PageHeader, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.PageHeader, nspace)
                });
                metadataList.Add(new MetaData()
                {
                    Item = MetaDataItem.Sidebar, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.Sidebar, nspace)
                });
            }
            settingsBackup.Metadata = metadataList;

            // RecentChanges
            settingsBackup.RecentChanges = settingsStorageProvider.GetRecentChanges().ToList();

            // OutgoingLinks
            settingsBackup.OutgoingLinks = (Dictionary <string, string[]>)settingsStorageProvider.GetAllOutgoingLinks();

            // ACLEntries
            AclEntry[] aclEntries = settingsStorageProvider.AclManager.RetrieveAllEntries();
            settingsBackup.AclEntries = new List <AclEntryBackup>(aclEntries.Length);
            foreach (AclEntry aclEntry in aclEntries)
            {
                settingsBackup.AclEntries.Add(new AclEntryBackup()
                {
                    Action   = aclEntry.Action,
                    Resource = aclEntry.Resource,
                    Subject  = aclEntry.Subject,
                    Value    = aclEntry.Value
                });
            }

            JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer();

            javascriptSerializer.MaxJsonLength = javascriptSerializer.MaxJsonLength * 10;

            string tempDir = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), Guid.NewGuid().ToString());

            Directory.CreateDirectory(tempDir);

            FileStream tempFile = File.Create(Path.Combine(tempDir, "Settings.json"));

            byte[] buffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(settingsBackup));
            tempFile.Write(buffer, 0, buffer.Length);
            tempFile.Close();

            tempFile = File.Create(Path.Combine(tempDir, "Version.json"));
            buffer   = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(generateVersionFile("Settings")));
            tempFile.Write(buffer, 0, buffer.Length);
            tempFile.Close();

            using (ZipFile zipFile = new ZipFile()) {
                zipFile.AddDirectory(tempDir, "");
                zipFile.Save(zipFileName);
            }
            Directory.Delete(tempDir, true);

            return(true);
        }
        /// <summary>
        /// Backups the specified settings provider.
        /// </summary>
        /// <param name="zipFileName">The zip file name where to store the backup.</param>
        /// <param name="settingsStorageProvider">The source settings provider.</param>
        /// <param name="knownNamespaces">The currently known page namespaces.</param>
        /// <param name="knownPlugins">The currently known plugins.</param>
        /// <returns><c>true</c> if the backup file has been succesfully created.</returns>
        public static bool BackupSettingsStorageProvider(string zipFileName, ISettingsStorageProviderV30 settingsStorageProvider, string[] knownNamespaces, string[] knownPlugins)
        {
            SettingsBackup settingsBackup = new SettingsBackup();

            // Settings
            settingsBackup.Settings = (Dictionary<string, string>)settingsStorageProvider.GetAllSettings();

            // Plugins Status and Configuration
            settingsBackup.PluginsFileNames = knownPlugins.ToList();
            Dictionary<string, bool> pluginsStatus = new Dictionary<string, bool>();
            Dictionary<string, string> pluginsConfiguration = new Dictionary<string, string>();
            foreach(string plugin in knownPlugins) {
                pluginsStatus[plugin] = settingsStorageProvider.GetPluginStatus(plugin);
                pluginsConfiguration[plugin] = settingsStorageProvider.GetPluginConfiguration(plugin);
            }
            settingsBackup.PluginsStatus = pluginsStatus;
            settingsBackup.PluginsConfiguration = pluginsConfiguration;

            // Metadata
            List<MetaData> metadataList = new List<MetaData>();
            // Meta-data (global)
            metadataList.Add(new MetaData() {
                Item = MetaDataItem.AccountActivationMessage,
                Tag = null,
                Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.AccountActivationMessage, null)
            });
            metadataList.Add(new MetaData() { Item = MetaDataItem.PasswordResetProcedureMessage, Tag = null, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.PasswordResetProcedureMessage, null) });
            metadataList.Add(new MetaData() { Item = MetaDataItem.LoginNotice, Tag = null, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.LoginNotice, null) });
            metadataList.Add(new MetaData() { Item = MetaDataItem.PageChangeMessage, Tag = null, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.PageChangeMessage, null) });
            metadataList.Add(new MetaData() { Item = MetaDataItem.DiscussionChangeMessage, Tag = null, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.DiscussionChangeMessage, null) });
            // Meta-data (ns-specific)
            List<string> namespacesToProcess = new List<string>();
            namespacesToProcess.Add("");
            namespacesToProcess.AddRange(knownNamespaces);
            foreach(string nspace in namespacesToProcess) {
                metadataList.Add(new MetaData() { Item = MetaDataItem.EditNotice, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.EditNotice, nspace) });
                metadataList.Add(new MetaData() { Item = MetaDataItem.Footer, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.Footer, nspace) });
                metadataList.Add(new MetaData() { Item = MetaDataItem.Header, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.Header, nspace) });
                metadataList.Add(new MetaData() { Item = MetaDataItem.HtmlHead, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.HtmlHead, nspace) });
                metadataList.Add(new MetaData() { Item = MetaDataItem.PageFooter, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.PageFooter, nspace) });
                metadataList.Add(new MetaData() { Item = MetaDataItem.PageHeader, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.PageHeader, nspace) });
                metadataList.Add(new MetaData() { Item = MetaDataItem.Sidebar, Tag = nspace, Content = settingsStorageProvider.GetMetaDataItem(MetaDataItem.Sidebar, nspace) });
            }
            settingsBackup.Metadata = metadataList;

            // RecentChanges
            settingsBackup.RecentChanges = settingsStorageProvider.GetRecentChanges().ToList();

            // OutgoingLinks
            settingsBackup.OutgoingLinks = (Dictionary<string, string[]>)settingsStorageProvider.GetAllOutgoingLinks();

            // ACLEntries
            AclEntry[] aclEntries = settingsStorageProvider.AclManager.RetrieveAllEntries();
            settingsBackup.AclEntries = new List<AclEntryBackup>(aclEntries.Length);
            foreach(AclEntry aclEntry in aclEntries) {
                settingsBackup.AclEntries.Add(new AclEntryBackup() {
                    Action = aclEntry.Action,
                    Resource = aclEntry.Resource,
                    Subject = aclEntry.Subject,
                    Value = aclEntry.Value
                });
            }

            JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer();
            javascriptSerializer.MaxJsonLength = javascriptSerializer.MaxJsonLength * 10;

            string tempDir = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), Guid.NewGuid().ToString());
            Directory.CreateDirectory(tempDir);

            FileStream tempFile = File.Create(Path.Combine(tempDir, "Settings.json"));
            byte[] buffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(settingsBackup));
            tempFile.Write(buffer, 0, buffer.Length);
            tempFile.Close();

            tempFile = File.Create(Path.Combine(tempDir, "Version.json"));
            buffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(generateVersionFile("Settings")));
            tempFile.Write(buffer, 0, buffer.Length);
            tempFile.Close();

            using(ZipFile zipFile = new ZipFile()) {
                zipFile.AddDirectory(tempDir, "");
                zipFile.Save(zipFileName);
            }
            Directory.Delete(tempDir, true);

            return true;
        }