Index: lams_central/conf/security/Owasp.CsrfGuard.properties =================================================================== diff -u -rf86004309489cb81f283d1962b481b4bbb3facd6 -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_central/conf/security/Owasp.CsrfGuard.properties (.../Owasp.CsrfGuard.properties) (revision f86004309489cb81f283d1962b481b4bbb3facd6) +++ lams_central/conf/security/Owasp.CsrfGuard.properties (.../Owasp.CsrfGuard.properties) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -142,6 +142,7 @@ org.owasp.csrfguard.protected.dokuAuthoringSave=/lams/tool/ladoku11/authoring/update.do org.owasp.csrfguard.protected.dokuAuthoringDefineLater=/lams/tool/ladoku11/authoring/definelater.do org.owasp.csrfguard.protected.dokuMonitoringUpdateLearnerMark=/lams/tool/ladoku11/monitoring/updateLearnerMark.do +org.owasp.csrfguard.protected.dokuMonitoringChangeLeader=/lams/tool/ladoku11/monitoring/changeLeaderForGroup.do org.owasp.csrfguard.protected.forumAuthoringSave=/lams/tool/lafrum11/authoring/update.do org.owasp.csrfguard.protected.forumAuthoringDefineLater=/lams/tool/lafrum11/authoring/definelater.do Index: lams_tool_doku/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r29997e1d587d3ced8db5f525058eafb4e9742b2d -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_tool_doku/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 29997e1d587d3ced8db5f525058eafb4e9742b2d) +++ lams_tool_doku/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -85,6 +85,9 @@ label.monitoring.learner.marks.last.name = Last name label.monitoring.learner.marks.mark = Mark label.monitoring.learner.marks.mark.tip = (click to edit; max: 100) +label.monitoring.change.leader = Change leader +label.monitoring.leader.successfully.changed = Leader changed +label.monitoring.leader.not.changed = Leader was not changed messsage.monitoring.learner.marks.no.data = No learner data found messsage.monitoring.learner.marks.update.fail = Error while updating a learner mark outcome.authoring.title = Learning outcomes Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dokumaranApplicationContext.xml =================================================================== diff -u -r2509a4b8ae30079b238c0af1c508466517584e3b -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dokumaranApplicationContext.xml (.../dokumaranApplicationContext.xml) (revision 2509a4b8ae30079b238c0af1c508466517584e3b) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dokumaranApplicationContext.xml (.../dokumaranApplicationContext.xml) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -95,6 +95,7 @@ PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED + PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dto/SessionDTO.java =================================================================== diff -u -r368e60d0fd7df1a3e327670ef9d0f3487803110b -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dto/SessionDTO.java (.../SessionDTO.java) (revision 368e60d0fd7df1a3e327670ef9d0f3487803110b) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dto/SessionDTO.java (.../SessionDTO.java) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -32,6 +32,8 @@ private String readOnlyPadId; private boolean sessionFaulty; private ItemRatingDTO itemRatingDto; + private int numberOfLearners; + private boolean sessionFinished; public Long getSessionId() { return sessionId; @@ -80,4 +82,20 @@ public void setItemRatingDto(ItemRatingDTO ratingDto) { this.itemRatingDto = ratingDto; } + + public int getNumberOfLearners() { + return numberOfLearners; + } + + public void setNumberOfLearners(int numberOfLearners) { + this.numberOfLearners = numberOfLearners; + } + + public boolean isSessionFinished() { + return sessionFinished; + } + + public void setSessionFinished(boolean sesssionFinished) { + this.sessionFinished = sesssionFinished; + } } \ No newline at end of file Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java =================================================================== diff -u -r7eab6b4371036949ed61a387bc7706473895f567 -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision 7eab6b4371036949ed61a387bc7706473895f567) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -24,6 +24,7 @@ package org.lamsfoundation.lams.tool.dokumaran.service; import java.io.IOException; +import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; @@ -267,6 +268,39 @@ } @Override + public void changeLeaderForGroup(long toolSessionId, long leaderUserId) { + DokumaranSession session = getDokumaranSessionBySessionId(toolSessionId); + if (DokumaranConstants.COMPLETED == session.getStatus()) { + throw new InvalidParameterException("Attempting to assing a new leader with user ID " + leaderUserId + + " to a finished session wtih ID " + toolSessionId); + } + + DokumaranUser existingLeader = session.getGroupLeader(); + if (existingLeader == null || existingLeader.getUserId().equals(leaderUserId)) { + return; + } + Dokumaran dokumaran = session.getDokumaran(); + DokumaranUser newLeader = getUserByIDAndContent(leaderUserId, dokumaran.getContentId()); + if (newLeader == null) { + return; + } + if (!newLeader.getSession().getSessionId().equals(toolSessionId)) { + throw new InvalidParameterException("User with ID " + leaderUserId + " belongs to session with ID " + + newLeader.getSession().getSessionId() + " and not to session with ID " + toolSessionId); + } + + session.setGroupLeader(newLeader); + dokumaranSessionDao.update(session); + + Set userIds = getUsersBySession(toolSessionId).stream() + .collect(Collectors.mapping(dokumaranUser -> dokumaranUser.getUserId().intValue(), Collectors.toSet())); + + ObjectNode jsonCommand = JsonNodeFactory.instance.objectNode(); + jsonCommand.put("hookTrigger", "doku-leader-change-refresh-" + toolSessionId); + learnerService.createCommandForLearners(dokumaran.getContentId(), userIds, jsonCommand.toString()); + } + + @Override public void launchTimeLimit(Long toolContentId) throws IOException { Dokumaran dokumaran = getDokumaranByContentId(toolContentId); dokumaran.setTimeLimitLaunchedDate(new Date()); @@ -447,6 +481,8 @@ SessionDTO group = new SessionDTO(); group.setSessionId(session.getSessionId()); group.setSessionName(session.getSessionName()); + group.setNumberOfLearners(getUsersBySession(session.getSessionId()).size()); + group.setSessionFinished(DokumaranConstants.COMPLETED == session.getStatus()); group.setPadId(session.getPadId()); group.setReadOnlyPadId(session.getEtherpadReadOnlyId()); Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java =================================================================== diff -u -re0cdeed1959c06ed434e7a4abec0aa5722128c8b -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java (.../IDokumaranService.java) (revision e0cdeed1959c06ed434e7a4abec0aa5722128c8b) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java (.../IDokumaranService.java) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -239,4 +239,6 @@ void startGalleryWalk(long toolContentId) throws IOException; void finishGalleryWalk(long toolContentId) throws IOException; + + void changeLeaderForGroup(long toolSessionId, long leaderUserId); } \ No newline at end of file Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/MonitoringController.java =================================================================== diff -u -r368e60d0fd7df1a3e327670ef9d0f3487803110b -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 368e60d0fd7df1a3e327670ef9d0f3487803110b) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -61,11 +61,13 @@ import org.lamsfoundation.lams.web.util.SessionMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -276,6 +278,14 @@ } + @RequestMapping(path = "/changeLeaderForGroup", method = RequestMethod.POST) + @ResponseBody + @ResponseStatus(HttpStatus.OK) + public void changeLeaderForGroup(@RequestParam(name = AttributeNames.PARAM_TOOL_SESSION_ID) long toolSessionId, + @RequestParam long leaderUserId) { + dokumaranService.changeLeaderForGroup(toolSessionId, leaderUserId); + } + @RequestMapping("/startGalleryWalk") private void startGalleryWalk(HttpServletRequest request) throws IOException { Long toolContentId = WebUtil.readLongParam(request, DokumaranConstants.ATTR_TOOL_CONTENT_ID, false); Index: lams_tool_doku/web/pages/learning/learning.jsp =================================================================== diff -u -r53041ab71ac581668c14bdf40f65be5ea5f26961 -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_tool_doku/web/pages/learning/learning.jsp (.../learning.jsp) (revision 53041ab71ac581668c14bdf40f65be5ea5f26961) +++ lams_tool_doku/web/pages/learning/learning.jsp (.../learning.jsp) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -74,6 +74,17 @@ } $('[data-toggle="tooltip"]').bootstrapTooltip(); + + <%-- Connect to command websocket only if it is learner UI --%> + + // command websocket stuff for refreshing + // trigger is an unique ID of page and action that command websocket code in Page.tag recognises + commandWebsocketHookTrigger = 'doku-leader-change-refresh-${toolSessionID}'; + // if the trigger is recognised, the following action occurs + commandWebsocketHook = function() { + location.reload(); + }; + }); if (${!hasEditRight && mode != "teacher" && !finishedLock}) { Index: lams_tool_doku/web/pages/monitoring/summary.jsp =================================================================== diff -u -r8e8e7b3f0982e5e772b90202f01d43f1ee52962d -r8d372a4476d25a498b5af8c04e82576edc7b0976 --- lams_tool_doku/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 8e8e7b3f0982e5e772b90202f01d43f1ee52962d) +++ lams_tool_doku/web/pages/monitoring/summary.jsp (.../summary.jsp) (revision 8d372a4476d25a498b5af8c04e82576edc7b0976) @@ -412,6 +412,38 @@ } }); } + + + function showChangeLeaderModal(toolSessionId) { + $('#change-leader-modals').empty() + .load('tool/lalead11/monitoring/displayChangeLeaderForGroupDialogFromActivity.do',{ + toolSessionId : toolSessionId + }); + } + + function onChangeLeaderCallback(response, leaderUserId, toolSessionId){ + if (response.isSuccessful) { + $.ajax({ + 'url' : '', + 'type': 'post', + 'cache' : 'false', + 'data': { + 'toolSessionID' : toolSessionId, + 'leaderUserId' : leaderUserId, + '' : '' + }, + success : function(){ + alert(""); + }, + error : function(){ + alert(""); + } + }); + + } else { + alert(""); + } + } @@ -510,6 +542,12 @@  ${groupSummary.sessionName} + + +
<%@ include file="advanceoptions.jsp"%> + +
\ No newline at end of file