package org.solrmarc.index.extractor.impl.direct; import org.marc4j.marc.Record; import org.solrmarc.index.extractor.AbstractMultiValueExtractor; import org.solrmarc.index.extractor.ExternalMethod; import org.solrmarc.index.extractor.formatter.FieldFormatter.eCleanVal; import org.solrmarc.index.extractor.formatter.FieldFormatter.eJoinVal; import org.solrmarc.index.indexer.IndexerSpecException; import org.solrmarc.index.mapping.AbstractMultiValueMapping; import org.solrmarc.index.specification.Specification; import java.util.Collection; import java.util.EnumSet; public class DirectMultiValueExtractor extends AbstractMultiValueExtractor implements ExternalMethod { private Specification fieldsAndSubfieldSpec; public DirectMultiValueExtractor(Specification fieldSpec) { fieldsAndSubfieldSpec = fieldSpec; } private DirectMultiValueExtractor(DirectMultiValueExtractor toClone) { if (toClone.fieldsAndSubfieldSpec.isThreadSafe()) fieldsAndSubfieldSpec = toClone.fieldsAndSubfieldSpec; else fieldsAndSubfieldSpec = (Specification)toClone.fieldsAndSubfieldSpec.makeThreadSafeCopy(); } public Specification getFieldsAndSubfieldSpec() { return fieldsAndSubfieldSpec; } public void setFieldsAndSubfieldSpec(Specification fieldsAndSubfieldSpec) { this.fieldsAndSubfieldSpec = fieldsAndSubfieldSpec; } public void addMap(AbstractMultiValueMapping valueMapping) { fieldsAndSubfieldSpec.addMap(valueMapping); } public final Collection<FieldMatch> getFieldMatches(final Record record) { Collection<FieldMatch> result = fieldsAndSubfieldSpec.getFieldMatches(record); return result; } @Override public void extract(Collection<String> result, final Record record) throws Exception { for (FieldMatch fm : getFieldMatches(record)) { fm.addValuesTo(result); } } public void addCleanVal(eCleanVal cleanVal) { fieldsAndSubfieldSpec.addCleanVal(cleanVal); } public void setCleanVal(EnumSet<eCleanVal> of) { fieldsAndSubfieldSpec.setCleanVal(of); } public void setJoinVal(eJoinVal joinVal) { fieldsAndSubfieldSpec.setJoinVal(joinVal); } public void setSeparator(String separator) { fieldsAndSubfieldSpec.setSeparator(separator); } public void setSubstring(String startStr, String endStr) { int start, end; try { start = Integer.parseInt(startStr); } catch (NumberFormatException nfe) { throw new IndexerSpecException("Illegal substring specification: " + startStr); } if (endStr.equals("toEnd")) { fieldsAndSubfieldSpec.setSubstring(start, -1); } else { try { end = Integer.parseInt(endStr); } catch (NumberFormatException nfe) { throw new IndexerSpecException("Illegal substring specification: " + endStr); } if (start < 0 || end < 0 || start > end) { throw new IndexerSpecException("Illegal substring interval: " + start + " " + end); } fieldsAndSubfieldSpec.setSubstring(start, end); } } public void setFormatPatterns(String[] mapParts) { fieldsAndSubfieldSpec.setFormatPatterns(mapParts); } @Override public boolean isThreadSafe() { return fieldsAndSubfieldSpec.isThreadSafe(); } @Override public Object makeThreadSafeCopy() { return new DirectMultiValueExtractor(this); } }