private void doWalk()

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