/// <summary>
        /// Finishes off bulk mapping of tags and page routes in a PageSummary object
        /// </summary>
        public virtual async Task <List <PageSummary> > MapAsync(ICollection <Page> dbPages, IExecutionContext executionContext)
        {
            var ids = dbPages
                      .Select(p => p.PageId)
                      .ToArray();

            var routes = await _queryExecutor.ExecuteAsync(new GetPageRoutesByIdRangeQuery(ids), executionContext);

            var pageTags = await _dbContext
                           .PageTags
                           .AsNoTracking()
                           .Where(p => ids.Contains(p.PageId))
                           .Select(t => new
            {
                PageId = t.PageId,
                Tag    = t.Tag.TagText
            })
                           .ToListAsync();

            var pages = new List <PageSummary>(ids.Length);

            foreach (var dbPage in dbPages)
            {
                var pageRoute = routes.GetOrDefault(dbPage.PageId);
                EntityNotFoundException.ThrowIfNull(pageRoute, dbPage.PageId);

                var page = new PageSummary()
                {
                    FullUrlPath         = pageRoute.FullUrlPath,
                    HasDraftVersion     = pageRoute.HasDraftVersion,
                    HasPublishedVersion = pageRoute.HasPublishedVersion,
                    PublishDate         = pageRoute.PublishDate,
                    LastPublishDate     = pageRoute.LastPublishDate,
                    PublishStatus       = pageRoute.PublishStatus,
                    Locale   = pageRoute.Locale,
                    PageId   = pageRoute.PageId,
                    PageType = pageRoute.PageType,
                    Title    = pageRoute.Title,
                    UrlPath  = pageRoute.UrlPath
                };

                page.AuditData = _auditDataMapper.MapCreateAuditData(dbPage);

                if (!string.IsNullOrWhiteSpace(dbPage.CustomEntityDefinitionCode))
                {
                    var customEntityDefinition = _customEntityDefinitionRepository.GetByCode(dbPage.CustomEntityDefinitionCode);
                    // Graciously fall-back if the definition has been removed, since this is typically just for display purposes
                    page.CustomEntityName = customEntityDefinition?.Name ?? "Definition Missing";
                }

                page.Tags = pageTags
                            .Where(t => t.PageId == page.PageId)
                            .Select(t => t.Tag)
                            .ToArray();

                pages.Add(page);
            }

            return(pages);
        }
示例#2
0
        public void TestInitialize()
        {
            stream = new MemoryStream();
            BinaryWriter writer   = new BinaryWriter(stream);
            PageSummary  summary1 = new PageSummary()
            {
                AddressSpaceId = id1, Allocated = true, DataFileOffset = 0, Size = 1024, Used = 1024
            };
            PageSummary summary2 = new PageSummary()
            {
                AddressSpaceId = id2, Allocated = true, DataFileOffset = 1024, Size = 1024, Used = 100
            };
            PageSummary summary3 = new PageSummary()
            {
                AddressSpaceId = id1, Allocated = true, DataFileOffset = 2048, Size = 1024, Used = 200
            };
            PageSummary summary4 = new PageSummary()
            {
                AddressSpaceId = Guid.Empty, Allocated = false, DataFileOffset = 3072, Size = 1024, Used = 0
            };

            summary1.WriteToStream(writer);
            summary2.WriteToStream(writer);
            summary3.WriteToStream(writer);
            summary4.WriteToStream(writer);
            stream.Position = 0;
        }
示例#3
0
        internal static void AssertBasicDataMapping(
            string uniqueData,
            AddPageCommand addPageCommand,
            PageSummary page
            )
        {
            var sluggedUniqueData = SlugFormatter.ToSlug(uniqueData);

            page.Should().NotBeNull();
            page.PageId.Should().Be(addPageCommand.OutputPageId);

            page.AuditData.Should().NotBeNull();
            page.AuditData.Creator.Should().NotBeNull();
            page.AuditData.Creator.UserId.Should().BePositive();

            page.FullUrlPath.Should().Be($"/{sluggedUniqueData}/{addPageCommand.UrlPath}");

            page.Should().NotBeNull();
            page.HasDraftVersion.Should().BeFalse();
            page.Locale.Should().BeNull();
            page.PageType.Should().Be(addPageCommand.PageType);
            page.PublishDate.Should().NotBeNull().And.NotBeDefault();
            page.LastPublishDate.Should().NotBeNull().And.NotBeDefault();
            page.PublishStatus.Should().Be(PublishStatus.Published);
            page.Tags.Should().ContainSingle(t => t == "Test");
            page.Title.Should().Be(addPageCommand.Title);
            page.UrlPath.Should().Be(addPageCommand.UrlPath);
        }
示例#4
0
        /// <summary>
        /// Display the homepage/mainpage. If no page has been tagged with the 'homepage' tag,
        /// then a dummy PageSummary is put in its place.
        /// </summary>
        public ActionResult Index()
        {
            PageManager manager = new PageManager();

            // Get the first locked homepage
            PageSummary summary = manager.FindByTag("homepage").FirstOrDefault(h => h.IsLocked);
            if (summary == null)
            {
                // Look for a none-locked page as a fallback
                summary = manager.FindByTag("homepage").FirstOrDefault();
            }

            if (summary == null)
            {
                summary = new PageSummary();
                summary.Title = "You have no mainpage set";
                summary.Content = "To set a main page, create a page and assign the tag 'homepage' to it.";
                summary.CreatedBy = "";
                summary.CreatedOn = DateTime.Now;
                summary.Tags = "homepage";
                summary.ModifiedOn = DateTime.Now;
                summary.ModifiedBy = "";
            }

            RoadkillContext.Current.Page = summary;
            return View(summary);
        }
示例#5
0
        /// <summary>
        /// Display the homepage/mainpage. If no page has been tagged with the 'homepage' tag,
        /// then a dummy PageSummary is put in its place.
        /// </summary>
        public ActionResult Index()
        {
            PageManager manager = new PageManager();

            // Get the first locked homepage
            PageSummary summary = manager.FindByTag("homepage").FirstOrDefault(h => h.IsLocked);
            if (summary == null)
            {
                // Look for a none-locked page as a fallback
                summary = manager.FindByTag("homepage").FirstOrDefault();
            }

            if (summary == null)
            {
                summary = new PageSummary();
                summary.Title = SiteStrings.NoMainPage_Title;
                summary.Content = SiteStrings.NoMainPage_Label;
                summary.CreatedBy = "";
                summary.CreatedOn = DateTime.Now;
                summary.Tags = "homepage";
                summary.ModifiedOn = DateTime.Now;
                summary.ModifiedBy = "";
            }

            RoadkillContext.Current.Page = summary;
            return View(summary);
        }
示例#6
0
        private List <IProjectPage> RebuildArea(PageSummary area)
        {
            var areaName = ResolveAreaName(area.Name);

            var knownAreas = new HashSet <string>
            {
                "Archive",
                "ContentCast",
                "DataSource",
                "GuidedSelling",
                "Internal",
                "PartnerAccess",
                "Platform",
                "Production",
                "Sandbox",
                "Vortex"
            };

            if (!knownAreas.Contains(areaName))
            {
                throw new InvalidOperationException($"Unknown area name '{area.Name}'.");
            }

            var result = new ConcurrentBag <IProjectPage>();

            var projects = m_children[area.Id];

            Parallel.ForEach(
                projects,
                new ParallelOptions {
                MaxDegreeOfParallelism = 5
            },
                project =>
            {
                var page = RebuildProject(areaName, project);
                result.Add(page);
            });

            var updated = UpdateAreaPage(result, area);

            if (updated)
            {
                Console.WriteLine("Rebuild [{0}] area summary ... UPDATED", areaName);
            }
            else
            {
                Console.WriteLine("Rebuild [{0}] area summary ... not changed", areaName);
            }

            return(result.ToList());
        }
示例#7
0
        public async Task <PageSummary> ParsePageAsync(string url)
        {
            _logger.LogInformation($"Parse Url:{url}");
            PageSummary  pageSummary = new PageSummary();
            List <Image> images      = new List <Image>();

            var config = Configuration.Default.WithDefaultLoader();

            // Asynchronously get the document in a new context using the configuration
            var document = await BrowsingContext.New(config).OpenAsync(url);

            // return this so we can respond accordingly via our API
            pageSummary.StatusCode = document.StatusCode;

            // This CSS selector gets the desired content, for now we will select body element
            var cellSelector = "body";
            // Perform the query to get all cells with the content
            var elements = document.QuerySelectorAll(cellSelector);

            // exclude text from script and style elements.
            ScrubElements(elements);


            var selectedElement = elements.FirstOrDefault();

            if (selectedElement != null)
            {
                var words = selectedElement.TextContent.Words().ToList();
                // get doc word count
                pageSummary.WordCount = words.Sum(m => m.Count);

                // trim down to top 10 words
                pageSummary.Words = words.OrderByDescending(m => m.Count).Take(10);

                foreach (var item in document.Images)
                {
                    if (!string.IsNullOrEmpty(item.Source))
                    {
                        images.Add(new Image()
                        {
                            Url = item.Source
                        });
                    }
                }

                pageSummary.Images = images;
            }

            return(pageSummary);
        }
示例#8
0
        public void DebugThis()
        {
            Debug.Log(String.Format("Debugging Page {0}", Name));
            Debug.Log(String.Format("Title: {0}", Title));
            if (PageSummary != null)
            {
                PageSummary.DebugThis();
            }

            Debug.Log("Entries:");
            foreach (var item in Entries)
            {
                item.DebugThis();
            }
        }
示例#9
0
        public void PageSummary_CreateFromStreamEmpty()
        {
            long        pos    = stream.Position;
            PageSummary target = PageSummary.ReadFromStream(reader);

            Assert.IsNotNull(target);
            Assert.AreEqual(demo.AddressSpaceId, target.AddressSpaceId);
            Assert.AreEqual(demo.Size, target.Size);
            Assert.AreEqual(demo.Used, target.Used);
            Assert.AreEqual(demo.DataFileOffset, target.DataFileOffset);
            Assert.AreEqual(demo.Allocated, target.Allocated);
            Assert.AreEqual(pos, target.PageFileIndex);
            PageSummary expectedToBeNull = PageSummary.ReadFromStream(reader);

            Assert.IsNull(expectedToBeNull);
        }
示例#10
0
        public void PageSummary_SerializeAndDeSerialize()
        {
            long pos = stream.Position;

            demo.WriteToStream(writer);
            Assert.AreEqual(pos, demo.PageFileIndex);
            stream.Position = pos;
            PageSummary target = PageSummary.ReadFromStream(reader);

            Assert.IsNotNull(target);
            Assert.AreEqual(demo.AddressSpaceId, target.AddressSpaceId);
            Assert.AreEqual(demo.Size, target.Size);
            Assert.AreEqual(demo.Used, target.Used);
            Assert.AreEqual(demo.DataFileOffset, target.DataFileOffset);
            Assert.AreEqual(demo.Allocated, target.Allocated);
            Assert.AreEqual(demo.PageFileIndex, target.PageFileIndex);
        }
示例#11
0
 public void PageIndex_AddEntryToPageIndexWithEntries()
 {
     using (target = new PageIndex(stream))
     {
         PageSummary summary1 = new PageSummary()
         {
             Allocated = true, DataFileOffset = 4096, Size = 1024, AddressSpaceId = id1, Used = 300
         };
         target.AddOrUpdateEntry(summary1);
         Assert.AreEqual(3, target[id1].Count());
         Assert.AreEqual(4096, target[id1][2].DataFileOffset);
         Assert.AreEqual(1024, target[id1][2].Size);
         Assert.IsTrue(target[id1][2].Allocated);
         Assert.AreEqual(132, target[id1][2].PageFileIndex);
         Assert.AreEqual(5120, target.EndOfPageIndex);
     }
 }
示例#12
0
 public void TestInitialise()
 {
     stream              = new MemoryStream();
     reader              = new BinaryReader(stream);
     writer              = new BinaryWriter(stream);
     demo                = new PageSummary();
     demo.Size           = 1;
     demo.DataFileOffset = 2;
     demo.Allocated      = true;
     demo.AddressSpaceId = Guid.NewGuid();
     demo.Used           = 200;
     writer.Write(demo.AddressSpaceId.ToByteArray());
     writer.Write(demo.Size);
     writer.Write(demo.Used);
     writer.Write(demo.DataFileOffset);
     writer.Write(demo.Allocated);
     stream.Position = 0;
 }
示例#13
0
 public void PageIndex_AddEntryToEmptyPageIndex()
 {
     stream = new MemoryStream();
     using (target = new PageIndex(stream))
     {
         PageSummary summary1 = new PageSummary()
         {
             AddressSpaceId = id1, Allocated = true, DataFileOffset = 0, Size = 1024, Used = 1024
         };
         target.AddOrUpdateEntry(summary1);
         Assert.AreEqual(0, target[id1][0].DataFileOffset);
         Assert.AreEqual(1024, target[id1][0].Size);
         Assert.AreEqual(1024, target[id1][0].Used);
         Assert.IsTrue(target[id1][0].Allocated);
         Assert.AreEqual(0, target[id1][0].PageFileIndex);
         Assert.AreEqual(id1, target[id1][0].AddressSpaceId);
         Assert.AreEqual(1024, target.EndOfPageIndex);
     }
 }
示例#14
0
        public void PageIndex_MoveSummaryFromEmptyToUsed()
        {
            target = new PageIndex(stream);
            Assert.AreEqual(2, target[id1].Count);
            Assert.AreEqual(1, target.EmptyPages.Count);
            PageSummary summary = target.EmptyPages[0];

            Assert.AreEqual(99, summary.PageFileIndex);
            summary.AddressSpaceId = id1;
            target.AddOrUpdateEntry(summary);

            stream.Position = 0;

            var newIndex = new PageIndex(stream);

            Assert.AreEqual(3, target[id1].Count);
            Assert.AreEqual(0, target.EmptyPages.Count);
            PageSummary retrieved = target[id1][2];

            Assert.AreEqual(99, retrieved.PageFileIndex);
        }
示例#15
0
        private bool UpdateSummaryPage(IEnumerable <IProjectPage> pages, PageSummary summary)
        {
            var updated = new PageDocument();

            var tbody = new XElement(
                "tbody",
                new XElement(
                    "tr",
                    new XElement("th", "Area"),
                    new XElement("th", "Project"),
                    new XElement("th", "Type"),
                    new XElement("th", ".NET"),
                    new XElement("th", "Owner"),
                    new XElement("th", "Status")));

            foreach (var page in pages.OrderBy(p => p.OrderKey))
            {
                tbody.Add(page.RenderSummaryRow(false));
            }

            updated.Root.Add(
                new XElement(
                    "table",
                    tbody));

            var content  = updated.Render();
            var existing = m_confluence.GetCachedPage(summary);

            var before = NormalizeForComparison(existing.Content);
            var after  = NormalizeForComparison(content);

            if (after == before)
            {
                return(false);
            }

            existing.Content = content;
            m_confluence.UpdatePage(existing);
            return(true);
        }
示例#16
0
        public async Task Parse_ShouldReturnPageSummary()
        {
            //arrange
            var logger        = Substitute.For <ILogger <PageController> >();
            var parserService = Substitute.For <IParserService>();
            var url           = "https://localhost";
            var pageSummary   = new PageSummary();

            parserService.ParsePageAsync(url).Returns(Task.FromResult(pageSummary));

            //act
            var sut      = new PageController(parserService, logger);
            var response = await sut.Parse(url) as OkObjectResult;

            //assert
            response.Should().NotBeNull();
            if (response != null)
            {
                response.Value.Should().NotBeNull();
                response.Value.Should().BeOfType <PageSummary>();
                response.Value.Should().Be(pageSummary);
            }
        }
示例#17
0
        public List <PageSummary> GenerateQuestionAndAnswersList(string guid, FormSchema formSchema)
        {
            var formAnswers    = GetFormData(guid);
            var reducedAnswers = FormAnswersExtensions.GetReducedAnswers(formAnswers, formSchema);
            var formSummary    = new List <PageSummary>();

            foreach (var page in formSchema.Pages.ToList())
            {
                var pageSummary = new PageSummary
                {
                    PageTitle = page.Title,
                    PageSlug  = page.PageSlug
                };

                var summaryBuilder      = new SummaryDictionaryBuilder();
                var formSchemaQuestions = page.ValidatableElements
                                          .Where(_ => _ != null)
                                          .ToList();

                if (!formSchemaQuestions.Any() || !reducedAnswers.Where(p => p.PageSlug == page.PageSlug).Select(p => p).Any())
                {
                    continue;
                }

                formSchemaQuestions.ForEach(question =>
                {
                    var answer = _elementMapper.GetAnswerStringValue(question, formAnswers);
                    summaryBuilder.Add(question.GetLabelText(), answer, question.Type);
                });

                pageSummary.Answers = summaryBuilder.Build();
                formSummary.Add(pageSummary);
            }

            return(formSummary);
        }
示例#18
0
        public ActionResult New(PageSummary summary)
        {
            if (!ModelState.IsValid)
                return View("Edit", summary);

            PageManager manager = new PageManager();
            summary = manager.AddPage(summary);

            return RedirectToAction("Index", "Wiki", new { id = summary.Id, nocache = DateTime.Now.Ticks });
        }
示例#19
0
        private IProjectPage RebuildProject(string areaName, PageSummary project)
        {
            Console.WriteLine("Processing page '{0} / {1}'...", areaName, project.Name);

            IProjectPage page;

            try
            {
                ProjectType projectType;
                var         projectName = ResolveProjectName(project.Name, out projectType);

                var existing = m_confluence.GetCachedPage(project);
                var document = new PageDocument(existing.Content);

                switch (projectType)
                {
                case ProjectType.Library:
                    page = new LibraryProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.Website:
                    page = new WebsiteProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.Webservice:
                    page = new WebserviceProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.Service:
                    page = new ServiceProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.Console:
                    page = new ConsoleProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.Windows:
                    page = new WindowsProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.CloudRole:
                    page = new CloudRoleProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.CloudService:
                    page = new CloudServiceProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.FabricService:
                    page = new FabricServiceProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                case ProjectType.FabricApplication:
                    page = new FabricApplicationProjectPage(areaName, projectName, project.Name, document, m_owners);
                    break;

                default:
                    throw new InvalidOperationException(
                              $"Unknown how to process project of type '{projectType.ToString().ToLowerInvariant()}'.");
                }

                page.CheckPage(m_tfs);

                var updated = UpdateProjectPage(page, existing);
                if (updated)
                {
                    Console.WriteLine("[{0}] {1} #{2}... UPDATED", areaName, projectName, projectType.ToString().ToLowerInvariant());
                }
                else
                {
                    Console.WriteLine("[{0}] {1} #{2}... not changed", areaName, projectName, projectType.ToString().ToLowerInvariant());
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException(
                          $"An error occurred while processing page '{project.Name}' version {project.Version}.",
                          e);
            }

            return(page);
        }