Ejemplo n.º 1
0
        public void Initialize(InitializationEngine context)
        {
            DependencyResolver.SetResolver(new StaticWebServiceLocatorDependencyResolver(context.Locate.Advanced));

            var configuration = StaticWebConfiguration.CurrentSite;

            if (configuration != null && configuration.Enabled && configuration.UseRouting)
            {
                StaticWebRouting.LoadRoutes();
            }

            var events = ServiceLocator.Current.GetInstance <IContentEvents>();

            events.PublishedContent  += OnPublishedContent;
            events.PublishingContent += OnPublishingContent;
            events.MovingContent     += OnMovingContent;
            events.MovedContent      += OnMovedContent;
            events.DeletingContent   += OnDeletingContent;
            events.DeletedContent    += OnDeletedContent;

            var contentSecurityRepository = ServiceLocator.Current.GetInstance <IContentSecurityRepository>();

            contentSecurityRepository.ContentSecuritySaved += OnContentSecuritySaved;
        }
        /// <summary>
        /// Called when a scheduled job executes
        /// </summary>
        /// <returns>A status message to be stored in the database log and visible from admin mode</returns>
        public override string Execute()
        {
            _stopSignaled            = false;
            _cancellationTokenSource = new CancellationTokenSource();

            //Call OnStatusChanged to periodically notify progress of job for manually started jobs
            OnStatusChanged(String.Format("Starting execution of {0}", this.GetType()));

            _sitePages = new Dictionary <string, ConcurrentDictionary <string, string> >();
            StringBuilder resultMessage = new StringBuilder();


            var siteDefinitionRepository    = ServiceLocator.Current.GetInstance <ISiteDefinitionRepository>();
            var siteDefinitions             = siteDefinitionRepository.List().ToList();
            var hasAnyMatchingConfiguration = false;
            var numberOfSiteDefinitions     = siteDefinitions.Count;

            foreach (var siteDefinition in siteDefinitions)
            {
                _generatedPages = new Dictionary <int, string>();
                //_generatedResources = new ConcurrentDictionary<string, string>();

                _numberOfPages             = 0;
                _numberOfObsoletePages     = 0;
                _numberOfObsoleteResources = 0;

                var configuration = StaticWebConfiguration.Get(siteDefinition);
                if (configuration == null || !configuration.Enabled)
                {
                    if (configuration != null && !string.IsNullOrEmpty(configuration.Name))
                    {
                        resultMessage.AppendLine($"<div class=\"ui-state-error\"><b>{configuration.Name}</b> - Was ignored because not enabled or missing required settings.<br /></div>");
                    }
                    else
                    {
                        resultMessage.AppendLine($"<div class=\"ui-state-error\"><b>{siteDefinition.Name}</b> - Was ignored because it was not configured.<br /></div>");
                    }
                    continue;
                }
                hasAnyMatchingConfiguration = true;

                // This website has been setup for using StaticWebEpiServerPlugin
                SiteDefinition.Current = siteDefinition;

                var parallelOptions = new ParallelOptions
                {
                    MaxDegreeOfParallelism = configuration.MaxDegreeOfParallelismForScheduledJob,
                    CancellationToken      = _cancellationTokenSource.Token
                };

                // Add Empty placeholder for pages to come
                _sitePages.Add(configuration.Name, new ConcurrentDictionary <string, string>());

                //Add implementation
                var startPage = SiteDefinition.Current.StartPage.ToReferenceWithoutVersion();

                var pages = GetPages(configuration, parallelOptions, startPage);

                GeneratingPages(configuration, parallelOptions, pages);

                if (configuration.UseRouting)
                {
                    OnStatusChanged("Saving routes to file");
                    StaticWebRouting.SaveRoutes();
                }


                if (configuration.RemoveObsoletePages)
                {
                    OnStatusChanged("Looking for obsolete pages");
                    RemoveObsoletePages(configuration);
                }

                if (configuration.RemoveObsoleteResources)
                {
                    OnStatusChanged("Looking for obsolete resources");
                    RemoveObsoleteResources(configuration);
                }

                resultMessage.AppendLine($"<b>{configuration.Name}</b> - {_sitePages[configuration.Name].Count} pages generated.");

                if (_numberOfObsoletePages > 0)
                {
                    resultMessage.AppendLine($" {_numberOfObsoletePages} obsolete pages removed.");
                }
                if (_numberOfObsoleteResources > 0)
                {
                    resultMessage.AppendLine($" {_numberOfObsoleteResources} obsolete resources removed.");
                }

                resultMessage.AppendLine($"<br />");
            }

            if (!hasAnyMatchingConfiguration)
            {
                return("StaticWeb is not enabled! Add 'StaticWeb:InputUrl' and 'StaticWeb:OutputFolder' under 'appSettings' element in web.config");
            }

            return(resultMessage.ToString());
        }
        public void GeneratePage(SiteConfigurationElement configuration, string pageUrl, bool?useTemporaryAttribute, bool ignoreHtmlDependencies, string simpleAddress = null, ConcurrentDictionary <string, string> generatedResources = null)
        {
            if (configuration == null || !configuration.Enabled)
            {
                return;
            }

            //string orginalUrl = GetPageUrl(contentLink, language);
            if (pageUrl == null)
            {
                return;
            }

            string relativePath       = GetPageRelativePath(pageUrl);
            string relativeSimplePath = GetPageRelativePath(simpleAddress);
            var    hasSimpleAddress   = !string.IsNullOrEmpty(simpleAddress);
            var    fullPageUrl        = configuration.Url + pageUrl;
            var    fullSimpeAddress   = configuration.Url + simpleAddress;

            var generatePageEvent = new StaticWebGeneratePageEventArgs(fullPageUrl, simpleAddress);

            if (generatedResources != null)
            {
                generatePageEvent.Resources = generatedResources;
            }
            else
            {
                generatePageEvent.Resources = new ConcurrentDictionary <string, string>();
            }


            string html = null;

            var pageTypeConfiguration = StaticWebConfiguration.AllowedResourceTypes.FirstOrDefault(r => r.FileExtension == "");

            if (pageTypeConfiguration == null)
            {
                // don't download resource as it is of a known type we don't want to download
                generatePageEvent.CancelAction = true;
                generatePageEvent.CancelReason = "AllowedResourceTypes configuration for file extension '' is missing (read: used by page).";
            }
            else
            {
                generatePageEvent.TypeConfiguration = pageTypeConfiguration;
            }


            BeforeGeneratePage?.Invoke(this, generatePageEvent);
            // someone wants to cancel this generation of this event.
            if (generatePageEvent.CancelAction)
            {
                return;
            }

            BeforeGetPageContent?.Invoke(this, generatePageEvent);

            if (configuration.UseRouting)
            {
                StaticWebRouting.Remove(relativePath);
                if (hasSimpleAddress)
                {
                    StaticWebRouting.Remove(relativeSimplePath);
                }
            }

            // someone wants to cancel this generation of this event.
            if (!generatePageEvent.CancelAction)
            {
                var resourceInfo = DownloadResource(configuration.Url, pageUrl, generatePageEvent.TypeConfiguration);
                if (resourceInfo != null)
                {
                    if (generatePageEvent.TypeConfiguration.MimeType.StartsWith("*"))
                    {
                        generatePageEvent.TypeConfiguration = resourceInfo.TypeConfiguration;
                    }

                    if (resourceInfo.Data != null)
                    {
                        html = Encoding.UTF8.GetString(resourceInfo.Data);
                    }
                }
            }
            generatePageEvent.Content = html;

            // We don't care about a cancel action here
            AfterGetPageContent?.Invoke(this, generatePageEvent);

            if (generatePageEvent.Content == null)
            {
                return;
            }

            // reset cancel action and reason
            generatePageEvent.CancelAction = false;
            generatePageEvent.CancelReason = null;

            BeforeTryToFixLinkUrls?.Invoke(this, generatePageEvent);
            // someone wants to cancel/ignore ensuring resources.
            if (!generatePageEvent.CancelAction)
            {
                generatePageEvent.Content = TryToFixLinkUrls(generatePageEvent.Content);
            }

            // reset cancel action and reason
            generatePageEvent.CancelAction = false;
            generatePageEvent.CancelReason = null;

            BeforeEnsurePageResources?.Invoke(this, generatePageEvent);
            // someone wants to cancel/ignore ensuring resources.
            if (!generatePageEvent.CancelAction)
            {
                generatePageEvent.Content = EnsureDependencies(generatePageEvent.PageUrl, generatePageEvent.Content, configuration, useTemporaryAttribute, ignoreHtmlDependencies, generatePageEvent.TypeConfiguration, generatePageEvent.CurrentResources, generatePageEvent.Resources, 0);
            }

            // reset cancel action and reason
            generatePageEvent.CancelAction = false;
            generatePageEvent.CancelReason = null;

            // We don't care about a cancel action here
            AfterEnsurePageResources?.Invoke(this, generatePageEvent);

            string filePath  = configuration.OutputPath + relativePath + generatePageEvent.TypeConfiguration.DefaultName + generatePageEvent.TypeConfiguration.FileExtension;
            var    filePaths = new List <string>
            {
                filePath
            };

            if (hasSimpleAddress)
            {
                string filePath2 = configuration.OutputPath + relativeSimplePath + generatePageEvent.TypeConfiguration.DefaultName + generatePageEvent.TypeConfiguration.FileExtension;
                filePaths.Add(filePath2);
            }
            generatePageEvent.FilePaths = filePaths;

            // reset cancel action and reason
            generatePageEvent.CancelAction = false;
            generatePageEvent.CancelReason = null;

            BeforeGeneratePageWrite?.Invoke(this, generatePageEvent);
            // someone wants to cancel this page write.
            if (!generatePageEvent.CancelAction)
            {
                // only write and route content if it is not empty
                if (!string.IsNullOrEmpty(generatePageEvent.Content))
                {
                    foreach (string outputFilePath in generatePageEvent.FilePaths)
                    {
                        var directory = Path.GetDirectoryName(outputFilePath);
                        if (!Directory.Exists(directory))
                        {
                            Directory.CreateDirectory(directory);
                        }

                        WriteFile(outputFilePath, Encoding.UTF8.GetBytes(generatePageEvent.Content), useTemporaryAttribute);

                        if (configuration.UseRouting)
                        {
                            StaticWebRouting.Add(relativePath);
                            if (hasSimpleAddress)
                            {
                                StaticWebRouting.Add(relativeSimplePath);
                            }
                        }
                    }
                }
            }

            AfterGeneratePageWrite?.Invoke(this, generatePageEvent);
            // someone wants to cancel AFTER page write.
            if (generatePageEvent.CancelAction)
            {
                return;
            }

            AfterGeneratePage?.Invoke(this, generatePageEvent);
        }