package org.HdrHistogram;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import javax.xml.bind.DatatypeConverter;
import com.linkedin.parseq.HistogramSerializer;
public class Base64CompressedHistogramSerializer implements HistogramSerializer {
private ByteBuffer targetBuffer;
@Override
public synchronized String serialize(Histogram histogram) {
int requiredBytes = histogram.getNeededByteBufferCapacity() + (2 * Long.BYTES); // Long.BYTES for start and end timestamps
if ((targetBuffer == null) || targetBuffer.capacity() < requiredBytes) {
targetBuffer = ByteBuffer.allocate(requiredBytes);
}
targetBuffer.clear();
int compressedLength = histogram.encodeIntoCompressedByteBuffer(targetBuffer, Deflater.BEST_COMPRESSION);
targetBuffer.putLong(compressedLength, histogram.getStartTimeStamp());
targetBuffer.putLong(compressedLength + Long.BYTES, histogram.getEndTimeStamp());
byte[] compressedArray = Arrays.copyOf(targetBuffer.array(), compressedLength + (2 * Long.BYTES));
return DatatypeConverter.printBase64Binary(compressedArray);
}
@Override
public Histogram deserialize(String serialized) {
try {
byte[] rawBytes = DatatypeConverter.parseBase64Binary(serialized);
final ByteBuffer buffer = ByteBuffer.wrap(rawBytes, 0, rawBytes.length - (2 * Long.BYTES));
Histogram histogram = (Histogram) EncodableHistogram.decodeFromCompressedByteBuffer(buffer, 0);
final ByteBuffer timestamps = ByteBuffer.wrap(rawBytes, 0, rawBytes.length);
histogram.setStartTimeStamp(timestamps.getLong(rawBytes.length - (2 * Long.BYTES)));
histogram.setEndTimeStamp(timestamps.getLong(rawBytes.length - (2 * Long.BYTES) + Long.BYTES));
return histogram;
} catch (DataFormatException e) {
throw new RuntimeException(e);
}
}
}