Рефакторинг

This commit is contained in:
serega6531
2020-03-14 19:13:03 +03:00
parent 3a697f79e5
commit d3ed284ebe
2 changed files with 63 additions and 48 deletions

View File

@@ -4,7 +4,6 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.security.crypto.codec.Hex; import org.springframework.security.crypto.codec.Hex;
import ru.serega6531.packmate.model.FoundPattern; import ru.serega6531.packmate.model.FoundPattern;
import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.model.enums.PatternSearchType;
import ru.serega6531.packmate.utils.Bytes; import ru.serega6531.packmate.utils.Bytes;
import java.util.*; import java.util.*;
@@ -20,71 +19,87 @@ class PatternMatcher {
private final Set<FoundPattern> result = new HashSet<>(); private final Set<FoundPattern> result = new HashSet<>();
public PatternMatcher(byte[] contentBytes, List<Pattern> patterns) { PatternMatcher(byte[] contentBytes, List<Pattern> patterns) {
this.contentBytes = contentBytes; this.contentBytes = contentBytes;
this.content = new String(contentBytes); this.content = new String(contentBytes);
this.patterns = patterns; this.patterns = patterns;
} }
public Set<FoundPattern> findMatches() { Set<FoundPattern> findMatches() {
patterns.forEach(this::match); patterns.forEach(this::match);
return result; return result;
} }
private void match(Pattern pattern) { private void match(Pattern pattern) {
if (pattern.getSearchType() == PatternSearchType.REGEX) { switch (pattern.getSearchType()) {
final var regex = compilePattern(pattern); case REGEX:
final Matcher matcher = regex.matcher(content); matchRegex(pattern);
int startPos = 0; break;
case SUBSTRING:
matchSubstring(pattern);
break;
case SUBBYTES:
matchSubbytes(pattern);
break;
}
}
while (matcher.find(startPos)) { private void matchRegex(Pattern pattern) {
addIfPossible(FoundPattern.builder() final var regex = compilePattern(pattern);
.patternId(pattern.getId()) final Matcher matcher = regex.matcher(content);
.startPosition(matcher.start()) int startPos = 0;
.endPosition(matcher.end() - 1)
.build()); while (matcher.find(startPos)) {
startPos = matcher.end(); addIfPossible(FoundPattern.builder()
.patternId(pattern.getId())
.startPosition(matcher.start())
.endPosition(matcher.end() - 1)
.build());
startPos = matcher.end();
}
}
private void matchSubstring(Pattern pattern) {
int startSearch = 0;
final String value = pattern.getValue();
while (true) {
int start = StringUtils.indexOfIgnoreCase(content, value, startSearch);
if (start == -1) {
return;
} }
} else if (pattern.getSearchType() == PatternSearchType.SUBSTRING) {
int startSearch = 0;
final String value = pattern.getValue();
while (true) { int end = start + value.length() - 1;
int start = StringUtils.indexOfIgnoreCase(content, value, startSearch); addIfPossible(FoundPattern.builder()
.patternId(pattern.getId())
.startPosition(start)
.endPosition(end)
.build());
if (start == -1) { startSearch = end + 1;
return; }
} }
int end = start + value.length() - 1; private void matchSubbytes(Pattern pattern) {
addIfPossible(FoundPattern.builder() int startSearch = 0;
.patternId(pattern.getId()) final byte[] value = Hex.decode(pattern.getValue());
.startPosition(start)
.endPosition(end)
.build());
startSearch = end + 1; while (true) {
int start = Bytes.indexOf(contentBytes, value, startSearch, contentBytes.length);
if (start == -1) {
return;
} }
} else if (pattern.getSearchType() == PatternSearchType.SUBBYTES) {
int startSearch = 0;
final byte[] value = Hex.decode(pattern.getValue());
while (true) { int end = start + value.length - 1;
int start = Bytes.indexOf(contentBytes, value, startSearch, contentBytes.length); addIfPossible(FoundPattern.builder()
.patternId(pattern.getId())
.startPosition(start)
.endPosition(end)
.build());
if (start == -1) { startSearch = end + 1;
return;
}
int end = start + value.length - 1;
addIfPossible(FoundPattern.builder()
.patternId(pattern.getId())
.startPosition(start)
.endPosition(end)
.build());
startSearch = end + 1;
}
} }
} }

View File

@@ -39,7 +39,7 @@ public class StreamSubscriptionService {
log.info("Отписан пользователь {}", Objects.requireNonNull(session.getRemoteAddress()).getHostName()); log.info("Отписан пользователь {}", Objects.requireNonNull(session.getRemoteAddress()).getHostName());
} }
public void broadcast(SubscriptionMessage message) { void broadcast(SubscriptionMessage message) {
subscribers.forEach(s -> { subscribers.forEach(s -> {
try { try {
s.sendMessage(objectToTextMessage(message)); s.sendMessage(objectToTextMessage(message));