2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.logreader.internal.searchengine;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.regex.Matcher;
18 import java.util.regex.Pattern;
19 import java.util.regex.PatternSyntaxException;
21 import org.eclipse.jdt.annotation.NonNullByDefault;
22 import org.eclipse.jdt.annotation.Nullable;
25 * This class implements logic for regular expression based searching.
27 * @author Pauli Anttila - Initial contribution
30 public class SearchEngine {
32 private List<Pattern> matchers;
33 private List<Pattern> blacklistingMatchers;
35 private long matchCount;
38 * Initialize search patterns.
40 * @param patterns search patterns.
41 * @param blacklistingPatterns search patterns to bypass results which have found by the initial search patterns.
44 public SearchEngine(String patterns, @Nullable String blacklistingPatterns) throws PatternSyntaxException {
45 matchers = compilePatterns(patterns);
46 blacklistingMatchers = compilePatterns(blacklistingPatterns);
50 * Check if data is matching to one of the provided search patterns.
52 * @param data data against search will be done.
53 * @return true if one of the search patterns found.
55 public boolean isMatching(String data) {
56 if (isMatching(matchers, data)) {
57 if (notBlacklisted(data)) {
65 public long getMatchCount() {
69 public void setMatchCount(long matchCount) {
70 this.matchCount = matchCount;
73 public void clearMatchCount() {
78 * Split pattern string and precompile search patterns.
80 * @param patterns patterns which will handled.
81 * @return list of precompiled patterns. If pattern parameter is null, empty list is returned.
83 private List<Pattern> compilePatterns(@Nullable String patterns) throws PatternSyntaxException {
84 List<Pattern> patternsList = new ArrayList<>();
85 if (patterns != null && !patterns.isEmpty()) {
86 String[] list = patterns.split("\\|");
87 if (list.length > 0) {
88 for (String patternStr : list) {
89 patternsList.add(Pattern.compile(patternStr));
96 private boolean notBlacklisted(String data) {
97 return !isMatching(blacklistingMatchers, data);
100 private boolean isMatching(@Nullable List<Pattern> patterns, String data) {
101 if (patterns != null) {
102 for (Pattern pattern : patterns) {
103 Matcher matcher = pattern.matcher(data);
104 if (matcher.find()) {