public PartitionSupervisorFactory(
            IChangeFeedObserverFactory observerFactory,
            ILeaseManager leaseManager,
            ILeaseCheckpointer leaseCheckpointer,
            ICheckpointPartitionProcessorFactory partitionProcessorFactory,
            ChangeFeedProcessorOptions options)
        {
            if (observerFactory == null)
            {
                throw new ArgumentNullException(nameof(observerFactory));
            }
            if (leaseManager == null)
            {
                throw new ArgumentNullException(nameof(leaseManager));
            }
            if (leaseCheckpointer == null)
            {
                throw new ArgumentNullException(nameof(leaseCheckpointer));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (partitionProcessorFactory == null)
            {
                throw new ArgumentNullException(nameof(partitionProcessorFactory));
            }

            this.observerFactory            = observerFactory;
            this.leaseManager               = leaseManager;
            this.leaseCheckpointer          = leaseCheckpointer;
            this.changeFeedProcessorOptions = options;
            this.partitionProcessorFactory  = partitionProcessorFactory;
        }
 /// <summary>
 /// Sets the <see cref="ICheckpointPartitionProcessorFactory"/> to be used to create <see cref="IPartitionProcessor"/> for partition processing.
 /// </summary>
 /// <param name="partitionProcessorFactory">The instance of <see cref="IPartitionProcessorFactory"/> to use.</param>
 /// <returns>The instance of <see cref="ChangeFeedProcessorBuilder"/> to use.</returns>
 public ChangeFeedProcessorBuilder WithCheckpointPartitionProcessorFactory(ICheckpointPartitionProcessorFactory partitionProcessorFactory)
 {
     if (partitionProcessorFactory == null)
     {
         throw new ArgumentNullException(nameof(partitionProcessorFactory));
     }
     this.checkpointPartitionProcessorFactory = partitionProcessorFactory;
     return(this);
 }
        private ICheckpointPartitionProcessorFactory GetPartitionProcessorFactory(string feedCollectionSelfLink)
        {
            ICheckpointPartitionProcessorFactory factory = this.checkpointPartitionProcessorFactory;

            if (this.partitionProcessorFactory != null)
            {
                if (this.checkpointPartitionProcessorFactory != null)
                {
                    throw new ArgumentException("Only one partition processor factory can be used");
                }

                factory = new CheckpointPartitionProcessorFactoryAdapter(this.partitionProcessorFactory);
            }

            return(factory ?? new PartitionProcessorFactory(
                       this.feedDocumentClient,
                       this.changeFeedProcessorOptions,
                       feedCollectionSelfLink,
                       this.healthMonitor));
        }