Index: lams_central/src/java/org/lamsfoundation/lams/web/controller/LtiController.java =================================================================== diff -u -r2e1574cede0a43314af36aa790c3ca156845cab2 -r663e7b156d927eda40b9e8357ce7d3ab052e9c15 --- lams_central/src/java/org/lamsfoundation/lams/web/controller/LtiController.java (.../LtiController.java) (revision 2e1574cede0a43314af36aa790c3ca156845cab2) +++ lams_central/src/java/org/lamsfoundation/lams/web/controller/LtiController.java (.../LtiController.java) (revision 663e7b156d927eda40b9e8357ce7d3ab052e9c15) @@ -51,6 +51,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; +import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -96,9 +97,9 @@ ExtServer extServer = integrationService.getExtServer(consumerKey); //support for ContentItemSelectionRequest. If lesson was created during such request, update its ExtServerLesson's resourceLinkId for the first time - boolean isContentItemSelection = WebUtil.readBooleanParam(request, "custom_isContentItemSelection", false); + boolean isContentItemSelection = WebUtil.readBooleanParam(request, "custom_iscontentitemselection", false); if (lesson == null && isContentItemSelection) { - Long lessonId = WebUtil.readLongParam(request, "custom_lessonId"); + Long lessonId = WebUtil.readLongParam(request, "custom_lessonid"); lesson = integrationService.getExtServerLessonMap(lessonId); lesson.setResourceLinkId(resourceLinkId); userManagementService.save(lesson); @@ -142,7 +143,6 @@ return learnerMonitor(request, respnse); } - } /** @@ -226,12 +226,12 @@ Organisation organisation = monitoringService.getOrganisation(organisationId); // 1. init lesson + Boolean liveEditEnabled = extServer.getLiveEditEnabled() == null ? false : extServer.getLiveEditEnabled(); Lesson lesson = monitoringService.initializeLesson(title, desc, new Long(ldIdStr), organisation.getOrganisationId(), user.getUserId(), null, false, enableLessonIntro, - extServer.getLearnerPresenceAvailable(), extServer.getLearnerImAvailable(), - extServer.getLiveEditEnabled(), extServer.getEnableLessonNotifications(), - extServer.getForceLearnerRestart(), extServer.getAllowLearnerRestart(), - extServer.getGradebookOnComplete(), null, null); + extServer.getLearnerPresenceAvailable(), extServer.getLearnerImAvailable(), liveEditEnabled, + extServer.getEnableLessonNotifications(), extServer.getForceLearnerRestart(), + extServer.getAllowLearnerRestart(), extServer.getGradebookOnComplete(), null, null); Long lessonId = lesson.getLessonId(); // 2. create lessonClass for lesson List staffList = new LinkedList(); @@ -249,10 +249,6 @@ integrationService.createExtServerLessonMap(lessonId, resourceLinkId, extServer); integrationService.addExtUsersToLesson(extServer, lessonId, contextId, resourceLinkId); - -// Thread t = new Thread(new AddUsersToLessonThread(serverId, datetime, username, hashValue, lsIdStr, -// courseId, country, lang, learnerIds, monitorIds, firstNames, lastNames, emails, request)); -// t.start(); //support for ContentItemSelectionRequest String ltiMessageType = request.getParameter(BasicLTIConstants.LTI_MESSAGE_TYPE); @@ -353,12 +349,15 @@ contentItemJSON.put("title", lesson.getLessonName()); contentItemJSON.put("text", lesson.getLessonDescription()); ObjectNode customJSON = JsonNodeFactory.instance.objectNode(); - customJSON.put("lessonId", lesson.getLessonId().toString()); - customJSON.put("isContentItemSelection", "true"); + customJSON.put("lessonid", lesson.getLessonId().toString()); + customJSON.put("iscontentitemselection", "true"); contentItemJSON.set("custom", customJSON); + + ArrayNode graph = JsonNodeFactory.instance.arrayNode(); + graph.add(contentItemJSON); ObjectNode responseJSON = JsonNodeFactory.instance.objectNode(); - responseJSON.set("@graph", contentItemJSON); + responseJSON.set("@graph", graph); responseJSON.put("@context", "http://purl.imsglobal.org/ctx/lti/v1/ContentItem"); String content_items = URLEncoder.encode(responseJSON.toString(), "UTF-8"); @@ -429,145 +428,4 @@ return userManagementService.getUserByLogin(dto.getLogin()); } -// private class AddUsersToLessonThread implements Runnable { -// -// private String serverId; -// private String datetime; -// private String username; -// private String hashValue; -// private String lsIdStr; -// private String courseId; -// private String country; -// private String lang; -// private String learnerIds; -// private String monitorIds; -// private String firstNames; -// private String lastNames; -// private String emails; -// private HttpServletRequest request; -// -// public AddUsersToLessonThread(String serverId, String datetime, String username, String hashValue, -// String lsIdStr, String courseId, String country, String lang, String learnerIds, String monitorIds, -// String firstNames, String lastNames, String emails, HttpServletRequest request) { -// this.serverId = serverId; -// this.datetime = datetime; -// this.username = username; -// this.hashValue = hashValue; -// this.lsIdStr = lsIdStr; -// this.courseId = courseId; -// this.country = country; -// this.lang = lang; -// this.learnerIds = learnerIds; -// this.monitorIds = monitorIds; -// this.firstNames = firstNames; -// this.lastNames = lastNames; -// this.emails = emails; -// this.request = request; -// } -// -// @Override -// public void run() { -// addUsersToLesson(serverId, datetime, username, hashValue, lsIdStr, courseId, country, lang, learnerIds, -// monitorIds, firstNames, lastNames, emails, request); -// } -// -// /** -// * Adds each user in learnerIds and monitorIds as learner and staff to the given lesson id; authenticates using -// * the 3rd party server requestor's username. -// * -// * @param serverId -// * @param datetime -// * @param hashValue -// * @param lsIdStr -// * @param learnerIds -// * @param monitorIds -// * @param request -// * @return -// */ -// public Boolean addUsersToLesson(String serverId, String datetime, String requestorUsername, String hashValue, -// String lsIdStr, String courseId, String countryIsoCode, String langIsoCode, String learnerIds, -// String monitorIds, String firstNames, String lastNames, String emails, HttpServletRequest request) { -// try { -// -// // get Server map -// ExtServer extServer = integrationService.getExtServer(serverId); -// // authenticate -// Authenticator.authenticate(extServer, datetime, requestorUsername, hashValue); -// -// String[] learnerIdArray = (learnerIds != null) ? learnerIds.split(",") : new String[0]; -// String[] monitorIdArray = (monitorIds != null) ? monitorIds.split(",") : new String[0]; -// String[] firstNameArray = (firstNames != null) -// ? firstNames.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1) -// : new String[0]; -// String[] lastNameArray = (lastNames != null) ? lastNames.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1) -// : new String[0]; -// String[] emailArray = (emails != null) ? emails.split(",") : new String[0]; -// -// // in case there is firstNames available - check all arrays have the same length, as otherwise it's -// // prone to ArrayOutOfBounds exceptions -// if ((firstNames != null) && ((firstNameArray.length != lastNameArray.length) -// || (firstNameArray.length != emailArray.length) -// || (firstNameArray.length != (learnerIdArray.length + monitorIdArray.length)))) { -// log.error("Invalid parameters sent: wrong array length. " + "learnerIds=" + learnerIds -// + " &monitorIds=" + monitorIds + " &firstNames=" + firstNames + " &lastNames=" + lastNames -// + " &emails=" + emails + " &array lengths=" + learnerIdArray.length + "!" -// + monitorIdArray.length + "!" + firstNameArray.length + "!" + lastNameArray.length + "!" -// + emailArray.length); -// return false; -// } -// -// int i = 0; -// for (String userName : learnerIdArray) { -// String firstName = null; -// String lastName = null; -// String email = null; -// if (firstNames != null) { -// // unescape values passed from the external server. Works OK even if the values were not escaped -// firstName = StringEscapeUtils.unescapeCsv(firstNameArray[i]); -// lastName = StringEscapeUtils.unescapeCsv(lastNameArray[i]); -// email = StringEscapeUtils.unescapeCsv(emailArray[i]); -// } -// -// if (StringUtils.isNotBlank(userName)) { -// addUserToLesson(extServer, LoginRequestDispatcher.METHOD_LEARNER, lsIdStr, userName, firstName, -// lastName, email, courseId, countryIsoCode, langIsoCode); -// } -// i++; -// } -// -// for (String userName : monitorIdArray) { -// String firstName = null; -// String lastName = null; -// String email = null; -// if (firstNames != null) { -// // unescape values passed from the external server. Works OK even if the values were not escaped -// firstName = StringEscapeUtils.unescapeCsv(firstNameArray[i]); -// lastName = StringEscapeUtils.unescapeCsv(lastNameArray[i]); -// email = StringEscapeUtils.unescapeCsv(emailArray[i]); -// } -// -// if (StringUtils.isNotBlank(userName)) { -// integrationService.addExtUserToLesson(extServer, LoginRequestDispatcher.METHOD_MONITOR, lsIdStr, -// userName, firstName, lastName, email, courseId, countryIsoCode, langIsoCode); -// } -// i++; -// } -// -// return true; -// } catch (UserInfoFetchException e) { -// log.error(e, e); -// return false; -// } catch (UserInfoValidationException e) { -// log.error(e, e); -// return false; -// } catch (AuthenticationException e) { -// log.error(e, e); -// return false; -// } -// } -// -// -// } - - } Index: lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java =================================================================== diff -u -r2e1574cede0a43314af36aa790c3ca156845cab2 -r663e7b156d927eda40b9e8357ce7d3ab052e9c15 --- lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 2e1574cede0a43314af36aa790c3ca156845cab2) +++ lams_common/src/java/org/lamsfoundation/lams/integration/service/IntegrationService.java (.../IntegrationService.java) (revision 663e7b156d927eda40b9e8357ce7d3ab052e9c15) @@ -977,7 +977,8 @@ JsonNode member = membership.get("member"); String extUserId = member.get("userId").asText(); - String firstName = member.get("givenName").asText(); + //to address Moodle version 3.7.1 bug + String firstName = member.get("givenName") == null ? member.get("giveName").asText() : member.get("giveName").asText(); String lastName = member.get("familyName").asText(); String fullName = member.get("name").asText(); String email = member.get("email").asText(); @@ -1036,7 +1037,7 @@ JsonNode messages = membership.get("message"); - log.info("membership" + i + " messages: " + messages.toString()); + log.info("membership" + i + " messages: " + (messages == null ? "" : messages.toString())); if (messages != null && messages.size() > 0) { for (int k = 0; k < messages.size(); k++) { JsonNode message = messages.get(k);