}
@Override
public void render(final Value value, final Object target, final Class<?> clazz, final CoderContext context)
throws ConversionException {
final RowData rowData = (RowData) target;
final int at = value.getCursor();
final int end = value.getEncodedSize();
final int size = end - at;
final int rowDataSize = size + RowData.ENVELOPE_SIZE;
final byte[] valueBytes = value.getEncodedBytes();
byte[] rowDataBytes = rowData.getBytes();
if (rowDataSize < RowData.MINIMUM_RECORD_LENGTH || rowDataSize > RowData.MAXIMUM_RECORD_LENGTH) {
throw new CorruptRowDataException("RowData is too short or too long: " + rowDataSize);
}
if (rowDataBytes == null || rowDataSize > rowDataBytes.length) {
rowDataBytes = new byte[rowDataSize + INITIAL_BUFFER_SIZE];
rowData.reset(rowDataBytes);
}
//
// Assemble the Row in a byte array
//
AkServerUtil.putInt(rowDataBytes, RowData.O_LENGTH_A, rowDataSize);
AkServerUtil.putShort(rowDataBytes, RowData.O_SIGNATURE_A, RowData.SIGNATURE_A);
System.arraycopy(valueBytes, at, rowDataBytes, RowData.O_FIELD_COUNT, size);
AkServerUtil.putShort(rowDataBytes, RowData.O_SIGNATURE_B + rowDataSize, RowData.SIGNATURE_B);
AkServerUtil.putInt(rowDataBytes, RowData.O_LENGTH_B + rowDataSize, rowDataSize);
rowData.prepareRow(0);
value.setCursor(end);
}