package org.sakaiproject.citation.impl.openurl;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.sakaiproject.citation.api.Citation;
import org.sakaiproject.citation.impl.openurl.ContextObject.Entity;
/**
* This class exposes the services for OpenURLs, this isn't in the API as at the moment it
* doesn't need to be used outside the citations implementation.
* Most of the logic is in implementations and other classes.
* @author buckett
*
*/
public class OpenURLServiceImpl {
private List<Transport> transports;
private List<Format> formats;
private List<Converter> converters;
private Format urlFormat;
private Transport urlTransport;
public void setTransports(List<Transport> transports) {
this.transports = transports;
}
public void setFormats(List<Format> formats) {
this.formats = formats;
}
public void setConverters(List<Converter> converters) {
this.converters = converters;
}
public void init() {
// Find the
for(Transport transport: transports) {
if (transport instanceof InlineHttpTransport) {
urlTransport = transport;
break;
}
}
for(Format format : formats) {
if (format.canHandle(KEVFormat.FORMAT_ID)) {
urlFormat = format;
break;
}
}
}
public ContextObject parse(HttpServletRequest request) {
ContextObject contextObject = null;
for(Transport transport : transports) {
RawContextObject rawContextObject = transport.parse(request);
if (rawContextObject != null && rawContextObject.getData() != null) {
for (Format format: formats) {
contextObject = format.parse(rawContextObject.getData());
if (contextObject != null) {
// TODO Should validate it.
break;
}
}
}
}
return contextObject;
}
/**
* This Converts a citation into a context object.
* @param citation
* @return
*/
public ContextObject convert(Citation citation) {
ContextObject contextObject = null;
if (citation != null && citation.getSchema() != null) {
String schema = citation.getSchema().getIdentifier();
for(Converter converter: converters) {
if (converter.canConvertCitation(schema)) {
contextObject = new ContextObject();
contextObject.getEntities().put(Entity.REFERENT, converter.convert(citation));
break;
}
}
}
return contextObject;
}
public Citation convert(ContextObject contextObject) {
Citation citation = null;
if (contextObject != null) {
ContextObjectEntity referent = contextObject.getEntity(Entity.REFERENT);
if (referent != null) {
String format = referent.getFormat();
for(Converter converter: converters) {
if (converter.canConvertOpenUrl(format)) {
citation = converter.convert(referent);
// Basic validation.
if (citation.hasCitationProperty("title")) {
break;
}
}
}
if (citation == null) {
// None of the converters matched.
}
}
}
return citation;
}
/**
* Generate an OpenURL based on the passed ContextObject.
* @param contextObject
* @return
*/
public String toURL(ContextObject contextObject) {
String encodedCO = urlFormat.encode(contextObject);
String url = urlTransport.encode(encodedCO);
return url;
}
}