Index: lams_tool_doku/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -r122dd5d7a7fc16042e798dc96c3a7a9ee96a8b8c -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 122dd5d7a7fc16042e798dc96c3a7a9ee96a8b8c) +++ lams_tool_doku/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -95,3 +95,4 @@ outcome.authoring.existing.none = none outcome.authoring.create.new = [create new] output.desc.manual.grading = Manual grading +monitoring.summary.gallery.walk.start = Start Gallery Walk \ No newline at end of file Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dbupdates/patch20201122.sql =================================================================== diff -u -r122dd5d7a7fc16042e798dc96c3a7a9ee96a8b8c -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dbupdates/patch20201122.sql (.../patch20201122.sql) (revision 122dd5d7a7fc16042e798dc96c3a7a9ee96a8b8c) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dbupdates/patch20201122.sql (.../patch20201122.sql) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -6,7 +6,9 @@ --LDEV-5120 Add column for Doku Gallery Walk ALTER TABLE tl_ladoku11_dokumaran ADD COLUMN gallery_walk_enabled TINYINT NOT NULL DEFAULT 0, - ADD COLUMN gallery_walk_read_only TINYINT NOT NULL DEFAULT 0; + ADD COLUMN gallery_walk_read_only TINYINT NOT NULL DEFAULT 0, + ADD COLUMN gallery_walk_started TINYINT NOT NULL DEFAULT 0, + ADD COLUMN gallery_walk_finished TINYINT NOT NULL DEFAULT 0; -- Put all sql statements above here Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dokumaranApplicationContext.xml =================================================================== diff -u -r01c2a55767c613282c319ed8b38a0c78712e3661 -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dokumaranApplicationContext.xml (.../dokumaranApplicationContext.xml) (revision 01c2a55767c613282c319ed8b38a0c78712e3661) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/dokumaranApplicationContext.xml (.../dokumaranApplicationContext.xml) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -94,7 +94,7 @@ PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,+java.lang.Exception - PROPAGATION_REQUIRED,-java.lang.Exception + PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_REQUIRED,+java.lang.Exception @@ -106,6 +106,7 @@ 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/model/Dokumaran.java =================================================================== diff -u -r122dd5d7a7fc16042e798dc96c3a7a9ee96a8b8c -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java (.../Dokumaran.java) (revision 122dd5d7a7fc16042e798dc96c3a7a9ee96a8b8c) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/model/Dokumaran.java (.../Dokumaran.java) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -113,6 +113,12 @@ @Column(name = "gallery_walk_read_only") private boolean galleryWalkReadOnly; + @Column(name = "gallery_walk_started") + private boolean galleryWalkStarted; + + @Column(name = "gallery_walk_finished") + private boolean galleryWalkFinished; + // general information @Column(name = "create_date") private Date created; @@ -429,4 +435,20 @@ public void setGalleryWalkReadOnly(boolean galleryWalkReadOnly) { this.galleryWalkReadOnly = galleryWalkReadOnly; } + + public boolean isGalleryWalkStarted() { + return galleryWalkStarted; + } + + public void setGalleryWalkStarted(boolean galleryWalkStarted) { + this.galleryWalkStarted = galleryWalkStarted; + } + + public boolean isGalleryWalkFinished() { + return galleryWalkFinished; + } + + public void setGalleryWalkFinished(boolean galleryWalkFinished) { + this.galleryWalkFinished = galleryWalkFinished; + } } \ No newline at end of file Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java =================================================================== diff -u -rb5c36d2f8fb70869f2402ed3457a9513e2db871c -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision b5c36d2f8fb70869f2402ed3457a9513e2db871c) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/DokumaranService.java (.../DokumaranService.java) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -65,6 +65,7 @@ import org.lamsfoundation.lams.tool.dokumaran.model.Dokumaran; import org.lamsfoundation.lams.tool.dokumaran.model.DokumaranSession; import org.lamsfoundation.lams.tool.dokumaran.model.DokumaranUser; +import org.lamsfoundation.lams.tool.dokumaran.web.controller.LearningWebsocketServer; import org.lamsfoundation.lams.tool.exception.DataMissingException; import org.lamsfoundation.lams.tool.exception.ToolException; import org.lamsfoundation.lams.tool.service.ILamsToolService; @@ -500,6 +501,25 @@ return (DokumaranUser) dokumaranUserDao.getObject(DokumaranUser.class, uid); } + @Override + public void startGalleryWalk(long toolContentId) throws IOException { + Dokumaran dokumaran = getDokumaranByContentId(toolContentId); + if (!dokumaran.isGalleryWalkEnabled()) { + throw new IllegalArgumentException( + "Can not start Gallery Walk as it is not enabled for Dokumaran with tool content ID " + + toolContentId); + } + if (dokumaran.isGalleryWalkFinished()) { + throw new IllegalArgumentException( + "Can not start Gallery Walk as it is already finished for Dokumaran with tool content ID " + + toolContentId); + } + dokumaran.setGalleryWalkStarted(true); + dokumaranDao.saveObject(dokumaran); + + LearningWebsocketServer.sendPageRefreshRequest(toolContentId); + } + // ***************************************************************************** // private methods // ***************************************************************************** @@ -761,7 +781,7 @@ ToolSession toolSession = toolService.getToolSession(toolSessionId); Long lessonId = toolSession.getLesson().getLessonId(); groupIdentifier = DokumaranConstants.PREFIX_SHARED_GROUP + dokumaran.getSharedPadId() + lessonId; - + etherpadHtml = EtherpadUtil.preparePadContent(dokumaran.getInstructions()); } else { session.setEtherpadGroupId(sessionWithAlreadyCreatedPad.getEtherpadGroupId()); Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java =================================================================== diff -u -r5ce80833bb0828de219fc5b59e9e73c365da8559 -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java (.../IDokumaranService.java) (revision 5ce80833bb0828de219fc5b59e9e73c365da8559) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/service/IDokumaranService.java (.../IDokumaranService.java) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -262,4 +262,6 @@ * @return */ DokumaranUser getUser(Long uid); + + void startGalleryWalk(long toolContentId) throws IOException; } Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningController.java =================================================================== diff -u -rb5c36d2f8fb70869f2402ed3457a9513e2db871c -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningController.java (.../LearningController.java) (revision b5c36d2f8fb70869f2402ed3457a9513e2db871c) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningController.java (.../LearningController.java) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -58,10 +58,8 @@ import org.lamsfoundation.lams.web.util.SessionMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -107,17 +105,19 @@ DokumaranUser user = null; boolean isFirstTimeAccess = false; ToolAccessMode mode = WebUtil.readToolAccessModeParam(request, AttributeNames.PARAM_MODE, true); + // get back login user DTO + HttpSession ss = SessionManager.getSession(); + UserDTO currentUserDto = null; if ((mode != null) && mode.isTeacher()) { // monitoring mode - user is specified in URL // dokumaranUser may be null if the user was force completed. user = getSpecifiedUser(toolSessionId, WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, false)); } else { - // get back login user DTO - HttpSession ss = SessionManager.getSession(); - UserDTO userDto = (UserDTO) ss.getAttribute(AttributeNames.USER); - user = dokumaranService.getUserByIDAndSession(new Long(userDto.getUserID().intValue()), toolSessionId); + currentUserDto = (UserDTO) ss.getAttribute(AttributeNames.USER); + user = dokumaranService.getUserByIDAndSession(new Long(currentUserDto.getUserID().intValue()), + toolSessionId); if (user == null) { - user = new DokumaranUser(userDto, session); + user = new DokumaranUser(currentUserDto, session); dokumaranService.saveUser(user); isFirstTimeAccess = true; } @@ -149,24 +149,45 @@ } boolean isUserLeader = (user != null) && dokumaranService.isUserLeader(leaders, user.getUserId()); - - // check whether finish lock is on/off - boolean finishedLock = dokumaran.getLockWhenFinished() && (user != null) && user.isSessionFinished(); boolean hasEditRight = !dokumaran.isUseSelectLeaderToolOuput() || dokumaran.isUseSelectLeaderToolOuput() && isUserLeader; + sessionMap.put(DokumaranConstants.ATTR_HAS_EDIT_RIGHT, hasEditRight); + sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, toolSessionId); + sessionMap.put(DokumaranConstants.ATTR_TOOL_CONTENT_ID, dokumaran.getContentId()); + sessionMap.put(DokumaranConstants.ATTR_REFLECTION_ON, dokumaran.isReflectOnActivity()); + sessionMap.put(AttributeNames.ATTR_IS_LAST_ACTIVITY, dokumaranService.isLastActivity(toolSessionId)); + sessionMap.put(DokumaranConstants.ATTR_DOKUMARAN, dokumaran); - // basic information + // get the API key from the config table and add it to the session + String etherpadServerUrl = Configuration.get(ConfigurationKeys.ETHERPAD_SERVER_URL); + String etherpadApiKey = Configuration.get(ConfigurationKeys.ETHERPAD_API_KEY); + if (StringUtils.isBlank(etherpadServerUrl) || StringUtils.isBlank(etherpadApiKey)) { + return "pages/learning/notconfigured"; + } + request.setAttribute(DokumaranConstants.KEY_ETHERPAD_SERVER_URL, etherpadServerUrl); + + if (dokumaran.isGalleryWalkStarted() && !dokumaran.isGalleryWalkFinished()) { + List groupList = dokumaranService.getSummary(dokumaran.getContentId()); + request.setAttribute(DokumaranConstants.ATTR_SUMMARY_LIST, groupList); + if (currentUserDto == null) { + currentUserDto = (UserDTO) ss.getAttribute(AttributeNames.USER); + } + Cookie cookie = dokumaranService.createEtherpadCookieForMonitor(currentUserDto, dokumaran.getContentId()); + response.addCookie(cookie); + return "pages/learning/galleryWalk"; + } + + sessionMap.put(AttributeNames.ATTR_MODE, mode); + // check whether finish lock is on/off + boolean finishedLock = dokumaran.getLockWhenFinished() && (user != null) && user.isSessionFinished(); sessionMap.put(DokumaranConstants.ATTR_TITLE, dokumaran.getTitle()); sessionMap.put(DokumaranConstants.ATTR_INSTRUCTIONS, dokumaran.getInstructions()); sessionMap.put(DokumaranConstants.ATTR_FINISH_LOCK, finishedLock); sessionMap.put(DokumaranConstants.ATTR_LOCK_ON_FINISH, dokumaran.getLockWhenFinished()); sessionMap.put(DokumaranConstants.ATTR_USER_FINISHED, (user != null) && user.isSessionFinished()); - sessionMap.put(DokumaranConstants.ATTR_HAS_EDIT_RIGHT, hasEditRight); + sessionMap.put(DokumaranConstants.ATTR_IS_LEADER_RESPONSE_FINALIZED, dokumaranService.isLeaderResponseFinalized(leaders)); - sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, toolSessionId); - sessionMap.put(DokumaranConstants.ATTR_TOOL_CONTENT_ID, dokumaran.getContentId()); - sessionMap.put(AttributeNames.ATTR_MODE, mode); // reflection information String entryText = new String(); @@ -177,7 +198,6 @@ entryText = notebookEntry.getEntry(); } } - sessionMap.put(DokumaranConstants.ATTR_REFLECTION_ON, dokumaran.isReflectOnActivity()); sessionMap.put(DokumaranConstants.ATTR_REFLECTION_INSTRUCTION, dokumaran.getReflectInstructions()); sessionMap.put(DokumaranConstants.ATTR_REFLECTION_ENTRY, entryText); @@ -191,17 +211,6 @@ dokumaran.setDefineLater(false); dokumaranService.saveOrUpdateDokumaran(dokumaran); - sessionMap.put(AttributeNames.ATTR_IS_LAST_ACTIVITY, dokumaranService.isLastActivity(toolSessionId)); - sessionMap.put(DokumaranConstants.ATTR_DOKUMARAN, dokumaran); - - // get the API key from the config table and add it to the session - String etherpadServerUrl = Configuration.get(ConfigurationKeys.ETHERPAD_SERVER_URL); - String etherpadApiKey = Configuration.get(ConfigurationKeys.ETHERPAD_API_KEY); - if (StringUtils.isBlank(etherpadServerUrl) || StringUtils.isBlank(etherpadApiKey)) { - return "pages/learning/notconfigured"; - } - request.setAttribute(DokumaranConstants.KEY_ETHERPAD_SERVER_URL, etherpadServerUrl); - //time limit boolean isTimeLimitEnabled = hasEditRight && !finishedLock && dokumaran.getTimeLimit() != 0; long secondsLeft = isTimeLimitEnabled ? dokumaranService.getSecondsLeft(dokumaran) : 0; @@ -320,23 +329,6 @@ return "pages/learning/notebook"; } - @SuppressWarnings("unchecked") - @RequestMapping("/startGalleryWalk") - private String startGalleryWalk(@RequestParam String sessionMapID, HttpServletResponse response, - HttpSession session, Model model) throws EtherpadException { - SessionMap map = (SessionMap) session.getAttribute(sessionMapID); - Long toolSessionID = (Long) map.get(AttributeNames.PARAM_TOOL_SESSION_ID); - Dokumaran dokumaran = dokumaranService.getDokumaranBySessionId(toolSessionID); - List groupList = dokumaranService.getSummary(dokumaran.getContentId()); - model.addAttribute(DokumaranConstants.ATTR_SUMMARY_LIST, groupList); - - UserDTO userDto = (UserDTO) session.getAttribute(AttributeNames.USER); - Cookie cookie = dokumaranService.createEtherpadCookieForMonitor(userDto, dokumaran.getContentId()); - response.addCookie(cookie); - - return "pages/learning/galleryWalk"; - } - /** * Submit reflection form input database. * Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningWebsocketServer.java =================================================================== diff -u -rb8cffb90895b237f8974633720e6c491699117f4 -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision b8cffb90895b237f8974633720e6c491699117f4) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/LearningWebsocketServer.java (.../LearningWebsocketServer.java) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -184,7 +184,7 @@ * Monitor has launched time limit. All learners will need to refresh the page in order to stop showing them * waitForTimeLimitLaunch page. */ - private static void sendPageRefreshRequest(Long toolContentId) throws IOException { + public static void sendPageRefreshRequest(Long toolContentId) throws IOException { Set toolContentWebsockets = websockets.get(toolContentId); if (toolContentWebsockets == null) { return; Index: lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/MonitoringController.java =================================================================== diff -u -r153c59d8375056a983c1bb0bb34044057c7c410a -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 153c59d8375056a983c1bb0bb34044057c7c410a) +++ lams_tool_doku/src/java/org/lamsfoundation/lams/tool/dokumaran/web/controller/MonitoringController.java (.../MonitoringController.java) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -267,9 +267,6 @@ /** * Stores date when user has started activity with time limit - * - * @throws IOException - * @throws JSONException */ @RequestMapping("/addOneMinute") private void addOneMinute(HttpServletRequest request) throws IOException { @@ -279,6 +276,13 @@ } + @RequestMapping("/startGalleryWalk") + private void startGalleryWalk(HttpServletRequest request) throws IOException { + Long toolContentId = WebUtil.readLongParam(request, DokumaranConstants.ATTR_TOOL_CONTENT_ID, false); + + dokumaranService.startGalleryWalk(toolContentId); + } + private Integer getUserId() { HttpSession ss = SessionManager.getSession(); UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); Index: lams_tool_doku/web/pages/learning/learning.jsp =================================================================== diff -u -rb5c36d2f8fb70869f2402ed3457a9513e2db871c -re606aaebe2ef85c40a4054ef76abf62c94d224a4 --- lams_tool_doku/web/pages/learning/learning.jsp (.../learning.jsp) (revision b5c36d2f8fb70869f2402ed3457a9513e2db871c) +++ lams_tool_doku/web/pages/learning/learning.jsp (.../learning.jsp) (revision e606aaebe2ef85c40a4054ef76abf62c94d224a4) @@ -106,11 +106,7 @@ document.location.href=''; } - function startGalleryWalk(){ - document.location.href=''; - } - - + //init the connection with server using server URL but with different protocol var dokuWebsocketInitTime = Date.now(), dokuWebsocket = new WebSocket(''.replace('http', 'ws') @@ -152,6 +148,12 @@ // create JSON object var input = JSON.parse(e.data); + // force page refresh, for example to go to Gallery Walk + if (input.pageRefresh) { + location.reload(); + return; + } + //monitor has added one minute to the total timeLimit time if (input.addTime) { //reload page in order to allow editing the pad again @@ -272,15 +274,9 @@ - +
- - - +