static PutOperation forUpload(RouterConfig routerConfig, NonBlockingRouterMetrics routerMetrics,
      ClusterMap clusterMap, NotificationSystem notificationSystem, AccountService accountService, byte[] userMetadata,
      ReadableStreamChannel channel, PutBlobOptions options, FutureResult<String> futureResult,
      Callback<String> callback, RouterCallback routerCallback,
      ByteBufferAsyncWritableChannel.ChannelEventListener writableChannelEventListener, KeyManagementService kms,
      CryptoService cryptoService, CryptoJobHandler cryptoJobHandler, Time time, BlobProperties blobProperties,
      String partitionClass, QuotaChargeCallback quotaChargeCallback, CompressionService compressionService) {
    return new PutOperation(routerConfig, routerMetrics, clusterMap, notificationSystem, accountService, userMetadata,
        channel, null, options, futureResult, callback, routerCallback, writableChannelEventListener, kms,
        cryptoService, cryptoJobHandler, time, blobProperties, partitionClass, quotaChargeCallback, compressionService);
  }
Construct a PutOperation with the given parameters. For any operation, based on the max chunk size for puts,
an object contained within the {@link ReadableStreamChannel} will either be put as a single blob if its size is
less than the max chunk size; or will be split into as many chunks as required each of which is no longer in
size than the max chunk put size, and a single metadata blob containing the information about each of these
chunks.
@param routerConfig the {@link RouterConfig} containing the configs for put operations.
@param routerMetrics The {@link NonBlockingRouterMetrics} to be used for reporting metrics.
@param clusterMap the {@link ClusterMap} of the cluster
@param notificationSystem the {@link NotificationSystem} to use for blob creation notifications.
@param accountService the {@link AccountService} used for account/container id and name mapping.
@param userMetadata the userMetadata associated with the put operation.
@param channel the {@link ReadableStreamChannel} containing the blob data. This cannot be null.
@param options The {@link PutBlobOptions} associated with the request. This cannot be null.
@param futureResult the future that will contain the result of the operation.
@param callback the callback that is to be called when the operation completes.
@param routerCallback The {@link RouterCallback} to use for callbacks to the router.
@param writableChannelEventListener a callback to be called on certain chunk filler channel events.
@param kms {@link KeyManagementService} to assist in fetching container keys for encryption or decryption
@param cryptoService {@link CryptoService} to assist in encryption or decryption
@param cryptoJobHandler {@link CryptoJobHandler} to assist in the execution of crypto jobs
@param time the Time instance to use.
@param blobProperties the BlobProperties associated with the put operation.
@param partitionClass the partition class to choose partitions from. Can be {@code null} if no affinity is required
@param quotaChargeCallback {@link QuotaChargeCallback} to listen to events that should result in charging quota.
@param compressionService The compression service use to compress data chunks.
@return the {@link PutOperation}.
ambry-router/src/main/java/com/github/ambry/router/PutOperation.java