package org.solrmarc.mixin; import java.util.Collection; import java.util.LinkedHashSet; import java.util.Set; import org.marc4j.marc.Record; import org.solrmarc.index.SolrIndexer; import org.solrmarc.index.SolrIndexerMixin; import org.solrmarc.tools.Utils; public class LanguageMixin extends SolrIndexerMixin { public Collection<String> getCombinedFormat(final Record record) throws Exception { // part1_format_facet = 000[6]:007[0], format_maps.properties(broad_format), first // part2_format_facet = 999t, format_maps.properties(format) String mapName1 = SolrIndexer.instance().loadTranslationMap(null, "format_maps.properties(broad_format)"); String mapName2 = SolrIndexer.instance().loadTranslationMap(null, "format_maps.properties(format_007)"); String mapName3 = SolrIndexer.instance().loadTranslationMap(null, "format_maps.properties(format)"); Collection<String> result = SolrIndexer.instance().getFieldList(record, "999t"); result = SolrIndexer.instance().remap(result, SolrIndexer.instance().findMap(mapName3), false); Set<String> urls = SolrIndexer.instance().getFieldList(record, "856u"); if (Utils.setItemContains(urls, "serialssolutions")) { String serialsFormat = SolrIndexer.instance().remap("as", SolrIndexer.instance().findMap(mapName1), true); if (serialsFormat != null) result.add(serialsFormat); } else { String format_007 = SolrIndexer.instance().getFirstFieldVal(record, mapName2, "007[0]"); if (format_007 != null) { result.add(format_007); } else { String broadFormat = SolrIndexer.instance().getFirstFieldVal(record, mapName1, "000[6-7]:000[6]"); if (broadFormat != null) { if (broadFormat.contains("|")) broadFormat = broadFormat.substring(0, broadFormat.indexOf('|')); result.add(broadFormat); } } } return(result); } public Set<String> getCustomLanguage(final Record record, String propertiesMap) throws Exception { Set<String> resultSet = new LinkedHashSet<String>(); String mapName = SolrIndexer.instance().loadTranslationMap(propertiesMap); String primaryLanguage = SolrIndexer.instance().getFirstFieldVal(record, mapName, "008[35-37]"); Collection<String> otherLanguages = SolrIndexer.instance().getFieldList(record, "041a:041d"); otherLanguages = SolrIndexer.instance().remap(otherLanguages, SolrIndexer.instance().findMap(mapName), true); Collection<String> translatedFrom = SolrIndexer.instance().getFieldList(record, "041h"); translatedFrom = SolrIndexer.instance().remap(translatedFrom, SolrIndexer.instance().findMap(mapName), true); Collection<String> subtitleLanguage = SolrIndexer.instance().getFieldList(record, "041b"); subtitleLanguage = SolrIndexer.instance().remap(subtitleLanguage, SolrIndexer.instance().findMap(mapName), true); Collection<String> format = getCombinedFormat(record); boolean isBook = Utils.setItemContains(format, "Book") || Utils.setItemContains(format, "Journal"); boolean isDVD = Utils.setItemContains(format, "DVD") ; Set<String> notesFields = SolrIndexer.instance().getFieldList(record, "500a"); boolean isTranslated = Utils.setItemContains(notesFields, "[Tt]ranslat((ed)|(ion))"); if (primaryLanguage != null) resultSet.add(primaryLanguage); if (primaryLanguage != null && Utils.setItemContains(otherLanguages, primaryLanguage)) { otherLanguages.remove(primaryLanguage); } if (isBook && isTranslated && otherLanguages.size() == 1 && translatedFrom.size() == 0) { copySetWithSuffix(resultSet, otherLanguages, " (translated from)"); } else { if (isDVD) copySetWithSuffix(resultSet, otherLanguages, " (dubbed in)"); else copySetWithSuffix(resultSet, otherLanguages, " (also in)"); if (primaryLanguage != null && Utils.setItemContains(translatedFrom, primaryLanguage)) { translatedFrom.remove(primaryLanguage); } copySetWithSuffix(resultSet, translatedFrom, " (translated from)"); } copySetWithSuffix(resultSet, subtitleLanguage, (isBook ? " (summary in)" : " (subtitles in)") ); return(resultSet); } private void copySetWithSuffix(Set<String> resultSet, Collection<String> languageList, String suffix) { for (String language : languageList) { String toAdd = language + suffix; resultSet.add(toAdd); } } }