package org.solrmarc.index.specification;
import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.marc4j.marc.DataField;
import org.marc4j.marc.Subfield;
import org.marc4j.marc.VariableField;
import org.solrmarc.index.extractor.formatter.FieldFormatter;
import org.solrmarc.index.extractor.formatter.FieldFormatterBase;
import org.solrmarc.index.extractor.formatter.FieldFormatter.eJoinVal;
import org.solrmarc.index.specification.conditional.Condition;
public class SingleDataFieldSpecification extends SingleSpecification
{
String subfields;
Pattern subfieldPattern;
public SingleDataFieldSpecification(String tag, String subfields, Condition cond, FieldFormatter fmt)
{
super(tag, cond);
this.subfields = subfields;
subfieldPattern = makePattern(subfields);
this.fmt = fmt;
}
public SingleDataFieldSpecification(String tag, String subfields, Condition cond)
{
super(tag, cond);
this.subfields = subfields;
subfieldPattern = makePattern(subfields);
if (subfields != null && subfields.length() == 1)
fmt = new FieldFormatterBase(false).setJoinVal(eJoinVal.SEPARATE);
else
fmt = new FieldFormatterBase(false).setJoinVal(eJoinVal.JOIN).setSeparator(" ");
}
public SingleDataFieldSpecification(String tag, String subfields)
{
this(tag, subfields, null);
}
protected SingleDataFieldSpecification(SingleDataFieldSpecification toClone)
{
super(toClone.tag, toClone.cond);
this.subfields = toClone.subfields;
this.subfieldPattern = toClone.subfieldPattern;
this.fmt = (FieldFormatter) (toClone.fmt.isThreadSafe() ? toClone.fmt : toClone.fmt.makeThreadSafeCopy());
}
private final static Pattern makePattern(String subfields)
{
if (subfields == null || subfields.length() == 0) return (Pattern.compile("."));
else if (subfields.startsWith("[") && subfields.endsWith("]")) return (Pattern.compile(subfields));
else return (Pattern.compile("[" + subfields + "]"));
}
public void setFormatter(FieldFormatter fmt)
{
this.fmt = fmt;
}
// public String getSubfields()
// {
// return subfields;
// }
//
@Override
public void addFieldValues(Collection<String> result, VariableField vf) throws Exception
{
DataField df = (DataField) vf;
StringBuilder sb = fmt.start();
if (fmt.hasFieldFormat())
{
sb.append(fmt.getFieldFormat());
}
fmt.addTag(sb, df);
fmt.addIndicators(sb, df);
int cnt = 0;
for (Subfield subfield : df.getSubfields())
{
final String codeStr = "" + subfield.getCode();
Matcher matcher = subfieldPattern.matcher(codeStr);
if (matcher.matches())
{
fmt.addSeparator(sb,cnt);
fmt.addCode(sb,codeStr);
Collection<String> prepped = fmt.prepData(vf, (subfield.getCode() == 'a'), subfield.getData());
for (String val : prepped)
{
val = fmt.handleSubFieldFormat(codeStr, val);
fmt.addVal(sb, codeStr, val);
fmt.addAfterSubfield(sb, result);
}
cnt++;
}
}
fmt.addAfterField(sb, result);
}
@Override
public Object makeThreadSafeCopy()
{
return new SingleDataFieldSpecification(this);
}
}