package ru.pdguard.mask; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; /** * Состояние одной операции маскирования. * *

Одинаковые значения в пределах запроса получают одинаковую замену: если * клиент упомянут дважды, в тексте дважды окажется {@code [FIO_1]}, и смысл * запроса для модели сохранится. * *

Экземпляр живёт в рамках одного вызова и между потоками не разделяется. */ public final class MaskContext { /** Разделитель ключа; в названии типа ПД этот знак не встречается. */ private static final char SEPARATOR = '#'; private final Map assigned = new HashMap<>(); private final Map counters = new HashMap<>(); /** * Замена для значения; при повторе возвращается ранее выданная. * * @param factory получает тип ПД и порядковый номер значения этого типа */ public String resolve(String type, String value, BiFunction factory) { return assigned.computeIfAbsent(type + SEPARATOR + value, key -> factory.apply(type, counters.merge(type, 1, Integer::sum))); } }