Init
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
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)));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user