package org.solrmarc.index.specification.conditional;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.marc4j.marc.ControlField;
import org.marc4j.marc.DataField;
import org.marc4j.marc.Subfield;
import org.marc4j.marc.VariableField;
import org.solrmarc.index.indexer.FullConditionalParser;
import org.solrmarc.index.indexer.FullSym;
public class ConditionSubfield extends Condition
{
char sfCode;
final String value;
final Pattern valuePattern;
int op;
public ConditionSubfield(String offsetStr, String value, int op)
{
this(null, offsetStr, value, op);
}
public ConditionSubfield(String fieldTag, String offsetStr, String value, int op)
{
super(fieldTag);
this.sfCode = offsetStr.charAt(0);
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 List<Subfield> sfl = ((DataField) f).getSubfields(sfCode);
for (Subfield sf : sfl)
{
String sfVal = (sf == null) ? null : sf.getData();
switch (op) {
case FullSym.EQU:
{
if (sfVal.equals(value)) return (true);
break;
}
case FullSym.CONTAINS:
{
if (sfVal.contains(value)) return (true);
break;
}
case FullSym.LT:
{
if (sfVal.startsWith(value)) return (true);
break;
}
case FullSym.GT:
{
if (sfVal.endsWith(value)) return (true);
break;
}
case FullSym.NEQ:
{
if (sfVal.equals(value)) return (false);
break;
}
case FullSym.MATCH:
{
if (valuePattern != null && valuePattern.matcher(sfVal).matches()) return (true);
break;
}
}
}
return (op == FullSym.NEQ ? true : false);
}
}