in generator/src/main/java/org/apache/kafka/message/MessageDataGenerator.java [1479:1643]
private void generateVariableLengthFieldSize(FieldSpec field,
Versions possibleVersions,
boolean tagged) {
IsNullConditional.forField(field).
alwaysEmitBlockScope(true).
possibleVersions(possibleVersions).
nullableVersions(field.nullableVersions()).
ifNull(() -> {
if (!tagged || !field.defaultString().equals("null")) {
VersionConditional.forVersions(fieldFlexibleVersions(field), possibleVersions).
ifMember(__ -> {
if (tagged) {
buffer.printf("_numTaggedFields++;%n");
buffer.printf("_size += %d;%n",
MessageGenerator.sizeOfUnsignedVarint(field.tag().get()));
buffer.printf("_size += %d;%n", MessageGenerator.sizeOfUnsignedVarint(
MessageGenerator.sizeOfUnsignedVarint(0)));
}
buffer.printf("_size += %d;%n", MessageGenerator.sizeOfUnsignedVarint(0));
}).
ifNotMember(__ -> {
if (tagged) {
throw new RuntimeException("Tagged field " + field.name() +
" should not be present in non-flexible versions.");
}
if (field.type().isString()) {
buffer.printf("_size += 2;%n");
} else {
buffer.printf("_size += 4;%n");
}
}).
generate(buffer);
}
}).
ifShouldNotBeNull(() -> {
if (tagged) {
if (!field.defaultString().equals("null")) {
field.generateNonDefaultValueCheck(headerGenerator,
structRegistry, buffer, "this.", Versions.NONE);
buffer.incrementIndent();
}
buffer.printf("_numTaggedFields++;%n");
buffer.printf("_size += %d;%n",
MessageGenerator.sizeOfUnsignedVarint(field.tag().get()));
}
if (field.type().isString()) {
generateStringToBytes(field.camelCaseName());
VersionConditional.forVersions(fieldFlexibleVersions(field), possibleVersions).
ifMember(__ -> {
headerGenerator.addImport(MessageGenerator.BYTE_UTILS_CLASS);
if (tagged) {
buffer.printf("int _stringPrefixSize = " +
"ByteUtils.sizeOfUnsignedVarint(_stringBytes.length + 1);%n");
buffer.printf("_size += _stringBytes.length + _stringPrefixSize + " +
"ByteUtils.sizeOfUnsignedVarint(_stringPrefixSize);%n");
} else {
buffer.printf("_size += _stringBytes.length + " +
"ByteUtils.sizeOfUnsignedVarint(_stringBytes.length + 1);%n");
}
}).
ifNotMember(__ -> {
if (tagged) {
throw new RuntimeException("Tagged field " + field.name() +
" should not be present in non-flexible versions.");
}
buffer.printf("_size += _stringBytes.length + 2;%n");
}).
generate(buffer);
} else if (field.type().isArray()) {
buffer.printf("int _arraySize = 0;%n");
VersionConditional.forVersions(fieldFlexibleVersions(field), possibleVersions).
ifMember(__ -> {
headerGenerator.addImport(MessageGenerator.BYTE_UTILS_CLASS);
buffer.printf("_arraySize += ByteUtils.sizeOfUnsignedVarint(%s.size() + 1);%n",
field.camelCaseName());
}).
ifNotMember(__ -> {
buffer.printf("_arraySize += 4;%n");
}).
generate(buffer);
FieldType.ArrayType arrayType = (FieldType.ArrayType) field.type();
FieldType elementType = arrayType.elementType();
if (elementType.fixedLength().isPresent()) {
buffer.printf("_arraySize += %s.size() * %d;%n",
field.camelCaseName(),
elementType.fixedLength().get());
} else if (elementType instanceof FieldType.ArrayType) {
throw new RuntimeException("Arrays of arrays are not supported " +
"(use a struct).");
} else {
buffer.printf("for (%s %sElement : %s) {%n",
elementType.getBoxedJavaType(headerGenerator),
field.camelCaseName(), field.camelCaseName());
buffer.incrementIndent();
generateVariableLengthArrayElementSize(fieldFlexibleVersions(field),
String.format("%sElement", field.camelCaseName()),
elementType,
possibleVersions);
buffer.decrementIndent();
buffer.printf("}%n");
}
if (tagged) {
headerGenerator.addImport(MessageGenerator.BYTE_UTILS_CLASS);
buffer.printf("_cache.setArraySizeInBytes(%s, _arraySize);%n",
field.camelCaseName());
buffer.printf("_size += _arraySize + ByteUtils.sizeOfUnsignedVarint(_arraySize);%n");
} else {
buffer.printf("_size += _arraySize;%n");
}
} else if (field.type().isBytes()) {
if (field.zeroCopy()) {
buffer.printf("int _bytesSize = %s.remaining();%n", field.camelCaseName());
} else {
buffer.printf("int _bytesSize = %s.length;%n", field.camelCaseName());
}
VersionConditional.forVersions(fieldFlexibleVersions(field), possibleVersions).
ifMember(__ -> {
headerGenerator.addImport(MessageGenerator.BYTE_UTILS_CLASS);
if (field.zeroCopy()) {
buffer.printf("_bytesSize += " +
"ByteUtils.sizeOfUnsignedVarint(%s.remaining() + 1);%n", field.camelCaseName());
} else {
buffer.printf("_bytesSize += ByteUtils.sizeOfUnsignedVarint(%s.length + 1);%n",
field.camelCaseName());
}
}).
ifNotMember(__ -> {
buffer.printf("_bytesSize += 4;%n");
}).
generate(buffer);
if (tagged) {
headerGenerator.addImport(MessageGenerator.BYTE_UTILS_CLASS);
buffer.printf("_size += _bytesSize + ByteUtils.sizeOfUnsignedVarint(_bytesSize);%n");
} else {
buffer.printf("_size += _bytesSize;%n");
}
} else if (field.type().isRecords()) {
buffer.printf("int _recordsSize = %s.sizeInBytes();%n", field.camelCaseName());
VersionConditional.forVersions(fieldFlexibleVersions(field), possibleVersions).
ifMember(__ -> {
headerGenerator.addImport(MessageGenerator.BYTE_UTILS_CLASS);
buffer.printf("_recordsSize += " +
"ByteUtils.sizeOfUnsignedVarint(%s.sizeInBytes() + 1);%n", field.camelCaseName());
}).
ifNotMember(__ -> {
buffer.printf("_recordsSize += 4;%n");
}).
generate(buffer);
buffer.printf("_size += _recordsSize;%n");
} else if (field.type().isStruct()) {
buffer.printf("int size = this.%s.size(_cache, _version);%n", field.camelCaseName());
if (tagged) {
buffer.printf("_size += ByteUtils.sizeOfUnsignedVarint(size);%n");
}
buffer.printf("_size += size;%n");
} else {
throw new RuntimeException("unhandled type " + field.type());
}
if (tagged && !field.defaultString().equals("null")) {
buffer.decrementIndent();
buffer.printf("}%n");
}
}).
generate(buffer);
}