package com.revolsys.record.filter;
import java.util.Collections;
import java.util.Map;
import java.util.function.Predicate;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.SpelParserConfiguration;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import com.revolsys.collection.map.LinkedHashMapEx;
import com.revolsys.collection.map.MapEx;
import com.revolsys.io.map.MapSerializer;
import com.revolsys.record.Record;
public class SpringExpresssionLanguageFilter implements Predicate<Record>, MapSerializer {
private static SpelParserConfiguration EXPRESSION_CONFIGURATION = new SpelParserConfiguration(
true, true);
private static final SpelExpressionParser EXPRESSION_PARSER = new SpelExpressionParser(
EXPRESSION_CONFIGURATION);
private final StandardEvaluationContext context = new StandardEvaluationContext();
private final Expression expression;
private final String query;
public SpringExpresssionLanguageFilter(final String query) {
this(query, Collections.<String, Object> emptyMap());
}
@SuppressWarnings("unchecked")
public SpringExpresssionLanguageFilter(final String query,
final Map<String, ? extends Object> variables) {
this.query = query;
this.expression = EXPRESSION_PARSER.parseExpression(query);
this.context.addPropertyAccessor(new RecordAccessor());
this.context.setVariable("systemProperties", System.getProperties());
this.context.setVariables((Map<String, Object>)variables);
}
@Override
public boolean test(final Record object) {
try {
final Boolean value = this.expression.getValue(this.context, object, Boolean.class);
return value;
} catch (final Throwable e) {
return false;
}
}
@Override
public MapEx toMap() {
final MapEx map = new LinkedHashMapEx();
addTypeToMap(map, "queryFilter");
map.put("query", this.query);
return map;
}
@Override
public String toString() {
return this.expression.getExpressionString();
}
}