/// <summary>
        /// Creates a stream of items that are candidates for publishing
        /// </summary>
        protected override ISourceObservable <CandidateValidationContext> CreatePublishSourceStream(DateTime started, PublishOptions options, IPublishCandidateSource publishSourceRepository, IPublishValidator validator, IPublisherOperationService publisherOperationService, CancellationTokenSource errorSource)
        {
            UnpublishedNodeSourceProducer unsp = new UnpublishedNodeSourceProducer(
                started,
                options.Languages,
                options.Targets,
                (IEnumerable <string>) new string[1] {
                PublishOptionsMetadataExtensions.GetPublishType(options)
            },
                publishSourceRepository,
                publisherOperationService,
                validator,
                this._options.UnpublishedOperationsLoadingBatchSize,
                errorSource,
                errorSource.Token,
                (ILogger)LoggerFactoryExtensions.CreateLogger <UnpublishedNodeSourceProducer>(this._loggerFactory));

            DeletedNodesSourceProducer dnsp = new DeletedNodesSourceProducer(
                (ISourceObservable <CandidateValidationContext>)unsp,
                started,
                options.Languages,
                options.Targets,
                (IEnumerable <string>) new string[1] {
                PublishOptionsMetadataExtensions.GetPublishType(options)
            },
                publisherOperationService,
                this._options.UnpublishedOperationsLoadingBatchSize,
                errorSource,
                (ILogger)LoggerFactoryExtensions.CreateLogger <UnpublishedNodeSourceProducer>(this._loggerFactory),
                null);

            return((ISourceObservable <CandidateValidationContext>)dnsp);
        }
        /// <summary>
        /// Creates a stream of items that are to be published
        /// </summary>
        protected override IObservable <CandidateValidationTargetContext> CreateTargetProcessingStream(DateTime started, IPublishCandidateSource publishSourceRepository, IPublishValidator validator, PublishOptions jobOptions, IObservable <CandidateValidationContext> publishStream, IItemIndexService targetIndex, ITestableContentRepository testableContentRepository, IMediaRepository targetMediaRepository, IRequiredPublishFieldsResolver requiredPublishFieldsResolver, CancellationTokenSource errorSource, Guid targetId)
        {
            IPublishCandidateTargetValidator publishCandidateTargetValidator = !PublishOptionsMetadataExtensions.GetItemBucketsEnabled(jobOptions) ?
                                                                               (IPublishCandidateTargetValidator) new PublishTargetParentValidator(publishSourceRepository, targetIndex) :
                                                                               (IPublishCandidateTargetValidator) new PublishTargetBucketParentValidator(publishSourceRepository, targetIndex, PublishOptionsMetadataExtensions.GetBucketTemplateId(jobOptions));

            publishStream = (IObservable <CandidateValidationContext>) new CandidatesParentValidationTargetProducer(
                publishStream,
                publishCandidateTargetValidator,
                errorSource,
                (ILogger)LoggerFactoryExtensions.CreateLogger <CandidatesParentValidationTargetProducer>(this._loggerFactory));

            return(base.CreateTargetProcessingStream(
                       started,
                       publishSourceRepository,
                       validator,
                       jobOptions,
                       publishStream,
                       targetIndex,
                       testableContentRepository,
                       targetMediaRepository,
                       requiredPublishFieldsResolver,
                       errorSource,
                       targetId));
        }
        /// <summary>
        /// Creates a stream of items that are candidates for publishing
        /// </summary>
        protected override ISourceObservable <CandidateValidationContext> CreatePublishSourceStream(DateTime started, PublishOptions options, IPublishCandidateSource publishSourceRepository, IPublishValidator validator, IPublisherOperationService publisherOperationService, CancellationTokenSource errorSource)
        {
            IPublishCandidate result = publishSourceRepository.GetNode(options.ItemId.Value).Result;

            if (result == null)
            {
                throw new ArgumentNullException(string.Format("The publish could not be performed from a start item that doesn't exist : {0}.", (object)options.ItemId.Value));
            }

            IPublishCandidate publishCandidate = result.ParentId.HasValue ?
                                                 publishSourceRepository.GetNode(result.ParentId.Value).Result :
                                                 result;

            ISourceObservable <CandidateValidationContext> sourceObservable =
                (ISourceObservable <CandidateValidationContext>) new TreeNodeSourceProducer(
                    publishSourceRepository,
                    result,
                    validator,
                    options.Descendants,
                    this._options.SourceTreeReaderBatchSize,
                    errorSource,
                    (ILogger)LoggerFactoryExtensions.CreateLogger <TreeNodeSourceProducer>(this._loggerFactory));

            if (PublishOptionsMetadataExtensions.GetItemBucketsEnabled(options) && publishCandidate.Node.TemplateId == PublishOptionsMetadataExtensions.GetBucketTemplateId(options))
            {
                sourceObservable =
                    (ISourceObservable <CandidateValidationContext>) new BucketNodeSourceProducer(
                        sourceObservable,
                        publishSourceRepository,
                        result,
                        PublishOptionsMetadataExtensions.GetBucketTemplateId(options),
                        errorSource,
                        (ILogger)LoggerFactoryExtensions.CreateLogger <BucketNodeSourceProducer>(this._loggerFactory));
            }

            DeletedNodesSourceProducer dnsp = new DeletedNodesSourceProducer(
                sourceObservable,
                started,
                options.Languages,
                options.Targets,
                (IEnumerable <string>) new string[1] {
                PublishOptionsMetadataExtensions.GetPublishType(options)
            },
                publisherOperationService,
                this._options.UnpublishedOperationsLoadingBatchSize,
                errorSource,
                (ILogger)LoggerFactoryExtensions.CreateLogger <UnpublishedNodeSourceProducer>(this._loggerFactory),
                (Predicate <PublisherOperation>)(op => Enumerable.Contains <Guid>((IEnumerable <Guid>)op.Path.Ancestors, options.ItemId.Value)));

            return((ISourceObservable <CandidateValidationContext>)dnsp);
        }