private List bildPathTemplates()

in src/main/java/com/epam/eco/commons/avro/avpath/AvPath.java [114:158]


    private List<PathTemplate> bildPathTemplates(Schema schema) {
        List<PathTemplate> finalPathTemplates = new ArrayList<>();
        Map<String, List<PathTemplate>> templatesBySchemaPaths = new HashMap<>();
        new SchemaTraverser(
                new SchemaTraverseListener() {
                    @Override
                    public void onSchemaField(String path, Schema parentSchema, Field field) {
                        int sepIdx = path.lastIndexOf('.');
                        String prefixPath = sepIdx > 0 ? path.substring(0, sepIdx) : null;

                        List<PathTemplate> prefixPathTemplates =
                                prefixPath != null ?
                                templatesBySchemaPaths.get(prefixPath) :
                                Collections.singletonList(EMPTY_PATH_TEMPLATE);

                        List<PathTemplate> fieldPathTemplates =
                                buildPathTemplatesForPath(field.name(), field.schema());

                        List<PathTemplate> pathTemplates = new ArrayList<>();
                        for (PathTemplate prefixPathTemplate : prefixPathTemplates) {
                            for (PathTemplate fieldPathTemplate : fieldPathTemplates) {
                                PathTemplate pathTemplate = prefixPathTemplate.join(fieldPathTemplate);
                                if (pathTemplate.getSchema().getType() == Type.RECORD) {
                                    pathTemplates.add(pathTemplate);
                                } else {
                                    finalPathTemplates.add(pathTemplate);
                                }
                            }
                        }
                        templatesBySchemaPaths.put(path, pathTemplates);
                    }
                    @Override
                    public void onSchema(String path, Schema parentSchema, Schema schema) {
                    }
                }).walk(schema);

        return Stream.concat(
                    finalPathTemplates.stream(),
                    templatesBySchemaPaths.values().stream().
                            flatMap(Collection::stream)).
                sorted().
                collect(Collectors.collectingAndThen(
                        Collectors.toList(),
                        Collections::unmodifiableList));
    }