in src/main/java/com/epam/eco/commons/avro/traversal/GenericSchemaTraverser.java [71:126]
private void doWalk(Path desiredPath, Object parentSchema, Object schema) {
if (!isCurrentPathTraversable(desiredPath)) {
return;
}
Type type = AvroUtils.typeOfGenericSchemaOrElseNullIfUnknown(schema);
if (type == null && schema instanceof String) {
schema = getHandledNamedTypeFor((String)schema);
type = AvroUtils.typeOfGenericSchema(schema);
}
listener.onSchema(getCurrentPathString(), parentSchema, schema);
if (Type.ARRAY == type) {
doWalk(
desiredPath,
schema,
((Map<String, Object>)schema).get(AvroConstants.SCHEMA_KEY_ARRAY_ITEMS));
} else if (Type.MAP == type) {
doWalk(
desiredPath,
schema,
((Map<String, Object>)schema).get(AvroConstants.SCHEMA_KEY_MAP_VALUES));
} else if (
Type.ENUM == type ||
Type.FIXED == type
) {
storeNamedTypeAsHandled((Map<String, Object>)schema);
} else if (Type.RECORD == type) {
Map<String, Object> schemaMap = (Map<String, Object>)schema;
doInNamespaceContext(schemaMap, ()->{
if (!storeNamedTypeAsHandled(schemaMap)) {
return;
}
List<Map<String, Object>> fields =
(List<Map<String, Object>>)schemaMap.get(AvroConstants.SCHEMA_KEY_FIELDS);
for (Map<String, Object> field : fields) {
try {
appendToCurrentPath((String)field.get(AvroConstants.SCHEMA_KEY_NAME));
if (!isCurrentPathTraversable(desiredPath)) {
continue;
}
listener.onSchemaField(getCurrentPathString(), schemaMap, field);
doWalk(desiredPath, schemaMap, field.get(AvroConstants.SCHEMA_KEY_TYPE));
} finally {
subtractFromCurrentPath();
}
}
});
} else if (Type.UNION == type) {
for (Object unionItemSchema : (List<Object>)schema) {
doWalk(desiredPath, schema, unionItemSchema);
}
}
}