package com.aconex.scrutineer.elasticsearch;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import com.aconex.scrutineer.IdAndVersion;
import com.aconex.scrutineer.IdAndVersionFactory;
import com.fasterxml.sort.DataReader;
class IdAndVersionDataReader extends DataReader<IdAndVersion> {
private static final int BYTES_PER_CHAR = 2;
private static final int BYTES_PER_LONG = 8;
private static final int BYTES_PER_OBJECT_POINTER = 24;
private static final int BYTES_PER_ARRAY_POINTER = 28;
private final IdAndVersionFactory factory;
private final ObjectInputStream objectInputStream;
public IdAndVersionDataReader(IdAndVersionFactory factory, ObjectInputStream objectInputStream) {
this.factory = factory;
this.objectInputStream = objectInputStream;
}
@Override
public IdAndVersion readNext() throws IOException {
try {
return factory.readFromStream(objectInputStream);
} catch (EOFException e) {
return null;
}
}
@Override
public int estimateSizeInBytes(IdAndVersion item) {
int idAndVersionContainerSize = BYTES_PER_OBJECT_POINTER;
int versionSize = BYTES_PER_LONG;
int idSize = BYTES_PER_OBJECT_POINTER + BYTES_PER_ARRAY_POINTER + (item.getId().length() * BYTES_PER_CHAR);
int totalSize = idAndVersionContainerSize + versionSize + idSize;
return totalSize;
}
@Override
public void close() throws IOException {
objectInputStream.close();
}
}