diff --git a/clients/src/main/java/org/apache/kafka/common/protocol/Protocol.java b/clients/src/main/java/org/apache/kafka/common/protocol/Protocol.java index c23aa1782d6..1b051d58bf0 100644 --- a/clients/src/main/java/org/apache/kafka/common/protocol/Protocol.java +++ b/clients/src/main/java/org/apache/kafka/common/protocol/Protocol.java @@ -19,6 +19,7 @@ package org.apache.kafka.common.protocol; import org.apache.kafka.common.message.RequestHeaderData; import org.apache.kafka.common.message.ResponseHeaderData; import org.apache.kafka.common.protocol.types.BoundField; +import org.apache.kafka.common.protocol.types.Field; import org.apache.kafka.common.protocol.types.Schema; import org.apache.kafka.common.protocol.types.TaggedFields; import org.apache.kafka.common.protocol.types.Type; @@ -27,6 +28,7 @@ import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; +import java.util.TreeMap; public class Protocol { @@ -49,7 +51,23 @@ public class Protocol { subTypes.put(field.def.name, type.arrayElementType().get()); } } else if (type instanceof TaggedFields) { - b.append("_tagged_fields "); + Map taggedFields = new TreeMap<>(((TaggedFields) type).fields()); + taggedFields.forEach((tag, taggedField) -> { + if (taggedField.type.isArray()) { + b.append("["); + b.append(taggedField.name); + b.append("]"); + if (!subTypes.containsKey(taggedField.name)) + subTypes.put(taggedField.name + "<tag: " + tag.toString() + ">", taggedField.type.arrayElementType().get()); + } else { + b.append(taggedField.name); + if (!subTypes.containsKey(taggedField.name)) + subTypes.put(taggedField.name + "<tag: " + tag.toString() + ">", taggedField.type); + } + b.append("<tag: "); + b.append(tag); + b.append("> "); + }); } else { b.append(field.def.name); b.append(" "); @@ -90,6 +108,12 @@ public class Protocol { } } + private static void appendFieldNameToTable(String name, StringBuilder b) { + b.append(""); + b.append(name); + b.append(""); + } + private static void schemaToFieldTableHtml(Schema schema, StringBuilder b) { Set fields = new LinkedHashSet<>(); populateSchemaFields(schema, fields); @@ -101,28 +125,12 @@ public class Protocol { b.append(""); for (BoundField field : fields) { b.append("\n"); - b.append(""); - b.append(field.def.name); - b.append(""); - b.append(""); if (field.def.type instanceof TaggedFields) { TaggedFields taggedFields = (TaggedFields) field.def.type; // Only include the field in the table if there are actually tags defined if (taggedFields.numFields() > 0) { - b.append("\n"); - b.append(""); - b.append("\n"); - b.append("\n"); - b.append("\n"); - b.append(""); taggedFields.fields().forEach((tag, taggedField) -> { - b.append("\n"); - b.append(""); - b.append(""); + appendFieldNameToTable(taggedField.name + "<tag: " + tag.toString() + ">", b); b.append(""); b.append("\n"); }); - b.append("
TagTagged fieldDescription
"); - b.append(tag); - b.append(""); - b.append(taggedField.name); - b.append(""); b.append(taggedField.docString); if (taggedField.type.isArray()) { @@ -136,11 +144,10 @@ public class Protocol { b.append("
\n"); - } else { - b.append(field.def.docString); } } else { + appendFieldNameToTable(field.def.name, b); + b.append(""); b.append(field.def.docString); } b.append("");