in generator/src/main/java/org/apache/kafka/message/MessageDataGenerator.java [686:800]
private void generateClassFromStruct(String className, StructSpec struct,
Versions parentVersions) {
headerGenerator.addImport(MessageGenerator.STRUCT_CLASS);
buffer.printf("@SuppressWarnings(\"unchecked\")%n");
buffer.printf("@Override%n");
buffer.printf("public void fromStruct(Struct struct, short _version) {%n");
buffer.incrementIndent();
VersionConditional.forVersions(parentVersions, struct.versions()).
allowMembershipCheckAlwaysFalse(false).
ifNotMember(__ -> {
headerGenerator.addImport(MessageGenerator.UNSUPPORTED_VERSION_EXCEPTION_CLASS);
buffer.printf("throw new UnsupportedVersionException(\"Can't read " +
"version \" + _version + \" of %s\");%n", className);
}).
generate(buffer);
Versions curVersions = parentVersions.intersect(struct.versions());
if (!messageFlexibleVersions.intersect(struct.versions()).empty()) {
buffer.printf("NavigableMap<Integer, Object> _taggedFields = null;%n");
}
buffer.printf("this._unknownTaggedFields = null;%n");
VersionConditional.forVersions(messageFlexibleVersions, struct.versions()).
ifMember(__ -> {
headerGenerator.addImport(MessageGenerator.NAVIGABLE_MAP_CLASS);
buffer.printf("_taggedFields = (NavigableMap<Integer, Object>) " +
"struct.get(\"%s\");%n", TAGGED_FIELDS_SECTION_NAME);
}).
generate(buffer);
for (FieldSpec field : struct.fields()) {
VersionConditional.forVersions(field.versions(), curVersions).
alwaysEmitBlockScope(field.type().isArray()).
ifNotMember(__ -> {
buffer.printf("this.%s = %s;%n", field.camelCaseName(),
field.fieldDefault(headerGenerator, structRegistry));
}).
ifMember(presentVersions -> {
VersionConditional.forVersions(field.taggedVersions(), presentVersions).
ifNotMember(presentAndUntaggedVersions -> {
if (field.type().isArray()) {
buffer.printf("Object[] _nestedObjects = struct.getArray(\"%s\");%n",
field.snakeCaseName());
generateArrayFromStruct(field, presentAndUntaggedVersions);
} else {
buffer.printf("this.%s = %s;%n",
field.camelCaseName(),
readFieldFromStruct(field.type(), field.snakeCaseName(), field.zeroCopy()));
}
}).
ifMember(presentAndTaggedVersions -> {
buffer.printf("if (_taggedFields.containsKey(%d)) {%n", field.tag().get());
buffer.incrementIndent();
if (field.type().isArray()) {
buffer.printf("Object[] _nestedObjects = " +
"(Object[]) _taggedFields.remove(%d);%n", field.tag().get());
generateArrayFromStruct(field, presentAndTaggedVersions);
} else if (field.type().isBytes()) {
headerGenerator.addImport(MessageGenerator.BYTE_BUFFER_CLASS);
buffer.printf("ByteBuffer _byteBuffer = (ByteBuffer) _taggedFields.remove(%d);%n",
field.tag().get());
IsNullConditional.forName("_byteBuffer").
nullableVersions(field.nullableVersions()).
possibleVersions(field.versions()).
ifNull(() -> {
buffer.printf("this.%s = null;%n", field.camelCaseName());
}).
ifShouldNotBeNull(() -> {
headerGenerator.addImport(MessageGenerator.MESSAGE_UTIL_CLASS);
buffer.printf("this.%s = MessageUtil.byteBufferToArray(_byteBuffer);%n",
field.camelCaseName());
}).
generate(buffer);
} else if (field.type().isStruct()) {
buffer.printf("this.%s = new %s((Struct) _taggedFields.remove(%d), _version);%n",
field.camelCaseName(),
field.type().getBoxedJavaType(headerGenerator),
field.tag().get());
} else {
buffer.printf("this.%s = (%s) _taggedFields.remove(%d);%n",
field.camelCaseName(),
field.type().getBoxedJavaType(headerGenerator),
field.tag().get());
}
buffer.decrementIndent();
buffer.printf("} else {%n");
buffer.incrementIndent();
buffer.printf("this.%s = %s;%n", field.camelCaseName(),
field.fieldDefault(headerGenerator, structRegistry));
buffer.decrementIndent();
buffer.printf("}%n");
}).
generate(buffer);
}).
generate(buffer);
}
VersionConditional.forVersions(messageFlexibleVersions, struct.versions()).
ifMember(__ -> {
headerGenerator.addImport(MessageGenerator.NAVIGABLE_MAP_CLASS);
buffer.printf("if (!_taggedFields.isEmpty()) {%n");
buffer.incrementIndent();
headerGenerator.addImport(MessageGenerator.ARRAYLIST_CLASS);
buffer.printf("this._unknownTaggedFields = new ArrayList<>(_taggedFields.size());%n");
headerGenerator.addStaticImport(MessageGenerator.MAP_ENTRY_CLASS);
buffer.printf("for (Entry<Integer, Object> entry : _taggedFields.entrySet()) {%n");
buffer.incrementIndent();
headerGenerator.addImport(MessageGenerator.RAW_TAGGED_FIELD_CLASS);
buffer.printf("this._unknownTaggedFields.add((RawTaggedField) entry.getValue());%n");
buffer.decrementIndent();
buffer.printf("}%n");
buffer.decrementIndent();
buffer.printf("}%n");
}).
generate(buffer);
buffer.decrementIndent();
buffer.printf("}%n");
}