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.VariableField;
import org.solrmarc.index.indexer.FullConditionalParser;
import org.solrmarc.index.indexer.FullSym;
public class ConditionPosition extends Condition
{
int offset;
int endOffset;
final String value;
final Pattern valuePattern;
int op;
public ConditionPosition(String offsetStr, String value, int op)
{
this(null, offsetStr, value, op);
}
public ConditionPosition(String fieldTag, String offsetStr, String value, int op)
{
super(fieldTag);
offset = Integer.parseInt(offsetStr.replaceAll("\\[([0-9]+)(-[0-9]+)?\\]", "$1"));
endOffset = offset;
String endOffsetStr = offsetStr.replaceAll("\\[([0-9]+)(-)?([0-9]+)?\\]", "$3");
if (endOffsetStr != null && endOffsetStr.length() > 0) endOffset = Integer.parseInt(endOffsetStr);
this.op = op;
this.value = value;
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 String data = ((ControlField) f).getData();
if (data.length() < offset) return (false);
final String posVal = data.substring(offset, endOffset + 1);
switch (op) {
case FullSym.EQU:
return (posVal.equals(value));
case FullSym.CONTAINS:
return (posVal.contains(value));
case FullSym.LT:
return (posVal.startsWith(value));
case FullSym.GT:
return (posVal.endsWith(value));
case FullSym.NEQ:
return (!posVal.equals(value));
case FullSym.MATCH:
return (valuePattern.matcher(posVal).matches());
}
return (false);
}
}