Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java =================================================================== diff -u -rcfc45c0ce1011ea9595049e3ffe787d25afe9533 -r3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision cfc45c0ce1011ea9595049e3ffe787d25afe9533) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IIntegrationService.java (.../IIntegrationService.java) (revision 3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8) @@ -213,7 +213,8 @@ * @return * @throws UnsupportedEncodingException */ - String getLessonFinishCallbackUrl(User user, Lesson lesson) throws UnsupportedEncodingException; + String getLessonFinishCallbackUrl(User user, Lesson lesson, Long finishedActivityId) + throws UnsupportedEncodingException; /** * Check whether specified lesson was created using LTI consumer, and if so - push user mark to that server Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java =================================================================== diff -u -rcfc45c0ce1011ea9595049e3ffe787d25afe9533 -r3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision cfc45c0ce1011ea9595049e3ffe787d25afe9533) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8) @@ -628,7 +628,8 @@ } @Override - public String getLessonFinishCallbackUrl(User user, Lesson lesson) throws UnsupportedEncodingException { + public String getLessonFinishCallbackUrl(User user, Lesson lesson, Long finishedActivityId) + throws UnsupportedEncodingException { if (lesson == null) { return null; } @@ -641,16 +642,23 @@ Long lessonId = lesson.getLessonId(); ExtServerLessonMap extServerLesson = getExtServerLessonMap(lessonId); ExtServer server = extServerLesson == null ? null : extServerLesson.getExtServer(); + if (server != null) { + lessonFinishCallbackUrl = server.getLessonFinishUrl(); + // skip LTI Advantage score push if it is not needed at this stage + if (StringUtils.isNotBlank(lessonFinishCallbackUrl) && !lessonFinishCallbackUrl.contains("%activityId%") + && finishedActivityId != null) { + return null; + } + } ExtUserUseridMap extUser = extServerLesson == null ? null : getExtUserUseridMapByUserId(server, user.getUserId()); // checks whether the lesson was created from extServer and whether it has lessonFinishCallbackUrl setting if (extServerLesson != null && extUser != null && server.getServerTypeId().equals(ExtServer.INTEGRATION_SERVER_TYPE) - && StringUtils.isNotBlank(extServerLesson.getExtServer().getLessonFinishUrl())) { + && StringUtils.isNotBlank(lessonFinishCallbackUrl)) { // construct real lessonFinishCallbackUrl - lessonFinishCallbackUrl = server.getLessonFinishUrl(); String timestamp = Long.toString(new Date().getTime()); String extUsername = extUser.getExtUsername(); String hash = hash(server, extUsername, timestamp); @@ -660,6 +668,10 @@ lessonFinishCallbackUrl = lessonFinishCallbackUrl.replaceAll("%username%", encodedExtUsername) .replaceAll("%lessonid%", lessonId.toString()).replaceAll("%timestamp%", timestamp) .replaceAll("%hash%", hash); + + lessonFinishCallbackUrl = lessonFinishCallbackUrl.replaceAll("%activityId%", + finishedActivityId == null ? "" : finishedActivityId.toString()); + log.debug(lessonFinishCallbackUrl); } // in case of LTI Tool Consumer - pushMarkToIntegratedServer() method will be invoked from GradebookService on mark update @@ -950,6 +962,7 @@ } } + @Override public ExtUserUseridMap getExtUserUseridMapByUserId(ExtServer extServer, Integer userId) { Map properties = new HashMap<>(); properties.put("extServer.sid", extServer.getSid()); Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/CompleteActivityController.java =================================================================== diff -u -rc61226d9e999c36d82584f6fe2ed55e8a1545d23 -r3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/CompleteActivityController.java (.../CompleteActivityController.java) (revision c61226d9e999c36d82584f6fe2ed55e8a1545d23) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/CompleteActivityController.java (.../CompleteActivityController.java) (revision 3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.learning.web.controller; import java.io.IOException; +import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -85,27 +86,34 @@ return null; } - // if user has already completed the lesson - we need to let non-LTI integrations server know to come and pick up - // updated marks (as it won't happen at lessoncomplete.jsp page) - if (progress.isComplete()) { - String lessonFinishCallbackUrl = integrationService.getLessonFinishCallbackUrl(progress.getUser(), - progress.getLesson()); - if (lessonFinishCallbackUrl != null) { - request.setAttribute("lessonFinishUrl", lessonFinishCallbackUrl); - } - if (progress.getLesson().getAllowLearnerRestart()) { - request.setAttribute("lessonID", progress.getLesson().getLessonId()); - } + if (progress.isComplete() && progress.getLesson().getAllowLearnerRestart()) { + request.setAttribute("lessonID", progress.getLesson().getLessonId()); } - // Set activity as complete try { - + // LTI Advantage also pushes marks on each activity completion, not only on lesson finish long activityId = WebUtil.readLongParam(request, AttributeNames.PARAM_ACTIVITY_ID); Activity activity = learnerService.getActivity(activityId); - //return forward - return learnerService.completeActivity(activityMapping, progress, activity, learnerId, false); + String lessonFinishCallbackUrl = null; + if (progress.isComplete() || activity.isToolActivity()) { + lessonFinishCallbackUrl = integrationService.getLessonFinishCallbackUrl(progress.getUser(), + progress.getLesson(), progress.isComplete() ? null : activityId); + if (lessonFinishCallbackUrl != null) { + // if user has already completed the lesson - we need to let non-LTI integrations server know to come and pick up + // updated marks (as it won't happen at lessoncomplete.jsp page) + request.setAttribute("lessonFinishUrl", lessonFinishCallbackUrl); + } + } + // Set activity as complete + String forward = learnerService.completeActivity(activityMapping, progress, activity, learnerId, false); + if (lessonFinishCallbackUrl != null && forward.startsWith("redirect")) { + // loadToolActivity.jsp will make an Ajax call to LTI Advantage servlet + forward = WebUtil.appendParameterToURL(forward, "activityFinishUrl", + URLEncoder.encode(lessonFinishCallbackUrl, "UTF8")); + } + return forward; + } catch (LearnerServiceException e) { return "error"; } Index: lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/LessonCompleteActivityController.java =================================================================== diff -u -r20aa6cbca9fc96d341080e6ad39f82593443f792 -r3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8 --- lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/LessonCompleteActivityController.java (.../LessonCompleteActivityController.java) (revision 20aa6cbca9fc96d341080e6ad39f82593443f792) +++ lams_learning/src/java/org/lamsfoundation/lams/learning/web/controller/LessonCompleteActivityController.java (.../LessonCompleteActivityController.java) (revision 3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8) @@ -77,7 +77,7 @@ //let non-LTI integrations server know to come and pick up updated marks (it will happen at lessoncomplete.jsp page) String lessonFinishCallbackUrl = integrationService.getLessonFinishCallbackUrl(learnerProgress.getUser(), - lesson); + lesson, null); if (lessonFinishCallbackUrl != null) { request.setAttribute("lessonFinishUrl", lessonFinishCallbackUrl); } Index: lams_learning/web/loadToolActivity.jsp =================================================================== diff -u -r29efbf8dd9d499c948e51a97d560c5d6d1cbf0af -r3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8 --- lams_learning/web/loadToolActivity.jsp (.../loadToolActivity.jsp) (revision 29efbf8dd9d499c948e51a97d560c5d6d1cbf0af) +++ lams_learning/web/loadToolActivity.jsp (.../loadToolActivity.jsp) (revision 3a817bfe8c85ab09ac85d7f7c8594aaf66a8bae8) @@ -78,12 +78,27 @@ } window.location.href = url; } - - -