コード例 #1
0
        public void ValidateUrls_SitemapNode()
        {
            SitemapNode siteMapNode = new SitemapNode("/categories");

            _urlValidator.ValidateUrls(null, siteMapNode);

            siteMapNode.Url.Should().Be("http://example.org/categories");
        }
コード例 #2
0
ファイル: SitemapApiTests.cs プロジェクト: tkirda/BetterCMS
        private static Mock<ISitemapService> MockSitemapService(SitemapNode[] sitemap)
        {
            var serviceMock = new Mock<ISitemapService>();
            serviceMock
                .Setup(h => h.GetRootNodes(It.IsAny<string>()))
                .Returns(sitemap ?? new SitemapNode[0]);

            return serviceMock;
        }
コード例 #3
0
        private static Mock<IRepository> MockRepository(SitemapNode[] sitemap)
        {
            var mock = new Mock<IRepository>();

            mock.Setup(r => r.First<SitemapNode>(It.IsAny<Guid>()))
                .Returns(sitemap[0]);

            mock.Setup(r => r.AsQueryable<SitemapNode>())
                .Returns(sitemap.AsQueryable());

            return mock;
        }
コード例 #4
0
        public void Serialize_SitemapNode_AllTags()
        {
            SitemapNode sitemapNode = new SitemapNode("abc")
            {
                LastModificationDate = new DateTime(2013, 12, 11, 16, 05, 00, DateTimeKind.Utc),
                ChangeFrequency = ChangeFrequency.Weekly,
                Priority = 0.8M
            };

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-all.xml");
        }
コード例 #5
0
        public void ValidateUrls_SitemapNodeWithImages()
        {
            SitemapNode sitemapNode = new SitemapNode("abc")
            {
                Images = new List<SitemapImage>
                {
                    new SitemapImage("/image.jpg")
                    {
                        License = "/licenses/unlicense/",
                    }
                }
            };

            _urlValidator.ValidateUrls(null, sitemapNode);

            var sitemapImage = sitemapNode.Images[0];

            sitemapImage.Url.Should().Be("http://example.org/image.jpg");
            sitemapImage.License.Should().Be("http://example.org/licenses/unlicense/");
        }
コード例 #6
0
        /// <summary>
        /// Deletes the node (does not archive sitemap).
        /// </summary>
        /// <param name="node">The node.</param>
        /// <param name="deletedNodes">The deleted nodes.</param>
        public void DeleteNode(SitemapNode node, ref IList<SitemapNode> deletedNodes)
        {
            if (node.ChildNodes != null)
            {
                foreach (var childNode in node.ChildNodes)
                {
                    DeleteNode(childNode, ref deletedNodes);
                }
            }

            repository.Delete(node);
            deletedNodes.Add(node);
        }
コード例 #7
0
ファイル: SitemapService.cs プロジェクト: wezmag/BetterCMS
        /// <summary>
        /// Saves the translations.
        /// </summary>
        /// <param name="model">The node model.</param>
        /// <param name="node">The node to save.</param>
        private void SaveTranslations(SaveSitemapNodeModel model, SitemapNode node)
        {
            if (model.Translations != null)
            {
                foreach (var nodeTranslation in node.Translations)
                {
                    if (model.Translations.All(m => m.Id != nodeTranslation.Id))
                    {
                        repository.Delete(nodeTranslation);
                    }
                }

                foreach (var translationModel in model.Translations)
                {
                    var translationToSave = node.Translations.FirstOrDefault(t => t.Id == translationModel.Id);
                    var isNewTranslation = translationToSave == null;
                    if (isNewTranslation)
                    {
                        translationToSave = new Module.Pages.Models.SitemapNodeTranslation { Id = translationModel.Id.GetValueOrDefault(), Node = node };
                    }
                    else if (translationModel.Version > 0)
                    {
                        translationToSave.Version = translationModel.Version;
                    }

                    translationToSave.Language = repository.AsProxy<Language>(translationModel.LanguageId);
                    translationToSave.Macro = translationModel.Macro;
                    translationToSave.Title = translationModel.Title;
                    translationToSave.UsePageTitleAsNodeTitle = translationModel.UsePageTitleAsNodeTitle;
                    translationToSave.Url = translationModel.Url;
                    translationToSave.UrlHash = !string.IsNullOrWhiteSpace(translationToSave.Url) ? translationToSave.Url.UrlHash() : null;

                    if (translationToSave.Node != node)
                    {
                        translationToSave.Node = node;
                    }

                    repository.Save(translationToSave);
                }
            }
        }
コード例 #8
0
ファイル: NodeService.cs プロジェクト: k4gdw/BetterCMS
        /// <summary>
        /// Puts the specified request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>
        ///   <c>PutNodeResponse</c> with create or updated node id.
        /// </returns>
        public PutNodeResponse Put(PutNodeRequest request)
        {
            var sitemapFuture = repository.AsQueryable<Module.Pages.Models.Sitemap>(e => e.Id == request.SitemapId)
                .FetchMany(f => f.AccessRules)
                .ToFuture();

            var node =
                repository.AsQueryable<SitemapNode>(e => e.Sitemap.Id == request.SitemapId && e.Id == request.Id)
                    .FetchMany(n => n.Translations)
                    .ToFuture()
                    .ToList()
                    .FirstOrDefault();

            var sitemap = sitemapFuture.ToList().FirstOne();

            if (cmsConfiguration.Security.AccessControlEnabled)
            {
                accessControlService.DemandAccess(sitemap, securityService.GetCurrentPrincipal(), AccessLevel.ReadWrite);
            }

            var isNew = node == null;
            if (isNew)
            {
                node = new SitemapNode
                              {
                                  Id = request.Id.GetValueOrDefault(),
                                  Translations = new List<Module.Pages.Models.SitemapNodeTranslation>()
                              };
            }
            else if (request.Data.Version > 0)
            {
                node.Version = request.Data.Version;
            }

            unitOfWork.BeginTransaction();

            sitemapService.ArchiveSitemap(sitemap.Id);

            node.Sitemap = sitemap;
            node.Title = request.Data.Title;
            if (request.Data.PageId.GetValueOrDefault() != default(Guid))
            {
                node.Page = repository.AsProxy<PageProperties>(request.Data.PageId.GetValueOrDefault());
                node.Url = null;
                node.UrlHash = null;
            }
            else
            {
                node.Page = null;
                node.Url = request.Data.Url;
                node.UrlHash = node.Url.UrlHash();
            }

            node.ParentNode = request.Data.ParentId.GetValueOrDefault() != default(Guid)
                                  ? repository.AsProxy<SitemapNode>(request.Data.ParentId.GetValueOrDefault())
                                  : null;

            node.DisplayOrder = request.Data.DisplayOrder;
            node.Macro = request.Data.Macro;
            node.UsePageTitleAsNodeTitle = request.Data.UsePageTitleAsNodeTitle;

            repository.Save(node);

            UpdateTranslations(node, request.Data);

            unitOfWork.Commit();

            // Fire events.
            if (isNew)
            {
                Events.SitemapEvents.Instance.OnSitemapNodeCreated(node);
            }
            else
            {
                Events.SitemapEvents.Instance.OnSitemapNodeUpdated(node);
            }

            Events.SitemapEvents.Instance.OnSitemapUpdated(sitemap);

            return new PutNodeResponse { Data = node.Id };
        }
コード例 #9
0
        /// <summary>
        /// Gets the page translation from page translations list, which is most compatible with node translation:
        /// if page translation exists, take page translations
        /// if page translation does not exist, take default language translation
        /// if default language translation does not exist, take node's data
        /// </summary>
        /// <param name="pageTranslations">The page translations.</param>
        /// <param name="nodeLanguage">The node language.</param>
        /// <param name="node">The node.</param>
        /// <returns></returns>
        private PageTranslationViewModel GetPageTranslation(IEnumerable <PageTranslationViewModel> pageTranslations, Guid nodeLanguage, SitemapNode node, Page page)
        {
            var pageTranslation = pageTranslations.FirstOrDefault(p => p.LanguageId == nodeLanguage);

            if (pageTranslation == null)
            {
                pageTranslation = pageTranslations.FirstOrDefault(p => !p.LanguageId.HasValue);
            }

            if (pageTranslation == null && page != null)
            {
                pageTranslation = new PageTranslationViewModel
                {
                    Title       = page.Title,
                    PageUrl     = page.PageUrl,
                    PageUrlHash = page.PageUrlHash
                };
            }

            if (pageTranslation == null)
            {
                pageTranslation = new PageTranslationViewModel
                {
                    Title       = node.Title,
                    PageUrl     = node.Url,
                    PageUrlHash = node.UrlHash
                };
            }

            return(pageTranslation);
        }
コード例 #10
0
 private string SerializeSitemap(SitemapNode sitemapNode)
 {
     return serializer.Serialize(new SitemapModel(new List<SitemapNode> { sitemapNode }));
 }
コード例 #11
0
        public void Serialize_SitemapNode_VideoAllTags()
        {
            SitemapNode sitemapNode = new SitemapNode("http://www.example.com/videos/some_video_landing_page.html")
            {
                Video = new SitemapVideo("Grilling steaks for summer", "Alkis shows you how to get perfectly done steaks every time",
                                         "http://www.example.com/thumbs/123.jpg", "http://www.example.com/video123.flv")
                {
                    PlayerUrl = new VideoPlayerUrl("http://www.example.com/videoplayer.swf?video=123")
                    {
                        AllowEmbed = YesNo.Yes,
                        Autoplay = "ap=1"
                    },
                    Duration = 600,
                    ExpirationDate = new DateTime(2014, 12, 16, 16, 56, 0, DateTimeKind.Utc),
                    Rating = 4.2M,
                    ViewCount = 12345,
                    PublicationDate = new DateTime(2014, 12, 16, 17, 51, 0, DateTimeKind.Utc),
                    FamilyFriendly = YesNo.No,
                    Tags = new[] { "steak", "summer", "outdoor" },
                    Category = "Grilling",
                    Restriction = new VideoRestriction("IE GB US CA", VideoRestrictionRelationship.Allow),
                    Gallery = new VideoGallery("http://cooking.example.com")
                    {
                        Title = "Cooking Videos"
                    },
                    Prices = new List<VideoPrice>
                    {
                        new VideoPrice("EUR",1.99M),
                        new VideoPrice("TRY",5.99M){Type = VideoPurchaseOption.Rent},
                        new VideoPrice("USD",2.99M){Resolution = VideoPurchaseResolution.Hd}
                    },
                    RequiresSubscription = YesNo.No,
                    Uploader = new VideoUploader("GrillyMcGrillerson")
                    {
                        Info = "http://www.example.com/users/grillymcgrillerson"
                    },
                    Platform = "web mobile",
                    Live = YesNo.Yes
                }
            };

            _namespaces.Add(Namespaces.VideoPrefix, Namespaces.Video);

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-video-all.xml");
        }
コード例 #12
0
        public void Serialize_SitemapNode_Mobile()
        {
            SitemapNode sitemapNode = new SitemapNode("http://mobile.example.com/article100.html") { Mobile = new SitemapMobile() };

            _namespaces.Add(Namespaces.MobilePrefix, Namespaces.Mobile);

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-mobile.xml");
        }
コード例 #13
0
        public Task <SitemapNode> CreateAsync(SitemapNode sitemapNode)
        {
            _sitemapNodes.Add(sitemapNode);

            return(Task.FromResult(sitemapNode));
        }
コード例 #14
0
 public Task <SitemapNode> UpdateAsync(Guid id, SitemapNode sitemapNode)
 {
     return(Task.FromResult(sitemapNode));
 }
コード例 #15
0
        private static SitemapNode JTokenToSitemapNodeConvert(JToken data)
        {
            if (data == null)
            {
                return(null);
            }

            SitemapNode model = new SitemapNode();

            model.Id        = new Guid(data["id"].ToString());
            model.ParentId  = (data["parent_id"] != null && data["parent_id"].Value <string>() != null) ? new Guid(data["parent_id"].Value <string>()) : (Guid?)null;
            model.Name      = (string)data["name"];
            model.Label     = (string)data["label"];
            model.Url       = (string)data["url"];
            model.IconClass = (string)data["icon_class"];
            model.Type      = (SitemapNodeType)((int)data["type"]);
            model.EntityId  = (Guid?)data["entity_id"];
            model.Weight    = (int)data["weight"];

            model.GroupName = (string)null;

            if (!string.IsNullOrWhiteSpace((string)data["label_translations"]))
            {
                model.LabelTranslations = JsonConvert.DeserializeObject <List <TranslationResource> >((string)data["label_translations"]);
            }
            else
            {
                model.LabelTranslations = new List <TranslationResource>();
            }

            model.Access = new List <Guid>();
            if (data["access_roles"] != null)
            {
                foreach (var rId in data["access_roles"].AsJEnumerable())
                {
                    model.Access.Add(new Guid(rId.ToString()));
                }
            }

            model.EntityListPages = new List <Guid>();
            if (data["entity_list_pages"] != null)
            {
                foreach (var rId in data["entity_list_pages"].AsJEnumerable())
                {
                    model.EntityListPages.Add(new Guid(rId.ToString()));
                }
            }

            model.EntityCreatePages = new List <Guid>();
            if (data["entity_create_pages"] != null)
            {
                foreach (var rId in data["entity_create_pages"].AsJEnumerable())
                {
                    model.EntityCreatePages.Add(new Guid(rId.ToString()));
                }
            }

            model.EntityDetailsPages = new List <Guid>();
            if (data["entity_details_pages"] != null)
            {
                foreach (var rId in data["entity_details_pages"].AsJEnumerable())
                {
                    model.EntityDetailsPages.Add(new Guid(rId.ToString()));
                }
            }

            model.EntityManagePages = new List <Guid>();
            if (data["entity_manage_pages"] != null)
            {
                foreach (var rId in data["entity_manage_pages"].AsJEnumerable())
                {
                    model.EntityManagePages.Add(new Guid(rId.ToString()));
                }
            }


            return(model);
        }
コード例 #16
0
        private static SitemapNode DataRowToSitemapNodeConvert(DataRow data)
        {
            if (data == null)
            {
                return(null);
            }

            SitemapNode model = new SitemapNode();

            model.Id        = new Guid(data["id"].ToString());
            model.ParentId  = data["parent_id"] != DBNull.Value ? new Guid(data["parent_id"].ToString()) : (Guid?)null;
            model.Name      = (string)data["name"];
            model.Label     = (string)data["label"];
            model.Url       = (string)data["url"];
            model.IconClass = (string)data["icon_class"];
            model.Type      = (SitemapNodeType)((int)data["type"]);
            model.EntityId  = data["entity_id"] == DBNull.Value ? null : (Guid?)data["entity_id"];
            model.Weight    = (int)data["weight"];

            model.GroupName = (string)null;

            if (!string.IsNullOrWhiteSpace((string)data["label_translations"]))
            {
                model.LabelTranslations = JsonConvert.DeserializeObject <List <TranslationResource> >((string)data["label_translations"]);
            }
            else
            {
                model.LabelTranslations = new List <TranslationResource>();
            }

            model.Access = new List <Guid>();
            if (data["access_roles"] != null)
            {
                model.Access.AddRange((Guid[])data["access_roles"]);
            }

            model.EntityListPages = new List <Guid>();
            if (data["entity_list_pages"] != null)
            {
                model.EntityListPages.AddRange((Guid[])data["entity_list_pages"]);
            }

            model.EntityCreatePages = new List <Guid>();
            if (data["entity_create_pages"] != null)
            {
                model.EntityCreatePages.AddRange((Guid[])data["entity_create_pages"]);
            }

            model.EntityDetailsPages = new List <Guid>();
            if (data["entity_details_pages"] != null)
            {
                model.EntityDetailsPages.AddRange((Guid[])data["entity_details_pages"]);
            }

            model.EntityManagePages = new List <Guid>();
            if (data["entity_manage_pages"] != null)
            {
                model.EntityManagePages.AddRange((Guid[])data["entity_manage_pages"]);
            }

            return(model);
        }
コード例 #17
0
ファイル: NodeService.cs プロジェクト: team4rent/BetterCMS
        /// <summary>
        /// Puts the specified request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>
        ///   <c>PutNodeResponse</c> with create or updated node id.
        /// </returns>
        public PutNodeResponse Put(PutNodeRequest request)
        {
            var sitemapFuture = repository.AsQueryable <Module.Pages.Models.Sitemap>(e => e.Id == request.SitemapId)
                                .FetchMany(f => f.AccessRules)
                                .ToFuture();

            var node =
                repository.AsQueryable <SitemapNode>(e => e.Sitemap.Id == request.SitemapId && e.Id == request.Id)
                .FetchMany(n => n.Translations)
                .ToFuture()
                .ToList()
                .FirstOrDefault();

            var sitemap = sitemapFuture.ToList().FirstOne();

            if (cmsConfiguration.Security.AccessControlEnabled)
            {
                accessControlService.DemandAccess(sitemap, securityService.GetCurrentPrincipal(), AccessLevel.ReadWrite);
            }

            var isNew = node == null;

            if (isNew)
            {
                node = new SitemapNode
                {
                    Id           = request.Id.GetValueOrDefault(),
                    Translations = new List <Module.Pages.Models.SitemapNodeTranslation>()
                };
            }
            else if (request.Data.Version > 0)
            {
                node.Version = request.Data.Version;
            }

            unitOfWork.BeginTransaction();

            sitemapService.ArchiveSitemap(sitemap.Id);

            node.Sitemap = sitemap;
            node.Title   = request.Data.Title;
            if (request.Data.PageId.GetValueOrDefault() != default(Guid))
            {
                node.Page    = repository.AsProxy <PageProperties>(request.Data.PageId.GetValueOrDefault());
                node.Url     = null;
                node.UrlHash = null;
            }
            else
            {
                node.Page    = null;
                node.Url     = request.Data.Url;
                node.UrlHash = node.Url.UrlHash();
            }

            node.ParentNode = request.Data.ParentId.GetValueOrDefault() != default(Guid)
                                  ? repository.AsProxy <SitemapNode>(request.Data.ParentId.GetValueOrDefault())
                                  : null;

            node.DisplayOrder            = request.Data.DisplayOrder;
            node.Macro                   = request.Data.Macro;
            node.UsePageTitleAsNodeTitle = request.Data.UsePageTitleAsNodeTitle;

            repository.Save(node);

            UpdateTranslations(node, request.Data);

            unitOfWork.Commit();

            // Fire events.
            if (isNew)
            {
                Events.SitemapEvents.Instance.OnSitemapNodeCreated(node);
            }
            else
            {
                Events.SitemapEvents.Instance.OnSitemapNodeUpdated(node);
            }

            Events.SitemapEvents.Instance.OnSitemapUpdated(sitemap);

            return(new PutNodeResponse {
                Data = node.Id
            });
        }
コード例 #18
0
 /// <summary>
 /// Adds the translations.
 /// </summary>
 /// <param name="archivedNode">The archived node.</param>
 /// <param name="node">The node.</param>
 /// <returns>Archived node translation list.</returns>
 private static IList<SitemapNodeTranslation> AddTranslations(ArchivedNode archivedNode, SitemapNode node)
 {
     var translations = new List<SitemapNodeTranslation>();
     if (archivedNode.Translations != null)
     {
         foreach (var translation in archivedNode.Translations)
         {
             translations.Add(new SitemapNodeTranslation
             {
                 Node = node,
                 Language = new Language() { Id = translation.LanguageId },
                 Title = translation.Title,
                 Url = translation.Url,
                 UsePageTitleAsNodeTitle = translation.UsePageTitleAsNodeTitle,
                 Macro = translation.Macro
             });
         }
     }
     return translations;
 }
コード例 #19
0
        /// <summary>
        /// Gets the root node.
        /// </summary>
        /// <param name="node">The node.</param>
        /// <returns>Node that has no parent.</returns>
        private SitemapNode GetRootNode(SitemapNode node)
        {
            if (node.ParentNode != null)
            {
                return GetRootNode(node.ParentNode);
            }

            return node;
        }
コード例 #20
0
ファイル: DefaultPageService.cs プロジェクト: namld/BetterCMS
        /// <summary>
        /// Gets the page translation from page translations list, which is most compatible with node translation:
        /// if page translation exists, take page translations
        /// if page translation does not exist, take default language translation
        /// if default language translation does not exist, take node's data
        /// </summary>
        /// <param name="pageTranslations">The page translations.</param>
        /// <param name="nodeLanguage">The node language.</param>
        /// <param name="node">The node.</param>
        /// <returns></returns>
        private PageTranslationViewModel GetPageTranslation(IEnumerable<PageTranslationViewModel> pageTranslations, Guid nodeLanguage, SitemapNode node, Page page)
        {
            var pageTranslation = pageTranslations.FirstOrDefault(p => p.LanguageId == nodeLanguage);

            if (pageTranslation == null)
            {
                pageTranslation = pageTranslations.FirstOrDefault(p => !p.LanguageId.HasValue);
            }

            if (pageTranslation == null && page != null)
            {
                pageTranslation = new PageTranslationViewModel
                                  {
                                      Title = page.Title,
                                      PageUrl = page.PageUrl,
                                      PageUrlHash = page.PageUrlHash
                                  };
            }

            if (pageTranslation == null)
            {
                pageTranslation = new PageTranslationViewModel
                                  {
                                      Title = node.Title,
                                      PageUrl = node.Url,
                                      PageUrlHash = node.UrlHash
                                  };
            }

            return pageTranslation;
        }
コード例 #21
0
        /// <summary>
        /// Saves the node.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="version">The version.</param>
        /// <param name="url">The URL.</param>
        /// <param name="title">The title.</param>
        /// <param name="displayOrder">The display order.</param>
        /// <param name="parentId">The parent id.</param>
        /// <param name="isDeleted">if set to <c>true</c> [is deleted].</param>
        /// <param name="parentNode">The parent node.</param>
        /// <returns>
        /// Updated or newly created sitemap node.
        /// </returns>
        public SitemapNode SaveNode(Guid id, int version, string url, string title, int displayOrder, Guid parentId, bool isDeleted = false, SitemapNode parentNode = null)
        {
            var node = id.HasDefaultValue()
                ? new SitemapNode()
                : repository.First<SitemapNode>(id);

            var oldUrl = node.Url;

            if (isDeleted)
            {
                if (!node.Id.HasDefaultValue())
                {
                    repository.Delete(node);
                    UpdatedPageProperties(id.HasDefaultValue(), node.IsDeleted, oldUrl, url);
                }
            }
            else
            {
                node.Version = version;
                node.Title = title;
                node.Url = url;
                node.DisplayOrder = displayOrder;
                if (parentNode != null && !parentNode.Id.HasDefaultValue())
                {
                    node.ParentNode = parentNode;
                }
                else
                {
                    node.ParentNode = parentId.HasDefaultValue()
                        ? null
                        : repository.First<SitemapNode>(parentId);
                }

                repository.Save(node);
                UpdatedPageProperties(id.HasDefaultValue(), node.IsDeleted, oldUrl, url);
            }

            return node;
        }
コード例 #22
0
        public void Serialize_SitemapNode_NewsReqiredTags()
        {
            SitemapNode sitemapNode = new SitemapNode("http://www.example.org/business/article55.html")
            {
                News = new SitemapNews(new NewsPublication("The Example Times", "en"), new DateTime(2014, 11, 5, 0, 0, 0, DateTimeKind.Utc), "Companies A, B in Merger Talks")
            };

            _namespaces.Add(Namespaces.NewsPrefix, Namespaces.News);

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-news-required.xml");
        }
コード例 #23
0
 /// <summary>
 /// Deletes the node without page update.
 /// </summary>
 /// <param name="node">The node.</param>
 public void DeleteNodeWithoutPageUpdate(SitemapNode node)
 {
     repository.Delete(node);
 }
コード例 #24
0
        private dynamic BuildNodeShape(SitemapNode node)
        {
            var childShapes = node.Children.Values.Select(BuildNodeShape).ToList();

            return(Shape.Sitemap_Node(Title: node.Title, Url: node.Url, Children: childShapes));
        }
コード例 #25
0
        public void ValidateUrls_SitemapNodeWithVideo()
        {
            SitemapNode sitemapNode = new SitemapNode("/some_video_landing_page.html")
            {
                Video = new SitemapVideo
                {
                    ContentUrl = "/video123.flv",
                    ThumbnailUrl = "/thumbs/123.jpg",
                    PlayerUrl = new VideoPlayerUrl
                    {
                        Url = "/videoplayer.swf?video=123",
                    },
                    Gallery = new VideoGallery
                    {
                        Url = "/gallery-1",
                    },
                    Uploader = new VideoUploader
                    {
                        Info = "/users/grillymcgrillerson"
                    }
                }
            };

            _urlValidator.ValidateUrls(null, sitemapNode);

            sitemapNode.Video.ContentUrl.Should().Be("http://example.org/video123.flv");
            sitemapNode.Video.ThumbnailUrl.Should().Be("http://example.org/thumbs/123.jpg");
            sitemapNode.Video.PlayerUrl.Url.Should().Be("http://example.org/videoplayer.swf?video=123");
            sitemapNode.Video.Gallery.Url.Should().Be("http://example.org/gallery-1");
            sitemapNode.Video.Uploader.Info.Should().Be("http://example.org/users/grillymcgrillerson");
        }
コード例 #26
0
        /// <summary>
        /// Saves the translations.
        /// </summary>
        /// <param name="translationUpdatedInDb"></param>
        /// <param name="sitemapNode">The sitemap node.</param>
        /// <param name="node">The node.</param>
        /// <param name="translationList"></param>
        private void SaveTranslations(out bool translationUpdatedInDb, SitemapNode sitemapNode, SitemapNodeViewModel node, List <SitemapNodeTranslation> translationList)
        {
            translationUpdatedInDb = false;
            var translations = translationList == null
                                    ? Repository.AsQueryable <SitemapNodeTranslation>().Where(translation => translation.Node.Id == sitemapNode.Id).ToList()
                                    : translationList.Where(translation => translation.Node.Id == sitemapNode.Id).ToList();

            foreach (var model in node.Translations)
            {
                var saveIt      = false;
                var translation = translations.FirstOrDefault(t => t.Id == model.Id);
                if (translation == null)
                {
                    translation = translations.FirstOrDefault(t => t.Language.Id == model.LanguageId);
                    if (translation != null)
                    {
                        throw new InvalidDataException(string.Format("Node {0} translation to language {1} already exists.", sitemapNode.Id, model.LanguageId));
                    }

                    saveIt      = true;
                    translation = new SitemapNodeTranslation
                    {
                        Node     = sitemapNode,
                        Language = Repository.AsProxy <Language>(model.LanguageId),
                        Title    = model.Title,
                        Macro    = CmsConfiguration.EnableMacros ? model.Macro : null,
                        UsePageTitleAsNodeTitle = model.UsePageTitleAsNodeTitle
                    };

                    if (sitemapNode.Page == null)
                    {
                        translation.UsePageTitleAsNodeTitle = false;
                        translation.Url     = model.Url;
                        translation.UrlHash = model.Url.UrlHash();
                    }
                }
                else
                {
                    if (translation.Version != model.Version)
                    {
                        throw new ConcurrentDataException(translation);
                    }

                    if (translation.Title != model.Title)
                    {
                        saveIt            = true;
                        translation.Title = model.Title;
                    }

                    if (CmsConfiguration.EnableMacros && translation.Macro != model.Macro)
                    {
                        saveIt            = true;
                        translation.Macro = model.Macro;
                    }

                    if (sitemapNode.Page == null)
                    {
                        if (translation.Url != model.Url || translation.UsePageTitleAsNodeTitle)
                        {
                            saveIt = true;
                            translation.UsePageTitleAsNodeTitle = false;
                            translation.Url     = model.Url;
                            translation.UrlHash = model.Url.UrlHash();
                        }
                    }
                    else
                    {
                        if (translation.Url != null || translation.UrlHash != null)
                        {
                            saveIt              = true;
                            translation.Url     = null;
                            translation.UrlHash = null;
                        }
                        if (translation.UsePageTitleAsNodeTitle != model.UsePageTitleAsNodeTitle)
                        {
                            saveIt = true;
                            translation.UsePageTitleAsNodeTitle = model.UsePageTitleAsNodeTitle;
                        }
                    }
                }

                if (saveIt)
                {
                    Repository.Save(translation);
                    translationUpdatedInDb = true;
                }
            }
        }
コード例 #27
0
        public ActionResult SiteMapXml()
        {
            DateTime           value;
            string             str;
            string             empty;
            string             str1;
            List <SitemapNode> sitemapNodes = new List <SitemapNode>();
            string             item         = ConfigurationManager.AppSettings["SiteName"];

            sitemapNodes.Add(new SitemapNode(string.Empty)
            {
                Url             = item,
                ChangeFrequency = new ChangeFrequency?(ChangeFrequency.Always),
                Priority        = new decimal?(1)
            });
            IEnumerable <MenuLink> menuLinks = this._menuLinkService.FindBy((MenuLink x) => x.Status == 1, true);

            if (menuLinks.IsAny <MenuLink>())
            {
                foreach (MenuLink menuLink in menuLinks)
                {
                    SitemapNode sitemapNode = new SitemapNode(string.Empty)
                    {
                        Url             = base.Url.Action("GetContent", "Menu", new { menu = menuLink.SeoUrl }, base.Request.Url.Scheme),
                        ChangeFrequency = new ChangeFrequency?(ChangeFrequency.Daily),
                        Priority        = new decimal?(new decimal(8, 0, 0, false, 1))
                    };
                    if (menuLink.UpdatedDate.HasValue)
                    {
                        value = menuLink.UpdatedDate.Value;
                        str1  = value.ToString("yyyy-MM-dd");
                    }
                    else
                    {
                        str1 = string.Empty;
                    }
                    sitemapNode.LastModificationDate = str1;
                    sitemapNodes.Add(sitemapNode);
                }
            }
            IOrderedEnumerable <Post> posts =
                from x in this._postService.FindBy((Post x) => x.Status == 1, true)
                orderby x.CreatedDate descending
                select x;

            if (posts.IsAny <Post>())
            {
                foreach (Post post in posts)
                {
                    SitemapNode sitemapNode1 = new SitemapNode(string.Empty)
                    {
                        Url             = base.Url.Action("PostDetail", "Post", new { seoUrl = post.SeoUrl }, base.Request.Url.Scheme),
                        ChangeFrequency = new ChangeFrequency?(ChangeFrequency.Daily),
                        Priority        = new decimal?(new decimal(5, 0, 0, false, 1))
                    };
                    if (post.UpdatedDate.HasValue)
                    {
                        value = post.UpdatedDate.Value;
                        empty = value.ToString("yyyy-MM-dd");
                    }
                    else
                    {
                        empty = string.Empty;
                    }
                    sitemapNode1.LastModificationDate = empty;
                    sitemapNodes.Add(sitemapNode1);
                }
            }
            IOrderedEnumerable <News> news =
                from x in this._newsService.FindBy((News x) => x.Status == 1, true)
                orderby x.CreatedDate descending
                select x;

            if (news.IsAny <News>())
            {
                foreach (News news1 in news)
                {
                    SitemapNode sitemapNode2 = new SitemapNode(string.Empty)
                    {
                        Url             = base.Url.Action("NewsDetail", "News", new { seoUrl = news1.SeoUrl }, base.Request.Url.Scheme),
                        ChangeFrequency = new ChangeFrequency?(ChangeFrequency.Daily),
                        Priority        = new decimal?(new decimal(5, 0, 0, false, 1))
                    };
                    if (news1.UpdatedDate.HasValue)
                    {
                        value = news1.UpdatedDate.Value;
                        str   = value.ToString("yyyy-MM-dd");
                    }
                    else
                    {
                        str = string.Empty;
                    }
                    sitemapNode2.LastModificationDate = str;
                    sitemapNodes.Add(sitemapNode2);
                }
            }
            return(this._sitemapProvider.CreateSitemap(new SitemapModel(sitemapNodes)));
        }
コード例 #28
0
        /// <summary>
        /// Deletes the node.
        /// </summary>
        /// <param name="node">The node.</param>
        private void DeleteNode(SitemapNode node)
        {
            foreach (var childNode in node.ChildNodes)
            {
                DeleteNode(childNode);
            }

            repository.Delete(node);

            UpdatedPageProperties(false, true, node.Url, string.Empty);
        }
コード例 #29
0
        private static void Patch20181215(EntityManager entMan, EntityRelationManager relMan, RecordManager recMan)
        {
            var appSrv = new AppService();

            #region << Create SDK App >>
            var sdkApp = new App()
            {
                Id          = WEBVELLA_SDK_APP_ID,
                Name        = WEBVELLA_SDK_APP_NAME,
                Label       = "Software Development Kit",
                Description = "SDK & Development Tools",
                IconClass   = "ti-settings",
                Author      = "WebVella",
                Weight      = 1000,
                Color       = "#dc3545",
                Access      = new List <Guid>()
                {
                    SystemIds.AdministratorRoleId
                }
            };
            appSrv.CreateApplication(sdkApp.Id, sdkApp.Name, sdkApp.Label, sdkApp.Description, sdkApp.IconClass, sdkApp.Author, sdkApp.Color,
                                     sdkApp.Weight, sdkApp.Access, DbContext.Current.Transaction);

            #endregion

            #region << Create App Sitemap Areas>>
            {
                var appArea = new SitemapArea()
                {
                    Id          = WEBVELLA_SDK_APP_AREA_DESIGN_ID,
                    Name        = "objects",
                    Label       = "Objects",
                    Description = "Schema and Layout management",
                    IconClass   = "ti-ruler-pencil",
                    Weight      = 1,
                    Color       = "#2196F3"
                };
                appSrv.CreateArea(appArea.Id, WEBVELLA_SDK_APP_ID, appArea.Name, appArea.Label, appArea.LabelTranslations, appArea.Description, appArea.DescriptionTranslations,
                                  appArea.IconClass, appArea.Color, appArea.Weight, appArea.ShowGroupNames, appArea.Access, DbContext.Current.Transaction);
            }
            {
                var appArea = new SitemapArea()
                {
                    Id          = WEBVELLA_SDK_APP_AREA_ACCESS_ID,
                    Name        = "access",
                    Label       = "Access",
                    Description = "Manage users and roles",
                    IconClass   = "ti-key",
                    Weight      = 2,
                    Color       = "#673AB7"
                };
                appSrv.CreateArea(appArea.Id, WEBVELLA_SDK_APP_ID, appArea.Name, appArea.Label, appArea.LabelTranslations, appArea.Description, appArea.DescriptionTranslations,
                                  appArea.IconClass, appArea.Color, appArea.Weight, appArea.ShowGroupNames, appArea.Access, DbContext.Current.Transaction);
            }
            {
                var appArea = new SitemapArea()
                {
                    Id          = WEBVELLA_SDK_APP_AREA_SERVER_ID,
                    Name        = "server",
                    Label       = "Server",
                    Description = "Background jobs and maintenance",
                    IconClass   = "ti-server",
                    Weight      = 3,
                    Color       = "#F44336"
                };
                appSrv.CreateArea(appArea.Id, WEBVELLA_SDK_APP_ID, appArea.Name, appArea.Label, appArea.LabelTranslations, appArea.Description, appArea.DescriptionTranslations,
                                  appArea.IconClass, appArea.Color, appArea.Weight, appArea.ShowGroupNames, appArea.Access, DbContext.Current.Transaction);
            }
            #endregion

            #region Create Sitemap Nodes >>
            //Design
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("5b132ac0-703e-4342-a13d-c7ff93d07a4f"),
                    Name      = "page",
                    Label     = "Pages",
                    IconClass = "ti-file",
                    Url       = "/sdk/objects/page/l",
                    Weight    = 1,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_DESIGN_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("9b30bf96-67d9-4d20-bf07-e6ef1c44d553"),
                    Name      = "data_source",
                    Label     = "Data sources",
                    IconClass = "ti-cloud-down",
                    Url       = "/sdk/objects/data_source/l/list",
                    Weight    = 2,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_DESIGN_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("02d75ea5-8fc6-4f95-9933-0eed6b36ca49"),
                    Name      = "application",
                    Label     = "Applications",
                    IconClass = "ti-layout-grid2",
                    Url       = "/sdk/objects/application/l/list",
                    Weight    = 3,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_DESIGN_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("dfa7ec55-b55b-404f-b251-889f1d81df29"),
                    Name      = "entity",
                    Label     = "Entities",
                    IconClass = "ti-server",
                    Url       = "/sdk/objects/entity/l",
                    Weight    = 4,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_DESIGN_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("4571de62-a817-4a94-8b49-4b230cc0d2ad"),
                    Name      = "codegen",
                    Label     = "Code generation",
                    IconClass = "fa fa-code",
                    Url       = "/sdk/objects/codegen/a/codegen",
                    Weight    = 10,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_DESIGN_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }

            //Access
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("ff578868-817e-433d-988f-bb8d4e9baa0d"),
                    Name      = "user",
                    Label     = "Users",
                    IconClass = "ti-user",
                    Url       = "/sdk/access/user/l/list",
                    Weight    = 1,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_ACCESS_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("75567fc4-70e1-41a9-9e32-2e5b62636598"),
                    Name      = "role",
                    Label     = "Roles",
                    IconClass = "fa fa-key",
                    Url       = "/sdk/access/role/l/list",
                    Weight    = 2,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_ACCESS_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }

            //Server
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("396ec481-3b2e-461c-b514-743fb3252003"),
                    Name      = "job",
                    Label     = "Background jobs",
                    IconClass = "ti-settings",
                    Url       = "/sdk/server/job/l/plan",
                    Weight    = 1,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_SERVER_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }
            {
                var appNode = new SitemapNode()
                {
                    Id        = new Guid("78a29ac8-d2aa-4379-b990-08f7f164a895"),
                    Name      = "log",
                    Label     = "Logs",
                    IconClass = "ti-notepad",
                    Url       = "/sdk/server/log/l/list",
                    Weight    = 2,
                    Type      = SitemapNodeType.Url
                };
                appSrv.CreateAreaNode(appNode.Id, WEBVELLA_SDK_APP_AREA_SERVER_ID, appNode.Name, appNode.Label, appNode.LabelTranslations, appNode.IconClass, appNode.Url,
                                      (int)appNode.Type, appNode.EntityId, appNode.Weight, appNode.Access, DbContext.Current.Transaction);
            }
            #endregion
        }
コード例 #30
0
 private string SerializeSitemap(SitemapNode sitemapNode)
 {
     return(Serialize(new SitemapModel(new[] { sitemapNode })));
 }
コード例 #31
0
 /// <summary>
 /// Deletes the node without page update.
 /// </summary>
 /// <param name="node">The node.</param>
 public void DeleteNodeWithoutPageUpdate(SitemapNode node)
 {
     repository.Delete(node);
 }
コード例 #32
0
        /// <summary>
        /// Saves the node.
        /// </summary>
        /// <param name="id">The id.</param>
        /// <param name="version">The version.</param>
        /// <param name="url">The URL.</param>
        /// <param name="title">The title.</param>
        /// <param name="displayOrder">The display order.</param>
        /// <param name="parentId">The parent id.</param>
        /// <param name="isDeleted">if set to <c>true</c> [is deleted].</param>
        /// <param name="parentNode">The parent node.</param>
        /// <returns>
        /// Updated or newly created sitemap node.
        /// </returns>
        public SitemapNode SaveNode(Guid id, int version, string url, string title, int displayOrder, Guid parentId, bool isDeleted = false, SitemapNode parentNode = null)
        {
            var node = id.HasDefaultValue()
                ? new SitemapNode()
                : repository.First <SitemapNode>(id);

            var oldUrl = node.Url;

            if (isDeleted)
            {
                if (!node.Id.HasDefaultValue())
                {
                    repository.Delete(node);
                    UpdatedPageProperties(id.HasDefaultValue(), node.IsDeleted, oldUrl, url);
                }
            }
            else
            {
                node.Version      = version;
                node.Title        = title;
                node.Url          = url;
                node.DisplayOrder = displayOrder;
                if (parentNode != null && !parentNode.Id.HasDefaultValue())
                {
                    node.ParentNode = parentNode;
                }
                else
                {
                    node.ParentNode = parentId.HasDefaultValue()
                        ? null
                        : repository.First <SitemapNode>(parentId);
                }

                repository.Save(node);
                UpdatedPageProperties(id.HasDefaultValue(), node.IsDeleted, oldUrl, url);
            }

            return(node);
        }
コード例 #33
0
        public SitemapNode GetSitemapRoot()
        {
            // Create dictionary indexed by routes
            var routeSettings = GetRoutes().ToDictionary(
                k => k.Slug,
                v => v);

            var sitemapRoot = _cacheManager.Get("WebAdvanced.Sitemap.Root", ctx => {
                ctx.Monitor(_signals.When("WebAdvanced.Sitemap.Refresh"));

                var sitemap = new SitemapNode("Root", null);

                foreach (var provider in _routeProviders.OrderByDescending(p => p.Priority))
                {
                    var validRoutes = provider.GetDisplayRoutes()
                                      .Where(r => _routeFilters.All(filter => filter.AllowUrl(r.Url)))
                                      .AsEnumerable();

                    foreach (var item in validRoutes)
                    {
                        var alias        = item.UrlAlias ?? item.Url;
                        var slugs        = alias.Split('/').ToArray();
                        var routeSetting = routeSettings.ContainsKey(slugs[0]) ? routeSettings[slugs[0]] : null;

                        // Only add this to the sitemap if the route settings exist and accept it
                        if (routeSetting == null || !routeSetting.Active || slugs.Count() > routeSetting.DisplayLevels)
                        {
                            continue;
                        }

                        int i = 0;
                        SitemapNode currentNode = sitemap;
                        while (i < slugs.Length)
                        {
                            var isLeaf = i == slugs.Length - 1;
                            if (!currentNode.Children.ContainsKey(slugs[i]))
                            {
                                string name = isLeaf ? item.Title : slugs[i].SlugToTitle();
                                string url  = isLeaf ? item.Url : null;
                                currentNode.Children.Add(slugs[i], new SitemapNode(name, url));
                            }
                            else if (isLeaf)   // Only replace existing items if the current is a leaf
                            {
                                currentNode.Children[slugs[i]].Url = item.Url;
                                // Keep current title if the over-riding one is empty  when a custom route is over-riding a content route
                                if (!string.IsNullOrWhiteSpace(item.Title))
                                {
                                    currentNode.Children[slugs[i]].Title = item.Title;
                                }
                            }
                            currentNode = currentNode.Children[slugs[i]];
                            i++;
                        }
                    }
                }

                return(sitemap);
            });

            return(sitemapRoot);
        }
コード例 #34
0
ファイル: SitemapService.cs プロジェクト: wezmag/BetterCMS
        /// <summary>
        /// Saves the child nodes.
        /// </summary>
        /// <param name="sitemap">The sitemap.</param>
        /// <param name="parentNode">The parent node.</param>
        /// <param name="nodesToSave">The nodes to save.</param>
        /// <param name="currentNodes">The current nodes.</param>
        /// <param name="createdNodes">The created nodes.</param>
        /// <param name="updatedNodes">The sitemap nodes.</param>
        /// <param name="deletedNodes">The deleted nodes.</param>
        private void SaveChildNodes(
            Module.Pages.Models.Sitemap sitemap,
            SitemapNode parentNode,
            IEnumerable<SaveSitemapNodeModel> nodesToSave,
            IList<SitemapNode> currentNodes,
            ref IList<SitemapNode> createdNodes,
            ref IList<SitemapNode> updatedNodes,
            ref IList<SitemapNode> deletedNodes)
        {
            if (nodesToSave == null)
            {
                return;
            }

            foreach (var nodeModel in nodesToSave)
            {
                var nodeToSave = currentNodes.FirstOrDefault(n => n.Id == nodeModel.Id && !n.IsDeleted);
                var isNew = nodeToSave == null;
                if (isNew)
                {
                    nodeToSave = new SitemapNode
                                     {
                                         Id = nodeModel.Id.GetValueOrDefault(),
                                         Sitemap = sitemap,
                                         Translations = new List<Module.Pages.Models.SitemapNodeTranslation>()
                                     };
                }
                else if (nodeModel.Version > 0)
                {
                    nodeToSave.Version = nodeModel.Version;
                }

                nodeToSave.Page = nodeModel.PageId.HasValue ? repository.AsProxy<PageProperties>(nodeModel.PageId.Value) : null;
                nodeToSave.UsePageTitleAsNodeTitle = nodeModel.UsePageTitleAsNodeTitle;
                nodeToSave.Title = nodeModel.Title;
                nodeToSave.Url = nodeModel.Url;
                nodeToSave.UrlHash = !string.IsNullOrWhiteSpace(nodeModel.Url) ? nodeModel.Url.UrlHash() : null;
                nodeToSave.DisplayOrder = nodeModel.DisplayOrder;
                nodeToSave.Macro = nodeModel.Macro;
                nodeToSave.ParentNode = parentNode;

                repository.Save(nodeToSave);

                SaveTranslations(nodeModel, nodeToSave);

                if (isNew)
                {
                    createdNodes.Add(nodeToSave);
                }
                else
                {
                    updatedNodes.Add(nodeToSave);
                }

                SaveChildNodes(sitemap, nodeToSave, nodeModel.Nodes, currentNodes, ref createdNodes, ref updatedNodes, ref deletedNodes);
            }
        }
コード例 #35
0
        /// <summary>
        /// Saves the node list.
        /// </summary>
        /// <param name="sitemap"></param>
        /// <param name="nodes">The nodes.</param>
        /// <param name="parentNode">The parent node.</param>
        /// <param name="toList"></param>
        private void SaveNodeList(Models.Sitemap sitemap, IEnumerable <SitemapNodeViewModel> nodes, SitemapNode parentNode, List <SitemapNode> nodesToSearchIn)
        {
            if (nodes == null)
            {
                return;
            }

            foreach (var node in nodes)
            {
                var isDeleted = node.IsDeleted || (parentNode != null && parentNode.IsDeleted);
                var create    = node.Id.HasDefaultValue() && !isDeleted;
                var update    = !node.Id.HasDefaultValue() && !isDeleted;
                var delete    = !node.Id.HasDefaultValue() && isDeleted;

                bool updatedInDB;
                var  sitemapNode = SaveNodeIfUpdated(out updatedInDB, sitemap, node.Id, node.Version, node.Url, node.Title, node.PageId, node.UsePageTitleAsNodeTitle, node.DisplayOrder, node.ParentId, isDeleted, parentNode, nodesToSearchIn);

                if (create && updatedInDB)
                {
                    createdNodes.Add(sitemapNode);
                }
                else if (update && updatedInDB)
                {
                    updatedNodes.Add(sitemapNode);
                }
                else if (delete && updatedInDB)
                {
                    deletedNodes.Add(sitemapNode);
                }

                SaveNodeList(sitemap, node.ChildNodes, sitemapNode, nodesToSearchIn);
            }
        }
コード例 #36
0
        /// <summary>
        /// Saves the node (does not archive sitemap).
        /// </summary>
        /// <param name="nodeUpdated"></param>
        /// <param name="sitemap">The sitemap.</param>
        /// <param name="nodeId">The id.</param>
        /// <param name="version">The version.</param>
        /// <param name="url">The URL.</param>
        /// <param name="title">The title.</param>
        /// <param name="macro">The macro.</param>
        /// <param name="pageId">The page identifier.</param>
        /// <param name="usePageTitleAsNodeTitle">if set to <c>true</c> [use page title as node title].</param>
        /// <param name="displayOrder">The display order.</param>
        /// <param name="parentId">The parent id.</param>
        /// <param name="isDeleted">if set to <c>true</c> node is deleted.</param>
        /// <param name="parentNode">The parent node.</param>
        /// <param name="nodeList"></param>
        /// <returns>
        /// Updated or newly created sitemap node.
        /// </returns>
        public SitemapNode SaveNode(out bool nodeUpdated, Sitemap sitemap, Guid nodeId, int version, string url, string title, string macro, Guid pageId, bool usePageTitleAsNodeTitle, int displayOrder, Guid parentId, bool isDeleted = false, SitemapNode parentNode = null, List<SitemapNode> nodeList = null)
        {
            nodeUpdated = false;
            var node = nodeId.HasDefaultValue()
                ? new SitemapNode()
                : nodeList != null ? nodeList.First(n => n.Id == nodeId) : repository.First<SitemapNode>(nodeId);

            if (isDeleted)
            {
                if (!node.Id.HasDefaultValue())
                {
                    repository.Delete(node);
                    nodeUpdated = true;
                }
            }
            else
            {
                var updated = false;
                if (node.Sitemap == null)
                {
                    node.Sitemap = sitemap;
                }

                if (node.Title != title)
                {
                    updated = true;
                    node.Title = title;
                }

                if (node.Page != (!pageId.HasDefaultValue() ? repository.AsProxy<PageProperties>(pageId) : null))
                {
                    updated = true;
                    node.Page = !pageId.HasDefaultValue() ? repository.AsProxy<PageProperties>(pageId) : null;
                }

                if (node.UsePageTitleAsNodeTitle != (!pageId.HasDefaultValue() && usePageTitleAsNodeTitle))
                {
                    updated = true;
                    node.UsePageTitleAsNodeTitle = !pageId.HasDefaultValue() && usePageTitleAsNodeTitle;
                }

                if (node.Url != (node.Page != null ? null : url))
                {
                    updated = true;
                    node.Url = node.Page != null ? null : url;
                    node.UrlHash = node.Page != null ? null : url.UrlHash();
                }

                if (node.DisplayOrder != displayOrder)
                {
                    updated = true;
                    node.DisplayOrder = displayOrder;
                }

                SitemapNode newParent;
                if (parentNode != null && !parentNode.Id.HasDefaultValue())
                {
                    newParent = parentNode;
                }
                else
                {
                    newParent = parentId.HasDefaultValue()
                        ? null
                        : repository.AsProxy<SitemapNode>(parentId);
                }

                if (node.ParentNode != newParent)
                {
                    updated = true;
                    node.ParentNode = newParent;
                }

                if (cmsConfiguration.EnableMacros && node.Macro != macro)
                {
                    node.Macro = macro;
                    updated = true;
                }

                if (updated)
                {
                    node.Version = version;
                    repository.Save(node);
                    nodeUpdated = true;
                }
            }

            return node;
        }
コード例 #37
0
        private SitemapNode SaveNodeIfUpdated(out bool nodeUpdated, Models.Sitemap sitemap, Guid nodeId, int version, string url, string title, Guid pageId, bool usePageTitleAsNodeTitle, int displayOrder, Guid parentId, bool isDeleted = false, SitemapNode parentNode = null, List <SitemapNode> nodesToSearchIn = null)
        {
            nodeUpdated = false;
            var node = nodeId.HasDefaultValue()
                ? new SitemapNode()
                : nodesToSearchIn != null?nodesToSearchIn.First(n => n.Id == nodeId) : Repository.First <SitemapNode>(nodeId);

            if (isDeleted)
            {
                if (!node.Id.HasDefaultValue())
                {
                    Repository.Delete(node);
                    nodeUpdated = true;
                }
            }
            else
            {
                var updated = false;
                if (node.Sitemap == null)
                {
                    node.Sitemap = sitemap;
                }

                if (node.Title != title)
                {
                    updated    = true;
                    node.Title = title;
                }

                if (node.Page != (!pageId.HasDefaultValue() ? Repository.AsProxy <PageProperties>(pageId) : null))
                {
                    updated   = true;
                    node.Page = !pageId.HasDefaultValue() ? Repository.AsProxy <PageProperties>(pageId) : null;
                }

                if (node.UsePageTitleAsNodeTitle != (!pageId.HasDefaultValue() && usePageTitleAsNodeTitle))
                {
                    updated = true;
                    node.UsePageTitleAsNodeTitle = !pageId.HasDefaultValue() && usePageTitleAsNodeTitle;
                }

                if (node.Url != (node.Page != null ? null : url))
                {
                    updated      = true;
                    node.Url     = node.Page != null ? null : url;
                    node.UrlHash = node.Page != null ? null : url.UrlHash();
                }

                if (node.DisplayOrder != displayOrder)
                {
                    updated           = true;
                    node.DisplayOrder = displayOrder;
                }

                SitemapNode newParent;
                if (parentNode != null && !parentNode.Id.HasDefaultValue())
                {
                    newParent = parentNode;
                }
                else
                {
                    newParent = parentId.HasDefaultValue()
                        ? null
                        : Repository.First <SitemapNode>(parentId);
                }

                if (node.ParentNode != newParent)
                {
                    updated         = true;
                    node.ParentNode = newParent;
                }

                if (updated)
                {
                    node.Version = version;
                    Repository.Save(node);
                    nodeUpdated = true;
                }
            }

            return(node);
        }
コード例 #38
0
        /// <summary>
        /// Adds the nodes.
        /// </summary>
        /// <param name="sitemap">The sitemap.</param>
        /// <param name="archivedNodes">The archived nodes.</param>
        /// <param name="parentNode">The parent node.</param>
        /// <returns>
        /// Sitemap node list.
        /// </returns>
        private static List<SitemapNode> AddNodes(Sitemap sitemap, IEnumerable<ArchivedNode> archivedNodes, SitemapNode parentNode)
        {
            var nodes = new List<SitemapNode>();
            foreach (var archivedNode in archivedNodes)
            {
                var node = new SitemapNode
                    {
                        Title = archivedNode.Title,
                        Url = archivedNode.Url,
                        Page = !archivedNode.PageId.HasDefaultValue()
                                ? new PageProperties
                                        {
                                            Id = archivedNode.PageId
                                        }
                                : null,
                        UsePageTitleAsNodeTitle = archivedNode.UsePageTitleAsNodeTitle,
                        DisplayOrder = archivedNode.DisplayOrder,
                        ParentNode = parentNode,
                        Macro = archivedNode.Macro
                    };

                node.ChildNodes = AddNodes(sitemap, archivedNode.Nodes, node);
                node.Translations = AddTranslations(archivedNode, node);
                nodes.Add(node);
            }

            nodes.ForEach(sitemap.Nodes.Add);
            return nodes.OrderBy(node => node.DisplayOrder).ToList();
        }
コード例 #39
0
        public ActionResult SiteMapXml()
        {
            DateTime value;
            string   str;
            string   empty;
            string   str1;
            var      sitemapNodes = new List <SitemapNode>();
            var      item         = ConfigurationManager.AppSettings["SiteName"];

            sitemapNodes.Add(new SitemapNode(string.Empty)
            {
                Url             = item,
                ChangeFrequency = ChangeFrequency.Always,
                Priority        = 1
            });
            var menuLinks = _menuLinkService.FindBy(x => x.Status == 1, true);

            if (menuLinks.IsAny())
            {
                foreach (var menuLink in menuLinks)
                {
                    var sitemapNode = new SitemapNode(string.Empty)
                    {
                        Url             = Url.Action("GetContent", "Menu", new { menu = menuLink.SeoUrl }, Request.Url.Scheme),
                        ChangeFrequency = ChangeFrequency.Daily,
                        Priority        = new decimal(8, 0, 0, false, 1)
                    };
                    if (menuLink.UpdatedDate.HasValue)
                    {
                        value = menuLink.UpdatedDate.Value;
                        str1  = value.ToString("yyyy-MM-dd");
                    }
                    else
                    {
                        str1 = string.Empty;
                    }
                    sitemapNode.LastModificationDate = str1;
                    sitemapNodes.Add(sitemapNode);
                }
            }
            var posts =
                from x in _postService.FindBy(x => x.Status == 1, true)
                orderby x.CreatedDate descending
                select x;

            if (posts.IsAny())
            {
                foreach (var post in posts)
                {
                    var sitemapNode1 = new SitemapNode(string.Empty)
                    {
                        Url             = Url.Action("PostDetail", "Post", new { seoUrl = post.SeoUrl }, Request.Url.Scheme),
                        ChangeFrequency = ChangeFrequency.Daily,
                        Priority        = new decimal(5, 0, 0, false, 1)
                    };
                    if (post.UpdatedDate.HasValue)
                    {
                        value = post.UpdatedDate.Value;
                        empty = value.ToString("yyyy-MM-dd");
                    }
                    else
                    {
                        empty = string.Empty;
                    }
                    sitemapNode1.LastModificationDate = empty;
                    sitemapNodes.Add(sitemapNode1);
                }
            }
            var news =
                from x in _newsService.FindBy(x => x.Status == 1, true)
                orderby x.CreatedDate descending
                select x;

            if (news.IsAny())
            {
                foreach (var news1 in news)
                {
                    var sitemapNode2 = new SitemapNode(string.Empty)
                    {
                        Url             = Url.Action("NewsDetail", "News", new { seoUrl = news1.SeoUrl }, Request.Url.Scheme),
                        ChangeFrequency = ChangeFrequency.Daily,
                        Priority        = new decimal(5, 0, 0, false, 1)
                    };
                    if (news1.UpdatedDate.HasValue)
                    {
                        value = news1.UpdatedDate.Value;
                        str   = value.ToString("yyyy-MM-dd");
                    }
                    else
                    {
                        str = string.Empty;
                    }
                    sitemapNode2.LastModificationDate = str;
                    sitemapNodes.Add(sitemapNode2);
                }
            }

            return(_sitemapProvider.CreateSitemap(new SitemapModel(sitemapNodes)));
        }
コード例 #40
0
        /// <summary>
        /// Restores the nodes.
        /// </summary>
        /// <param name="sitemap">The sitemap.</param>
        /// <param name="parentNode">The parent node.</param>
        /// <param name="childNodes">The child nodes.</param>
        private void RestoreTheNodes(Sitemap sitemap, SitemapNode parentNode, IEnumerable<SitemapNode> childNodes)
        {
            foreach (var node in childNodes)
            {
                var restoredNode = new SitemapNode
                {
                    Sitemap = sitemap,
                    ParentNode = parentNode,
                    Title = node.Title,
                    UsePageTitleAsNodeTitle = node.UsePageTitleAsNodeTitle,
                    Macro = node.Macro,
                };

                if (node.Page != null)
                {
                    var node1 = node;
                    var page = repository.FirstOrDefault<PageProperties>(properties => properties.Id == node1.Page.Id && !properties.IsDeleted);
                    restoredNode.Page = page;
                    restoredNode.Url = page != null ? null : node.Url;
                    restoredNode.UrlHash = page != null ? null : node.UrlHash;
                }
                else
                {
                    restoredNode.Page = null;
                    restoredNode.Url = node.Url;
                    restoredNode.UrlHash = node.UrlHash;
                }

                repository.Save(restoredNode);

                foreach (var translation in node.Translations)
                {
                    var translation1 = translation;
                    var language = repository.FirstOrDefault<Language>(l => l.Id == translation1.Language.Id && !l.IsDeleted);
                    if (language == null)
                    {
                        continue;
                    }

                    var restoredTranslation = new SitemapNodeTranslation
                        {
                            Node = restoredNode,
                            Language = language,
                            Title = translation.Title,
                            UsePageTitleAsNodeTitle = translation.UsePageTitleAsNodeTitle,
                            Macro = translation.Macro
                        };

                    if (restoredNode.Page == null)
                    {
                        restoredTranslation.Url = restoredNode.Url;
                        restoredTranslation.UrlHash = restoredNode.Url.UrlHash();
                    }

                    repository.Save(restoredTranslation);
                }

                RestoreTheNodes(sitemap, restoredNode, node.ChildNodes);
            }
        }
コード例 #41
0
 /// <summary>
 /// Occurs when the process of sitemap parsing has finished.
 /// </summary>
 /// <param name="url">Website URL.</param>
 /// <param name="sitemap">Parsed sitemap.</param>
 public void OnCompleted(string url, SitemapNode sitemap)
 {
     SitemapManager.Current.OnCompleted(url, sitemap);
 }
コード例 #42
0
        public void Serialize_SitemapNode_ImageRequiredTags()
        {
            SitemapNode sitemapNode = new SitemapNode("abc")
            {
                Images = new List<SitemapImage> { new SitemapImage("image1"), new SitemapImage("image2") }
            };

            _namespaces.Add(Namespaces.ImagePrefix, Namespaces.Image);

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-image-required.xml");
        }
コード例 #43
0
 /// <summary>
 /// Occurs when the process of sitemap parsing has finished.
 /// </summary>
 /// <param name="url">Website URL.</param>
 /// <param name="sitemap">Parsed sitemap.</param>
 private void OnCompleted(string url, SitemapNode sitemap)
 {
     OnProgress(url, 100).Result = sitemap;
 }
コード例 #44
0
        public void Serialize_SitemapNode_NewsAllTags()
        {
            SitemapNode sitemapNode = new SitemapNode("http://www.example.org/business/article55.html")
            {
                News = new SitemapNews(new NewsPublication("The Example Times", "en"), new DateTime(2014, 11, 5, 0, 0, 0, DateTimeKind.Utc), "Companies A, B in Merger Talks")
                {
                    Access = NewsAccess.Subscription,
                    Genres = "PressRelease, Blog",
                    Keywords = "business, merger, acquisition, A, B",
                    StockTickers = "NASDAQ:A, NASDAQ:B"
                }
            };

            _namespaces.Add(Namespaces.NewsPrefix, Namespaces.News);

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-news-all.xml");
        }
コード例 #45
0
        /// <summary>
        /// Saves the node (does not archive sitemap).
        /// </summary>
        /// <param name="nodeUpdated"></param>
        /// <param name="sitemap">The sitemap.</param>
        /// <param name="nodeId">The id.</param>
        /// <param name="version">The version.</param>
        /// <param name="url">The URL.</param>
        /// <param name="title">The title.</param>
        /// <param name="macro">The macro.</param>
        /// <param name="pageId">The page identifier.</param>
        /// <param name="usePageTitleAsNodeTitle">if set to <c>true</c> [use page title as node title].</param>
        /// <param name="displayOrder">The display order.</param>
        /// <param name="parentId">The parent id.</param>
        /// <param name="isDeleted">if set to <c>true</c> node is deleted.</param>
        /// <param name="parentNode">The parent node.</param>
        /// <param name="nodeList"></param>
        /// <returns>
        /// Updated or newly created sitemap node.
        /// </returns>
        public SitemapNode SaveNode(out bool nodeUpdated, Sitemap sitemap, Guid nodeId, int version, string url, string title, string macro, Guid pageId, bool usePageTitleAsNodeTitle, int displayOrder, Guid parentId, bool isDeleted = false, SitemapNode parentNode = null, List <SitemapNode> nodeList = null)
        {
            nodeUpdated = false;
            var node = nodeId.HasDefaultValue()
                ? new SitemapNode()
                : nodeList != null?nodeList.First(n => n.Id == nodeId) : repository.First <SitemapNode>(nodeId);

            if (isDeleted)
            {
                if (!node.Id.HasDefaultValue())
                {
                    repository.Delete(node);
                    nodeUpdated = true;
                }
            }
            else
            {
                var updated = false;
                if (node.Sitemap == null)
                {
                    node.Sitemap = sitemap;
                }

                if (node.Title != title)
                {
                    updated    = true;
                    node.Title = title;
                }

                if (node.Page != (!pageId.HasDefaultValue() ? repository.AsProxy <PageProperties>(pageId) : null))
                {
                    updated   = true;
                    node.Page = !pageId.HasDefaultValue() ? repository.AsProxy <PageProperties>(pageId) : null;
                }

                if (node.UsePageTitleAsNodeTitle != (!pageId.HasDefaultValue() && usePageTitleAsNodeTitle))
                {
                    updated = true;
                    node.UsePageTitleAsNodeTitle = !pageId.HasDefaultValue() && usePageTitleAsNodeTitle;
                }

                if (node.Url != (node.Page != null ? null : url))
                {
                    updated      = true;
                    node.Url     = node.Page != null ? null : url;
                    node.UrlHash = node.Page != null ? null : url.UrlHash();
                }

                if (node.DisplayOrder != displayOrder)
                {
                    updated           = true;
                    node.DisplayOrder = displayOrder;
                }

                SitemapNode newParent;
                if (parentNode != null && !parentNode.Id.HasDefaultValue())
                {
                    newParent = parentNode;
                }
                else
                {
                    newParent = parentId.HasDefaultValue()
                        ? null
                        : repository.AsProxy <SitemapNode>(parentId);
                }

                if (node.ParentNode != newParent)
                {
                    updated         = true;
                    node.ParentNode = newParent;
                }

                if (cmsConfiguration.EnableMacros && node.Macro != macro)
                {
                    node.Macro = macro;
                    updated    = true;
                }

                if (updated)
                {
                    node.Version = version;
                    repository.Save(node);
                    nodeUpdated = true;
                }
            }

            return(node);
        }
コード例 #46
0
        public void Serialize_SitemapNode_RequiredTegs()
        {
            SitemapNode sitemapNode = new SitemapNode("abc");

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-required.xml");
        }
コード例 #47
0
        /// <summary>
        /// Adds the nodes.
        /// </summary>
        /// <param name="sitemap">The sitemap.</param>
        /// <param name="archivedNodes">The archived nodes.</param>
        /// <param name="parentNode">The parent node.</param>
        /// <returns>
        /// Sitemap node list.
        /// </returns>
        private static List <SitemapNode> AddNodes(Sitemap sitemap, IEnumerable <ArchivedNode> archivedNodes, SitemapNode parentNode)
        {
            var nodes = new List <SitemapNode>();

            foreach (var archivedNode in archivedNodes)
            {
                var node = new SitemapNode
                {
                    Title = archivedNode.Title,
                    Url   = archivedNode.Url,
                    Page  = !archivedNode.PageId.HasDefaultValue()
                                ? new PageProperties
                    {
                        Id = archivedNode.PageId
                    }
                                : null,
                    UsePageTitleAsNodeTitle = archivedNode.UsePageTitleAsNodeTitle,
                    DisplayOrder            = archivedNode.DisplayOrder,
                    ParentNode = parentNode,
                    Macro      = archivedNode.Macro
                };

                node.ChildNodes   = AddNodes(sitemap, archivedNode.Nodes, node);
                node.Translations = AddTranslations(archivedNode, node);
                nodes.Add(node);
            }

            nodes.ForEach(sitemap.Nodes.Add);
            return(nodes.OrderBy(node => node.DisplayOrder).ToList());
        }
コード例 #48
0
        public void Serialize_SitemapNode_VideoRequiredTags()
        {
            SitemapNode sitemapNode = new SitemapNode("http://www.example.com/videos/some_video_landing_page.html")
            {
                Video = new SitemapVideo("Grilling steaks for summer", "Alkis shows you how to get perfectly done steaks every time",
                                         "http://www.example.com/thumbs/123.jpg", "http://www.example.com/video123.flv")
            };

            _namespaces.Add(Namespaces.VideoPrefix, Namespaces.Video);

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-video-required.xml");
        }
コード例 #49
0
        /// <summary>
        /// Adds the translations.
        /// </summary>
        /// <param name="archivedNode">The archived node.</param>
        /// <param name="node">The node.</param>
        /// <returns>Archived node translation list.</returns>
        private static IList <SitemapNodeTranslation> AddTranslations(ArchivedNode archivedNode, SitemapNode node)
        {
            var translations = new List <SitemapNodeTranslation>();

            if (archivedNode.Translations != null)
            {
                foreach (var translation in archivedNode.Translations)
                {
                    translations.Add(new SitemapNodeTranslation
                    {
                        Node     = node,
                        Language = new Language {
                            Id = translation.LanguageId
                        },
                        Title = translation.Title,
                        Url   = translation.Url,
                        UsePageTitleAsNodeTitle = translation.UsePageTitleAsNodeTitle,
                        Macro = translation.Macro
                    });
                }
            }
            return(translations);
        }
コード例 #50
0
        public void Serialize_SitemapNode_ImageAllTags()
        {
            SitemapNode sitemapNode = new SitemapNode("abc")
            {
                Images = new List<SitemapImage>
                {
                    new SitemapImage("http://example.com/image.jpg")
                    {
                        Caption = "Photo caption",
                        Location = "Limerick, Ireland",
                        License = "http://choosealicense.com/licenses/unlicense/",
                        Title = "Photo Title"
                    }
                }
            };

            _namespaces.Add(Namespaces.ImagePrefix, Namespaces.Image);

            string result = _serializer.Serialize(sitemapNode);

            result.Should().BeXmlEquivalent("Samples/sitemap-node-image-all.xml");
        }
コード例 #51
0
        /// <summary>
        /// Saves the node list.
        /// </summary>
        /// <param name="sitemap">The sitemap.</param>
        /// <param name="nodes">The nodes.</param>
        /// <param name="parentNode">The parent node.</param>
        /// <param name="nodeList"></param>
        /// <param name="translationList"></param>
        private void SaveNodeList(Models.Sitemap sitemap, IEnumerable <SitemapNodeViewModel> nodes, SitemapNode parentNode, List <SitemapNode> nodeList, List <SitemapNodeTranslation> translationList)
        {
            if (nodes == null)
            {
                return;
            }

            foreach (var node in nodes)
            {
                var isDeleted = node.IsDeleted || (parentNode != null && parentNode.IsDeleted);
                var create    = node.Id.HasDefaultValue() && !isDeleted;
                var update    = !node.Id.HasDefaultValue() && !isDeleted;
                var delete    = !node.Id.HasDefaultValue() && isDeleted;

                bool updatedInDB;
                var  translationUpdatedInDB = false;
                var  sitemapNode            = SitemapService.SaveNode(out updatedInDB, sitemap, node.Id, node.Version, node.Url, node.Title, node.Macro, node.PageId, node.UsePageTitleAsNodeTitle, node.DisplayOrder, node.ParentId, isDeleted, parentNode, nodeList);

                if ((create || update) && (node.Translations != null && node.Translations.Count > 0))
                {
                    SaveTranslations(out translationUpdatedInDB, sitemapNode, node, translationList);
                }

                if (create && (updatedInDB || translationUpdatedInDB))
                {
                    createdNodes.Add(sitemapNode);
                }
                else if (update && (updatedInDB || translationUpdatedInDB))
                {
                    updatedNodes.Add(sitemapNode);
                }
                else if (delete && updatedInDB)
                {
                    deletedNodes.Add(sitemapNode);
                    RemoveTranslations(sitemapNode);
                }

                SaveNodeList(sitemap, node.ChildNodes, sitemapNode, nodeList, translationList);
            }
        }