Example #1
0
 private void Prepare(
     DocumentBuildParameters parameters,
     DocumentBuildContext context,
     TemplateProcessor templateProcessor,
     string markdownServiceContextHash,
     out IHostServiceCreator hostServiceCreator,
     out PhaseProcessor phaseProcessor)
 {
     if (IntermediateFolder != null && parameters.ApplyTemplateSettings.TransformDocument)
     {
         context.IncrementalBuildContext = IncrementalBuildContext.Create(parameters, CurrentBuildInfo, LastBuildInfo, IntermediateFolder, markdownServiceContextHash);
         hostServiceCreator = new HostServiceCreatorWithIncremental(context);
         phaseProcessor     = new PhaseProcessor
         {
             Handlers =
             {
                 new PrebuildBuildPhaseHandler(context).WithIncremental(),
                 new PostbuildPhaseHandler(context,                       templateProcessor).WithIncremental(),
             }
         };
     }
     else
     {
         hostServiceCreator = new HostServiceCreator(context);
         phaseProcessor     = new PhaseProcessor
         {
             Handlers =
             {
                 new PrebuildBuildPhaseHandler(context),
                 new PostbuildPhaseHandler(context,     templateProcessor),
             }
         };
     }
 }
Example #2
0
        public virtual HostService CreateHostService(
            DocumentBuildParameters parameters,
            TemplateProcessor templateProcessor,
            IMarkdownService markdownService,
            IEnumerable <IInputMetadataValidator> metadataValidator,
            IDocumentProcessor processor,
            IEnumerable <FileAndType> files)
        {
            var(models, invalidFiles) = LoadModels(files, parameters, processor);
            var hostService = new HostService(
                parameters.Files.DefaultBaseDir,
                models,
                parameters.VersionName,
                parameters.VersionDir,
                parameters.LruSize,
                parameters.GroupInfo,
                new BuildParameters(parameters.TagParameters))
            {
                MarkdownService            = markdownService,
                Processor                  = processor,
                Template                   = templateProcessor,
                Validators                 = metadataValidator?.ToImmutableList(),
                ShouldTraceIncrementalInfo = ShouldProcessorTraceInfo(processor),
                CanIncrementalBuild        = CanProcessorIncremental(processor),
                InvalidSourceFiles         = invalidFiles.ToImmutableList(),
            };

            return(hostService);
        }
Example #3
0
 public virtual HostService CreateHostService(
     DocumentBuildParameters parameters,
     TemplateProcessor templateProcessor,
     IMarkdownService markdownService,
     IEnumerable<IInputMetadataValidator> metadataValidator,
     IDocumentProcessor processor,
     IEnumerable<FileAndType> files)
 {
     var hostService = new HostService(
                parameters.Files.DefaultBaseDir,
                files == null
                     ? new FileModel[0]
                     : from file in files
                       select Load(processor, parameters.Metadata, parameters.FileMetadata, file) into model
                       where model != null
                       select model)
     {
         MarkdownService = markdownService,
         Processor = processor,
         Template = templateProcessor,
         Validators = metadataValidator?.ToImmutableList(),
         ShouldTraceIncrementalInfo = ShouldProcessorTraceInfo(processor),
         CanIncrementalBuild = CanProcessorIncremental(processor),
     };
     return hostService;
 }
Example #4
0
        public virtual HostService CreateHostService(
            DocumentBuildParameters parameters,
            TemplateProcessor templateProcessor,
            IMarkdownService markdownService,
            IEnumerable <IInputMetadataValidator> metadataValidator,
            IDocumentProcessor processor,
            IEnumerable <FileAndType> files)
        {
            var hostService = new HostService(
                parameters.Files.DefaultBaseDir,
                files == null
                    ? Enumerable.Empty <FileModel>()
                    : from file in files
                select Load(processor, parameters.Metadata, parameters.FileMetadata, file) into model
                where model != null
                select model,
                parameters.VersionName,
                parameters.VersionDir,
                parameters.LruSize,
                parameters.GroupInfo)
            {
                MarkdownService            = markdownService,
                Processor                  = processor,
                Template                   = templateProcessor,
                Validators                 = metadataValidator?.ToImmutableList(),
                ShouldTraceIncrementalInfo = ShouldProcessorTraceInfo(processor),
                CanIncrementalBuild        = CanProcessorIncremental(processor),
            };

            return(hostService);
        }
Example #5
0
        private List <HostService> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable <IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IHostServiceCreator creator)
        {
            var files = (from file in parameters.Files.EnumerateFiles().AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism)
                         from p in (from processor in processors
                                    let priority = processor.GetProcessingPriority(file)
                                                   where priority != ProcessingPriority.NotSupported
                                                   group processor by priority into ps
                                                   orderby ps.Key descending
                                                   select ps.ToList()).FirstOrDefault() ?? new List <IDocumentProcessor> {
                null
            }
                         group file by p).ToList();

            var toHandleItems    = files.Where(s => s.Key != null);
            var notToHandleItems = files
                                   .Where(s => s.Key == null)
                                   .SelectMany(s => s)
                                   .Where(s => s.Type != DocumentType.Overwrite &&
                                          !s.File.EndsWith(".yaml.md", StringComparison.OrdinalIgnoreCase) &&
                                          !s.File.EndsWith(".yml.md", StringComparison.OrdinalIgnoreCase))
                                   .ToList();

            if (notToHandleItems.Count > 0)
            {
                Logger.LogWarning(
                    $"Unable to handle following files: {notToHandleItems.Select(s => s.File).ToDelimitedString()}. Do they miss `YamlMime` as the first line of file, e.g.: `### YamlMime:ManagedReference`?",
                    code: WarningCodes.Build.UnknownContentType);
            }

            try
            {
                return((from processor in processors.AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism)
                        join item in toHandleItems.AsParallel() on processor equals item.Key into g
                        from item in g.DefaultIfEmpty()
                        where item != null && item.Any(s => s.Type != DocumentType.Overwrite) // when normal file exists then processing is needed
                        select LoggerPhaseScope.WithScope(
                            processor.Name,
                            LogLevel.Verbose,
                            () => creator.CreateHostService(
                                parameters,
                                templateProcessor,
                                MarkdownService,
                                MetadataValidators,
                                processor,
                                item)
                            )).ToList());
            }
            catch (AggregateException ex)
            {
                throw ex.GetBaseException();
            }
        }
        private IEnumerable <HostService> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable <IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IHostServiceCreator creator)
        {
            var k = from fileItem in (
                from file in parameters.Files.EnumerateFiles()
                from p in (from processor in processors
                           let priority = processor.GetProcessingPriority(file)
                                          where priority != ProcessingPriority.NotSupported
                                          group processor by priority into ps
                                          orderby ps.Key descending
                                          select ps.ToList()).FirstOrDefault() ?? new List <IDocumentProcessor> {
                null
            }
                select new { file, p })
                    group fileItem by fileItem.p;

            var toHandleItems    = k.Where(s => s.Key != null);
            var notToHandleItems = k.Where(s => s.Key == null);

            foreach (var item in notToHandleItems)
            {
                var sb = new StringBuilder();
                sb.AppendLine("Cannot handle following file:");
                foreach (var f in item)
                {
                    sb.Append("\t");
                    sb.AppendLine(f.file.File);
                }
                Logger.LogWarning(sb.ToString());
            }

            foreach (var pair in (from processor in processors
                                  join item in toHandleItems on processor equals item.Key into g
                                  from item in g.DefaultIfEmpty()
                                  select new
            {
                processor,
                item,
            }).AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism))
            {
                using (new LoggerPhaseScope(pair.processor.Name, true))
                {
                    var hostService = creator.CreateHostService(
                        parameters,
                        templateProcessor,
                        MarkdownService,
                        MetadataValidators,
                        pair.processor,
                        pair.item?.Select(f => f.file));
                    yield return(hostService);
                }
            }
        }
Example #7
0
        private List <HostService> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable <IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IHostServiceCreator creator)
        {
            var files = (from file in parameters.Files.EnumerateFiles().AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism)
                         from p in (from processor in processors
                                    let priority = processor.GetProcessingPriority(file)
                                                   where priority != ProcessingPriority.NotSupported
                                                   group processor by priority into ps
                                                   orderby ps.Key descending
                                                   select ps.ToList()).FirstOrDefault() ?? new List <IDocumentProcessor> {
                null
            }
                         group file by p).ToList();

            var toHandleItems    = files.Where(s => s.Key != null);
            var notToHandleItems = files.Where(s => s.Key == null);

            foreach (var item in notToHandleItems)
            {
                var sb = new StringBuilder();
                sb.AppendLine("Cannot handle following file:");
                foreach (var f in item)
                {
                    sb.Append("\t");
                    sb.AppendLine(f.File);
                }
                Logger.LogWarning(sb.ToString());
            }

            try
            {
                return((from processor in processors.AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism)
                        join item in toHandleItems.AsParallel() on processor equals item.Key into g
                        from item in g.DefaultIfEmpty()
                        select LoggerPhaseScope.WithScope(
                            processor.Name,
                            LogLevel.Verbose,
                            () => creator.CreateHostService(
                                parameters,
                                templateProcessor,
                                MarkdownService,
                                MetadataValidators,
                                processor,
                                item)
                            )).ToList());
            }
            catch (AggregateException ex)
            {
                throw new DocfxException(ex.InnerException?.Message, ex);
            }
        }
Example #8
0
        public ManifestProcessor(List <ManifestItemWithContext> manifestWithContext, DocumentBuildContext context, TemplateProcessor templateProcessor)
        {
            _context             = context ?? throw new ArgumentNullException(nameof(context));
            _templateProcessor   = templateProcessor ?? throw new ArgumentNullException(nameof(templateProcessor));
            _manifestWithContext = manifestWithContext ?? throw new ArgumentNullException(nameof(manifestWithContext));

            // E.g. we can set TOC model to be globally shared by every data model
            // Make sure it is single thread
            _globalMetadata = _templateProcessor.Tokens?.ToDictionary(pair => pair.Key, pair => (object)pair.Value)
                              ?? new Dictionary <string, object>();
        }
Example #9
0
        private IEnumerable <HostService> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable <IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IMarkdownService markdownService)
        {
            var k = from fileItem in (
                from file in parameters.Files.EnumerateFiles()
                from p in (from processor in processors
                           let priority = processor.GetProcessingPriority(file)
                                          where priority != ProcessingPriority.NotSupported
                                          group processor by priority into ps
                                          orderby ps.Key descending
                                          select ps.ToList()).FirstOrDefault() ?? new List <IDocumentProcessor> {
                null
            }
                select new { file, p })
                    group fileItem by fileItem.p;

            var toHandleItems    = k.Where(s => s.Key != null);
            var notToHandleItems = k.Where(s => s.Key == null);

            foreach (var item in notToHandleItems)
            {
                var sb = new StringBuilder();
                sb.AppendLine("Cannot handle following file:");
                foreach (var f in item)
                {
                    sb.Append("\t");
                    sb.AppendLine(f.file.File);
                }
                Logger.LogWarning(sb.ToString());
            }

            // todo : revert until PreProcessor ready
            return(from processor in processors
                   join item in toHandleItems on processor equals item.Key into g
                   from item in g.DefaultIfEmpty().AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism)
                   select new HostService(
                       parameters.Files.DefaultBaseDir,
                       item == null
                            ? new FileModel[0]
                            : from file in item
                       select Load(processor, parameters.Metadata, parameters.FileMetadata, file.file) into model
                       where model != null
                       select model)
            {
                MarkdownService = markdownService,
                Processor = processor,
                Template = templateProcessor,
                Validators = MetadataValidators.ToImmutableList(),
            });
        }
Example #10
0
        public static List <TemplateManifestItem> Transform(TemplateProcessor processor, List <ManifestItem> manifest, DocumentBuildContext context, ApplyTemplateSettings settings)
        {
            if (settings.Options == ApplyTemplateOptions.ExportRawModel || processor == null)
            {
                ExportRawModel(manifest, settings);
                return(null);
            }

            using (new LoggerPhaseScope("Apply Templates"))
            {
                Logger.LogInfo($"Applying templates to {manifest.Count} model(s)...");

                processor.ProcessDependencies(settings.OutputFolder);
                if (processor.IsEmpty)
                {
                    Logger.LogWarning("No template is found.");
                    ExportRawModel(manifest, settings);
                    return(null);
                }

                Logger.LogVerbose("Start applying template...");

                var outputDirectory = context.BuildOutputFolder;

                var templateManifest = processor.Transform(manifest, context, settings);

                if (!settings.Options.HasFlag(ApplyTemplateOptions.TransformDocument))
                {
                    Logger.LogInfo("Dryrun, no template will be applied to the documents.");
                }

                if (templateManifest.Count > 0)
                {
                    // Save manifest from template
                    // TODO: Keep .manifest for backward-compatability, will remove next sprint
                    var manifestPath = Path.Combine(outputDirectory ?? string.Empty, Constants.ObsoleteManifestFileName);
                    JsonUtility.Serialize(manifestPath, templateManifest);
                    // Logger.LogInfo($"Manifest file saved to {manifestPath}. NOTE: This file is out-of-date and will be removed in version 1.8, if you rely on this file, please change to use {Constants.ManifestFileName} instead.");

                    var manifestJsonPath = Path.Combine(outputDirectory ?? string.Empty, Constants.ManifestFileName);

                    var toc            = context.GetTocInfo();
                    var manifestObject = GenerateManifest(context, templateManifest);
                    JsonUtility.Serialize(manifestJsonPath, manifestObject);
                    Logger.LogInfo($"Manifest file saved to {manifestJsonPath}.");
                }
                return(templateManifest);
            }
        }
Example #11
0
        private static IEnumerable <InnerBuildContext> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable <IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IMarkdownService markdownService)
        {
            var k = from fileItem in (
                from file in parameters.Files.EnumerateFiles()
                from p in (from processor in processors
                           let priority = processor.GetProcessingPriority(file)
                                          where priority != ProcessingPriority.NotSupported
                                          group processor by priority into ps
                                          orderby ps.Key descending
                                          select ps.ToList()).FirstOrDefault() ?? new List <IDocumentProcessor> {
                null
            }
                select new { file, p })
                    group fileItem by fileItem.p;

            var toHandleItems    = k.Where(s => s.Key != null);
            var notToHandleItems = k.Where(s => s.Key == null);

            foreach (var item in notToHandleItems)
            {
                var sb = new StringBuilder();
                sb.AppendLine("Cannot handle following file:");
                foreach (var f in item)
                {
                    sb.Append("\t");
                    sb.AppendLine(f.file.File);
                }
                Logger.LogWarning(sb.ToString());
            }

            return(from item in toHandleItems.AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism)
                   select new InnerBuildContext(
                       new HostService(
                           parameters.Files.DefaultBaseDir,
                           from file in item
                           select Load(item.Key, parameters.Metadata, parameters.FileMetadata, file.file)
                           into model
                           where model != null
                           select model)
            {
                MarkdownService = markdownService,
            },
                       item.Key,
                       templateProcessor));
        }
Example #12
0
        private void ProcessUnloadedTemplateDependency(IEnumerable <HostService> hostServices)
        {
            var loaded   = Context.ManifestItems;
            var unloaded = GetUnloadedManifestItems(hostServices);
            var types    = new HashSet <string>(unloaded.Select(m => m.DocumentType).Except(loaded.Select(m => m.DocumentType)));

            if (types.Count > 0)
            {
                TemplateProcessor.ProcessDependencies(types, Context.ApplyTemplateSettings);
            }
            foreach (var m in unloaded)
            {
                Context.ManifestItems.Add(m);
            }
        }
 public override HostService CreateHostService(
     DocumentBuildParameters parameters,
     TemplateProcessor templateProcessor,
     IMarkdownService markdownService,
     IEnumerable<IInputMetadataValidator> metadataValidator,
     IDocumentProcessor processor,
     IEnumerable<FileAndType> files)
 {
     if (ShouldProcessorTraceInfo(processor))
     {
         IncrementalContext.CreateProcessorInfo(processor);
     }
     var hs = base.CreateHostService(parameters, templateProcessor, markdownService, metadataValidator, processor, files);
     PostCreate(hs, files);
     return hs;
 }
Example #14
0
        public override HostService CreateHostService(
            DocumentBuildParameters parameters,
            TemplateProcessor templateProcessor,
            IMarkdownService markdownService,
            IEnumerable <IInputMetadataValidator> metadataValidator,
            IDocumentProcessor processor,
            IEnumerable <FileAndType> files)
        {
            if (ShouldProcessorTraceInfo(processor))
            {
                IncrementalContext.CreateProcessorInfo(processor);
            }
            var hs = base.CreateHostService(parameters, templateProcessor, markdownService, metadataValidator, processor, files);

            PostCreate(hs, files);
            return(hs);
        }
Example #15
0
 public ManifestProcessor(IEnumerable<HostService> hostServices, DocumentBuildContext context, TemplateProcessor templateProcessor)
 {
     if (hostServices == null)
     {
         throw new ArgumentNullException(nameof(hostServices));
     }
     if (context == null)
     {
         throw new ArgumentNullException(nameof(context));
     }
     if (templateProcessor == null)
     {
         throw new ArgumentNullException(nameof(templateProcessor));
     }
     _context = context;
     _templateProcessor = templateProcessor;
     Init(hostServices);
 }
Example #16
0
 public ManifestProcessor(List <HostService> hostServices, DocumentBuildContext context, TemplateProcessor templateProcessor)
 {
     if (hostServices == null)
     {
         throw new ArgumentNullException(nameof(hostServices));
     }
     if (context == null)
     {
         throw new ArgumentNullException(nameof(context));
     }
     if (templateProcessor == null)
     {
         throw new ArgumentNullException(nameof(templateProcessor));
     }
     _context           = context;
     _templateProcessor = templateProcessor;
     Init(hostServices);
 }
 private void Prepare(
     DocumentBuildParameters parameters,
     DocumentBuildContext context,
     TemplateProcessor templateProcessor,
     string markdownServiceContextHash,
     out IHostServiceCreator hostServiceCreator,
     out PhaseProcessor phaseProcessor)
 {
     if (IntermediateFolder != null && parameters.ApplyTemplateSettings.TransformDocument)
     {
         using (new LoggerPhaseScope("CreateIncrementalBuildContext", false))
             using (new PerformanceScope("CreateIncrementalBuildContext", LogLevel.Verbose))
             {
                 context.IncrementalBuildContext = IncrementalBuildContext.Create(parameters, CurrentBuildInfo, LastBuildInfo, IntermediateFolder, markdownServiceContextHash);
             }
         hostServiceCreator = new HostServiceCreatorWithIncremental(context);
         phaseProcessor     = new PhaseProcessor
         {
             Handlers =
             {
                 new CompilePhaseHandler(context).WithIncremental(),
                 new LinkPhaseHandler(context,                      templateProcessor).WithIncremental(),
             }
         };
     }
     else
     {
         hostServiceCreator = new HostServiceCreator(context);
         phaseProcessor     = new PhaseProcessor
         {
             Handlers =
             {
                 new CompilePhaseHandler(context),
                 new LinkPhaseHandler(context,    templateProcessor),
             }
         };
     }
 }
        private void ProcessUnloadedTemplateDependency(IEnumerable <HostService> hostServices, int maxParallelism)
        {
            var loaded = Context.ManifestItems;
            IEnumerable <ManifestItem> unloaded;

            using (new LoggerPhaseScope("GetUnloadedManifestItems", LogLevel.Verbose))
            {
                unloaded = GetUnloadedManifestItems(hostServices, maxParallelism);
            }
            var types = new HashSet <string>(unloaded.Select(m => m.DocumentType).Except(loaded.Select(m => m.DocumentType)));

            if (types.Count > 0)
            {
                using (new LoggerPhaseScope("ProcessDependencies", LogLevel.Verbose))
                {
                    TemplateProcessor.ProcessDependencies(types, Context.ApplyTemplateSettings);
                }
            }
            foreach (var m in unloaded)
            {
                Context.ManifestItems.Add(m);
            }
        }
Example #19
0
        public void Build(DocumentBuildParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }
            if (parameters.OutputBaseDir == null)
            {
                throw new ArgumentException("Output folder cannot be null.", nameof(parameters) + "." + nameof(parameters.OutputBaseDir));
            }
            if (parameters.Files == null)
            {
                throw new ArgumentException("Source files cannot be null.", nameof(parameters) + "." + nameof(parameters.Files));
            }
            if (parameters.MaxParallelism <= 0)
            {
                parameters.MaxParallelism = Environment.ProcessorCount;
            }
            if (parameters.Metadata == null)
            {
                parameters.Metadata = ImmutableDictionary <string, object> .Empty;
            }

            using (new LoggerPhaseScope(PhaseName))
            {
                Logger.LogInfo($"Max parallelism is {parameters.MaxParallelism.ToString()}.");
                Directory.CreateDirectory(parameters.OutputBaseDir);
                var context = new DocumentBuildContext(
                    Path.Combine(Environment.CurrentDirectory, parameters.OutputBaseDir),
                    parameters.Files.EnumerateFiles(),
                    parameters.ExternalReferencePackages,
                    parameters.MaxParallelism);
                Logger.LogVerbose("Start building document...");
                var innerContexts = Enumerable.Empty <InnerBuildContext>();
                try
                {
                    using (var processor = parameters.TemplateManager?.GetTemplateProcessor(parameters.MaxParallelism))
                    {
                        innerContexts = GetInnerContexts(parameters, Processors, processor).ToList();
                        var manifest = new List <ManifestItemWithContext>();
                        foreach (var item in innerContexts)
                        {
                            manifest.AddRange(BuildCore(item, context));
                        }

                        // Use manifest from now on
                        UpdateContext(context);
                        UpdateHref(manifest, context);

                        var generatedManifest = TemplateProcessor.Transform(processor, manifest.Select(s => s.Item).ToList(), context, parameters.ApplyTemplateSettings);
                        // todo : move to plugin.
                        object value;
                        if (parameters.Metadata.TryGetValue("_enableSearch", out value))
                        {
                            var isSearchable = value as bool?;
                            if (isSearchable.HasValue && isSearchable.Value)
                            {
                                ExtractSearchData.ExtractSearchIndexFromHtml.GenerateFile(generatedManifest, parameters.OutputBaseDir);
                            }
                        }
                        Logger.LogInfo($"Building {manifest.Count} file(s) completed.");
                    }
                }
                finally
                {
                    foreach (var item in innerContexts)
                    {
                        if (item.HostService != null)
                        {
                            Cleanup(item.HostService);
                            item.HostService.Dispose();
                        }
                    }
                }
            }
        }
Example #20
0
 public LinkPhaseHandler(DocumentBuildContext context, TemplateProcessor templateProcessor)
 {
     Context           = context;
     TemplateProcessor = templateProcessor;
 }
Example #21
0
        private IEnumerable <HostService> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable <IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IMarkdownService markdownService,
            DocumentBuildContext context)
        {
            var k = from fileItem in (
                from file in parameters.Files.EnumerateFiles()
                from p in (from processor in processors
                           let priority = processor.GetProcessingPriority(file)
                                          where priority != ProcessingPriority.NotSupported
                                          group processor by priority into ps
                                          orderby ps.Key descending
                                          select ps.ToList()).FirstOrDefault() ?? new List <IDocumentProcessor> {
                null
            }
                select new { file, p })
                    group fileItem by fileItem.p;

            var toHandleItems    = k.Where(s => s.Key != null);
            var notToHandleItems = k.Where(s => s.Key == null);

            foreach (var item in notToHandleItems)
            {
                var sb = new StringBuilder();
                sb.AppendLine("Cannot handle following file:");
                foreach (var f in item)
                {
                    sb.Append("\t");
                    sb.AppendLine(f.file.File);
                }
                Logger.LogWarning(sb.ToString());
            }

            // todo : revert until PreProcessor ready
            var pairs = from processor in processors
                        join item in toHandleItems on processor equals item.Key into g
                        from item in g.DefaultIfEmpty()
                        select new
            {
                processor,
                item,
                canProcessorIncremental = CanProcessorIncremental(processor, parameters.VersionName),
            };

            // load last xrefspecmap and manifestitems
            BuildVersionInfo lbvi   = LastBuildInfo?.Versions.SingleOrDefault(v => v.VersionName == parameters.VersionName);
            var lastXRefSpecMap     = lbvi?.XRefSpecMap;
            var lastManifest        = lbvi?.Manifest;
            var lastDependencyGraph = lbvi?.Dependency;

            return(from pair in pairs.AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism)
                   select new HostService(
                       parameters.Files.DefaultBaseDir,
                       pair.item == null
                            ? new FileModel[0]
                            : from file in pair.item
                       select Load(pair.processor, parameters.Metadata, parameters.FileMetadata, file.file, pair.canProcessorIncremental, lastXRefSpecMap, lastManifest, lastDependencyGraph, context) into model
                       where model != null
                       select model)
            {
                MarkdownService = markdownService,
                Processor = pair.processor,
                Template = templateProcessor,
                Validators = MetadataValidators.ToImmutableList(),
            });
        }
Example #22
0
 public ManifestProcessor(List <ManifestItemWithContext> manifestWithContext, DocumentBuildContext context, TemplateProcessor templateProcessor)
 {
     _context             = context ?? throw new ArgumentNullException(nameof(context));
     _templateProcessor   = templateProcessor ?? throw new ArgumentNullException(nameof(templateProcessor));
     _manifestWithContext = manifestWithContext ?? throw new ArgumentNullException(nameof(manifestWithContext));
 }
Example #23
0
        private IEnumerable <HostService> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable <IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IMarkdownService markdownService,
            DocumentBuildContext context)
        {
            var k = from fileItem in (
                from file in parameters.Files.EnumerateFiles()
                from p in (from processor in processors
                           let priority = processor.GetProcessingPriority(file)
                                          where priority != ProcessingPriority.NotSupported
                                          group processor by priority into ps
                                          orderby ps.Key descending
                                          select ps.ToList()).FirstOrDefault() ?? new List <IDocumentProcessor> {
                null
            }
                select new { file, p })
                    group fileItem by fileItem.p;

            var toHandleItems    = k.Where(s => s.Key != null);
            var notToHandleItems = k.Where(s => s.Key == null);

            foreach (var item in notToHandleItems)
            {
                var sb = new StringBuilder();
                sb.AppendLine("Cannot handle following file:");
                foreach (var f in item)
                {
                    sb.Append("\t");
                    sb.AppendLine(f.file.File);
                }
                Logger.LogWarning(sb.ToString());
            }

            // todo : revert until PreProcessor ready
            foreach (var pair in (from processor in processors
                                  join item in toHandleItems on processor equals item.Key into g
                                  from item in g.DefaultIfEmpty()
                                  select new
            {
                processor,
                item,
            }).AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism))
            {
                var  incrementalContext          = context.IncrementalBuildContext;
                var  processorSupportIncremental = IsProcessorSupportIncremental(pair.processor);
                bool processorCanIncremental     = processorSupportIncremental;
                if (processorSupportIncremental)
                {
                    incrementalContext.CreateProcessorInfo(pair.processor);
                    processorCanIncremental = incrementalContext.CanProcessorIncremental(pair.processor);
                }

                var hostService = new HostService(
                    parameters.Files.DefaultBaseDir,
                    pair.item == null
                            ? new FileModel[0]
                            : from file in pair.item
                    select Load(pair.processor, parameters.Metadata, parameters.FileMetadata, file.file, processorCanIncremental, context) into model
                    where model != null
                    select model)
                {
                    MarkdownService            = markdownService,
                    Processor                  = pair.processor,
                    Template                   = templateProcessor,
                    Validators                 = MetadataValidators.ToImmutableList(),
                    ShouldTraceIncrementalInfo = processorSupportIncremental,
                    CanIncrementalBuild        = processorCanIncremental,
                };

                if (ShouldTraceIncrementalInfo)
                {
                    using (new LoggerPhaseScope("ReportModelLoadInfo", true))
                    {
                        var allFiles    = pair.item?.Select(f => f.file.File) ?? new string[0];
                        var loadedFiles = hostService.Models.Select(m => m.FileAndType.File);
                        incrementalContext.ReportModelLoadInfo(hostService, allFiles.Except(loadedFiles), null);
                        incrementalContext.ReportModelLoadInfo(hostService, loadedFiles, BuildPhase.PreBuild);
                    }
                }
                yield return(hostService);
            }
        }
Example #24
0
 private void Prepare(
     DocumentBuildParameters parameters,
     DocumentBuildContext context,
     TemplateProcessor templateProcessor,
     string markdownServiceContextHash,
     out IHostServiceCreator hostServiceCreator,
     out PhaseProcessor phaseProcessor)
 {
     if (IntermediateFolder != null && parameters.ApplyTemplateSettings.TransformDocument)
     {
         context.IncrementalBuildContext = IncrementalBuildContext.Create(parameters, CurrentBuildInfo, LastBuildInfo, IntermediateFolder, markdownServiceContextHash);
         hostServiceCreator = new HostServiceCreatorWithIncremental(context);
         phaseProcessor = new PhaseProcessor
         {
             Handlers =
                             {
                                 new PrebuildBuildPhaseHandler(context).WithIncremental(),
                                 new PostbuildPhaseHandler(context, templateProcessor).WithIncremental(),
                             }
         };
     }
     else
     {
         hostServiceCreator = new HostServiceCreator(context);
         phaseProcessor = new PhaseProcessor
         {
             Handlers =
                             {
                                 new PrebuildBuildPhaseHandler(context),
                                 new PostbuildPhaseHandler(context, templateProcessor),
                             }
         };
     }
 }
Example #25
0
        private IEnumerable<HostService> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable<IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IHostServiceCreator creator)
        {
            var k = from fileItem in (
                    from file in parameters.Files.EnumerateFiles()
                    from p in (from processor in processors
                               let priority = processor.GetProcessingPriority(file)
                               where priority != ProcessingPriority.NotSupported
                               group processor by priority into ps
                               orderby ps.Key descending
                               select ps.ToList()).FirstOrDefault() ?? new List<IDocumentProcessor> { null }
                    select new { file, p })
                    group fileItem by fileItem.p;

            var toHandleItems = k.Where(s => s.Key != null);
            var notToHandleItems = k.Where(s => s.Key == null);
            foreach (var item in notToHandleItems)
            {
                var sb = new StringBuilder();
                sb.AppendLine("Cannot handle following file:");
                foreach (var f in item)
                {
                    sb.Append("\t");
                    sb.AppendLine(f.file.File);
                }
                Logger.LogWarning(sb.ToString());
            }

            foreach (var pair in (from processor in processors
                                  join item in toHandleItems on processor equals item.Key into g
                                  from item in g.DefaultIfEmpty()
                                  select new
                                  {
                                      processor,
                                      item,
                                  }).AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism))
            {
                var hostService = creator.CreateHostService(
                    parameters,
                    templateProcessor,
                    MarkdownService,
                    MetadataValidators,
                    pair.processor,
                    pair.item?.Select(f => f.file));
                yield return hostService;
            }
        }
Example #26
0
 public InnerBuildContext(HostService hostService, IDocumentProcessor processor, TemplateProcessor templateProcessor)
 {
     HostService       = hostService;
     Processor         = processor;
     TemplateProcessor = templateProcessor;
 }
Example #27
0
        private IEnumerable<HostService> GetInnerContexts(
            DocumentBuildParameters parameters,
            IEnumerable<IDocumentProcessor> processors,
            TemplateProcessor templateProcessor,
            IMarkdownService markdownService,
            DocumentBuildContext context)
        {
            var k = from fileItem in (
                    from file in parameters.Files.EnumerateFiles()
                    from p in (from processor in processors
                               let priority = processor.GetProcessingPriority(file)
                               where priority != ProcessingPriority.NotSupported
                               group processor by priority into ps
                               orderby ps.Key descending
                               select ps.ToList()).FirstOrDefault() ?? new List<IDocumentProcessor> { null }
                    select new { file, p })
                    group fileItem by fileItem.p;

            var toHandleItems = k.Where(s => s.Key != null);
            var notToHandleItems = k.Where(s => s.Key == null);
            foreach (var item in notToHandleItems)
            {
                var sb = new StringBuilder();
                sb.AppendLine("Cannot handle following file:");
                foreach (var f in item)
                {
                    sb.Append("\t");
                    sb.AppendLine(f.file.File);
                }
                Logger.LogWarning(sb.ToString());
            }

            // todo : revert until PreProcessor ready
            foreach (var pair in (from processor in processors
                                  join item in toHandleItems on processor equals item.Key into g
                                  from item in g.DefaultIfEmpty()
                                  select new
                                  {
                                      processor,
                                      item,
                                  }).AsParallel().WithDegreeOfParallelism(parameters.MaxParallelism))
            {
                var incrementalContext = context.IncrementalBuildContext;
                var processorSupportIncremental = IsProcessorSupportIncremental(pair.processor);
                bool processorCanIncremental = processorSupportIncremental;
                if (processorSupportIncremental)
                {
                    incrementalContext.CreateProcessorInfo(pair.processor);
                    processorCanIncremental = incrementalContext.CanProcessorIncremental(pair.processor);
                }

                var hostService = new HostService(
                       parameters.Files.DefaultBaseDir,
                       pair.item == null
                            ? new FileModel[0]
                            : from file in pair.item
                              select Load(pair.processor, parameters.Metadata, parameters.FileMetadata, file.file, processorCanIncremental, context) into model
                              where model != null
                              select model)
                {
                    MarkdownService = markdownService,
                    Processor = pair.processor,
                    Template = templateProcessor,
                    Validators = MetadataValidators.ToImmutableList(),
                    ShouldTraceIncrementalInfo = processorSupportIncremental,
                    CanIncrementalBuild = processorCanIncremental,
                };

                if (ShouldTraceIncrementalInfo)
                {
                    using (new LoggerPhaseScope("ReportModelLoadInfo", true))
                    {
                        var allFiles = pair.item?.Select(f => f.file.File) ?? new string[0];
                        var loadedFiles = hostService.Models.Select(m => m.FileAndType.File);
                        incrementalContext.ReportModelLoadInfo(hostService, allFiles.Except(loadedFiles), null);
                        incrementalContext.ReportModelLoadInfo(hostService, loadedFiles, BuildPhase.PreBuild);
                    }
                }
                yield return hostService;
            }
        }