All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.amygdalum.testrecorder.deserializers.FieldNamingStrategy Maven / Gradle / Ivy

package net.amygdalum.testrecorder.deserializers;

import static java.util.Arrays.asList;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;

import java.util.List;
import java.util.function.Function;

import net.amygdalum.testrecorder.types.FieldSignature;
import net.amygdalum.testrecorder.types.SerializedField;

public final class FieldNamingStrategy {

    private static final List> NAMING_STRATEGIES = asList(qualifySimple(), qualifyCanonical());

    private FieldNamingStrategy() {
    }

    public static List ensureUniqueNames(List fields) {
        if (containsUniqueNames(fields)) {
            return fields;
        }
        List collect = fields.stream()
            .collect(groupingBy(SerializedField::getName, toList())).values().stream()
            .map(equalfields -> applyStrategys(equalfields))
            .flatMap(List::stream)
            .collect(toList());
        return collect;
    }

    private static  List applyStrategys(List equalfields) {
        for (Function naming : NAMING_STRATEGIES) {
            List qualified = equalfields.stream()
                .map(field -> new SerializedField(new FieldSignature(field.getDeclaringClass(), field.getType(), naming.apply(field)), field.getValue()))
                .collect(toList());
            if (containsUniqueNames(qualified)) {
                return qualified;
            }
        }
        return equalfields;
    }

    private static boolean containsUniqueNames(List fields) {
        return fields.stream()
            .map(SerializedField::getName)
            .distinct()
            .count() == fields.size();
    }

    private static Function qualifySimple() {
        return field -> field.getDeclaringClass().getSimpleName().replace('.', '$') + "$" + field.getName();
    }

    private static Function qualifyCanonical() {
        return field -> field.getDeclaringClass().getCanonicalName().replace('.', '$') + "$" + field.getName();
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy