diff --git a/src/main/java/ru/pdguard/config/SystemsConfig.java b/src/main/java/ru/pdguard/config/SystemsConfig.java index b6b04ea..b9552cb 100644 --- a/src/main/java/ru/pdguard/config/SystemsConfig.java +++ b/src/main/java/ru/pdguard/config/SystemsConfig.java @@ -27,7 +27,7 @@ import java.util.TreeMap; * Файла нет — работают настройки по умолчанию, и сервис поднимается без него. */ @Component -public class SystemsConfig { +public final class SystemsConfig { private static final Logger LOG = LoggerFactory.getLogger(SystemsConfig.class); diff --git a/src/main/java/ru/pdguard/core/AdaptiveConcurrencyLimiter.java b/src/main/java/ru/pdguard/core/AdaptiveConcurrencyLimiter.java index 1a387ef..28d688c 100644 --- a/src/main/java/ru/pdguard/core/AdaptiveConcurrencyLimiter.java +++ b/src/main/java/ru/pdguard/core/AdaptiveConcurrencyLimiter.java @@ -49,7 +49,7 @@ import java.util.concurrent.TimeUnit; * библиотеке — это ровно тот класс проблем, из-за которого модели второй * ступени понадобилась отдельная настройка сборки. */ -public class AdaptiveConcurrencyLimiter { +public final class AdaptiveConcurrencyLimiter { private static final long DEFAULT_ADJUST_WINDOW_NANOS = TimeUnit.MILLISECONDS.toNanos(20); diff --git a/src/main/java/ru/pdguard/core/Pipeline.java b/src/main/java/ru/pdguard/core/Pipeline.java index 29609f3..30fb1ac 100644 --- a/src/main/java/ru/pdguard/core/Pipeline.java +++ b/src/main/java/ru/pdguard/core/Pipeline.java @@ -16,6 +16,7 @@ import ru.pdguard.detect.PdTypes; import ru.pdguard.detect.RuleRegistry; import ru.pdguard.detect.Span; import ru.pdguard.mask.MaskContext; +import ru.pdguard.mask.MaskMode; import ru.pdguard.mask.Masker; import java.util.ArrayList; @@ -271,6 +272,9 @@ public class Pipeline { /** Замаскированный текст вместе с таблицей обратной замены. */ public record Masked(String text, Map restorations) { + public Masked { + restorations = Map.copyOf(restorations); + } } /** @@ -283,7 +287,7 @@ public class Pipeline { */ public Masked maskWithRestorations(String text, SystemPolicy policy) { SystemPolicy reversible = new SystemPolicy(policy.name(), policy.enabled(), policy.demask(), - ru.pdguard.mask.MaskMode.TOKEN, policy.types(), policy.requireCompanion(), policy.key()); + MaskMode.TOKEN, policy.types(), policy.requireCompanion(), policy.key()); List spans = findPersonalData(text, reversible); if (spans.isEmpty()) { return new Masked(text, Map.of()); diff --git a/src/main/java/ru/pdguard/detect/ResourceLoader.java b/src/main/java/ru/pdguard/detect/ResourceLoader.java index d1dce2d..32af586 100644 --- a/src/main/java/ru/pdguard/detect/ResourceLoader.java +++ b/src/main/java/ru/pdguard/detect/ResourceLoader.java @@ -12,6 +12,8 @@ import java.util.Comparator; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Общие приёмы чтения словарей и внешних файлов. @@ -24,6 +26,8 @@ import java.util.stream.Collectors; */ final class ResourceLoader { + private static final Logger LOG = LoggerFactory.getLogger(ResourceLoader.class); + private ResourceLoader() { } @@ -90,8 +94,7 @@ final class ResourceLoader { } } catch (IOException e) { // Битый файл не должен ронять работу: остаётся прежнее значение. - java.util.logging.Logger.getLogger(ResourceLoader.class.getName()) - .fine("Не удалось перечитать файл " + path + ": " + e.getMessage()); + LOG.warn("Не удалось перечитать файл {}", path, e); } return state.current; } diff --git a/src/main/java/ru/pdguard/detect/Rule.java b/src/main/java/ru/pdguard/detect/Rule.java index 3991829..6347e91 100644 --- a/src/main/java/ru/pdguard/detect/Rule.java +++ b/src/main/java/ru/pdguard/detect/Rule.java @@ -31,6 +31,11 @@ import java.util.regex.Pattern; public record Rule(String type, Pattern pattern, int priority, List groups, Predicate validator, Pattern veto, Pattern context, List anchors) { + public Rule { + groups = List.copyOf(groups); + anchors = List.copyOf(anchors); + } + /** * Флаги компиляции для всех правил. *