package org.sakaiproject.citation.impl.openurl;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.BidiMap;
import org.apache.commons.collections.bidimap.TreeBidiMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.citation.api.Citation;
import org.sakaiproject.citation.api.CitationService;
/**
* Converts from a ContextObjectEntity to a Citation and back.
* @author buckett
*
*/
public class BookConverter extends AbstractConverter implements Converter {
final static Log log = LogFactory.getLog(BookConverter.class);
public final static String ID = "info:ofi/fmt:kev:mtx:book";
private CitationService citationService;
public void setCitationService(CitationService citationService) {
this.citationService = citationService;
}
static BidiMap conversion = new TreeBidiMap();
static {
// From Citation to OpenURL.
conversion.put("creator", "au");
conversion.put("title", "btitle");
conversion.put("year", "date"); // TODO Should validate date (also "date", date").
conversion.put("publisher", "pub");
conversion.put("publicationLocation", "place");
conversion.put("edition", "edition");
conversion.put("sourceTitle", "series"); // Only for books, sourceTitle is used for other things.
conversion.put("isnIdentifier", "isbn");
// DOI and ISBN should become IDs on the context object.
}
public String getOpenUrlKey(String citationsKey) {
return (String) conversion.get(citationsKey);
}
public String getCitationsKey(String openUrlKey) {
return (String) conversion.getKey(openUrlKey);
}
public boolean canConvertOpenUrl(String format) {
return ID.equals(format);
}
public boolean canConvertCitation(String type) {
return "book".equals(type);
}
public ContextObjectEntity convert(Citation citation) {
Map<String,Object> props = citation.getCitationProperties();
ContextObjectEntity entity = new ContextObjectEntity();
entity.addValue("genre", "book");
// Loop through the citation props
convertSimple(props, entity);
// Handle ISBN
if(citation.hasCitationProperty("isbn")) {
Object value = citation.getCitationProperty("isbn", false);
addId(entity, value, ISBN_URN_PREFIX);
}
return entity;
}
public Citation convert(ContextObjectEntity entity) {
Map<String, List<String>> values = entity.getValues();
// Set the genre.
String genre = null;
List<String> genres = values.get("genre");
if (genres != null) {
genre = genres.get(0);
}
if (genre == null) {
genre = "book";
}
Citation citation = citationService.addCitation(genre);
// Map the IDs from CO the citation.
for (String id: entity.getIds()) {
if (id.startsWith(ISBN_URN_PREFIX)) {
String isbn = id.substring(ISBN_URN_PREFIX.length());
if (isbn.length() > 0 ) {
citation.setCitationProperty("isnIdentifier", isbn);
}
} else if (id.startsWith(DOI_PREFIX)) {
String doi = id.substring(DOI_PREFIX.length());
if (doi.length() > 0) {
citation.setCitationProperty(DOI_PREFIX, doi);
}
} else {
citation.setCitationProperty("otherIds", id);
}
}
convertSimple(values, citation);
String author = Utils.lookForAuthor(values);
if (author != null) {
citation.setCitationProperty("creator", author);
}
return citation;
}
}