private static void RenderStackHtml(ParallelStack stack, IHtmlRenderer visitor, int increment = 0)
        {
            if (stack.Stacks.Count == 0)
            {
                var lastFrame = stack.Frame;
                visitor.EnterFrameGroupEnd(increment);
                visitor.WriteFrameSeparator($" ~~~~ {FormatThreadIdList(visitor, stack.ThreadIds)}");
                visitor.LeaveFrameGroupEnd();
                visitor.EnterFrame(increment);
                visitor.WriteCount($"{stack.ThreadIds.Count,Padding}");
                RenderFrame(lastFrame, visitor);
                visitor.LeaveFrame();

                return;
            }

            foreach (var nextStackFrame in stack.Stacks.OrderBy(s => s.ThreadIds.Count))
            {
                RenderStackHtml(nextStackFrame, visitor,
                                (nextStackFrame.ThreadIds.Count == stack.ThreadIds.Count) ? increment : increment + 1);
            }

            var currentFrame = stack.Frame;

            visitor.EnterFrame(increment);
            visitor.WriteCount($"{stack.ThreadIds.Count,Padding}");
            RenderFrame(currentFrame, visitor);
            visitor.LeaveFrame();
        }
Exemplo n.º 2
0
 public void Return(IHtmlRenderer htmlRenderer)
 {
     if (_objectDisposed)
     {
         throw new ObjectDisposedException(nameof(NetworkServicePool));
     }
     _htmlRendererPool.Add(htmlRenderer);
 }
Exemplo n.º 3
0
        /// <summary>
        /// Renders an HTML node to a file.
        /// </summary>
        public static void SaveNode(this IHtmlRenderer renderer, HtmlNode node, string filePath)
        {
            renderer.GuardNotNull(nameof(renderer));
            node.GuardNotNull(nameof(node));
            filePath.GuardNotNull(nameof(filePath));

            using (var writer = File.CreateText(filePath))
                renderer.SaveNode(node, writer);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Renders an HTML node to <see cref="TextWriter"/>.
        /// </summary>
        public static void SaveNode(this IHtmlRenderer renderer, HtmlNode node, TextWriter writer)
        {
            renderer.GuardNotNull(nameof(renderer));
            node.GuardNotNull(nameof(node));
            writer.GuardNotNull(nameof(writer));

            var source = renderer.RenderNode(node);

            writer.Write(source);
        }
Exemplo n.º 5
0
 /// <summary>
 /// Creates an <see cref="HtmlRendererResult{TModel}"/>
 /// </summary>
 /// <param name="view">The view</param>
 /// <param name="model">The model</param>
 /// <param name="statusCode">A custom status code</param>
 public HtmlRendererResult(IHtmlRenderer <TModel> view, TModel model, HttpStatusCode?statusCode = null)
 {
     if (view == null)
     {
         throw new ArgumentNullException(nameof(view));
     }
     View       = view;
     Model      = model;
     StatusCode = statusCode;
 }
Exemplo n.º 6
0
        public ViewerService(IApplicationStorageService applicationStorageService, ISolutionListTreeViewService solutionListTreeViewService, IHtmlRenderer htmlRenderer, IActionService actionService, IFileUtilities fileUtilities, IRenderingOptionsTreeViewService renderingOptionsTreeViewService)
        {
            _applicationStorageService   = applicationStorageService;
            _solutionListTreeViewService = solutionListTreeViewService;
            _htmlRenderer  = htmlRenderer;
            _fileUtilities = fileUtilities;
            _renderingOptionsTreeViewService = renderingOptionsTreeViewService;

            _solutionListTreeViewService.ActionPresentBlobs += SolutionListTreeViewService_ActionPresentBlobs;
            actionService.ActionSave += ActionService_ActionSave;
        }
        public static void RenderHtml(this ParallelStack stacks, IHtmlRenderer visitor)
        {
            visitor.EnterRender(stacks);
            foreach (var stack in stacks.Stacks)
            {
                visitor.EnterStackRoot();
                RenderStackHtml(stack, visitor);
                visitor.LeaveStackRoot();
            }

            visitor.EndRender();
        }
 /// <summary>
 /// Creates an <see cref="ActionResult"/> from an <see cref="IHtmlRenderer{TModel}"/> and a <typeparamref name="TModel"/>
 /// </summary>
 /// <typeparam name="TModel">The model type</typeparam>
 /// <param name="view">The view</param>
 /// <param name="model">The model</param>
 /// <param name="statusCode">A custom status code</param>
 /// <returns>An <see cref="ActionResult"/></returns>
 public static HtmlRendererResult <TModel> Create <TModel>(
     IHtmlRenderer <TModel> view,
     TModel model,
     HttpStatusCode?statusCode = null
     )
 {
     if (view == null)
     {
         throw new ArgumentNullException(nameof(view));
     }
     return(new HtmlRendererResult <TModel>(view, model, statusCode));
 }
Exemplo n.º 9
0
 /// <summary>
 /// Creates an <see cref="EightyViewAdapter{TModel}"/>
 /// </summary>
 /// <param name="path">The view path</param>
 /// <param name="view">The view</param>
 public EightyViewAdapter(string path, IHtmlRenderer <TModel> view)
 {
     if (path == null)
     {
         throw new ArgumentNullException(nameof(path));
     }
     if (view == null)
     {
         throw new ArgumentNullException(nameof(view));
     }
     Path  = path;
     _view = view;
 }
Exemplo n.º 10
0
 public Engine(ISolutionAnalyzer solutionAnalyzer, IStorageService storageService, IHtmlRenderer htmlRenderer)
 {
     _solutionAnalyzer = solutionAnalyzer;
     _storageService   = storageService;
     _htmlRenderer     = htmlRenderer;
 }
Exemplo n.º 11
0
        /// <summary>
        /// Add an <see cref="IHtmlRenderer{TModel}"/> to the collection
        /// </summary>
        /// <param name="path">The view path</param>
        /// <param name="view">The view</param>
        public void RegisterSingleton <TModel>(string path, IHtmlRenderer <TModel> view)
        {
            var adapter = new EightyViewAdapter <TModel>(path, view);

            Views[path] = adapter;
        }
Exemplo n.º 12
0
 /// <summary>
 /// Add an <see cref="IHtmlRenderer{TModel}"/> to the collection
 /// </summary>
 /// <param name="controllerName">The controller name</param>
 /// <param name="viewName">The view name</param>
 /// <param name="view">The view</param>
 public void RegisterSingleton <TModel>(string controllerName, string viewName, IHtmlRenderer <TModel> view)
 {
     RegisterSingleton(controllerName + "/" + viewName, view);
 }
Exemplo n.º 13
0
 /// <summary>
 /// Creates an <see cref="IActionResult"/> from an <see cref="IHtmlRenderer{TModel}"/> and a <typeparamref name="TModel"/>
 /// </summary>
 /// <typeparam name="TModel">The model type</typeparam>
 /// <param name="view">The view</param>
 /// <param name="model">The model</param>
 /// <param name="statusCode">A custom status code</param>
 /// <param name="renderAsync">Write the HTML to the response asynchronously</param>
 /// <returns>An <see cref="IActionResult"/></returns>
 public static HtmlRendererResult <TModel> ToActionResult <TModel>(
     this IHtmlRenderer <TModel> view,
     TModel model,
     HttpStatusCode?statusCode = null,
     bool renderAsync          = false
     ) => Create(view, model, statusCode, renderAsync);
Exemplo n.º 14
0
 /// <summary>
 /// Creates an <see cref="ActionResult"/> from an <see cref="IHtmlRenderer{TModel}"/> and a <typeparamref name="TModel"/>
 /// </summary>
 /// <typeparam name="TModel">The model type</typeparam>
 /// <param name="view">The view</param>
 /// <param name="model">The model</param>
 /// <param name="statusCode">A custom status code</param>
 /// <returns>An <see cref="ActionResult"/></returns>
 public static HtmlRendererResult <TModel> ToActionResult <TModel>(
     this IHtmlRenderer <TModel> view,
     TModel model,
     HttpStatusCode?statusCode = null
     ) => Create(view, model, statusCode);
Exemplo n.º 15
0
        protected override RenderingResult Transform(Resource resource)
        {
            IHtmlRenderer htmlRenderer      = null;
            var           capturedResources = new List <Resource>();

            try
            {
                if (resource == null)
                {
                    throw new ArgumentNullException(nameof(resource));
                }

                htmlRenderer = _htmlRenderers.Take(_cancellationToken);
                htmlRenderer.OnResourceCaptured += CaptureResource;

                var oldStatusCode   = resource.StatusCode;
                var renderingFailed = !htmlRenderer.TryRender(
                    resource,
                    out var htmlText,
                    out var millisecondsPageLoadTime,
                    _cancellationToken
                    );

                if (renderingFailed)
                {
                    SendOutFailedProcessingResult();
                    _log.Info($"Failed to render {nameof(Resource)} was discarded: {JsonConvert.SerializeObject(resource)}");
                    return(null);
                }

                UpdateStatusCodeIfChanged();
                DoStatisticsIfHasPageLoadTime();

                if (!resource.StatusCode.IsWithinBrokenRange())
                {
                    return new RenderingResult
                           {
                               RenderedResource  = resource,
                               CapturedResources = capturedResources,
                               HtmlDocument      = new HtmlDocument {
                                   Uri = resource.Uri, HtmlText = htmlText
                               }
                           }
                }
                ;

                SendOutFailedProcessingResult();
                _log.Info($"Broken {nameof(Resource)} was discarded: {JsonConvert.SerializeObject(resource)}");
                return(null);

                void UpdateStatusCodeIfChanged()
                {
                    var newStatusCode = resource.StatusCode;

                    if (oldStatusCode == newStatusCode)
                    {
                        return;
                    }
                    if (!VerificationResults.Post(resource.ToVerificationResult()))
                    {
                        _log.Error($"Failed to post data to buffer block named [{nameof(VerificationResults)}].");
                    }
                }
                void DoStatisticsIfHasPageLoadTime()
                {
                    if (!millisecondsPageLoadTime.HasValue)
                    {
                        return;
                    }
                    _statistics.IncrementSuccessfullyRenderedPageCount();
                    _statistics.IncrementTotalPageLoadTimeBy(millisecondsPageLoadTime.Value);
                }
            }
            catch (Exception exception) when(!exception.IsAcknowledgingOperationCancelledException(_cancellationToken))
            {
                SendOutFailedProcessingResult();
                _log.Error($"One or more errors occurred while rendering: {JsonConvert.SerializeObject(resource)}.", exception);
                return(null);
            }
            finally
            {
                if (htmlRenderer != null)
                {
                    htmlRenderer.OnResourceCaptured -= CaptureResource;
                    _htmlRenderers.Add(htmlRenderer, CancellationToken.None);
                }
            }

            void CaptureResource(Resource capturedResource)
            {
                capturedResources.Add(capturedResource);
            }

            void SendOutFailedProcessingResult()
            {
                if (!FailedProcessingResults.Post(new FailedProcessingResult {
                    ProcessedResource = resource
                }))
                {
                    _log.Error($"Failed to post data to buffer block named [{nameof(FailedProcessingResults)}].");
                }
            }
        }