public TreePublishHandler(IRequiredPublishFieldsResolver requiredPublishFieldsResolver, 
     IPublisherOperationService publisherOpsService, 
     IDataStoreFactory dataStoreFactory, 
     IRepositoryFactory<IMediaRepository> mediaRepositoryFactory, 
     IRepositoryFactory<IItemIndexRepository> targetIndexRepositoryFactory, 
     IRepositoryFactory<IItemRepository> itemRepositoryFactory, 
     IRepositoryFactory<IItemRelationshipRepository> itemRelationshipRepoFactory, 
     IRepositoryFactory<IItemNodeRepository> itemNodeRepositoryFactory, 
     IRepositoryFactory<ITemplateGraphRepository> templateGraphRepositoryFactory, 
     IRepositoryFactory<IIndexableItemRepository> indexablePublishTargetRepositoryFactory, 
     IRepositoryFactory<IWorkflowStateRepository> workflowRepositoryFactory, 
     IRepositoryFactory<ITestableContentRepository> testableContentRepositoryFactory, 
     IRepositoryFactory<IManifestRepository> manifestRepositoryFactory,
     IRepositoryFactory<IPublishExclusionsRepository> publishExclusionsRepositoryFactory,
     IPromotionCoordinator promoterCoordinator, 
     IEventRegistry eventRegistry, 
     ILoggerFactory loggerFactory, 
     IApplicationLifetime applicationLifetime, 
     IConfiguration config)
     : this(requiredPublishFieldsResolver, publisherOpsService, dataStoreFactory, mediaRepositoryFactory, targetIndexRepositoryFactory, itemRepositoryFactory, itemRelationshipRepoFactory, itemNodeRepositoryFactory, templateGraphRepositoryFactory, indexablePublishTargetRepositoryFactory, workflowRepositoryFactory, testableContentRepositoryFactory, manifestRepositoryFactory, publishExclusionsRepositoryFactory, promoterCoordinator, eventRegistry, loggerFactory, applicationLifetime, SitecoreConfigurationExtensions.As<PublishJobHandlerOptions>(config))
 {
 }
 /// <summary>
 /// Creates a new instance of Incremental Publish Handler
 /// </summary>
 public IncrementalPublishHandler(IRequiredPublishFieldsResolver requiredPublishFieldsResolver,
                                  IPublisherOperationService publisherOpsService,
                                  IDataStoreFactory dataStoreFactory,
                                  IRepositoryFactory <IMediaRepository> mediaRepositoryFactory,
                                  IRepositoryFactory <IItemIndexRepository> targetIndexRepositoryFactory,
                                  IRepositoryFactory <IItemRepository> itemRepositoryFactory,
                                  IRepositoryFactory <IItemRelationshipRepository> itemRelationshipRepoFactory,
                                  IRepositoryFactory <IItemNodeRepository> itemNodeRepositoryFactory,
                                  IRepositoryFactory <ITemplateGraphRepository> templateGraphRepositoryFactory,
                                  IRepositoryFactory <IIndexableItemRepository> indexablePublishTargetRepositoryFactory,
                                  IRepositoryFactory <IWorkflowStateRepository> workflowRepositoryFactory,
                                  IRepositoryFactory <ITestableContentRepository> testableContentRepositoryFactory,
                                  IRepositoryFactory <IManifestRepository> manifestRepositoryFactory,
                                  IRepositoryFactory <IPublishExclusionsRepository> publishExclusionsRepositoryFactory,
                                  IPromotionCoordinator promoterCoordinator,
                                  IEventRegistry eventRegistry,
                                  ILoggerFactory loggerFactory,
                                  IApplicationLifetime applicationLifetime,
                                  IConfiguration config)
     : this(requiredPublishFieldsResolver, publisherOpsService, dataStoreFactory, mediaRepositoryFactory, targetIndexRepositoryFactory, itemRepositoryFactory, itemRelationshipRepoFactory, itemNodeRepositoryFactory, templateGraphRepositoryFactory, indexablePublishTargetRepositoryFactory, workflowRepositoryFactory, testableContentRepositoryFactory, manifestRepositoryFactory, publishExclusionsRepositoryFactory, promoterCoordinator, eventRegistry, loggerFactory, applicationLifetime, SitecoreConfigurationExtensions.As <PublishJobHandlerOptions>(config))
 {
 }
 public TreePublishHandler(IRequiredPublishFieldsResolver requiredPublishFieldsResolver,
                           IPublisherOperationService publisherOpsService,
                           IDataStoreFactory dataStoreFactory,
                           IRepositoryFactory <IMediaRepository> mediaRepositoryFactory,
                           IRepositoryFactory <IItemIndexRepository> targetIndexRepositoryFactory,
                           IRepositoryFactory <IItemRepository> itemRepositoryFactory,
                           IRepositoryFactory <IItemRelationshipRepository> itemRelationshipRepoFactory,
                           IRepositoryFactory <IItemNodeRepository> itemNodeRepositoryFactory,
                           IRepositoryFactory <ITemplateGraphRepository> templateGraphRepositoryFactory,
                           IRepositoryFactory <IIndexableItemRepository> indexablePublishTargetRepositoryFactory,
                           IRepositoryFactory <IWorkflowStateRepository> workflowRepositoryFactory,
                           IRepositoryFactory <ITestableContentRepository> testableContentRepositoryFactory,
                           IRepositoryFactory <IManifestRepository> manifestRepositoryFactory,
                           IRepositoryFactory <IPublishExclusionsRepository> publishExclusionsRepositoryFactory,
                           IPromotionCoordinator promoterCoordinator,
                           IEventRegistry eventRegistry,
                           ILoggerFactory loggerFactory,
                           IApplicationLifetime applicationLifetime,
                           PublishJobHandlerOptions options = null)
     : base(requiredPublishFieldsResolver, publisherOpsService, dataStoreFactory, mediaRepositoryFactory, targetIndexRepositoryFactory, itemRepositoryFactory, itemRelationshipRepoFactory, itemNodeRepositoryFactory, templateGraphRepositoryFactory, indexablePublishTargetRepositoryFactory, workflowRepositoryFactory, testableContentRepositoryFactory, manifestRepositoryFactory, publishExclusionsRepositoryFactory, promoterCoordinator, eventRegistry, loggerFactory, applicationLifetime, options ?? new PublishJobHandlerOptions())
 {
 }
 /// <summary>
 /// Creates a new instance of Incremental Publish Handler
 /// </summary>
 public IncrementalPublishHandler(IRequiredPublishFieldsResolver requiredPublishFieldsResolver,
     IPublisherOperationService publisherOpsService,
     IDataStoreFactory dataStoreFactory,
     IRepositoryFactory<IMediaRepository> mediaRepositoryFactory,
     IRepositoryFactory<IItemIndexRepository> targetIndexRepositoryFactory,
     IRepositoryFactory<IItemRepository> itemRepositoryFactory,
     IRepositoryFactory<IItemRelationshipRepository> itemRelationshipRepoFactory,
     IRepositoryFactory<IItemNodeRepository> itemNodeRepositoryFactory,
     IRepositoryFactory<ITemplateGraphRepository> templateGraphRepositoryFactory,
     IRepositoryFactory<IIndexableItemRepository> indexablePublishTargetRepositoryFactory,
     IRepositoryFactory<IWorkflowStateRepository> workflowRepositoryFactory,
     IRepositoryFactory<ITestableContentRepository> testableContentRepositoryFactory,
     IRepositoryFactory<IManifestRepository> manifestRepositoryFactory,
     IRepositoryFactory<IPublishExclusionsRepository> publishExclusionsRepositoryFactory,
     IPromotionCoordinator promoterCoordinator,
     IEventRegistry eventRegistry,
     ILoggerFactory loggerFactory,
     IApplicationLifetime applicationLifetime,
     PublishJobHandlerOptions options = null)
     : base(requiredPublishFieldsResolver, publisherOpsService, dataStoreFactory, mediaRepositoryFactory, targetIndexRepositoryFactory, itemRepositoryFactory, itemRelationshipRepoFactory, itemNodeRepositoryFactory, templateGraphRepositoryFactory, indexablePublishTargetRepositoryFactory, workflowRepositoryFactory, testableContentRepositoryFactory, manifestRepositoryFactory, publishExclusionsRepositoryFactory, promoterCoordinator, eventRegistry, loggerFactory, applicationLifetime, options ?? new PublishJobHandlerOptions())
 {
 }
        /// <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 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;
        }
        /// <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);
        }
        /// <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;
        }