in protonj2/src/main/java/org/apache/qpid/protonj2/codec/encoders/primitives/ArrayTypeEncoder.java [107:165]
public void writeRawArray(ProtonBuffer buffer, EncoderState state, Object[] values) {
TypeEncoder<?> typeEncoder = findTypeEncoder(buffer, state, values[0]);
// Write the Array Type encoding code, we don't optimize here.
buffer.writeByte(EncodingCodes.ARRAY32);
for (int i = 0; i < values.length; ++i) {
final int startIndex = buffer.getWriteOffset();
// Reserve space for the size and write the count of list elements.
buffer.writeInt(0);
typeEncoder = findTypeEncoder(buffer, state, values[i]);
if (values[i].getClass().getComponentType().isPrimitive()) {
Class<?> componentType = values[i].getClass().getComponentType();
if (componentType == Boolean.TYPE) {
buffer.writeInt(((boolean[]) values[i]).length);
((BooleanTypeEncoder) typeEncoder).writeRawArray(buffer, state, (boolean[]) values[i]);
} else if (componentType == Byte.TYPE) {
buffer.writeInt(((byte[]) values[i]).length);
((ByteTypeEncoder) typeEncoder).writeRawArray(buffer, state, (byte[]) values[i]);
} else if (componentType == Short.TYPE) {
buffer.writeInt(((short[]) values[i]).length);
((ShortTypeEncoder) typeEncoder).writeRawArray(buffer, state, (short[]) values[i]);
} else if (componentType == Integer.TYPE) {
buffer.writeInt(((int[]) values[i]).length);
((IntegerTypeEncoder) typeEncoder).writeRawArray(buffer, state, (int[]) values[i]);
} else if (componentType == Long.TYPE) {
buffer.writeInt(((long[]) values[i]).length);
((LongTypeEncoder) typeEncoder).writeRawArray(buffer, state, (long[]) values[i]);
} else if (componentType == Float.TYPE) {
buffer.writeInt(((Object[]) values[i]).length);
((FloatTypeEncoder) typeEncoder).writeRawArray(buffer, state, (float[]) values[i]);
} else if (componentType == Double.TYPE) {
buffer.writeInt(((double[]) values[i]).length);
((DoubleTypeEncoder) typeEncoder).writeRawArray(buffer, state, (double[]) values[i]);
} else if (componentType == Character.TYPE) {
buffer.writeInt(((float[]) values[i]).length);
((CharacterTypeEncoder) typeEncoder).writeRawArray(buffer, state, (char[]) values[i]);
} else {
throw new IllegalArgumentException(
"Cannot write arrays of type " + componentType.getName());
}
} else {
buffer.writeInt(((Object[]) values[i]).length);
typeEncoder.writeRawArray(buffer, state, (Object[]) values[i]);
}
// Move back and write the size
final long writeSize = buffer.getWriteOffset() - startIndex - Integer.BYTES;
if (writeSize > Integer.MAX_VALUE) {
throw new IllegalArgumentException("Cannot encode given array, encoded size to large: " + writeSize);
}
buffer.setInt(startIndex, (int) writeSize);
}
}