in src/main/java/com/epam/eco/commons/avro/modification/AddSchemaFieldToPath.java [59:105]
public void applyToGeneric(Map<String, Object> schemaMap) {
List<Map<String, Object>> typesToAddFieldTo = new ArrayList<>();
new GenericSchemaTraverser(new GenericSchemaTraverseListener() {
@Override
public void onSchemaField(
String path,
Map<String, Object> parentSchema,
Map<String, Object> field) {
// do nothing
}
@Override
public void onSchema(String path, Object parentSchema, Object schema) {
if (
AvroUtils.typeOfGenericSchema(schema) == Type.RECORD &&
Objects.equals(AddSchemaFieldToPath.this.path, path)) {
typesToAddFieldTo.add((Map<String, Object>)schema);
}
}
}).walk(schemaMap, path);
if (typesToAddFieldTo.isEmpty()) {
throw new RuntimeException(
String.format(
"Field '%s' can't be added to path '%s': no corresponding parent type found",
field.name(), path));
}
Map<String, Object> genericField = AvroUtils.fieldToGeneric(field);
for (Map<String, Object> typeToAddFieldTo : typesToAddFieldTo) {
List<Map<String, Object>> fields =
(List<Map<String, Object>>) typeToAddFieldTo.get(AvroConstants.SCHEMA_KEY_FIELDS);
Set<String> fieldNames = fields.stream().
map(m -> (String) m.get(AvroConstants.SCHEMA_KEY_FIELD_NAME)).
collect(Collectors.toSet());
if (fieldNames.contains(field.name())) {
throw new RuntimeException(
String.format(
"Field '%s' can't be added to path '%s': name already exists",
field.name(), path));
}
fields.add(genericField);
}
}