From 8c752f1d4424735ee10437dd16c21cf0fc342066 Mon Sep 17 00:00:00 2001 From: serega6531 Date: Mon, 11 Jan 2021 10:27:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BA=D1=8D=D1=88=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=BB=D1=8F=20substring=20=D0=B8=20?= =?UTF-8?q?subbytes=20=D0=BF=D0=B0=D1=82=D1=82=D0=B5=D1=80=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../packmate/service/PatternMatcher.java | 30 +++++++++++++++---- .../packmate/service/PatternService.java | 12 +++----- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/serega6531/packmate/service/PatternMatcher.java b/src/main/java/ru/serega6531/packmate/service/PatternMatcher.java index 7466cab..f629188 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternMatcher.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternMatcher.java @@ -15,7 +15,9 @@ import java.util.regex.Matcher; public class PatternMatcher { - private static final Map compiledPatterns = new HashMap<>(); + private static final Map compiledRegexes = new HashMap<>(); + private static final Map compiledStringKmps = new HashMap<>(); + private static final Map compiledByteKmps = new HashMap<>(); private final byte[] contentBytes; private final String content; @@ -43,7 +45,7 @@ public class PatternMatcher { } private void matchRegex(Pattern pattern) { - final var regex = compilePattern(pattern); + final var regex = compileRegex(pattern); final Matcher matcher = regex.matcher(content); int startPos = 0; @@ -59,7 +61,7 @@ public class PatternMatcher { private void matchSubstring(Pattern pattern) { final String value = pattern.getValue(); - KMPStringSearcher searcher = new KMPStringSearcher(value.toCharArray()); + KMPStringSearcher searcher = compileStringKMP(pattern); StringReader reader = new StringReader(content); while (true) { @@ -81,7 +83,7 @@ public class PatternMatcher { @SneakyThrows private void matchSubbytes(Pattern pattern) { final byte[] value = Hex.decode(pattern.getValue()); - KMPByteSearcher searcher = new KMPByteSearcher(value); + KMPByteSearcher searcher = compileByteKMP(pattern); InputStream is = new ByteArrayInputStream(contentBytes); while (true) { @@ -112,8 +114,24 @@ public class PatternMatcher { return a <= x && x <= b; } - static java.util.regex.Pattern compilePattern(Pattern pattern) { - return compiledPatterns.computeIfAbsent(pattern.getValue(), java.util.regex.Pattern::compile); + static void compilePattern(Pattern pattern) { + switch (pattern.getSearchType()) { + case REGEX -> compileRegex(pattern); + case SUBSTRING -> compileStringKMP(pattern); + case SUBBYTES -> compileByteKMP(pattern); + } + } + + private static java.util.regex.Pattern compileRegex(Pattern pattern) { + return compiledRegexes.computeIfAbsent(pattern.getValue(), java.util.regex.Pattern::compile); + } + + private static KMPStringSearcher compileStringKMP(Pattern pattern) { + return compiledStringKmps.computeIfAbsent(pattern.getValue(), val -> new KMPStringSearcher(val.toCharArray())); + } + + private static KMPByteSearcher compileByteKMP(Pattern pattern) { + return compiledByteKmps.computeIfAbsent(pattern.getValue(), val -> new KMPByteSearcher(Hex.decode(val))); } } diff --git a/src/main/java/ru/serega6531/packmate/service/PatternService.java b/src/main/java/ru/serega6531/packmate/service/PatternService.java index af1e054..038352a 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternService.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternService.java @@ -10,7 +10,6 @@ import ru.serega6531.packmate.model.FoundPattern; import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.enums.PatternActionType; import ru.serega6531.packmate.model.enums.PatternDirectionType; -import ru.serega6531.packmate.model.enums.PatternSearchType; import ru.serega6531.packmate.model.enums.SubscriptionMessageType; import ru.serega6531.packmate.model.pojo.PatternDto; import ru.serega6531.packmate.model.pojo.SubscriptionMessage; @@ -19,7 +18,6 @@ import ru.serega6531.packmate.repository.PatternRepository; import java.time.Instant; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.regex.PatternSyntaxException; import java.util.stream.Collectors; @Service @@ -85,12 +83,10 @@ public class PatternService { } public Pattern save(Pattern pattern) { - if (pattern.getSearchType() == PatternSearchType.REGEX) { - try { - PatternMatcher.compilePattern(pattern); - } catch (PatternSyntaxException e) { - throw new IllegalArgumentException(e.getMessage()); - } + try { + PatternMatcher.compilePattern(pattern); + } catch (Exception e) { + throw new IllegalArgumentException(e.getMessage()); } pattern.setSearchStartTimestamp(System.currentTimeMillis());