Index: lams_tool_scratchie/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/conf/language/lams/ApplicationResources_en_AU.properties,v diff -u -r1.27.2.8 -r1.27.2.9 --- lams_tool_scratchie/conf/language/lams/ApplicationResources_en_AU.properties 6 Dec 2016 09:02:25 -0000 1.27.2.8 +++ lams_tool_scratchie/conf/language/lams/ApplicationResources_en_AU.properties 6 Dec 2016 16:52:34 -0000 1.27.2.9 @@ -199,7 +199,8 @@ label.general.burning.question =General burning question label.waiting.for.leader.launch.time.limit =Leader has not started the activity. Please wait until he commences it. -label.waiting.for.leader.finish =Time limit set by teacher is over. Please wait until a group leader finishes the activity. +label.waiting.for.leader.submit.notebook =Time limit set by teacher is expired. Please wait until a group leader submits notebook. +label.waiting.for.leader.submit.burning.questions =Time limit set by teacher is expired. Please wait until a group leader submits burning questions. #======= End labels: Exported 191 labels for en AU ===== Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/ScratchieConstants.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/ScratchieConstants.java,v diff -u -r1.21.2.7 -r1.21.2.8 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/ScratchieConstants.java 6 Dec 2016 09:02:25 -0000 1.21.2.7 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/ScratchieConstants.java 6 Dec 2016 16:52:34 -0000 1.21.2.8 @@ -42,6 +42,8 @@ public static final String ERROR = "error"; public static final String DEFINE_LATER = "definelater"; + + public static final String WAIT_FOR_LEADER_TIME_LIMIT = "waitForLeaderTimeLimit"; // for parameters' name public static final String PARAM_TOOL_CONTENT_ID = "toolContentID"; Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java,v diff -u -r1.29.2.7 -r1.29.2.8 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java 6 Dec 2016 09:02:25 -0000 1.29.2.7 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java 6 Dec 2016 16:52:34 -0000 1.29.2.8 @@ -75,6 +75,14 @@ * @throws SchedulerException */ void launchTimeLimit(Long sessionId) throws SchedulerException; + + /** + * Checks if non-leaders should still wait for leader to submit either notebook or burning questions. + * + * @param toolSession + * @return + */ + boolean isWaitingForLeaderToSubmit(ScratchieSession toolSession); List getBurningQuestionsBySession(Long sessionId); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java,v diff -u -r1.51.2.26 -r1.51.2.27 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java 6 Dec 2016 15:32:51 -0000 1.51.2.26 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java 6 Dec 2016 16:52:34 -0000 1.51.2.27 @@ -301,6 +301,30 @@ scheduler.scheduleJob(finishScratchingJob, fnishScratchingTrigger); } + + @Override + public boolean isWaitingForLeaderToSubmit(ScratchieSession toolSession) { + Long toolSessionId = toolSession.getSessionId(); + Scratchie scratchie = toolSession.getScratchie(); + ScratchieUser groupLeader = toolSession.getGroupLeader(); + + boolean isReflectOnActivity = scratchie.isReflectOnActivity(); + // get notebook entry + NotebookEntry notebookEntry = null; + if (isReflectOnActivity && (groupLeader != null)) { + notebookEntry = getEntry(toolSessionId, CoreNotebookConstants.NOTEBOOK_TOOL, + ScratchieConstants.TOOL_SIGNATURE, groupLeader.getUserId().intValue()); + } + List burningQuestions = null; + if (scratchie.isBurningQuestionsEnabled()) { + burningQuestions = getBurningQuestionsBySession(toolSessionId); + } + boolean isWaitingForLeaderToSubmitNotebook = isReflectOnActivity && (notebookEntry == null); + boolean isWaitingForLeaderToSubmitBurningQuestions = scratchie.isBurningQuestionsEnabled() + && ((burningQuestions == null) || burningQuestions.isEmpty()) && !toolSession.isSessionFinished(); + + return isWaitingForLeaderToSubmitNotebook || isWaitingForLeaderToSubmitBurningQuestions; + } @Override public void changeUserMark(Long userId, Long sessionId, Integer newMark) { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/util/FinishScratchingJob.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/util/FinishScratchingJob.java,v diff -u -r1.1.2.1 -r1.1.2.2 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/util/FinishScratchingJob.java 6 Dec 2016 09:02:25 -0000 1.1.2.1 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/util/FinishScratchingJob.java 6 Dec 2016 16:52:34 -0000 1.1.2.2 @@ -16,8 +16,9 @@ import org.springframework.scheduling.quartz.QuartzJobBean; /** - * The Quartz sheduling job that finishes scratching for the given ToolSession (which will automatically lead to showing - * Finish button all non-leaders and thus let then finish the activity). + * The Quartz sheduling job that finishes scratching for the given ToolSession. It will lead to showing Finish button to + * all non-leaders in case they are not waiting for notebook/burning question to be submitted by the leader, and showing + * waitForLeaderSubmit page if they are waiting. * * @author Andrey Balan */ @@ -34,10 +35,20 @@ Long toolSessionId = (Long) properties.get("toolSessionId"); ScratchieSession toolSession = scratchieService.getScratchieSessionBySessionId(toolSessionId); - // if leader hasn't finished scratching yet - let all non-leaders see Next Activity button + //proceed only in case the leader hasn't finished scratching on his own if (!toolSession.isScratchingFinished()) { try { + //mark scratching as finished to stop showing learning.jsp to the leader scratchieService.setScratchingFinished(toolSessionId); + + // if non-leaders should not wait for notebook or burning questions to be submitted by the leader - let them see Finish button + boolean isWaitingForLeaderToSubmit = scratchieService.isWaitingForLeaderToSubmit(toolSession); + if (isWaitingForLeaderToSubmit) { + LearningWebsocketServer.sendPageRefreshRequest(toolSessionId); + } else { + LearningWebsocketServer.sendCloseRequest(toolSessionId); + } + } catch (JSONException | IOException e) { throw new RuntimeException(e); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningAction.java,v diff -u -r1.44.2.18 -r1.44.2.19 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningAction.java 6 Dec 2016 15:32:51 -0000 1.44.2.18 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningAction.java 6 Dec 2016 16:52:34 -0000 1.44.2.19 @@ -180,30 +180,6 @@ return mapping.findForward("waitforleader"); } - // forwards to the waitForLeader time limit pages - if (!mode.isTeacher()) { - boolean isNonLeader = !user.getUserId().equals(groupLeader.getUserId()); - if (isNonLeader && scratchie.getTimeLimit() != 0 && !user.isSessionFinished()) { - - //show waitForLeaderLaunchTimeLimit page if the leader hasn't started activity or hasn't pressed OK button to launch time limit - if (toolSession.getTimeLimitLaunchedDate() == null) { - request.setAttribute(ScratchieConstants.ATTR_WAITING_MESSAGE_KEY, "label.waiting.for.leader.launch.time.limit"); - return mapping.findForward("waitForLeaderTimeLimit"); - } - - // check if the time limit is exceeded - boolean isTimeLimitExceeded = toolSession.getTimeLimitLaunchedDate().getTime() - + scratchie.getTimeLimit() * 60000 < System.currentTimeMillis(); - - // if the time is up and leader hasn't submitted response (as there will be a little delay between time - // is up and scratching is finished) - show waitForLeaderFinish page - if (isTimeLimitExceeded && !toolSession.isScratchingFinished()) { - request.setAttribute(ScratchieConstants.ATTR_WAITING_MESSAGE_KEY, "label.waiting.for.leader.finish"); - return mapping.findForward("waitForLeaderTimeLimit"); - } - } - } - // initial Session Map SessionMap sessionMap = new SessionMap(); request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); @@ -368,12 +344,38 @@ request.setAttribute(ScratchieConstants.ATTR_IS_TIME_LIMIT_NOT_LAUNCHED, isTimeLimitNotLaunched); request.setAttribute(ScratchieConstants.ATTR_SECONDS_LEFT, secondsLeft); - // make non leaders also wait for burning questions submit - isWaitingForLeaderToSubmitNotebook |= isWaitingForLeaderToSubmitBurningQuestions; + // in case we can't show learning.jsp to non-leaders forward them to the waitForLeaderTimeLimit page + if (!isUserLeader && scratchie.getTimeLimit() != 0 && !mode.isTeacher()) { + // show waitForLeaderLaunchTimeLimit page if the leader hasn't started activity or hasn't pressed OK + // button to launch time limit + if (toolSession.getTimeLimitLaunchedDate() == null) { + request.setAttribute(ScratchieConstants.ATTR_WAITING_MESSAGE_KEY, + "label.waiting.for.leader.launch.time.limit"); + return mapping.findForward(ScratchieConstants.WAIT_FOR_LEADER_TIME_LIMIT); + } + + // check if the time limit is exceeded + boolean isTimeLimitExceeded = toolSession.getTimeLimitLaunchedDate().getTime() + + scratchie.getTimeLimit() * 60000 < System.currentTimeMillis(); + + // if the time limit is over and the leader hasn't submitted notebook or burning questions (thus + // non-leaders should wait) - show waitForLeaderFinish page + if (isTimeLimitExceeded && isWaitingForLeaderToSubmitNotebook) { + request.setAttribute(ScratchieConstants.ATTR_WAITING_MESSAGE_KEY, + "label.waiting.for.leader.submit.notebook"); + return mapping.findForward(ScratchieConstants.WAIT_FOR_LEADER_TIME_LIMIT); + } else if (isTimeLimitExceeded && isWaitingForLeaderToSubmitBurningQuestions) { + request.setAttribute(ScratchieConstants.ATTR_WAITING_MESSAGE_KEY, + "label.waiting.for.leader.submit.burning.questions"); + return mapping.findForward(ScratchieConstants.WAIT_FOR_LEADER_TIME_LIMIT); + } + } + sessionMap.put(ScratchieConstants.ATTR_IS_SCRATCHING_FINISHED, isScratchingFinished); + // make non leaders also wait for burning questions submit sessionMap.put(ScratchieConstants.ATTR_IS_WAITING_FOR_LEADER_TO_SUBMIT_NOTEBOOK, - isWaitingForLeaderToSubmitNotebook); + isWaitingForLeaderToSubmitNotebook | isWaitingForLeaderToSubmitBurningQuestions); return mapping.findForward(ScratchieConstants.SUCCESS); } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningWebsocketServer.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/Attic/LearningWebsocketServer.java,v diff -u -r1.1.2.5 -r1.1.2.6 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningWebsocketServer.java 7 Nov 2016 12:30:40 -0000 1.1.2.5 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningWebsocketServer.java 6 Dec 2016 16:52:34 -0000 1.1.2.6 @@ -210,7 +210,8 @@ } /** - * The leader finished the activity. Non-leaders will have Finish button displayed. + * The leader finished scratching and also . Non-leaders will have + * Finish button displayed. */ public static void sendCloseRequest(Long toolSessionId) throws JSONException, IOException { Set sessionWebsockets = LearningWebsocketServer.websockets.get(toolSessionId); @@ -230,7 +231,30 @@ } } } + + /** + * The time limit is expired but leader hasn't submitted required notebook/burning questions yet. Non-leaders + * will need to refresh the page in order to stop showing them questions page. + */ + public static void sendPageRefreshRequest(Long toolSessionId) throws JSONException, IOException { + Set sessionWebsockets = LearningWebsocketServer.websockets.get(toolSessionId); + if (sessionWebsockets == null) { + return; + } + // make a copy of the websocket collection so it does not get blocked while sending messages + sessionWebsockets = new HashSet(sessionWebsockets); + JSONObject responseJSON = new JSONObject(); + responseJSON.put("pageRefresh", true); + String response = responseJSON.toString(); + + for (Session websocket : sessionWebsockets) { + if (websocket.isOpen()) { + websocket.getBasicRemote().sendText(response); + } + } + } + private static IScratchieService getScratchieService() { if (LearningWebsocketServer.scratchieService == null) { LearningWebsocketServer.scratchieService = ScratchieServiceProxy Index: lams_tool_scratchie/web/pages/learning/questionlist.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/web/pages/learning/questionlist.jsp,v diff -u -r1.12.2.5 -r1.12.2.6 --- lams_tool_scratchie/web/pages/learning/questionlist.jsp 6 Dec 2016 15:32:51 -0000 1.12.2.5 +++ lams_tool_scratchie/web/pages/learning/questionlist.jsp 6 Dec 2016 16:52:34 -0000 1.12.2.6 @@ -32,13 +32,20 @@ websocket.onmessage = function(e) { // create JSON object var input = JSON.parse(e.data); - + + // leader finished the activity if (input.close) { - // leader finished the activity $('#finishButton').show(); return; } + //time limit is expired but leader hasn't submitted required notebook/burning questions yet. Non-leaders + //will need to refresh the page in order to stop showing them questions page. + if (input.pageRefresh) { + location.reload(); + return; + } + $.each(input, function(itemUid, answers) { $.each(answers, function(answerUid, isCorrect){ // only updates come via websockets