@Override
    public CopyResult call() throws Exception {
        CompleteMultipartUploadResult res;

        try {
            CompleteMultipartUploadRequest req = new CompleteMultipartUploadRequest(
                    origReq.getDestinationBucketName(), origReq.getDestinationKey(), uploadId,
                    collectPartETags())
                    .withSSECustomerKey(origReq.getDestinationSSECustomerKey())
                    .withRequesterPays(origReq.isRequesterPays())
                    .withGeneralProgressListener(origReq.getGeneralProgressListener())
                    .withRequestMetricCollector(origReq.getRequestMetricCollector())
                    .withRequestCredentialsProvider(origReq.getRequestCredentialsProvider())
                    ;
            res = s3.completeMultipartUpload(req);
        } catch (Exception e) {
            monitor.reportFailure();
            publishProgress(listener, ProgressEventType.TRANSFER_FAILED_EVENT);
            throw e;
        }

        CopyResult copyResult = new CopyResult();
        copyResult.setSourceBucketName(origReq.getSourceBucketName());
        copyResult.setSourceKey(origReq.getSourceKey());
        copyResult.setDestinationBucketName(res
                .getBucketName());
        copyResult.setDestinationKey(res.getKey());
        copyResult.setETag(res.getETag());
        copyResult.setVersionId(res.getVersionId());

        monitor.copyComplete();

        return copyResult;
    }
The listener where progress of the copy needs to be published.
aws-java-sdk-s3/src/main/java/com/amazonaws/services/s3/transfer/internal/CompleteMultipartCopy.java