package krasa.grepconsole.grep; import org.apache.commons.lang.StringUtils; import java.util.regex.Pattern; public class CopyListenerModel { private final boolean caseSensitive; private final boolean wholeLine; private final String expression; private final String unlessExpression; private final boolean regex; public CopyListenerModel(boolean caseSensitive, boolean wholeLine, boolean regex, String expression, String unlessExpression) { this.caseSensitive = caseSensitive; this.wholeLine = wholeLine; this.expression = expression; this.unlessExpression = unlessExpression; this.regex = regex; } public Matcher matcher() { Pattern unlessExpressionPattern = null; Pattern expressionPattern = null; if (!StringUtils.isBlank(expression)) { expressionPattern = Pattern.compile(expression, computeFlags()); } if (!StringUtils.isBlank(unlessExpression)) { unlessExpressionPattern = Pattern.compile(unlessExpression, computeFlags()); } return new Matcher(expressionPattern, unlessExpressionPattern, wholeLine); } public String getExpression() { return expression; } public boolean isCaseSensitive() { return caseSensitive; } public boolean isWholeLine() { return wholeLine; } public String getUnlessExpression() { return unlessExpression; } public boolean isRegex() { return regex; } private int computeFlags() { int i = caseSensitive ? 0 : Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE; int j = regex ? 0 : Pattern.LITERAL; return i | j; } public static class Matcher { private final Pattern expressionPattern; private final Pattern unlessExpressionPattern; private final boolean wholeLine; public Matcher(Pattern expressionPattern, Pattern unlessExpressionPattern, boolean wholeLine) { this.expressionPattern = expressionPattern; this.unlessExpressionPattern = unlessExpressionPattern; this.wholeLine = wholeLine; } public boolean matches(CharSequence s) { if (matchesPattern(expressionPattern, s) && !matchesPattern(unlessExpressionPattern, s)) { return true; } return false; } private boolean matchesPattern(Pattern pattern, CharSequence matchedLine) { boolean matches = false; if (pattern != null) { if (wholeLine) { matches = pattern.matcher(matchedLine).matches(); } else { matches = pattern.matcher(matchedLine).find(); } } return matches; } @Override public String toString() { return "[" + "expressionPattern=" + expressionPattern + ", unlessExpressionPattern=" + unlessExpressionPattern + ", wholeLine=" + wholeLine + ']'; } } }