public void applyToGeneric()

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);
        }
    }