/**
* Copyright 2016 LinkedIn Corp. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*/
package com.github.ambry.messageformat;
import com.github.ambry.store.StoreKey;
import com.github.ambry.utils.Crc32;
import com.github.ambry.utils.CrcInputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
/**
* PutMessageFormatInputStream which uses Blob Format V1 instead of the default V2
*/
public class PutMessageFormatBlobV1InputStream extends MessageFormatInputStream {
public PutMessageFormatBlobV1InputStream(StoreKey key, BlobProperties blobProperties, ByteBuffer userMetadata,
InputStream blobStream, long streamSize, BlobType blobType) throws MessageFormatException {
int headerSize = MessageFormatRecord.MessageHeader_Format_V1.getHeaderSize();
int blobPropertiesRecordSize =
MessageFormatRecord.BlobProperties_Format_V1.getBlobPropertiesRecordSize(blobProperties);
int userMetadataSize = MessageFormatRecord.UserMetadata_Format_V1.getUserMetadataSize(userMetadata);
long blobSize = MessageFormatRecord.Blob_Format_V1.getBlobRecordSize(streamSize);
buffer = ByteBuffer.allocate(
headerSize + key.sizeInBytes() + blobPropertiesRecordSize + userMetadataSize + (int) (blobSize - streamSize
- MessageFormatRecord.Crc_Size));
MessageFormatRecord.MessageHeader_Format_V1.serializeHeader(buffer,
blobPropertiesRecordSize + userMetadataSize + blobSize, headerSize + key.sizeInBytes(),
MessageFormatRecord.Message_Header_Invalid_Relative_Offset,
headerSize + key.sizeInBytes() + blobPropertiesRecordSize,
headerSize + key.sizeInBytes() + blobPropertiesRecordSize + userMetadataSize);
buffer.put(key.toBytes());
MessageFormatRecord.BlobProperties_Format_V1.serializeBlobPropertiesRecord(buffer, blobProperties);
MessageFormatRecord.UserMetadata_Format_V1.serializeUserMetadataRecord(buffer, userMetadata);
int bufferBlobStart = buffer.position();
MessageFormatRecord.Blob_Format_V1.serializePartialBlobRecord(buffer, streamSize);
Crc32 crc = new Crc32();
crc.update(buffer.array(), bufferBlobStart, buffer.position() - bufferBlobStart);
stream = new CrcInputStream(crc, blobStream);
streamLength = streamSize;
messageLength = buffer.capacity() + streamLength + MessageFormatRecord.Crc_Size;
buffer.flip();
}
public PutMessageFormatBlobV1InputStream(StoreKey key, BlobProperties blobProperties, ByteBuffer userMetadata,
InputStream blobStream, long streamSize) throws MessageFormatException {
this(key, blobProperties, userMetadata, blobStream, streamSize, BlobType.DataBlob);
}
}