/// <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));
            }
        }
Example #3
0
        /// <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);
            }
        }
Example #5
0
            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);
            }
Example #6
0
            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());
        }
Example #8
0
        /// <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);
            }
        }
Example #9
0
 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
                           };
            }
        }
Example #11
0
        /// <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));
            }
        }