Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java =================================================================== diff -u -rf685d0c3f89b3efd86c9fbdf22742425247f5e3a -r109a77d78a087aeb8b9418b2a49f943597097f06 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision f685d0c3f89b3efd86c9fbdf22742425247f5e3a) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 109a77d78a087aeb8b9418b2a49f943597097f06) @@ -23,13 +23,16 @@ package org.lamsfoundation.lams.integration.service; +import java.io.UnsupportedEncodingException; import java.util.List; import org.lamsfoundation.lams.integration.ExtCourseClassMap; import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtServerToolAdapterMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; +import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.usermanagement.User; /** *

@@ -86,4 +89,14 @@ void saveExtServerToolAdapterMap(ExtServerToolAdapterMap map); void deleteExtServerToolAdapterMap(ExtServerToolAdapterMap map); + + /** + * Checks whether the lesson was created from extServer and returns lessonFinishCallbackUrl if it's not blank. + * + * @param user + * @param lesson + * @return + * @throws UnsupportedEncodingException + */ + String getLessonFinishCallbackUrl(User user, Lesson lesson) throws UnsupportedEncodingException; } Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java =================================================================== diff -u -rd64f99e274c89f686642247169f37e3b0c731aaa -r109a77d78a087aeb8b9418b2a49f943597097f06 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision d64f99e274c89f686642247169f37e3b0c731aaa) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 109a77d78a087aeb8b9418b2a49f943597097f06) @@ -27,6 +27,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; @@ -41,12 +42,14 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.lamsfoundation.lams.integration.ExtCourseClassMap; +import org.lamsfoundation.lams.integration.ExtServerLessonMap; import org.lamsfoundation.lams.integration.ExtServerOrgMap; import org.lamsfoundation.lams.integration.ExtServerToolAdapterMap; import org.lamsfoundation.lams.integration.ExtUserUseridMap; import org.lamsfoundation.lams.integration.UserInfoFetchException; import org.lamsfoundation.lams.integration.security.RandomPasswordGenerator; import org.lamsfoundation.lams.integration.util.LoginRequestDispatcher; +import org.lamsfoundation.lams.lesson.Lesson; import org.lamsfoundation.lams.usermanagement.AuthenticationMethod; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.OrganisationState; @@ -413,4 +416,67 @@ public ExtServerOrgMap getExtServerOrgMap(Integer sid) { return (ExtServerOrgMap) service.findById(ExtServerOrgMap.class, sid); } + + public void createExtServerLessonMap(Long lessonId, ExtServerOrgMap extServer) { + ExtServerLessonMap map = new ExtServerLessonMap(); + map.setLessonId(lessonId); + map.setExtServer(extServer); + service.save(map); + } + + public String getLessonFinishCallbackUrl(User user, Lesson lesson) throws UnsupportedEncodingException { + // the callback url must contain %username%, %lessonid%, %timestamp% and %hash% eg: + // "http://test100.ics.mq.edu.au/webapps/lams-plglamscontent-bb_bb60/UserData?uid=%username%&lessonid=%lessonid%&ts=%timestamp%&hash=%hash%"; + // where %username%, %lessonid%, %timestamp% and %hash% will be replaced with their real values + String lessonFinishCallbackUrl = null; + + if (lesson != null) { + Long lessonId = lesson.getLessonId(); + ExtServerLessonMap extServerLesson = getExtServerLessonMap(lessonId); + // checks whether the lesson was created from extServer and whether it has lessonFinishCallbackUrl setting + if (extServerLesson != null && StringUtils.isNotBlank(extServerLesson.getExtServer().getLessonFinishUrl())) { + ExtServerOrgMap serverMap = extServerLesson.getExtServer(); + + ExtUserUseridMap extUserUseridMap = getExistingExtUserUseridMap(serverMap, user); + if (extUserUseridMap != null) { + String extUsername = extUserUseridMap.getExtUsername(); + + // construct real lessonFinishCallbackUrl + lessonFinishCallbackUrl = serverMap.getLessonFinishUrl(); + String timestamp = Long.toString(new Date().getTime()); + String hash = hash(serverMap, extUsername, timestamp); + String encodedExtUsername = URLEncoder.encode(extUsername, "UTF8"); + + // set the values for the parameters + lessonFinishCallbackUrl = lessonFinishCallbackUrl.replaceAll("%username%", encodedExtUsername) + .replaceAll("%lessonid%", lessonId.toString()).replaceAll("%timestamp%", timestamp) + .replaceAll("%hash%", hash); + log.debug(lessonFinishCallbackUrl); + } + } + } + + return lessonFinishCallbackUrl; + } + + private ExtServerLessonMap getExtServerLessonMap(Long lessonId) { + List list = service.findByProperty(ExtServerLessonMap.class, "lessonId", lessonId); + if (list == null || list.size() == 0) { + return null; + } else { + return (ExtServerLessonMap) list.get(0); + } + } + + private ExtUserUseridMap getExistingExtUserUseridMap(ExtServerOrgMap serverMap, User user) { + Map properties = new HashMap(); + properties.put("extServerOrgMap.sid", serverMap.getSid()); + properties.put("user.userId", user.getUserId()); + List list = service.findByProperties(ExtUserUseridMap.class, properties); + if (list == null || list.size() == 0) { + return null; + } else { + return (ExtUserUseridMap) list.get(0); + } + } } \ No newline at end of file