private static IBuildQueueJob CreateNewBuildJob(
            ComponentConfiguration componentConfiguration,
            CancellationTokenSource <CompileCancellationToken> cancellationTokenSource,
            ProgressToken progressToken,
            IJobCollection jobCollection)
        {
            IBuildableComponentSubtype buildableComponentSubtype = (IBuildableComponentSubtype)componentConfiguration.ComponentSubtype;

            string outputFilePath = buildableComponentSubtype.GetOutputTopLevelFilePath(componentConfiguration);

            if (jobCollection.JobInProgress(outputFilePath))
            {
                throw new CommandLineOperationException($"Build at {outputFilePath} is already in progress.");
            }

            BuildId         currentBuildId  = buildableComponentSubtype.CreateBuildId(componentConfiguration);
            BuildQueueJobId buildQueueJobId = BuildQueueJobExtension.CreateBuildQueueJobId(currentBuildId);
            IBuildQueueJob  job             = jobCollection.CreateNewJob(
                buildQueueJobId,
                componentConfiguration.ComponentDefinition.ReferencingEnvoy,
                buildableComponentSubtype.XmlName,
                outputFilePath,
                cancellationTokenSource,
                progressToken);

            return(job);
        }
        private static void JobCollectionOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e?.NewItems == null)
            {
                return;
            }

            foreach (object newItem in e.NewItems)
            {
                var  job        = (IBuildQueueJob)newItem;
                bool isChildJob = !BuildQueueJobId.IsRootJob(job.BuildQueueJobId);
                if (isChildJob)
                {
                    WriteBeginChildBuildMessage(job.AssociatedEnvoy.Name.Last);
                    job.PropertyChanged += OnChildBuildJobPropertyChanged;
                }
                else
                {
                    WriteBeginRootBuildMessage(job.AssociatedEnvoy.Name.Last);
                    job.PropertyChanged += OnRootBuildJobPropertyChanged;
                }
            }
        }