package org.solrmarc.index.specification;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.List;
import org.marc4j.marc.Record;
import org.marc4j.marc.VariableField;
import org.solrmarc.index.extractor.ExternalMethod;
import org.solrmarc.index.extractor.formatter.FieldFormatter;
import org.solrmarc.index.extractor.formatter.FieldFormatter.eCleanVal;
import org.solrmarc.index.extractor.formatter.FieldFormatter.eJoinVal;
import org.solrmarc.index.extractor.impl.direct.FieldMatch;
import org.solrmarc.index.mapping.AbstractMultiValueMapping;
import org.solrmarc.index.specification.conditional.Condition;
public abstract class Specification implements ExternalMethod
{
abstract public void addConditional(Condition cond);
abstract public String[] getTags();
String specLabel;
public List<FieldMatch> getFieldMatches(Record record)
{
final String tags[] = getTags();
List<VariableField> fields = record.getVariableFields(tags);
List<FieldMatch> result = new ArrayList<FieldMatch>(fields.size());
for (VariableField vf : fields)
{
SingleSpecification specUsed = this.getMatchingSpec(vf.getTag(), vf);
if (specUsed != null && (specUsed.cond == null || specUsed.cond.matches(record, vf)))
{
result.add(new FieldMatch(vf, specUsed));
}
}
return (result);
}
public boolean hasDuplicateTags()
{
return (false);
}
abstract protected SingleSpecification getMatchingSpec(String tag, VariableField f);
abstract public void addFieldValues(Collection<String> result, VariableField vf) throws Exception;
public String getSpecLabel()
{
return specLabel;
}
public void setSpecLabel(String specLabel)
{
this.specLabel = specLabel;
}
public abstract void setFormatter(FieldFormatter fmt);
public abstract void addCleanVal(eCleanVal cleanVal);
public abstract void setCleanVal(EnumSet<eCleanVal> of);
public abstract void setJoinVal(eJoinVal cleanVal);
public abstract void setSubstring(int offset, int endOffset);
public abstract void setSeparator(String string);
public abstract void setFormatPatterns(String[] mapParts);
public abstract void addMap(AbstractMultiValueMapping valueMapping);
}