/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.internal.model.conditions.match;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import com.db4o.query.Evaluation;
import com.db4o.query.Query;
import com.subgraph.vega.api.model.conditions.match.IHttpConditionStringMatchAction;
public abstract class RegexMatchAction implements IHttpConditionStringMatchAction, IHttpConditionMatchActionEx {
private String patternString;
private transient Pattern pattern;
private transient boolean patternCompileFailed;
private transient Evaluation regexConstraint;
protected RegexMatchAction() {
}
protected RegexMatchAction(String value) {
patternString = value;
}
protected String getPatternString() {
return patternString;
}
@Override
public MatchActionArgumentType getArgumentType() {
return MatchActionArgumentType.ARGUMENT_REGEX;
}
@Override
public String getArgumentAsString() {
return patternString;
}
@Override
public boolean setArgumentFromString(String value) {
if(!isValidArgumentString(value))
return false;
setString(value);
return true;
}
@Override
public boolean isValidArgumentString(String value) {
return createRegexPattern(value) != null;
}
protected boolean matchesRegex(String value) {
final Pattern regex = getRegexPattern();
return regex.matcher(value).find();
}
@Override
public void constrainQuery(Query query) {
final Pattern p = getRegexPattern();
if(p == null)
return;
query.constrain(getRegexConstraint(p));
}
protected abstract Evaluation createQueryEvaluation(Pattern pattern);
private Evaluation getRegexConstraint(Pattern pattern) {
synchronized(this) {
if(regexConstraint == null) {
regexConstraint = createQueryEvaluation(pattern);
}
return regexConstraint;
}
}
private Pattern getRegexPattern() {
if(patternCompileFailed)
return null;
synchronized(this) {
if(pattern == null) {
if((pattern = createRegexPattern(patternString)) == null)
patternCompileFailed = true;
}
return pattern;
}
}
private Pattern createRegexPattern(String str) {
try {
return Pattern.compile(str);
} catch (PatternSyntaxException e) {
return null;
}
}
@Override
public void setString(String value) {
this.patternString = value;
this.pattern = null;
this.patternCompileFailed = false;
this.regexConstraint = null;
}
}