package org.solrmarc.index.indexer; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.concurrent.atomic.AtomicLong; import org.marc4j.marc.Record; import org.solrmarc.index.collector.MultiValueCollector; import org.solrmarc.index.extractor.AbstractValueExtractor; import org.solrmarc.index.mapping.AbstractValueMapping; public abstract class AbstractValueIndexer<T> { private String solrFieldNamesStr; private Collection<String> solrFieldNames; protected final AbstractValueExtractor<T> extractor; protected AbstractValueMapping<T>[] mappings; protected final MultiValueCollector collector; private String specLabel; protected AtomicLong totalElapsedTime; public AbstractValueIndexer(final String solrFieldNamesStr, final AbstractValueExtractor<T> extractor, final AbstractValueMapping<T>[] mappings, final MultiValueCollector collector) { setSolrFieldNamesStr(solrFieldNamesStr); this.extractor = extractor; this.mappings = mappings; this.collector = collector; totalElapsedTime = new AtomicLong(0); } public String getSpecLabel() { return specLabel; } public void setSpecLabel(String specLabel) { this.specLabel = specLabel; } @SuppressWarnings("unchecked") public Collection<String> getFieldData(Record record) throws Exception { long start = System.nanoTime(); if (extractor == null) return Collections.emptyList(); T values = extractor.extract(record); if (values == null) { return Collections.emptyList(); } for (final AbstractValueMapping<T> mapping : mappings) { values = mapping.map(values); } Collection<String> result = null; if (values instanceof Collection) result = collector.collect((Collection<String>)values); else if (values instanceof String) result = collector.collect(Collections.singletonList((String)values)); long end = System.nanoTime(); totalElapsedTime.addAndGet(end - start); return (result); } @SuppressWarnings("unchecked") public void getFieldData(Record record, Collection<String> result) throws Exception { long start = System.nanoTime(); if (extractor == null) return; T values = extractor.extract(record); if (values == null) { return; } for (final AbstractValueMapping<T> mapping : mappings) { values = mapping.map(values); } if (values instanceof Collection) result.addAll(collector.collect((Collection<String>)values)); else if (values instanceof String) result.addAll(collector.collect(Collections.singletonList((String)values))); long end = System.nanoTime(); totalElapsedTime.addAndGet(end - start); } public Long getTotalElapsedTime() { return totalElapsedTime.get(); } public Collection<String> getSolrFieldNames() { return solrFieldNames; } public String getSolrFieldNamesStr() { return solrFieldNamesStr; } public void setSolrFieldNamesStr(String solrFieldNamesStr) { this.solrFieldNamesStr = solrFieldNamesStr; this.solrFieldNames = splitFieldNameStr(solrFieldNamesStr); } protected static Collection<String> splitFieldNameStr(String solrFieldNamesStr) { Collection<String> result = new ArrayList<String>(); if (result != null) { // The trim and whitespace in the pattern for split may well be unnecessary since the string // should have had all whitespace removed, but just in case. String[] fieldNames = solrFieldNamesStr.trim().split("[ \\t]*,[ \\t]*"); for (String fName : fieldNames) { result.add(fName); } } return(result); } }