package org.solrmarc.index;
import java.util.Collection;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.marc4j.marc.DataField;
import org.marc4j.marc.Record;
import org.marc4j.marc.Subfield;
import org.marc4j.marc.VariableField;
import org.solrmarc.tools.StringNaturalCompare;
import org.solrmarc.tools.Utils;
public class HathiIndexerMixin extends SolrIndexerMixin
{
static Comparator compare = new StringNaturalCompare();
public void perRecordInit(Record record)
{
}
public Set<String> getHathiURL(final Record record, String defaultURL, String defaultLabel)
{
Set<String> result = new LinkedHashSet<String>();
Map<String, String> sortedMap = new TreeMap<String, String>(compare);
List<VariableField> field974s = record.getVariableFields("974");
for (VariableField vf : field974s)
{
DataField df = (DataField)vf;
Subfield rights = df.getSubfield('r');
if (rights != null && (rights.getData().equals("pd") || rights.getData().equals("pdus") ||
rights.getData().equals("world") || rights.getData().startsWith("cc")))
{
Subfield labelField = df.getSubfield('z');
Subfield identField = df.getSubfield('u');
if (identField == null) continue;
String label = (labelField != null) ? labelField.getData() : "";
String sortlabel = (labelField != null) ? labelField.getData() : identField.getData();
if (defaultLabel.contains("%"))
{
label = defaultLabel.replace("%", label);
label = label.replaceAll(" [ ]+", " ");
}
else
{
label = defaultLabel + label;
}
// default URL prefix is http://hdl.handle.net/2027/
String value = defaultURL + identField.getData().trim() + "||" + label;
sortedMap.put(sortlabel, value);
}
}
for (String key : sortedMap.keySet())
{
String value = sortedMap.get(key);
result.add(value);
}
return(result);
}
public Set<String> getHathiURLUse856(final Record record, String defaultURL, String defaultLabel)
{
Set<String> result = new LinkedHashSet<String>();
List<VariableField> field856s = record.getVariableFields("856");
if (field856s.size() > 0)
{
for (VariableField vf : field856s)
{
DataField df = (DataField)vf;
Subfield rights = df.getSubfield('r');
if (rights != null && (rights.getData().equals("pd") || rights.getData().equals("pdus") ||
rights.getData().equals("world") || rights.getData().startsWith("cc")))
{
Subfield labelField = df.getSubfield('z');
Subfield urlField = df.getSubfield('u');
if (urlField == null) continue;
String label = (labelField != null) ? labelField.getData() : "";
if (defaultLabel.contains("%"))
{
label = defaultLabel.replaceFirst("%", label);
label = label.replaceAll(" [ ]+", " ");
}
else
{
label = defaultLabel + label;
}
// default URL prefix is http://hdl.handle.net/2027/
String value = urlField.getData().trim() + "||" + label;
result.add(value);
}
}
}
else
{
Map<String, String> sortedMap = new TreeMap<String, String>(compare);
List<VariableField> field974s = record.getVariableFields("974");
for (VariableField vf : field974s)
{
DataField df = (DataField)vf;
Subfield rights = df.getSubfield('r');
if (rights != null && (rights.getData().equals("pd") || rights.getData().equals("pdus") || rights.getData().equals("world")))
{
Subfield labelField = df.getSubfield('z');
Subfield identField = df.getSubfield('u');
if (identField == null) continue;
String label = (labelField != null) ? labelField.getData() : "";
String sortlabel = (labelField != null) ? labelField.getData() : identField.getData();
if (defaultLabel.contains("%"))
{
label = defaultLabel.replaceFirst("%", label);
label = label.replaceAll(" [ ]+", " ");
}
else
{
label = defaultLabel + label;
}
// default URL prefix is http://hdl.handle.net/2027/
String value = defaultURL + identField.getData().trim() + "||" + label;
sortedMap.put(sortlabel, value);
}
}
for (String key : sortedMap.keySet())
{
String value = sortedMap.get(key);
result.add(value);
}
}
return(result);
}
public Collection<String> getHathiFormat(Collection<String>formats)
{
if (!formats.contains("Online")) formats.add("Online"); // Online
if (formats.contains("Book") && !formats.contains("EBook")) formats.add("EBook");
return(formats);
}
// public Set<String> getHathiFormat1(final Record record)
// {
// String mapName1 = indexer.loadTranslationMap(null, "format_maps.properties(broad_format)");
// String mapName1a = indexer.loadTranslationMap(null, "format_maps.properties(broad_format_electronic)");
//// String mapName2 = indexer.loadTranslationMap(null, "format_maps.properties(format_007)");
//
// Set<String> result = new LinkedHashSet<String>();
//
// Set<String> f245h = SolrIndexer.getFieldList(record, "245h");
// if (Utils.setItemContains(f245h, "cartographic material"))
// {
// result.add("Map");
// }
// String broadFormat = indexer.getFirstFieldVal(record, mapName1, "000[6-7]:000[6]");
// if (broadFormat != null) result.add(broadFormat);
// result.add("Online"); // Online
//
// if (broadFormat.equals("Book"))
// {
// result.add(Utils.remap("am", indexer.findMap(mapName1a), true)); // eBook
// }
// return(result);
// }
}