Code review comment: Should `buildBlobPropertiesResponse` be moved to `ModelHelper` (or whatever type we have to dump model transformations) ?

Code under review:
public BlobInputStream openInputStream(BlobInputStreamOptions options) {
        options = options == null ? new BlobInputStreamOptions() : options;
        ConsistentReadControl consistentReadControl = options.getConsistentReadControl() == null
            ? ConsistentReadControl.ETAG : options.getConsistentReadControl();
        BlobRequestConditions requestConditions = options.getRequestConditions() == null
            ? new BlobRequestConditions() : options.getRequestConditions();

        BlobRange range = options.getRange() == null ? new BlobRange(0) : options.getRange();
        int chunkSize = options.getBlockSize() == null ? 4 * Constants.MB : options.getBlockSize();

        com.azure.storage.common.ParallelTransferOptions pOptions =
            new com.azure.storage.common.ParallelTransferOptions().setBlockSizeLong((long) chunkSize);
        BiFunction<BlobRange, BlobRequestConditions, Mono<BlobDownloadAsyncResponse>> downloadFunc =
            (r, conditions) -> client.downloadWithResponse(r, null, conditions, false);
        Tuple3<Long, BlobRequestConditions, BlobDownloadAsyncResponse> tuple =
            ChunkedDownloadUtils.downloadFirstChunk(range, pOptions, requestConditions, downloadFunc, true).block();
        if (tuple == null) {
            throw logger.logExceptionAsError(new IllegalStateException("Downloading first chunk returned null"));
        }

        BlobDownloadAsyncResponse downloadResponse = tuple.getT3();
        ByteBuffer initialBuffer = FluxUtil.collectBytesInByteBufferStream(downloadResponse.getValue())
            .map(ByteBuffer::wrap).block();
        if (initialBuffer == null) {
            throw logger.logExceptionAsError(new IllegalStateException("Collecting first chunk returned null"));
        }
        BlobProperties properties = BlobAsyncClientBase.buildBlobPropertiesResponse(downloadResponse).getValue();

        String eTag = properties.getETag();
        String versionId = properties.getVersionId();
        BlobAsyncClientBase client = this.client;

        switch (consistentReadControl) {
            case NONE:
                break;
            case ETAG:
                
                if (requestConditions.getIfMatch() == null) {
                    requestConditions.setIfMatch(eTag);
                }
                break;
            case VERSION_ID:
                if (versionId == null) {
                    throw logger.logExceptionAsError(
                        new UnsupportedOperationException("Versioning is not supported on this account."));
                } else {
                    
                    if (this.client.getVersionId() == null) {
                        client = this.client.getVersionClient(versionId);
                    }
                }
                break;
            default:
                throw logger.logExceptionAsError(new IllegalArgumentException("Concurrency control type not "
                    + "supported."));
        }

        return new BlobInputStream(client, range.getOffset(), range.getCount(), chunkSize, initialBuffer,
            requestConditions, properties);
    }

Line commented on: BlobProperties properties = BlobAsyncClientBase.buildBlobPropertiesResponse(downloadResponse).getValue();

Revised code:
public BlobInputStream openInputStream(BlobInputStreamOptions options) {
        options = options == null ? new BlobInputStreamOptions() : options;
        ConsistentReadControl consistentReadControl = options.getConsistentReadControl() == null
            ? ConsistentReadControl.ETAG : options.getConsistentReadControl();
        BlobRequestConditions requestConditions = options.getRequestConditions() == null
            ? new BlobRequestConditions() : options.getRequestConditions();

        BlobRange range = options.getRange() == null ? new BlobRange(0) : options.getRange();
        int chunkSize = options.getBlockSize() == null ? 4 * Constants.MB : options.getBlockSize();

        com.azure.storage.common.ParallelTransferOptions parallelTransferOptions =
            new com.azure.storage.common.ParallelTransferOptions().setBlockSizeLong((long) chunkSize);
        BiFunction<BlobRange, BlobRequestConditions, Mono<BlobDownloadAsyncResponse>> downloadFunc =
            (chunkRange, conditions) -> client.downloadWithResponse(chunkRange, null, conditions, false);
        return ChunkedDownloadUtils.downloadFirstChunk(range, parallelTransferOptions, requestConditions, downloadFunc, true)
            .flatMap(tuple3 -> {
                BlobDownloadAsyncResponse downloadResponse = tuple3.getT3();
                return FluxUtil.collectBytesInByteBufferStream(downloadResponse.getValue())
                    .map(ByteBuffer::wrap)
                    .zipWith(Mono.just(downloadResponse));
            })
            .flatMap(tuple2 -> {
                ByteBuffer initialBuffer = tuple2.getT1();
                BlobDownloadAsyncResponse downloadResponse = tuple2.getT2();

                BlobProperties properties = ModelHelper.buildBlobPropertiesResponse(downloadResponse).getValue();

                String eTag = properties.getETag();
                String versionId = properties.getVersionId();
                BlobAsyncClientBase client = this.client;

                switch (consistentReadControl) {
                    case NONE:
                        break;
                    case ETAG:
                        
                        if (requestConditions.getIfMatch() == null) {
                            requestConditions.setIfMatch(eTag);
                        }
                        break;
                    case VERSION_ID:
                        if (versionId == null) {
                            return FluxUtil.monoError(logger,
                                new UnsupportedOperationException("Versioning is not supported on this account."));
                        } else {
                            
                            if (this.client.getVersionId() == null) {
                                client = this.client.getVersionClient(versionId);
                            }
                        }
                        break;
                    default:
                        return FluxUtil.monoError(logger, new IllegalArgumentException("Concurrency control type not "
                            + "supported."));
                }

                return Mono.just(new BlobInputStream(client, range.getOffset(), range.getCount(), chunkSize, initialBuffer,
                    requestConditions, properties));
            }).block();
    }