package org.solrmarc.index.specification.conditional; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.marc4j.marc.ControlField; import org.marc4j.marc.DataField; import org.marc4j.marc.VariableField; import org.solrmarc.index.indexer.FullConditionalParser; import org.solrmarc.index.indexer.FullSym; public class ConditionIndicator extends Condition { int indicatorNum; final String value; final Pattern valuePattern; int op; public ConditionIndicator(String indicatorStr, String value, int op) { this(null, indicatorStr, value, op); } public ConditionIndicator(String fieldTag, String indicatorStr, String value, int op) { super(fieldTag); this.indicatorNum = (indicatorStr.equals("1")) ? 1 : 2; this.value = value; this.op = op; if (op == FullSym.MATCH) { Pattern tmp; try { tmp = Pattern.compile(value); } catch (PatternSyntaxException pse) { tmp = Pattern.compile(""); FullConditionalParser.addError("Invalid Regular Expression in Condition: " + value); FullConditionalParser.addError(pse.getMessage()); } valuePattern = tmp; } else { valuePattern = null; } } @Override public boolean matches(final VariableField f) { if (f instanceof ControlField) return (false); final char indVal = (indicatorNum == 1) ? ((DataField) f).getIndicator1() : ((DataField) f).getIndicator2(); switch (op) { case FullSym.EQU: return (indVal == value.charAt(0)); case FullSym.LT: return (indVal < value.charAt(0)); case FullSym.GT: return (indVal > value.charAt(0)); case FullSym.NEQ: return (indVal != value.charAt(0)); case FullSym.MATCH: return (valuePattern.matcher("" + indVal).matches()); } return (false); } }