package test.r2.integ;
/**
* @author Zhenkai Zhu
*/
import com.linkedin.data.ByteString;
import com.linkedin.r2.filter.R2Constants;
import com.linkedin.r2.message.stream.entitystream.WriteHandle;
import com.linkedin.r2.message.stream.entitystream.Writer;
import java.util.Arrays;
/** package private */ class BytesWriter implements Writer
{
private final long _total;
private final byte _fill;
private long _written;
private WriteHandle _wh;
private volatile boolean _error = false;
private volatile boolean _isDone = false;
BytesWriter(long total, byte fill)
{
_total = total;
_fill = fill;
_written = 0;
}
@Override
public void onInit(WriteHandle wh)
{
_wh = wh;
}
@Override
public void onWritePossible()
{
while(_wh.remaining() > 0 && _written < _total && !_error)
{
int bytesNum = (int)Math.min(R2Constants.DEFAULT_DATA_CHUNK_SIZE, _total - _written);
_wh.write(generate(bytesNum));
_written += bytesNum;
afterWrite(_wh, _written);
}
if (_written == _total && !_error)
{
_wh.done();
_isDone = true;
onFinish();
}
}
@Override
public void onAbort(Throwable ex)
{
// do nothing
}
public boolean isDone()
{
return _isDone;
}
protected void onFinish()
{
// nothing
}
protected void afterWrite(WriteHandle wh, long written)
{
// nothing
}
protected void markError()
{
_error = true;
}
private ByteString generate(int size)
{
byte[] result = new byte[size];
Arrays.fill(result, _fill);
return ByteString.copy(result);
}
}