/// <summary> /// This method will delete the pagestructure corresponding to the given page if this /// page is the last page. /// </summary> /// <param name="page">The page that is about to be deleted.</param> public static void DeletePageStructure(this IPage page) { if (ExistsInOtherLocale(page)) { return; } IPageStructure structureInfo = DataFacade.GetData <IPageStructure>(f => f.Id == page.Id).SingleOrDefault(); if (structureInfo == null) { return; } int localOrdering = structureInfo.LocalOrdering; DataFacade.Delete <IPageStructure>(structureInfo); List <IPageStructure> siblings = DataFacade.GetData <IPageStructure>( f => f.ParentId == structureInfo.ParentId && f.LocalOrdering >= localOrdering).ToList(); // If there's a page with the same local ordering - we're not changing anything if (siblings.Count == 0 || siblings.Any(ps => ps.LocalOrdering == localOrdering)) { return; } for (int i = 0; i < siblings.Count; i++) { siblings[i].LocalOrdering--; DataFacade.Update(siblings[i]); } }
/// <exclude /> public static IPage MoveTo(this IPage page, Guid parentId, int localOrder, bool addNewPage) { Verify.ArgumentNotNull(page, nameof(page)); lock (_lock) { IPageStructure pageStructure = DataFacade.GetData <IPageStructure>(f => f.Id == page.Id).FirstOrDefault(); if (pageStructure != null) { if (pageStructure.ParentId == parentId) { if (localOrder == pageStructure.LocalOrdering) { // If page is already has the right order - don't do anything return(page); } if (localOrder > pageStructure.LocalOrdering) { localOrder--; } } DataFacade.Delete(pageStructure); if (pageStructure.ParentId != parentId) { FixOrder(pageStructure.ParentId); } } return(InsertIntoPosition(page, parentId, localOrder, addNewPage)); } }
/// <exclude /> public static IPage AddPageAfter(this IPage newPage, Guid parentId, Guid existingPageId, bool addNewPage) { if (newPage == null) { throw new ArgumentNullException("newPage"); } lock (_lock) { List <IPageStructure> pageStructures = (from ps in DataFacade.GetData <IPageStructure>() where ps.ParentId == parentId orderby ps.LocalOrdering select ps).ToList(); bool pageInserted = false; foreach (IPageStructure pageStructure in pageStructures) { if (pageInserted == false) { if (pageStructure.Id == existingPageId) { IPageStructure newPageStructure = DataFacade.BuildNew <IPageStructure>(); newPageStructure.ParentId = parentId; newPageStructure.Id = newPage.Id; newPageStructure.LocalOrdering = pageStructure.LocalOrdering + 1; DataFacade.AddNew <IPageStructure>(newPageStructure); pageInserted = true; } } else { pageStructure.LocalOrdering += 1; } } DataFacade.Update(pageStructures.Cast <IData>()); if (addNewPage) { return(DataFacade.AddNew <IPage>(newPage)); } else { return(newPage); } } }
private static void BuildFolderPaths(SitemapBuildingData pagesData, IEnumerable<XElement> elements, IDictionary<string, Guid> urlToIdLookup, IPageUrlBuilder builder) { foreach (XElement element in elements) { Guid pageId = new Guid(element.Attribute(AttributeNames.Id).Value); IPage page = pagesData.PageById[pageId]; IPageStructure pageStructure = pagesData.StructureById[pageId]; if (pageStructure == null) { continue; } Guid parentId = pageStructure.ParentId; PageUrlSet pageUrls = builder.BuildUrlSet(page, parentId); if(pageUrls == null) { continue; } element.Add(new XAttribute(AttributeNames.URL, pageUrls.PublicUrl)); string lookupUrl = pageUrls.PublicUrl; if(pageUrls.FriendlyUrl != null) { element.Add(new XAttribute(AttributeNames.FriendlyUrl, pageUrls.FriendlyUrl)); } //// FolderPath isn't used any more //element.Add(new XAttribute("FolderPath", builder.FolderPaths[pageId])); element.Add(new XAttribute(AttributeNames.Depth, 1 + element.Ancestors(PageElementName).Count())); // NOTE: urlToIdLookup is obsolete, but old API needs it if (urlToIdLookup.ContainsKey(lookupUrl)) { Log.LogError(LogTitle, "Multiple pages share the same path '{0}', page ID: '{1}'. Duplicates are ignored.".FormatWith(pageUrls.PublicUrl, pageId)); continue; } urlToIdLookup.Add(lookupUrl, pageId); BuildFolderPaths(pagesData, element.Elements(), urlToIdLookup, builder); } }
public void CreatePageStructure(IPage page, Guid parentPageId) { if (DataFacade.GetData <IPageStructure>(f => f.Id == page.Id).Any()) { return; } int siblingPageCount = (from ps in DataFacade.GetData <IPageStructure>() where ps.ParentId == parentPageId select ps).Count(); IPageStructure newPageStructure = DataFacade.BuildNew <IPageStructure>(); newPageStructure.ParentId = parentPageId; newPageStructure.Id = page.Id; newPageStructure.LocalOrdering = siblingPageCount; DataFacade.AddNew <IPageStructure>(newPageStructure); }
public void CreatePageStructure(IPage newPage, Guid parentPageId) { if (DataFacade.GetData <IPageStructure>(f => f.Id == newPage.Id).Any()) { return; } var pageStructures = (from ps in DataFacade.GetData <IPageStructure>() where ps.ParentId == parentPageId orderby ps.LocalOrdering select ps).ToList(); bool pageInserted = false; foreach (IPageStructure pageStructure in pageStructures) { if (!pageInserted) { if (pageStructure.Id == _existingPageId) { IPageStructure newPageStructure = DataFacade.BuildNew <IPageStructure>(); newPageStructure.ParentId = parentPageId; newPageStructure.Id = newPage.Id; newPageStructure.LocalOrdering = pageStructure.LocalOrdering + 1; DataFacade.AddNew <IPageStructure>(newPageStructure); pageInserted = true; } } else { pageStructure.LocalOrdering += 1; } } DataFacade.Update(pageStructures); }
/// <exclude /> public static IPage GetPageFromLocalOrder(Guid parentId, int localOrder) { Guid pageId; using (new DataScope(DataScopeIdentifier.Administrated)) { // FirstOrDefault used here because local ordering could be "corrupt" IPageStructure pageStructure = (from ps in DataFacade.GetData <IPageStructure>() where ps.ParentId == parentId && ps.LocalOrdering == localOrder select ps).FirstOrDefault(); if (pageStructure == null) { return(null); } pageId = pageStructure.Id; } return(DataFacade.GetData <IPage>(f => f.Id == pageId).FirstOrDefault()); }
/// <exclude /> public static IPage AddPageAtBottom(this IPage newPage, Guid parentId, bool addNewPage) { if (newPage == null) { throw new ArgumentNullException("newPage"); } lock (_lock) { int siblingPageCount = (from ps in DataFacade.GetData <IPageStructure>() where ps.ParentId == parentId select ps).Count(); IPageStructure newPageStructure = DataFacade.BuildNew <IPageStructure>(); newPageStructure.ParentId = parentId; newPageStructure.Id = newPage.Id; newPageStructure.LocalOrdering = siblingPageCount; DataFacade.AddNew <IPageStructure>(newPageStructure); return(addNewPage ? DataFacade.AddNew <IPage>(newPage) : newPage); } }
public PageStructureRecord(IPageStructure ps) { ParentId = ps.ParentId; LocalOrdering = ps.LocalOrdering; }
private static Map BuildMap(UrlSpace urlSpace) { using (DebugLoggingScope.MethodInfoScope) { var publicationScope = DataScopeManager.CurrentDataScope.ToPublicationScope(); var localizationScope = LocalizationScopeManager.CurrentLocalizationScope; Log.LogVerbose(LogTitle, string.Format("Building page structure in the publication scope '{0}' with the localization scope '{1}'", publicationScope, localizationScope)); var urlToIdLookup = new Dictionary<string, Guid>(); var idToUrlLookup = new Dictionary<Guid, string>(); var pagesData = new SitemapBuildingData(); var pageToToChildElementsTable = new Hashtable<Guid, List<PageTreeInfo>>(); foreach (IPage page in pagesData.Pages) { IPageStructure pageStructure = pagesData.StructureById[page.Id]; if (pageStructure == null) { Log.LogWarning(LogTitle, "Failed to find PageStructure data. Page ID is '{0}'".FormatWith(page.Id)); continue; } int localOrdering = pageStructure.LocalOrdering; var pageElement = new XElement(ElementNames.Page, new XAttribute(AttributeNames.Id, page.Id), new XAttribute(AttributeNames.Title, page.Title), (string.IsNullOrEmpty(page.MenuTitle) ? null : new XAttribute(AttributeNames.MenuTitle, page.MenuTitle)), new XAttribute(AttributeNames.UrlTitle, page.UrlTitle), new XAttribute(AttributeNames.Description, page.Description ?? string.Empty), new XAttribute(AttributeNames.ChangedDate, page.ChangeDate), new XAttribute(AttributeNames.ChangedBy, page.ChangedBy ?? string.Empty)); var list = pageToToChildElementsTable[pageStructure.ParentId]; if (list == null) { list = new List<PageTreeInfo>(); pageToToChildElementsTable[pageStructure.ParentId] = list; } list.Add(new PageTreeInfo { ID = page.Id, LocalOrdering = localOrdering, Element = pageElement }); } var root = new XElement("root"); BuildXmlStructure(root, Guid.Empty, pageToToChildElementsTable, 100); #pragma warning disable 612 var pageUrlBuilder = PageUrls.UrlProvider.CreateUrlBuilder(publicationScope, localizationScope, urlSpace); BuildFolderPaths(pagesData, root.Elements(), pageUrlBuilder, urlToIdLookup); #pragma warning restore 612 foreach (var urlLookupEntry in urlToIdLookup) { idToUrlLookup.Add(urlLookupEntry.Value, urlLookupEntry.Key); } var lowerCaseUrlToIdLookup = new Dictionary<string, Guid>(); foreach (KeyValuePair<string, Guid> keyValuePair in urlToIdLookup) { string loweredUrl = keyValuePair.Key.ToLowerInvariant(); if (lowerCaseUrlToIdLookup.ContainsKey(loweredUrl)) { if (!_knownNotUniqueUrls.Contains(loweredUrl)) { lock (_knownNotUniqueUrls) { _knownNotUniqueUrls.Add(loweredUrl); } Log.LogError(LogTitle, "Multiple pages share the same path '{0}'. Page ID: '{1}'. Duplicates are ignored.".FormatWith(loweredUrl, keyValuePair.Value)); } continue; } lowerCaseUrlToIdLookup.Add(loweredUrl, keyValuePair.Value); } return new Map { IdToUrlLookup = idToUrlLookup, UrlToIdLookup = urlToIdLookup, LowerCaseUrlToIdLookup = lowerCaseUrlToIdLookup, RootPagesLookup = root.Elements(), PageUrlBuilder = pageUrlBuilder }; } }
/// <exclude /> public static IPage AddPageAlphabetic(this IPage newPage, Guid parentId) { if (newPage == null) { throw new ArgumentNullException("newPage"); } lock (_lock) { List <IPageStructure> pageStructures = (from ps in DataFacade.GetData <IPageStructure>() where ps.ParentId == parentId orderby ps.LocalOrdering select ps).ToList(); CultureInfo cultureInfo = UserSettings.CultureInfo; int targetLocalOrdering = -1; foreach (IPageStructure pageStructure in pageStructures) { if (targetLocalOrdering != -1) { pageStructure.LocalOrdering++; continue; } IPage page = (from p in DataFacade.GetData <IPage>() where p.Id == pageStructure.Id select p).SingleOrDefault(); if (page == null) { continue; } if (string.Compare(page.Title, newPage.Title, true, cultureInfo) > 0) { targetLocalOrdering = pageStructure.LocalOrdering; pageStructure.LocalOrdering++; } } if (targetLocalOrdering == -1) { targetLocalOrdering = pageStructures.Last().LocalOrdering + 1; } else { DataFacade.Update(pageStructures.Where(page => page.LocalOrdering > targetLocalOrdering).Cast <IData>()); } IPageStructure newPageStructure = DataFacade.BuildNew <IPageStructure>(); newPageStructure.ParentId = parentId; newPageStructure.Id = newPage.Id; newPageStructure.LocalOrdering = targetLocalOrdering; DataFacade.AddNew <IPageStructure>(newPageStructure); return(DataFacade.AddNew <IPage>(newPage)); } }