static PutOperation forStitching(RouterConfig routerConfig, NonBlockingRouterMetrics routerMetrics,
      ClusterMap clusterMap, NotificationSystem notificationSystem, AccountService accountService, byte[] userMetadata,
      List<ChunkInfo> chunksToStitch, PutBlobOptions options, FutureResult<String> futureResult,
      Callback<String> callback, RouterCallback routerCallback, 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,
        null, chunksToStitch, options == null ? PutBlobOptions.DEFAULT : options, futureResult, callback,
        routerCallback, null, kms, cryptoService, cryptoJobHandler, time, blobProperties, partitionClass,
        quotaChargeCallback, compressionService);
  }
Construct a PutOperation for composite blob stitching with the given parameters. This will upload a single metadata
blob containing information about each of the chunks in {@code chunksToStitch}. The metadata blob created will
behave like a normal composite blob where the data chunks are the blobs listed in {@code chunksToStitch}.
@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 chunksToStitch the list of chunks to stitch together. The put operation business logic will treat the
                      metadata in the {@link ChunkInfo} object as a source of truth when validating that the
                      chunks can be stitched.
@param options the {@link PutBlobOptions}.
@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 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