/// <summary> /// Backups the pages storage provider. /// </summary> /// <param name="zipFileName">The zip file name where to store the backup.</param> /// <param name="pagesStorageProvider">The pages storage provider.</param> /// <returns><c>true</c> if the backup file has been succesfully created.</returns> public static bool BackupPagesStorageProvider(string zipFileName, IPagesStorageProviderV30 pagesStorageProvider) { JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer(); javascriptSerializer.MaxJsonLength = javascriptSerializer.MaxJsonLength * 10; string tempDir = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), Guid.NewGuid().ToString()); Directory.CreateDirectory(tempDir); List <NamespaceInfo> nspaces = new List <NamespaceInfo>(pagesStorageProvider.GetNamespaces()); nspaces.Add(null); List <NamespaceBackup> namespaceBackupList = new List <NamespaceBackup>(nspaces.Count); foreach (NamespaceInfo nspace in nspaces) { // Backup categories CategoryInfo[] categories = pagesStorageProvider.GetCategories(nspace); List <CategoryBackup> categoriesBackup = new List <CategoryBackup>(categories.Length); foreach (CategoryInfo category in categories) { // Add this category to the categoriesBackup list categoriesBackup.Add(new CategoryBackup() { FullName = category.FullName, Pages = category.Pages }); } // Backup NavigationPaths NavigationPath[] navigationPaths = pagesStorageProvider.GetNavigationPaths(nspace); List <NavigationPathBackup> navigationPathsBackup = new List <NavigationPathBackup>(navigationPaths.Length); foreach (NavigationPath navigationPath in navigationPaths) { navigationPathsBackup.Add(new NavigationPathBackup() { FullName = navigationPath.FullName, Pages = navigationPath.Pages }); } // Add this namespace to the namespaceBackup list namespaceBackupList.Add(new NamespaceBackup() { Name = nspace == null ? "" : nspace.Name, DefaultPageFullName = nspace == null ? "" : nspace.DefaultPage.FullName, Categories = categoriesBackup, NavigationPaths = navigationPathsBackup }); // Backup pages (one json file for each page containing a maximum of 100 revisions) PageInfo[] pages = pagesStorageProvider.GetPages(nspace); foreach (PageInfo page in pages) { PageContent pageContent = pagesStorageProvider.GetContent(page); PageBackup pageBackup = new PageBackup(); pageBackup.FullName = page.FullName; pageBackup.CreationDateTime = page.CreationDateTime; pageBackup.LastModified = pageContent.LastModified; pageBackup.Content = pageContent.Content; pageBackup.Comment = pageContent.Comment; pageBackup.Description = pageContent.Description; pageBackup.Keywords = pageContent.Keywords; pageBackup.Title = pageContent.Title; pageBackup.User = pageContent.User; pageBackup.LinkedPages = pageContent.LinkedPages; pageBackup.Categories = (from c in pagesStorageProvider.GetCategoriesForPage(page) select c.FullName).ToArray(); // Backup the 100 most recent versions of the page List <PageRevisionBackup> pageContentBackupList = new List <PageRevisionBackup>(); int[] revisions = pagesStorageProvider.GetBackups(page); for (int i = revisions.Length - 1; i > revisions.Length - 100 && i >= 0; i--) { PageContent pageRevision = pagesStorageProvider.GetBackupContent(page, revisions[i]); PageRevisionBackup pageContentBackup = new PageRevisionBackup() { Revision = revisions[i], Content = pageRevision.Content, Comment = pageRevision.Comment, Description = pageRevision.Description, Keywords = pageRevision.Keywords, Title = pageRevision.Title, User = pageRevision.User, LastModified = pageRevision.LastModified }; pageContentBackupList.Add(pageContentBackup); } pageBackup.Revisions = pageContentBackupList; // Backup draft of the page PageContent draft = pagesStorageProvider.GetDraft(page); if (draft != null) { pageBackup.Draft = new PageRevisionBackup() { Content = draft.Content, Comment = draft.Comment, Description = draft.Description, Keywords = draft.Keywords, Title = draft.Title, User = draft.User, LastModified = draft.LastModified }; } // Backup all messages of the page List <MessageBackup> messageBackupList = new List <MessageBackup>(); foreach (Message message in pagesStorageProvider.GetMessages(page)) { messageBackupList.Add(BackupMessage(message)); } pageBackup.Messages = messageBackupList; FileStream tempFile = File.Create(Path.Combine(tempDir, page.FullName + ".json")); byte[] buffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(pageBackup)); tempFile.Write(buffer, 0, buffer.Length); tempFile.Close(); } } FileStream tempNamespacesFile = File.Create(Path.Combine(tempDir, "Namespaces.json")); byte[] namespacesBuffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(namespaceBackupList)); tempNamespacesFile.Write(namespacesBuffer, 0, namespacesBuffer.Length); tempNamespacesFile.Close(); // Backup content templates ContentTemplate[] contentTemplates = pagesStorageProvider.GetContentTemplates(); List <ContentTemplateBackup> contentTemplatesBackup = new List <ContentTemplateBackup>(contentTemplates.Length); foreach (ContentTemplate contentTemplate in contentTemplates) { contentTemplatesBackup.Add(new ContentTemplateBackup() { Name = contentTemplate.Name, Content = contentTemplate.Content }); } FileStream tempContentTemplatesFile = File.Create(Path.Combine(tempDir, "ContentTemplates.json")); byte[] contentTemplateBuffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(contentTemplatesBackup)); tempContentTemplatesFile.Write(contentTemplateBuffer, 0, contentTemplateBuffer.Length); tempContentTemplatesFile.Close(); // Backup Snippets Snippet[] snippets = pagesStorageProvider.GetSnippets(); List <SnippetBackup> snippetsBackup = new List <SnippetBackup>(snippets.Length); foreach (Snippet snippet in snippets) { snippetsBackup.Add(new SnippetBackup() { Name = snippet.Name, Content = snippet.Content }); } FileStream tempSnippetsFile = File.Create(Path.Combine(tempDir, "Snippets.json")); byte[] snippetBuffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(snippetsBackup)); tempSnippetsFile.Write(snippetBuffer, 0, snippetBuffer.Length); tempSnippetsFile.Close(); FileStream tempVersionFile = File.Create(Path.Combine(tempDir, "Version.json")); byte[] versionBuffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(generateVersionFile("Pages"))); tempVersionFile.Write(versionBuffer, 0, versionBuffer.Length); tempVersionFile.Close(); using (ZipFile zipFile = new ZipFile()) { zipFile.AddDirectory(tempDir, ""); zipFile.Save(zipFileName); } Directory.Delete(tempDir, true); return(true); }
/// <summary> /// Backups the pages storage provider. /// </summary> /// <param name="zipFileName">The zip file name where to store the backup.</param> /// <param name="pagesStorageProvider">The pages storage provider.</param> /// <returns><c>true</c> if the backup file has been succesfully created.</returns> public static bool BackupPagesStorageProvider(string zipFileName, IPagesStorageProviderV30 pagesStorageProvider) { JavaScriptSerializer javascriptSerializer = new JavaScriptSerializer(); javascriptSerializer.MaxJsonLength = javascriptSerializer.MaxJsonLength * 10; string tempDir = Path.Combine(Environment.GetEnvironmentVariable("TEMP"), Guid.NewGuid().ToString()); Directory.CreateDirectory(tempDir); List<NamespaceInfo> nspaces = new List<NamespaceInfo>(pagesStorageProvider.GetNamespaces()); nspaces.Add(null); List<NamespaceBackup> namespaceBackupList = new List<NamespaceBackup>(nspaces.Count); foreach(NamespaceInfo nspace in nspaces) { // Backup categories CategoryInfo[] categories = pagesStorageProvider.GetCategories(nspace); List<CategoryBackup> categoriesBackup = new List<CategoryBackup>(categories.Length); foreach(CategoryInfo category in categories) { // Add this category to the categoriesBackup list categoriesBackup.Add(new CategoryBackup() { FullName = category.FullName, Pages = category.Pages }); } // Backup NavigationPaths NavigationPath[] navigationPaths = pagesStorageProvider.GetNavigationPaths(nspace); List<NavigationPathBackup> navigationPathsBackup = new List<NavigationPathBackup>(navigationPaths.Length); foreach(NavigationPath navigationPath in navigationPaths) { navigationPathsBackup.Add(new NavigationPathBackup() { FullName = navigationPath.FullName, Pages = navigationPath.Pages }); } // Add this namespace to the namespaceBackup list namespaceBackupList.Add(new NamespaceBackup() { Name = nspace == null ? "" : nspace.Name, DefaultPageFullName = nspace == null ? "" : nspace.DefaultPage.FullName, Categories = categoriesBackup, NavigationPaths = navigationPathsBackup }); // Backup pages (one json file for each page containing a maximum of 100 revisions) PageInfo[] pages = pagesStorageProvider.GetPages(nspace); foreach(PageInfo page in pages) { PageContent pageContent = pagesStorageProvider.GetContent(page); PageBackup pageBackup = new PageBackup(); pageBackup.FullName = page.FullName; pageBackup.CreationDateTime = page.CreationDateTime; pageBackup.LastModified = pageContent.LastModified; pageBackup.Content = pageContent.Content; pageBackup.Comment = pageContent.Comment; pageBackup.Description = pageContent.Description; pageBackup.Keywords = pageContent.Keywords; pageBackup.Title = pageContent.Title; pageBackup.User = pageContent.User; pageBackup.LinkedPages = pageContent.LinkedPages; pageBackup.Categories = (from c in pagesStorageProvider.GetCategoriesForPage(page) select c.FullName).ToArray(); // Backup the 100 most recent versions of the page List<PageRevisionBackup> pageContentBackupList = new List<PageRevisionBackup>(); int[] revisions = pagesStorageProvider.GetBackups(page); for(int i = revisions.Length - 1; i > revisions.Length - 100 && i >= 0; i--) { PageContent pageRevision = pagesStorageProvider.GetBackupContent(page, revisions[i]); PageRevisionBackup pageContentBackup = new PageRevisionBackup() { Revision = revisions[i], Content = pageRevision.Content, Comment = pageRevision.Comment, Description = pageRevision.Description, Keywords = pageRevision.Keywords, Title = pageRevision.Title, User = pageRevision.User, LastModified = pageRevision.LastModified }; pageContentBackupList.Add(pageContentBackup); } pageBackup.Revisions = pageContentBackupList; // Backup draft of the page PageContent draft = pagesStorageProvider.GetDraft(page); if(draft != null) { pageBackup.Draft = new PageRevisionBackup() { Content = draft.Content, Comment = draft.Comment, Description = draft.Description, Keywords = draft.Keywords, Title = draft.Title, User = draft.User, LastModified = draft.LastModified }; } // Backup all messages of the page List<MessageBackup> messageBackupList = new List<MessageBackup>(); foreach(Message message in pagesStorageProvider.GetMessages(page)) { messageBackupList.Add(BackupMessage(message)); } pageBackup.Messages = messageBackupList; FileStream tempFile = File.Create(Path.Combine(tempDir, page.FullName + ".json")); byte[] buffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(pageBackup)); tempFile.Write(buffer, 0, buffer.Length); tempFile.Close(); } } FileStream tempNamespacesFile = File.Create(Path.Combine(tempDir, "Namespaces.json")); byte[] namespacesBuffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(namespaceBackupList)); tempNamespacesFile.Write(namespacesBuffer, 0, namespacesBuffer.Length); tempNamespacesFile.Close(); // Backup content templates ContentTemplate[] contentTemplates = pagesStorageProvider.GetContentTemplates(); List<ContentTemplateBackup> contentTemplatesBackup = new List<ContentTemplateBackup>(contentTemplates.Length); foreach(ContentTemplate contentTemplate in contentTemplates) { contentTemplatesBackup.Add(new ContentTemplateBackup() { Name = contentTemplate.Name, Content = contentTemplate.Content }); } FileStream tempContentTemplatesFile = File.Create(Path.Combine(tempDir, "ContentTemplates.json")); byte[] contentTemplateBuffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(contentTemplatesBackup)); tempContentTemplatesFile.Write(contentTemplateBuffer, 0, contentTemplateBuffer.Length); tempContentTemplatesFile.Close(); // Backup Snippets Snippet[] snippets = pagesStorageProvider.GetSnippets(); List<SnippetBackup> snippetsBackup = new List<SnippetBackup>(snippets.Length); foreach(Snippet snippet in snippets) { snippetsBackup.Add(new SnippetBackup() { Name = snippet.Name, Content = snippet.Content }); } FileStream tempSnippetsFile = File.Create(Path.Combine(tempDir, "Snippets.json")); byte[] snippetBuffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(snippetsBackup)); tempSnippetsFile.Write(snippetBuffer, 0, snippetBuffer.Length); tempSnippetsFile.Close(); FileStream tempVersionFile = File.Create(Path.Combine(tempDir, "Version.json")); byte[] versionBuffer = Encoding.Unicode.GetBytes(javascriptSerializer.Serialize(generateVersionFile("Pages"))); tempVersionFile.Write(versionBuffer, 0, versionBuffer.Length); tempVersionFile.Close(); using(ZipFile zipFile = new ZipFile()) { zipFile.AddDirectory(tempDir, ""); zipFile.Save(zipFileName); } Directory.Delete(tempDir, true); return true; }