package org.solrmarc.index.specification; import java.util.Collection; import java.util.EnumSet; 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.eCleanVal; import org.solrmarc.index.extractor.formatter.FieldFormatter.eJoinVal; import org.solrmarc.index.mapping.AbstractMultiValueMapping; import org.solrmarc.index.specification.conditional.Condition; public abstract class SingleSpecification extends Specification { // protected static FieldFormatter SINGLE_FMT = new FieldFormatterBase(true); protected String tag; Condition cond = null; protected FieldFormatter fmt; // protected FieldMatchCollector coll; String[] tags; public SingleSpecification(String tag, Condition cond) { this.tag = tag; this.cond = cond; tags = new String[1]; tags[0] = tag; fmt = new FieldFormatterBase(true); } protected SingleSpecification(SingleSpecification toClone) { this.tag = toClone.tag; this.cond = toClone.cond; this.tags = new String[1]; tags[0] = toClone.tag; if (toClone.fmt.isThreadSafe()) this.fmt = toClone.fmt; else this.fmt = (FieldFormatter)toClone.fmt.makeThreadSafeCopy(); } @Override public void addConditional(Condition cond) { if (this.cond == null) this.cond = cond; } public String getTag() { return tag; } @Override public String[] getTags() { return tags; } @Override protected SingleSpecification getMatchingSpec(final String tag, final VariableField f) { if (specMatches(tag, f)) { return (this); } return null; } protected boolean specMatches(String tag, VariableField f) { String stag = this.tag; return(tag.equals(stag)); } abstract public void addFieldValues(Collection<String> result, VariableField vf) throws Exception; @Override public void addMap(AbstractMultiValueMapping valueMapping) { if (fmt != null) fmt.addMap(valueMapping); } @Override public void setFormatter(FieldFormatter fmt) { this.fmt = fmt; } public void addCleanVal(eCleanVal cleanVal) { fmt.addCleanVal(cleanVal); } public void setCleanVal(EnumSet<eCleanVal> of) { fmt.setCleanVal(of); } public void setJoinVal(eJoinVal joinVal) { fmt.setJoinVal(joinVal); } public void setSubstring(int offset, int endOffset) { fmt.setSubstring(offset, endOffset); } public void setSeparator(String separator) { fmt.setSeparator(separator); } public void setFormatPatterns(String[] mapParts) { fmt.setSfCodeFmt(mapParts); } @Override public boolean isThreadSafe() { return(fmt.isThreadSafe()); } }