package org.unc.hive.client;
import java.util.HashMap;
import java.util.List;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
//import edu.unc.ils.mrc.hive.HiveException;
public class RecordFormatter {
private static String skosRDFXML = "SKOS - RDF/XML";
private static String skosNTriples = "SKOS - N Triples";
private static String dublinCore = "Dublin Core";
private static String modsXML = "MODS/XML";
private static String marcXML = "MARC/XML";
private static StringBuffer rec;
private static HashMap<String, HashMap<String,String>> props;
private final ConceptBrowserServiceAsync conceptBrowserService = GWT.create(ConceptBrowserService.class);
public void init() {
conceptBrowserService.getVocabularyProperties(
new AsyncCallback<HashMap<String, HashMap<String,String>>>() {
public void onFailure(Throwable caught) {
Window.alert(caught.getMessage());
}
public void onSuccess(HashMap<String, HashMap<String,String>> result) {
props = result;
}
});
}
public static String format(List<ConceptProxy> selectedConcepts, String recType) {
rec = new StringBuffer();
if (recType.equals(skosNTriples)) {
return formatSKOSNTriples(selectedConcepts);
} else if (recType.equals(dublinCore)) {
return formatDublinCore(selectedConcepts);
} else if (recType.equals(modsXML)) {
return formatModsXML(selectedConcepts);
} else if (recType.equals(marcXML)) {
return formatMarcXML(selectedConcepts);
} else
return formatSKOSRDFXML(selectedConcepts); //default
}
public static String formatSKOSRDFXML(List<ConceptProxy> selectedConcepts) {
rec.append("<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:skos=\"http://www.w3.org/2004/02/skos/core#\">\n");
for (ConceptProxy cp : selectedConcepts) {
String skosRDFXML = cp.getSkosCode();
int startPos = skosRDFXML.indexOf("<rdf:Description");
int endPos = skosRDFXML.indexOf("</rdf:RDF>");
if (endPos > startPos)
skosRDFXML = " " + skosRDFXML.substring(startPos,endPos);
rec.append(skosRDFXML);
}
rec.append("</rdf:RDF>");
return rec.toString();
}
public static String formatSKOSNTriples(List<ConceptProxy> selectedConcepts) {
for (ConceptProxy cp : selectedConcepts) {
rec.append("<" + cp.getURI() + ">" + " <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2004/02/skos/core#Concept>." + "\n");
if ((cp.getPreLabel() != null) && (cp.getPreLabel() != ""))
rec.append("<" + cp.getURI() + ">" + " <http://www.w3.org/2004/02/skos/core#prefLabel> " + "\"" + cp.getPreLabel() + "\"." + "\n");
if ((cp.getAltLabel() != null) && (!cp.getAltLabel().isEmpty()))
for (String label : cp.getAltLabel())
rec.append("<" + cp.getURI() + ">" + " <http://www.w3.org/2004/02/skos/core#altLabel> " + "\"" + label + "\"." + "\n");
if ((cp.getBroader() != null) && (!cp.getBroader().isEmpty())) {
for(String broaderConcept : cp.getBroader().keySet()){
String bc = cp.getBroader().get(broaderConcept);
rec.append("<" + cp.getURI() + ">" + " <http://www.w3.org/2004/02/skos/core#broader> " + "<" + bc + ">." + "\n");
}
}
if ((cp.getNarrower() != null) && (!cp.getNarrower().isEmpty())) {
for(String narrowerConcept : cp.getNarrower().keySet()){
String nc = cp.getNarrower().get(narrowerConcept);
rec.append("<" + cp.getURI() + ">" + " <http://www.w3.org/2004/02/skos/core#narrower> " + "<" + nc + ">." + "\n");
}
}
if ((cp.getRelated() != null) && (!cp.getRelated().isEmpty())) {
for(String relatedConcept : cp.getRelated().keySet()){
String rc = cp.getRelated().get(relatedConcept);
rec.append("<" + cp.getURI() + ">" + " <http://www.w3.org/2004/02/skos/core#related> " + "<" + rc + ">." + "\n");
}
}
int pos = cp.getURI().indexOf("#");
String scheme = "";
if (pos >= 0)
scheme = cp.getURI().substring(0,pos+1);
if ((scheme != null) && (scheme != ""))
rec.append("<" + cp.getURI() + ">" + " <http://www.w3.org/2004/02/skos/core#inScheme> " + "<" + scheme + ">." + "\n");
if ((cp.getScopeNotes() != null) && (!cp.getScopeNotes().isEmpty()))
for (String note : cp.getScopeNotes())
rec.append("<" + cp.getURI() + ">" + " <http://www.w3.org/2004/02/skos/core#scopeNote> " + "\"" + note + "\"." + "\n");
}
return rec.toString();
}
public static String formatDublinCore(List<ConceptProxy> selectedConcepts) {
rec.append("<?xml version=\"1.0\"?>\n\n" + "<metadata\n"
+ " xmlns=\"http://hive.nescent.org\"" + "\n"
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+ "\n" + " xmlns:dc=\"http://purl.org/dc/elements/1.1/\""
+ "\n" + " xmlns:dcterms=\"http://purl.org/dc/terms/\">"
+ "\n\n");
for (ConceptProxy cp : selectedConcepts) {
String dc = " <dc:subject xsi:type=\"dcterms:URI\">" + cp.getURI() + "</dc:subject>" + "\n";
rec.append(dc);
}
rec.append("\n</metadata>");
return rec.toString();
}
public static String formatModsXML(List<ConceptProxy> selectedConcepts) {
rec.append("<modsCollection xmlns:xlink=\"http://www.w3.org/1999/xlink\""
+ "\n"
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+ "\n"
+ " xmlns=\"http://www.loc.gov/mods/v3\""
+ "\n"
+ " xsi:schemaLocation=\"http://www.loc.gov/mods/v3 http://www.loc.gov/standards/mods/v3/mods-3-3.xsd\">"
+ "\n");
rec.append(" <mods version=\"3.3\">" + "\n");
for (ConceptProxy cp : selectedConcepts) {
String authority = getAuthorityForVocabulary(cp.getOrigin().toLowerCase());
rec.append(" <subject " + authority + ">" + "\n");
rec.append(" <topic" + " valueURI=\"" + cp.getURI() + "\">" + cp.getPreLabel() + "</topic>" + "\n");
rec.append(" </subject>" + "\n");
}
rec.append(" </mods>" + "\n" + "</modsCollection>");
return rec.toString();
}
public static String getAuthorityForVocabulary(String vocName) {
String authority = "";
HashMap<String,String> vals;
vals = props.get(vocName);
if (vals != null) {
authority = vals.get("uri");
}
if ((authority.equals("")) || (authority == null))
authority = "authority=\"" + vocName + "\"";
else
authority = "authorityURI=\"" + authority + "\"";
return authority;
}
public static String formatMarcXML(List<ConceptProxy> selectedConcepts) {
String origin = "";
String tag = "650";
String ind2 = "";
rec.append("<collection xmlns:xlink=\"http://www.w3.org/1999/xlink\""
+ "\n"
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+ "\n"
+ " xsi:schemaLocation=\"http://www.loc.gov/standards/marcxml/schema/xml.xsd\">"
+ "\n");
rec.append(" <record>" + "\n");
for (ConceptProxy cp : selectedConcepts) {
origin = cp.getOrigin().toLowerCase();
tag = "";
if (origin.equalsIgnoreCase("tgn"))
tag = "651";
else
tag = "650";
if (origin.equalsIgnoreCase("lcsh"))
ind2 = "0";
else if (origin.equalsIgnoreCase("lcshac"))
ind2 = "1";
else if (origin.equalsIgnoreCase("mesh"))
ind2 = "2";
else if (origin.equalsIgnoreCase("nal"))
ind2 = "3";
else if (origin.equalsIgnoreCase("cash"))
ind2 = "5";
else if (origin.equalsIgnoreCase("rvm"))
ind2 = "6";
else
ind2 = "7";
rec.append(" <datafield tag=\"" + tag + "\" ind1=\" \" ind2=\"" + ind2 + "\">" + "\n");
rec.append(" <subfield code=\"a\">" + cp.getPreLabel() + ".</subfield>" + "\n");
if (ind2.equals("7"))
rec.append(" <subfield code=\"2\">" + origin + "</subfield>" + "\n");
rec.append(" </datafield>" + "\n");
}
rec.append(" </record>" + "\n" + "</collection>");
return rec.toString();
}
}