コード例 #1
0
ファイル: CrawlerHelper.cs プロジェクト: WebCentrum/WebPackUI
        /// <summary>
        /// Crawls website and updates website's config with Rawpages
        /// </summary>
        /// <param name="config">Website's config</param>
        /// <returns>
        /// Updated website's config
        /// </returns>
        public WebsiteModel CrawlWebsite(WebsiteModel config)
        {
            config.AnalyzerConfig = new AnalyzerModel();
            config.OrganizerConfig = new OrganizerModel();
            config.ExportConfig = new ExportModel();
            config.ExportConfig.Xml = string.Empty;

            var crawler = ConfigureCrawler(config.CrawlerConfig);

            List<RawPage> list = new List<RawPage>();

            list = crawler.Crawl();
            
            foreach (var rawPage in list)
            {
                string path = rawPage.Path;
                int idx = path.LastIndexOf('/');
                string title = path; //idx == 0 ? path.Substring(0) : ("/" + path.Substring(idx + 1));

                var newRawPage = new RawPageModel
                {
                    Title = title,
                    Url = rawPage.Url.ToString(),
                    SitePath = path
                };
                config.AnalyzerConfig.RawPages.Add(newRawPage);
            }

            return config;
        }
コード例 #2
0
        /// <summary>
        /// Analyzes website and creates XML document
        /// </summary>
        /// <param name="config">Website's config</param>
        /// <returns>
        /// Updated website's config
        /// </returns>
        public WebsiteModel AnalyzeWebsite(WebsiteModel config)
        {
            CrawlerHelper crawlHelper = new CrawlerHelper();
            OrganizerHelper orgHelper = new OrganizerHelper();

            config.OrganizerConfig = new OrganizerModel();
            config.ExportConfig = new ExportModel();
            config.ExportConfig.Xml = string.Empty;

            var crawler = crawlHelper.ConfigureCrawler(config.CrawlerConfig);
            var list = crawler.Crawl();

            var analyzer = new WebsiteAnalyzer(config.AnalyzerConfig);
            var analyticsRunner = new AnalyticsRunner(crawler, analyzer);

            var site = analyticsRunner.Run(list);

            site.Name = config.Name;

            using (var sw = new StringWriter())
            {
                var serializer = new XmlSerializer(typeof(Site));
                serializer.Serialize(sw, site);

                config.ExportConfig.Xml = sw.ToString();
            }
                
            config.OrganizerConfig.Pages = orgHelper.AddChildren(site.Root, site);

            return config;
        }
コード例 #3
0
        /// <summary>
        /// Recursively updates all pages and their properties
        /// </summary>
        /// <param name="parent">Node from which to start updating</param>
        /// <param name="site">Whole site</param>
        /// <param name="config">Website's config</param>
        /// <returns></returns>
        public void UpdateChildren(Page parent, Site site, WebsiteModel config)
        {
            foreach (var page in parent.Children.Reverse<Page>())
            {
                var pageModel = GetPage(page.ID.ToString(), config);
                if (pageModel != null)
                {
                    page.Name = pageModel.Title;

                    if (page.Properties.Any())
                    {
                        foreach (var property in page.Properties.Reverse<Property>())
                        {
                            var propertyModel = GetProperty(property.ID.ToString(), pageModel);
                            if (propertyModel != null)
                            {
                                if (property.Name != propertyModel.Name)
                                {
                                    RenamePropertyReferences(site, property.Value, property.Name, propertyModel.Name, page.PageTypeID.ToString());
                                    //RenamePropertiesName(site.Root, property.Name, propertyModel.Name, page.PageTypeID.ToString());
                                    property.Name = propertyModel.Name;
                                }
                                property.Value = propertyModel.Html;
                            }
                            else
                            {
                                //RemovePropertiesFromPages(site.Root, property.Name, page.PageTypeID.ToString());
                                //RemovePropertyFromType(site, property.Name, page.PageTypeID.ToString());
                                
                                //RemovePropertyReferences(site, property.Name);
                                RemovePropertyFromTypeDefinition(site, property.Name, page.PageTypeID.ToString());
                                page.Properties.Remove(property);
                            }
                        }
                    }

                    if (page.Children.Any())
                    {
                        UpdateChildren(page, site, config);
                    }
                }
                else
                {
                    parent.Children.Remove(page);
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Updates website's config if needed and maps it to database mirror
        /// </summary>
        /// <param name="website">Website's mirror for XML comparsion</param>
        /// <param name="config">Website's config</param>
        /// <returns>
        /// Database mirror
        /// </returns>
        public WebsiteMirror MapModelToMirror(WebsiteMirror website, WebsiteModel config)
        {
            OrganizerHelper orgHelper = new OrganizerHelper();

            website.Name = config.Name;

            website.Xml = config.ExportConfig.Xml;
            website.Xsl = config.ExportConfig.Xsl;

            config.ExportConfig.Xml = string.Empty;
            config.ExportConfig.Xsl = string.Empty;

            // If XML is downloaded, retrieve it from the database, and deserialize and update each page of config.OrganizerModel
            if (website.Xml != string.Empty && website.Xml != null)
            {
                Site site;

                // Deserialize XML
                using (var sw = new StringReader(website.Xml))
                {
                    var serializer = new XmlSerializer(typeof(Site));
                    site = (Site)serializer.Deserialize(sw);
                }

                // Find changes in pages and properties (names, properties) and handle them
                orgHelper.UpdateChildren(site.Root, site, config);                

                // Turn the object into XML
                using (var sw = new StringWriter())
                {
                    var serializer = new XmlSerializer(typeof(Site));
                    serializer.Serialize(sw, site);

                    website.Xml = sw.ToString();
                }

                // Update each page of config.OrganizerModel
                config.OrganizerConfig.Pages = orgHelper.AddChildren(site.Root, site);
            }

            // Finally, update website's config
            website.Config = JsonConvert.SerializeObject(config);

            return website;
        }
コード例 #5
0
        public void PostSaveWebsiteConfig(int id, WebsiteModel config)
        {
            WebpackApiController apiHelper = new WebpackApiController();
            WebsiteMirror website = GetById(id);

            website = apiHelper.MapModelToMirror(website, config);
            apiHelper.Save(website);
        }
コード例 #6
0
        public void PostSaveXml(int id, WebsiteModel config)
        {
            WebpackApiController apiHelper = new WebpackApiController();
            WebsiteMirror website = GetById(id);

            website.Xml = config.ExportConfig.Xml;
            website.Xsl = config.ExportConfig.Xsl;

            apiHelper.Save(website);
        }
コード例 #7
0
        public WebsiteModel PostRunImport(WebsiteModel config)
        {
            OrganizerHelper orgHelper = new OrganizerHelper();

            //apply XSL
            string finalXml;
            if(config.ExportConfig.Xsl == null || config.ExportConfig.Xsl.Length == 0)
            {
                finalXml = config.ExportConfig.Xml;
            }
            else
            {
                finalXml = orgHelper.XslTransform(config.ExportConfig.Xml, config.ExportConfig.Xsl);
            }

            // na serializer zavolat novou metodu, která deserializuje jen XML - do objektu Site
            Site site;

            using (var sw = new StringReader(finalXml))
            {
                var serializer = new XmlSerializer(typeof(Site));
                site = (Site)serializer.Deserialize(sw);
            }

            WebpackImporter importer = new WebpackImporter();
            importer.Import(site,ApplicationContext.Current);

            //ApplicationContext.Services.ContentTypeService
             
            return config;
        }
コード例 #8
0
        public WebsiteModel PostTransformXml(WebsiteModel config)
        {
            OrganizerHelper orgHelper = new OrganizerHelper();

            config.ExportConfig.XmlPreview = config.ExportConfig.Xsl != string.Empty ? orgHelper.XslTransform(config.ExportConfig.Xml, config.ExportConfig.Xsl) : config.ExportConfig.Xml;
            
            return config;
        }
コード例 #9
0
        public WebsiteModel PostRunAnalyzer(WebsiteModel config)
        {
            AnalyzerHelper analyzerHelper = new AnalyzerHelper();

            return analyzerHelper.AnalyzeWebsite(config);
        }
コード例 #10
0
        public WebsiteModel PostRunCrawler(WebsiteModel config)
        {
            CrawlerHelper crawlHelper = new CrawlerHelper();

            return crawlHelper.CrawlWebsite(config);
        }
コード例 #11
0
        /// <summary>
        /// Returns page
        /// </summary>
        /// <param name="id">Page id</param>
        /// <param name="config">Website's config</param>
        /// <returns>
        /// Page
        /// </returns>
        public WebpackUI.Models.PageModel GetPage(string id, WebsiteModel config)
        {
            foreach (var page in config.OrganizerConfig.Pages)
            {
                if (page.Id == id)
                {
                    return page;
                }
                else if (page.Children.Any())
                {
                    var child = GetChildPage(id, page);
                    if (child != null)
                    {
                        return child;
                    }
                }
            }

            return null;
        }