package org.sakaiproject.lessonbuildertool.ccexport;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.component.cover.ComponentManager;
import org.sakaiproject.lessonbuildertool.model.SimplePageToolDao;
import org.sakaiproject.component.cover.ServerConfigurationService;
import org.sakaiproject.lti.api.LTIService;
import uk.org.ponder.messageutil.MessageLocator;
public class BltiExport {
private static Log log = LogFactory.getLog(AssignmentExport.class);
private static SimplePageToolDao simplePageToolDao;
static MessageLocator messageLocator = null;
protected static LTIService ltiService = null;
public void setSimplePageToolDao(Object dao) {
simplePageToolDao = (SimplePageToolDao)dao;
}
public void setMessageLocator(MessageLocator m) {
messageLocator = m;
}
public void init() {
log.info("init()");
if (ltiService == null) {
Object service = ComponentManager.get("org.sakaiproject.lti.api.LTIService");
if (service == null) {
log.info("can't find LTI Service -- disabling LTI support");
return;
}
ltiService = (LTIService)service;
log.info("LTI Export initialized");
}
}
public void destroy() {
log.info("destroy()");
}
public List<String> getEntitiesInSite(String siteId, CCExport bean) {
List<String> ret = new ArrayList();
if (ltiService == null)
return ret;
List<Map<String,Object>> contents = null;
try {
contents = ltiService.getContents(null, null, 0, 0);
} catch (Exception e) {
// this should never happen, but we saw it once
return null;
}
for (Map<String,Object> content : contents) {
Long id = getLong(content.get(LTIService.LTI_ID));
if (id.longValue() != -1L)
ret.add("blti/" + id);
}
return ret;
}
public boolean outputEntity(String bltiRef, ZipPrintStream out, PrintStream errStream, CCExport bean, CCExport.Resource resource, int version) {
int i = bltiRef.indexOf("/");
String id = bltiRef.substring(i + 1);
Long bkey = getLong(id);
Map content = ltiService.getContent(bkey);
if (content == null)
return false;
Long toolKey = getLongNull(content.get(LTIService.LTI_TOOL_ID));
if (toolKey == null)
return false;
Map tool = ltiService.getTool(toolKey);
String title = (String)tool.get(LTIService.LTI_TITLE);
String launch_url = (String)tool.get(LTIService.LTI_LAUNCH);
String custom1 = (String)tool.get(LTIService.LTI_CUSTOM);
if (content.get(LTIService.LTI_TITLE) != null)
title = (String)content.get(LTIService.LTI_TITLE);
String custom2 = (String)content.get(LTIService.LTI_CUSTOM);
List<String> custom = new ArrayList<String>();
if ((custom1 != null) && (!custom1.trim().equals("")))
custom.addAll(Arrays.asList(custom1.split("\n")));
if ((custom2 != null) && (!custom2.trim().equals(""))) {
custom.addAll(Arrays.asList(custom2.split("\n")));
}
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
switch (version) {
case CCExport.V11:
out.println("<cartridge_basiclti_link");
out.println(" xmlns=\"http://www.imsglobal.org/xsd/imslticc_v1p0\"");
out.println(" xmlns:blti=\"http://www.imsglobal.org/xsd/imsbasiclti_v1p0\"");
out.println(" xmlns:lticm=\"http://www.imsglobal.org/xsd/imslticm_v1p0\"");
out.println(" xmlns:lticp=\"http://www.imsglobal.org/xsd/imslticp_v1p0\"");
out.println(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
out.println(" xsi:schemaLocation=\"http://www.imsglobal.org/xsd/imslticc_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticc_v1p0.xsd http://www.imsglobal.org/xsd/imslticp_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticp_v1p0.xsd http://www.imsglobal.org/xsd/imslticm_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticm_v1p0.xsd http://www.imsglobal.org/xsd/imsbasiclti_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imsbasiclti_v1p0p1.xsd\">");
break;
default:
out.println("<cartridge_basiclti_link xmlns=\"http://www.imsglobal.org/xsd/imslticc_v1p0\"");
out.println(" xmlns:blti = \"http://www.imsglobal.org/xsd/imsbasiclti_v1p0\"");
out.println(" xmlns:lticm =\"http://www.imsglobal.org/xsd/imslticm_v1p0\"");
out.println(" xmlns:lticp =\"http://www.imsglobal.org/xsd/imslticp_v1p0\"");
out.println(" xmlns:xsi = \"http://www.w3.org/2001/XMLSchema-instance\"");
out.println(" xsi:schemaLocation = \"http://www.imsglobal.org/xsd/imslticc_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticc_v1p0p1.xsd http://www.imsglobal.org/xsd/imsbasiclti_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imsbasiclti_v1p0p1.xsd http://www.imsglobal.org/xsd/imslticm_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticm_v1p0.xsd http://www.imsglobal.org/xsd/imslticp_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticp_v1p0.xsd\">");
}
out.println(" <blti:title>" + StringEscapeUtils.escapeXml(title) + "</blti:title>");
if (custom.size() > 0) {
out.println(" <blti:custom>");
for (String attr : custom) {
int k = attr.indexOf("=");
if (k >= 0) {
String key = attr.substring(0, k).trim();
String value = attr.substring(k + 1).trim();
out.println(" <lticm:property name=\"" + StringEscapeUtils.escapeXml(key) + "\">" + StringEscapeUtils.escapeXml(value) + "</lticm:property>");
}
}
out.println(" </blti:custom>");
}
out.println(" <blti:launch_url>" + StringEscapeUtils.escapeXml(launch_url) + "</blti:launch_url>");
out.println(" <blti:vendor>");
out.println(" <lticp:code>" + StringEscapeUtils.escapeXml(ServerConfigurationService.getServerName()) + "</lticp:code>");
out.println(" <lticp:name>" + StringEscapeUtils.escapeXml(ServerConfigurationService.getString("ui.institution", "Sakai")) + "</lticp:name>");
out.println(" </blti:vendor>");
out.println("</cartridge_basiclti_link>");
return true;
}
public Long getLong(Object key) {
Long retval = getLongNull(key);
if (retval != null)
return retval;
return new Long(-1L);
}
public Long getLongNull(Object key) {
if (key == null)
return null;
if ((key instanceof Number))
return new Long(((Number)key).longValue());
if ((key instanceof String)) {
try {
return new Long((String)key);
} catch (Exception e) {
return null;
}
}
return null;
}
}