in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/schema/AvroSchemaScanner.java [224:279]
private void parseAvroRecord(JsonNode recordNode, String componentId,
List<DataEntity> dataEntities, List<MessageFlow> messageFlows) {
if (!recordNode.has(FIELD_TYPE)) {
return;
}
String type = recordNode.get(FIELD_TYPE).asText();
if (!TYPE_RECORD.equals(type)) {
return; // Only process record types
}
String name = recordNode.has(FIELD_NAME) ? recordNode.get(FIELD_NAME).asText() : DEFAULT_RECORD_NAME;
String namespace = recordNode.has(FIELD_NAMESPACE) ? recordNode.get(FIELD_NAMESPACE).asText() : null;
String fullName = namespace != null ? namespace + "." + name : name;
String description = recordNode.has(FIELD_DOC) ? recordNode.get(FIELD_DOC).asText() : DEFAULT_DESCRIPTION_PREFIX + name;
List<DataEntity.Field> fields = new ArrayList<>();
// Extract fields
if (recordNode.has(FIELD_FIELDS)) {
JsonNode fieldsNode = recordNode.get(FIELD_FIELDS);
for (JsonNode fieldNode : fieldsNode) {
DataEntity.Field field = parseField(fieldNode);
if (field != null) {
fields.add(field);
}
}
}
// Create data entity for this record
DataEntity entity = new DataEntity(
componentId,
fullName,
COMPONENT_TYPE_AVRO_RECORD,
fields,
null, // Avro doesn't have explicit primary keys
description
);
dataEntities.add(entity);
log.debug("Found Avro record: {} with {} fields", fullName, fields.size());
// Create message flow if this appears to be an event/message schema
if (isEventSchema(name, namespace)) {
MessageFlow messageFlow = new MessageFlow(
componentId, // publisher
null, // subscriber unknown
name, // topic derived from schema name
fullName, // message type
fullName, // schema
MESSAGE_PROTOCOL_KAFKA // Avro commonly used with Kafka
);
messageFlows.add(messageFlow);
log.debug("Created message flow for Avro schema: {}", fullName);
}
}