34 lines
1.5 KiB
Java
34 lines
1.5 KiB
Java
package ru.pdguard.mask;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.function.BiFunction;
|
|
|
|
/**
|
|
* Состояние одной операции маскирования.
|
|
*
|
|
* <p>Одинаковые значения в пределах запроса получают одинаковую замену: если
|
|
* клиент упомянут дважды, в тексте дважды окажется {@code [FIO_1]}, и смысл
|
|
* запроса для модели сохранится.
|
|
*
|
|
* <p>Экземпляр живёт в рамках одного вызова и между потоками не разделяется.
|
|
*/
|
|
public final class MaskContext {
|
|
|
|
/** Разделитель ключа; в названии типа ПД этот знак не встречается. */
|
|
private static final char SEPARATOR = '#';
|
|
|
|
private final Map<String, String> assigned = new HashMap<>();
|
|
private final Map<String, Integer> counters = new HashMap<>();
|
|
|
|
/**
|
|
* Замена для значения; при повторе возвращается ранее выданная.
|
|
*
|
|
* @param factory получает тип ПД и порядковый номер значения этого типа
|
|
*/
|
|
public String resolve(String type, String value, BiFunction<String, Integer, String> factory) {
|
|
return assigned.computeIfAbsent(type + SEPARATOR + value,
|
|
key -> factory.apply(type, counters.merge(type, 1, Integer::sum)));
|
|
}
|
|
}
|