Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rcbf95a868252401757c61327b3d9a383119ff9b5 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision cbf95a868252401757c61327b3d9a383119ff9b5) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -208,24 +208,25 @@ @Override public void copyAnswersFromLeader(AssessmentUser user, AssessmentUser leader) { - if ((user == null) || (leader == null) || user.getUid().equals(leader.getUid())) { return; } Long assessmentUid = leader.getSession().getAssessment().getUid(); AssessmentResult leaderResult = assessmentResultDao.getLastFinishedAssessmentResult(assessmentUid, leader.getUserId()); - AssessmentResult userResult = assessmentResultDao.getLastAssessmentResult(assessmentUid, user.getUserId()); + if (leaderResult == null) { + return; + } Set leaderQuestionResults = leaderResult.getQuestionResults(); - Long toolSessionId = leaderResult.getSessionId(); // if response doesn't exist create new empty objects which we populate on the next step + AssessmentResult userResult = assessmentResultDao.getLastAssessmentResult(assessmentUid, user.getUserId()); if (userResult == null) { userResult = new AssessmentResult(); userResult.setAssessment(leaderResult.getAssessment()); userResult.setUser(user); - userResult.setSessionId(toolSessionId); + userResult.setSessionId(leaderResult.getSessionId()); Set userQuestionResults = userResult.getQuestionResults(); for (AssessmentQuestionResult leaderQuestionResult : leaderQuestionResults) { @@ -631,35 +632,37 @@ } } - // store grades and finished date only on user hitting submit all answers button (and not submit mark hedging + // store finished date only on user hitting submit all answers button (and not submit mark hedging // question) - if (!isAutosave) { - int maximumGrade = 0; - float grade = 0; + int maximumGrade = 0; + float grade = 0; - //sum up user grade and max grade for all questions - for (Set questionsForOnePage : pagedQuestions) { - for (QuestionDTO questionDto : questionsForOnePage) { - // get questionResult from DB instance of AssessmentResult - AssessmentQuestionResult questionResult = null; - for (AssessmentQuestionResult questionResultIter : result.getQuestionResults()) { - if (questionDto.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { - questionResult = questionResultIter; - } + //sum up user grade and max grade for all questions + for (Set questionsForOnePage : pagedQuestions) { + for (QuestionDTO questionDto : questionsForOnePage) { + // get questionResult from DB instance of AssessmentResult + AssessmentQuestionResult questionResult = null; + for (AssessmentQuestionResult questionResultIter : result.getQuestionResults()) { + if (questionDto.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { + questionResult = questionResultIter; } - calculateAnswerMark(assessment.getUid(), userId, questionResult, questionDto); + } + calculateAnswerMark(assessment.getUid(), userId, questionResult, questionDto); + if (!isAutosave) { questionResult.setFinishDate(new Date()); - - grade += questionResult.getMark(); - maximumGrade += questionDto.getGrade(); } + + grade += questionResult.getMark(); + maximumGrade += questionDto.getGrade(); } - - result.setMaximumGrade(maximumGrade); - result.setGrade(grade); + } + + result.setMaximumGrade(maximumGrade); + result.setGrade(grade); + if (!isAutosave) { result.setFinishDate(new Timestamp(new Date().getTime())); - assessmentResultDao.update(result); } + assessmentResultDao.update(result); return true; } @@ -1148,10 +1151,25 @@ @Override public String finishToolSession(Long toolSessionId, Long userId) throws AssessmentApplicationException { + //mark user as finished AssessmentUser user = assessmentUserDao.getUserByUserIDAndSessionID(userId, toolSessionId); user.setSessionFinished(true); assessmentUserDao.saveObject(user); + //if this is a leader finishes, complete all non-leaders as well, also copy leader results to them + AssessmentSession session = user.getSession(); + Assessment assessment = session.getAssessment(); + if (assessment.isUseSelectLeaderToolOuput() && isUserGroupLeader(user, toolSessionId)) { + session.getAssessmentUsers().forEach(sessionUser -> { + //finish non-leader + sessionUser.setSessionFinished(true); + assessmentUserDao.saveObject(user); + + //copy answers from leader to non-leaders + copyAnswersFromLeader(sessionUser, session.getGroupLeader()); + }); + } + String nextUrl = null; try { nextUrl = leaveToolSession(toolSessionId, userId); @@ -2822,28 +2840,41 @@ return; } Assessment assessment = session.getAssessment(); + + AssessmentUser assessmentUser = getUserByIDAndSession(userId, toolSessionId); + // create user if he hasn't accessed this activity yet + if (assessmentUser == null) { + assessmentUser = new AssessmentUser(user.getUserDTO(), session); + createUser(assessmentUser); + + setAttemptStarted(assessment, assessmentUser, toolSessionId); + } + + //finalize the latest result, if it's still active + AssessmentResult lastAssessmentResult = getLastAssessmentResult(assessment.getUid(), userId); + if (lastAssessmentResult != null && lastAssessmentResult.getFinishDate() == null) { + lastAssessmentResult.setFinishDate(new Date()); + lastAssessmentResult.getQuestionResults() + .forEach(questionResult -> questionResult.setFinishDate(new Date())); + assessmentResultDao.update(lastAssessmentResult); + } - // copy answers only in case leader aware feature is ON - if (assessment.isUseSelectLeaderToolOuput()) { + //if this is a leader finishes, complete all non-leaders as well, also copy leader results to them + AssessmentUser groupLeader = checkLeaderSelectToolForSessionLeader(assessmentUser, toolSessionId); + if (isUserGroupLeader(assessmentUser, toolSessionId)) { + session.getAssessmentUsers().forEach(sessionUser -> { + //finish non-leader + sessionUser.setSessionFinished(true); + assessmentUserDao.saveObject(user); - AssessmentUser assessmentUser = getUserByIDAndSession(userId, toolSessionId); - // create user if he hasn't accessed this activity yet - if (assessmentUser == null) { - assessmentUser = new AssessmentUser(user.getUserDTO(), session); - createUser(assessmentUser); - } - - AssessmentUser groupLeader = session.getGroupLeader(); - - // check if leader has submitted answers - if ((groupLeader != null) && isLastAttemptFinishedByUser(groupLeader)) { - - // we need to make sure specified user has the same scratches as a leader - copyAnswersFromLeader(assessmentUser, groupLeader); - } - + //copy answers from leader to non-leaders + copyAnswersFromLeader(sessionUser, groupLeader); + }); + + } else { + assessmentUser.setSessionFinished(true); + assessmentUserDao.saveObject(user); } - } @Override Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java =================================================================== diff -u -rcbf95a868252401757c61327b3d9a383119ff9b5 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision cbf95a868252401757c61327b3d9a383119ff9b5) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -1574,30 +1574,44 @@ } McContent content = session.getMcContent(); - // copy answers only in case leader aware feature is ON - if (content.isUseSelectLeaderToolOuput()) { + McQueUsr mcUser = getMcUserBySession(userId, session.getUid()); + // create user if he hasn't accessed this activity yet + if (mcUser == null) { + String userName = user.getLogin(); + String fullName = user.getFirstName() + " " + user.getLastName(); + mcUser = new McQueUsr(userId, userName, fullName, session); + mcUserDAO.saveMcUser(mcUser); + } + + //finalize the latest result, if it's still active + if (!mcUser.isResponseFinalised()) { - McQueUsr mcUser = getMcUserBySession(userId, session.getUid()); - // create user if he hasn't accessed this activity yet - if (mcUser == null) { - - String userName = user.getLogin(); - String fullName = user.getFirstName() + " " + user.getLastName(); - mcUser = new McQueUsr(userId, userName, fullName, session); - mcUserDAO.saveMcUser(mcUser); + //calculate total learner mark + int learnerMark = 0; + for (McQueContent question : content.getMcQueContents()) { + McUsrAttempt attempt = mcUsrAttemptDAO.getUserAttemptByQuestion(userId, question.getUid()); + learnerMark += attempt == null ? 0 : attempt.getMark(); } - McQueUsr groupLeader = session.getGroupLeader(); + Integer numberOfAttempts = mcUser.getNumberOfAttempts() + 1; + mcUser.setNumberOfAttempts(numberOfAttempts); + mcUser.setLastAttemptTotalMark(learnerMark); + mcUser.setResponseFinalised(true); + updateMcQueUsr(mcUser); + } - // check if leader has submitted answers - if ((groupLeader != null) && groupLeader.isResponseFinalised()) { + //if this is a leader finishes, complete all non-leaders as well, also copy leader results to them + McQueUsr groupLeader = checkLeaderSelectToolForSessionLeader(mcUser, toolSessionId); + if (session.isUserGroupLeader(mcUser)) { + session.getMcQueUsers().forEach(sessionUser -> { + //finish non-leader + sessionUser.setResponseFinalised(true); + updateMcQueUsr(sessionUser); - // we need to make sure specified user has the same scratches as a leader - copyAnswersFromLeader(mcUser, groupLeader); - } - + //copy answers from leader to non-leaders + copyAnswersFromLeader(sessionUser, groupLeader); + }); } - } @Override @@ -1909,7 +1923,6 @@ * * Retries are controlled by lockWhenFinished, which defaults to true (no retries). */ - @SuppressWarnings("unchecked") @Override public void createRestToolContent(Integer userID, Long toolContentID, ObjectNode toolContentJSON) { Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McLearningController.java =================================================================== diff -u -r6ce1b949a486cdf029290566855cb29626ed0818 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McLearningController.java (.../McLearningController.java) (revision 6ce1b949a486cdf029290566855cb29626ed0818) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McLearningController.java (.../McLearningController.java) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -284,10 +284,6 @@ return "learning/AnswersContent"; } - /** - * ActionForward endLearning(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse - * response) - */ @RequestMapping("/endLearning") public String endLearning(@ModelAttribute McLearningForm mcLearningForm, HttpServletRequest request, HttpServletResponse response) throws IOException { @@ -393,20 +389,20 @@ String toolSessionID = request.getParameter(AttributeNames.PARAM_TOOL_SESSION_ID); McSession session = mcService.getMcSessionById(new Long(toolSessionID)); String toolContentId = session.getMcContent().getMcContentId().toString(); - McContent mcContent = mcService.getMcContent(new Long(toolContentId)); + McContent content = mcService.getMcContent(new Long(toolContentId)); List answers = McLearningController.parseLearnerAnswers(mcLearningForm, request, - mcContent.isQuestionsSequenced()); + content.isQuestionsSequenced()); Map learnerConfidenceLevels = null; - if (mcContent.isEnableConfidenceLevels()) { + if (content.isEnableConfidenceLevels()) { learnerConfidenceLevels = parseLearnerConfidenceLevels(mcLearningForm, request, - mcContent.isQuestionsSequenced()); + content.isQuestionsSequenced()); } - if (mcContent.isQuestionsSequenced()) { + if (content.isQuestionsSequenced()) { sessionMap.put(McAppConstants.QUESTION_AND_CANDIDATE_ANSWERS_KEY, answers); - if (mcContent.isEnableConfidenceLevels()) { + if (content.isEnableConfidenceLevels()) { sessionMap.put(McAppConstants.CONFIDENCE_LEVELS_KEY, learnerConfidenceLevels); } } @@ -421,7 +417,7 @@ } /* process the answers */ - List answerDtos = buildAnswerDtos(answers, learnerConfidenceLevels, mcContent, request); + List answerDtos = buildAnswerDtos(answers, learnerConfidenceLevels, content, request); mcService.saveUserAttempt(user, answerDtos); //calculate total learner mark @@ -435,6 +431,18 @@ user.setLastAttemptTotalMark(learnerMark); user.setResponseFinalised(true); mcService.updateMcQueUsr(user); + + //if this is a leader finishes, complete all non-leaders as well, also copy leader results to them + if (content.isUseSelectLeaderToolOuput() && session.isUserGroupLeader(user)) { + session.getMcQueUsers().forEach(sessionUser -> { + //finish non-leader + sessionUser.setResponseFinalised(true); + mcService.updateMcQueUsr(user); + + //copy answers from leader to non-leaders + mcService.copyAnswersFromLeader(sessionUser, session.getGroupLeader()); + }); + } return viewAnswers(mcLearningForm, request, response); } Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/qaApplicationContext.xml =================================================================== diff -u -r8384e056e833d8aadcd6cb12a219094f89c67042 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/qaApplicationContext.xml (.../qaApplicationContext.xml) (revision 8384e056e833d8aadcd6cb12a219094f89c67042) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/qaApplicationContext.xml (.../qaApplicationContext.xml) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -99,6 +99,7 @@ PROPAGATION_REQUIRED,-QaApplicationException PROPAGATION_REQUIRED,-QaApplicationException PROPAGATION_REQUIRED,-QaApplicationException + PROPAGATION_REQUIRED, -QaApplicationException Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java =================================================================== diff -u -r3bb7e0141ae1cc15ccd737c95d90b5762a34ad61 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java (.../IQaService.java) (revision 3bb7e0141ae1cc15ccd737c95d90b5762a34ad61) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/IQaService.java (.../IQaService.java) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -126,8 +126,6 @@ void removeQuestion(QaQueContent qaQuestion); - void createUserResponse(QaUsrResp qaUsrResp); - void updateUserResponse(QaUsrResp resp); QaUsrResp getResponseById(Long responseId); @@ -218,6 +216,8 @@ Long createNotebookEntry(Long id, Integer idType, String signature, Integer userID, String entry); NotebookEntry getEntry(Long id, Integer idType, String signature, Integer userID); + + String finishToolSession(Long toolSessionID, Long userID); /** * Get the LAMS audit service. Needed as the web layer controls the staff updating of an answer, so the log entry Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaService.java =================================================================== diff -u -r3bb7e0141ae1cc15ccd737c95d90b5762a34ad61 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaService.java (.../QaService.java) (revision 3bb7e0141ae1cc15ccd737c95d90b5762a34ad61) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/service/QaService.java (.../QaService.java) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -149,7 +149,7 @@ User leaderDto = (User) getUserManagementService().findById(User.class, leaderUserId.intValue()); String userName = leaderDto.getLogin(); String fullName = leaderDto.getFirstName() + " " + leaderDto.getLastName(); - leader = new QaQueUsr(leaderUserId, userName, fullName, qaSession, new TreeSet()); + leader = new QaQueUsr(leaderUserId, userName, fullName, qaSession, new TreeSet<>()); qaQueUsrDAO.createUsr(user); } @@ -177,21 +177,21 @@ if (response == null) { response = new QaUsrResp(leaderResponse.getAnswer(), leaderResponse.getAnswerAutosaved(), leaderResponse.getAttemptTime(), "", question, user, true); - createUserResponse(response); + qaUsrRespDAO.createUserResponse(response); // if it's been changed by the leader } else if (leaderResponse.getAttemptTime().compareTo(response.getAttemptTime()) != 0) { response.setAnswer(leaderResponse.getAnswer()); response.setAttemptTime(leaderResponse.getAttemptTime()); response.setTimezone(""); - updateUserResponse(response); + qaUsrRespDAO.updateUserResponse(response); } } } @Override public void setDefineLater(String strToolContentID, boolean value) { - QaContent qaContent = getQaContent(new Long(strToolContentID).longValue()); + QaContent qaContent = getQaContent(Long.parseLong(strToolContentID)); if (qaContent != null) { qaContent.setDefineLater(value); @@ -321,7 +321,7 @@ response = isAutosave ? new QaUsrResp(null, newAnswer, new Date(System.currentTimeMillis()), "", question, user, true) : new QaUsrResp(newAnswer, null, new Date(System.currentTimeMillis()), "", question, user, true); - createUserResponse(response); + qaUsrRespDAO.createUserResponse(response); // if answer has changed } else if (!newAnswer.equals(response.getAnswer())) { @@ -334,16 +334,11 @@ response.setAttemptTime(new Date(System.currentTimeMillis())); response.setTimezone(""); - updateUserResponse(response); + qaUsrRespDAO.updateUserResponse(response); } } @Override - public void createUserResponse(QaUsrResp qaUsrResp) { - qaUsrRespDAO.createUserResponse(qaUsrResp); - } - - @Override public void updateUser(QaQueUsr qaQueUsr) { qaQueUsrDAO.updateUsr(qaQueUsr); } @@ -746,7 +741,6 @@ @Override public void createToolSession(Long toolSessionId, String toolSessionName, Long toolContentID) throws ToolException { - if (toolSessionId == null) { logger.error("toolSessionId is null"); throw new ToolException("toolSessionId is missing"); @@ -761,7 +755,7 @@ if (qaSession == null) { try { qaSession = new QaSession(toolSessionId, new Date(System.currentTimeMillis()), QaSession.INCOMPLETE, - toolSessionName, qaContent, new TreeSet()); + toolSessionName, qaContent, new TreeSet<>()); qaSessionDAO.createSession(qaSession); } catch (Exception e) { logger.error("Error creating new toolsession in the db"); @@ -800,7 +794,6 @@ @Override public String leaveToolSession(Long toolSessionId, Long learnerId) throws DataMissingException, ToolException { - if (toolSessionId == null) { logger.error("toolSessionId is null"); throw new DataMissingException("toolSessionId is missing"); @@ -822,7 +815,6 @@ } catch (DataAccessException e) { throw new ToolException("Exception occured when user is leaving tool session: " + e); } - } @Override @@ -917,30 +909,45 @@ } QaContent content = session.getQaContent(); - // copy answers only in case leader aware feature is ON - if (content.isUseSelectLeaderToolOuput()) { - - QaQueUsr qaUser = getUserByIdAndSession(userId, toolSessionId); - // create user if he hasn't accessed this activity yet - if (qaUser == null) { - - String userName = user.getLogin(); - String fullName = user.getFirstName() + " " + user.getLastName(); - qaUser = new QaQueUsr(userId, userName, fullName, session, new TreeSet()); - qaQueUsrDAO.createUsr(qaUser); + QaQueUsr qaUser = getUserByIdAndSession(userId, toolSessionId); + // create user if he hasn't accessed this activity yet + if (qaUser == null) { + String userName = user.getLogin(); + String fullName = user.getFirstName() + " " + user.getLastName(); + qaUser = new QaQueUsr(userId, userName, fullName, session, new TreeSet<>()); + qaQueUsrDAO.createUsr(qaUser); + } + + //finalize the latest result, if it's still active + content.getQaQueContents().forEach(question -> { + + QaUsrResp response = getResponseByUserAndQuestion(userId, question.getUid()); + if (response != null && response.getAnswer() == null && response.getAnswerAutosaved() != null) { + response.setAnswer(response.getAnswerAutosaved()); + response.setAnswerAutosaved(null); + qaUsrRespDAO.updateUserResponse(response); } + }); - QaQueUsr groupLeader = session.getGroupLeader(); + //if this is a leader finishes, complete all non-leaders as well, also copy leader results to them + QaQueUsr groupLeader = checkLeaderSelectToolForSessionLeader(qaUser, toolSessionId); + if (isUserGroupLeader(qaUser, toolSessionId)) { + session.getQaQueUsers().forEach(sessionUser -> { + //finish users + sessionUser.setResponseFinalized(true); + sessionUser.setLearnerFinished(true); + updateUser(sessionUser); - // check if leader has submitted answers - if ((groupLeader != null) && groupLeader.isResponseFinalized()) { - - // we need to make sure specified user has the same scratches as a leader - copyAnswersFromLeader(qaUser, groupLeader); - } - + //copy answers from leader to non-leaders + copyAnswersFromLeader(sessionUser, groupLeader); + }); + + } else { + //finish user + qaUser.setResponseFinalized(true); + qaUser.setLearnerFinished(true); + updateUser(qaUser); } - } @Override @@ -1174,6 +1181,32 @@ return new ToolCompletionStatus(ToolCompletionStatus.ACTIVITY_ATTEMPTED, startDate, null); } } + + @Override + public String finishToolSession(Long toolSessionID, Long userID) { + QaQueUsr user = getUserByIdAndSession(userID, toolSessionID); + user.setLearnerFinished(true); + updateUser(user); + + //if this is a leader finishes, complete all non-leaders as well, also copy leader results to them + QaSession session = user.getQaSession(); + QaQueUsr groupLeader = checkLeaderSelectToolForSessionLeader(user, toolSessionID); + if (isUserGroupLeader(user, toolSessionID)) { + session.getQaQueUsers().forEach(sessionUser -> { + //finish users + sessionUser.setResponseFinalized(true); + sessionUser.setLearnerFinished(true); + updateUser(user); + + //copy answers from leader to non-leaders + copyAnswersFromLeader(sessionUser, groupLeader); + }); + } + + //return nextActivityUrl + return leaveToolSession(toolSessionID, userID); + } + // ****************** REST methods ************************* /** Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaLearningController.java =================================================================== diff -u -r3bb7e0141ae1cc15ccd737c95d90b5762a34ad61 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaLearningController.java (.../QaLearningController.java) (revision 3bb7e0141ae1cc15ccd737c95d90b5762a34ad61) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaLearningController.java (.../QaLearningController.java) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -74,12 +74,14 @@ 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.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.context.WebApplicationContext; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -401,10 +403,6 @@ /** * validates the learning mode parameters - * - * @param request - * @param mapping - * @return ActionForward */ protected void validateParameters(HttpServletRequest request, @ModelAttribute("qaLearningForm") QaLearningForm qaLearningForm) { @@ -452,14 +450,6 @@ /** * submits users responses - * - * @param mapping - * @param form - * @param request - * @param response - * @return - * @throws IOException - * @throws ServletException */ @RequestMapping("/submitAnswersContent") public String submitAnswersContent(@ModelAttribute("qaLearningForm") QaLearningForm qaLearningForm, @@ -588,17 +578,9 @@ /** * auto saves responses - * - * @param mapping - * @param form - * @param request - * @param response - * @return - * @throws IOException - * @throws ServletException */ @RequestMapping("/autoSaveAnswers") - @ResponseBody + @ResponseStatus(HttpStatus.OK) public void autoSaveAnswers(@ModelAttribute("qaLearningForm") QaLearningForm qaLearningForm, HttpServletRequest request) throws IOException, ServletException { String toolSessionID = request.getParameter(AttributeNames.PARAM_TOOL_SESSION_ID); @@ -636,14 +618,6 @@ /** * enables retaking the activity - * - * @param mapping - * @param form - * @param request - * @param response - * @return - * @throws IOException - * @throws ServletException */ @RequestMapping("/redoQuestions") public String redoQuestions(@ModelAttribute("qaLearningForm") QaLearningForm qaLearningForm, @@ -694,8 +668,6 @@ * answers screen, otherwise goes straight to the reflection screen (if any). * * @return Learner Report for a session - * @throws IOException - * @throws ServletException */ @RequestMapping("/storeAllResults") public String storeAllResults(@ModelAttribute("qaLearningForm") QaLearningForm qaLearningForm, @@ -885,12 +857,6 @@ /** * Get the answer from the form and copy into DTO. Set up the next question. If the current question is required and * the answer is blank, then just persist the error and don't change questions. - * - * @param form - * @param request - * @param generalLearnerFlowDTO - * @param getNextQuestion - * @return */ private Object[] storeSequentialAnswer(QaLearningForm qaLearningForm, HttpServletRequest request, GeneralLearnerFlowDTO generalLearnerFlowDTO, boolean getNextQuestion) { @@ -1056,7 +1022,6 @@ public String endLearning(@ModelAttribute("qaLearningForm") QaLearningForm qaLearningForm, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, ToolException { - LearningUtil.saveFormRequestData(request, qaLearningForm); String toolSessionID = request.getParameter(AttributeNames.PARAM_TOOL_SESSION_ID); @@ -1065,46 +1030,24 @@ String userID = request.getParameter("userID"); qaLearningForm.setUserID(userID); - QaSession qaSession = qaService.getSessionById(new Long(toolSessionID).longValue()); - - QaQueUsr qaQueUsr = qaService.getUserByIdAndSession(new Long(userID), qaSession.getQaSessionId()); - qaQueUsr.setLearnerFinished(true); - qaService.updateUser(qaQueUsr); - /* * The learner is done with the tool session. The tool needs to clean-up. */ HttpSession ss = SessionManager.getSession(); /* get back login user DTO */ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); - qaSession.setSession_end_date(new Date(System.currentTimeMillis())); - qaSession.setSession_status(QaAppConstants.COMPLETED); - qaService.updateSession(qaSession); - String httpSessionID = qaLearningForm.getHttpSessionID(); // request.getSession().removeAttribute(httpSessionID); qaLearningForm.setHttpSessionID(httpSessionID); - qaLearningForm.resetAll(); - String nextActivityUrl = qaService.leaveToolSession(new Long(toolSessionID), - new Long(user.getUserID().longValue())); + String nextActivityUrl = qaService.finishToolSession(Long.valueOf(toolSessionID), user.getUserID().longValue()); response.sendRedirect(nextActivityUrl); return null; } - /** - * - * @param qaLearningForm - * @param request - * @param response - * @return - * @throws IOException - * @throws ServletException - * @throws ToolException - */ @RequestMapping("/submitReflection") public String submitReflection(@ModelAttribute("qaLearningForm") QaLearningForm qaLearningForm, HttpServletRequest request, HttpServletResponse response) @@ -1146,15 +1089,6 @@ return endLearning(qaLearningForm, request, response); } - /** - * - * @param qaLearningForm - * @param request - * @return - * @throws IOException - * @throws ServletException - * @throws ToolException - */ @RequestMapping("/forwardtoReflection") public String forwardtoReflection(@ModelAttribute("qaLearningForm") QaLearningForm qaLearningForm, HttpServletRequest request) throws IOException, ServletException, ToolException { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -rcbf95a868252401757c61327b3d9a383119ff9b5 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision cbf95a868252401757c61327b3d9a383119ff9b5) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -32,7 +32,6 @@ import java.util.Date; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -99,7 +98,6 @@ import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.NumberUtil; -import org.lamsfoundation.lams.util.excel.ExcelCell; import org.lamsfoundation.lams.util.excel.ExcelRow; import org.lamsfoundation.lams.util.excel.ExcelSheet; @@ -382,7 +380,7 @@ List users = this.getUsersBySession(sessionId); for (ScratchieUser user : users) { - toolService.updateActivityMark(new Double(newMark), null, user.getUserId().intValue(), + toolService.updateActivityMark(newMark.doubleValue(), null, user.getUserId().intValue(), user.getSession().getSessionId(), false); // record mark change with audit service @@ -469,7 +467,7 @@ if (isPropagateToGradebook) { List users = this.getUsersBySession(sessionId); for (ScratchieUser user : users) { - toolService.updateActivityMark(new Double(mark), null, user.getUserId().intValue(), + toolService.updateActivityMark(Double.valueOf(mark), null, user.getUserId().intValue(), user.getSession().getSessionId(), false); } } @@ -605,7 +603,20 @@ ScratchieUser user = scratchieUserDao.getUserByUserIDAndSessionID(userId, toolSessionId); user.setSessionFinished(true); scratchieUserDao.saveObject(user); + + //if this is a leader finishes, complete all non-leaders as well + boolean isUserGroupLeader = user.getSession().isUserGroupLeader(user.getUid()); + if (isUserGroupLeader) { + getUsersBySession(toolSessionId).forEach(sessionUser -> { + //finish non-leader + sessionUser.setSessionFinished(true); + scratchieUserDao.saveObject(user); + // as long as there is no individual results in Scratchie tool (but rather one for entire group) there is no + // need to copyAnswersFromLeader() + }); + } + nextUrl = this.leaveToolSession(toolSessionId, userId); } catch (DataMissingException e) { throw new ScratchieApplicationException(e); @@ -877,7 +888,7 @@ // show total groupSummary if there is more than 1 group available if (sessionList.size() > 1) { GroupSummary groupSummaryTotal = new GroupSummary(); - groupSummaryTotal.setSessionId(new Long(0)); + groupSummaryTotal.setSessionId(0l); groupSummaryTotal.setSessionName("Summary"); groupSummaryTotal.setMark(0); @@ -1112,7 +1123,7 @@ } row.addCell(isFirstChoice, color); } - row.addCell(new Integer(numberOfFirstChoiceEvents)); + row.addCell(Integer.valueOf(numberOfFirstChoiceEvents)); double percentage = (numberOfItems == 0) ? 0 : (double) numberOfFirstChoiceEvents / numberOfItems; row.addPercentageCell(percentage); } @@ -1175,7 +1186,7 @@ } row.addCell(itemDto.getAnswersSequence(), color); } - row.addCell(new Integer(numberOfFirstChoiceEvents)); + row.addCell(Integer.valueOf(numberOfFirstChoiceEvents)); double percentage = (numberOfItems == 0) ? 0 : (double) numberOfFirstChoiceEvents / numberOfItems; row.addPercentageCell(percentage); @@ -1267,8 +1278,8 @@ color = IndexedColors.RED; } row.addCell(isFirstChoice, color); - row.addCell(new Long(attempts), color); - Long mark = (itemDto.getUserMark() == -1) ? null : new Long(itemDto.getUserMark()); + row.addCell(Integer.valueOf(attempts), color); + Long mark = (itemDto.getUserMark() == -1) ? null : Long.valueOf(itemDto.getUserMark()); row.addCell(mark); } } @@ -1292,8 +1303,8 @@ for (ScratchieUser user : summary.getUsers()) { row = researchAndAnalysisSheet.initRow(); row.addCell(user.getFirstName() + " " + user.getLastName()); - row.addCell(new Long(summary.getTotalAttempts())); - Long mark = (summary.getTotalAttempts() == 0) ? null : new Long(summary.getMark()); + row.addCell(Long.valueOf(summary.getTotalAttempts())); + Long mark = (summary.getTotalAttempts() == 0) ? null : Long.valueOf(summary.getMark()); row.addCell(mark); row.addCell(summary.getSessionName()); } @@ -1344,7 +1355,7 @@ row.addCell(answerTitle, color); for (int numberAttempts : answer.getAttempts()) { - row.addCell(new Long(numberAttempts)); + row.addCell(Integer.valueOf(numberAttempts)); } } researchAndAnalysisSheet.addEmptyRow(); @@ -1367,7 +1378,7 @@ row = researchAndAnalysisSheet.initRow(); row.addEmptyCell(); for (int i = 0; i < answers.size(); i++) { - row.addCell(new Long(i + 1)); + row.addCell(Integer.valueOf(i + 1)); } for (ScratchieAnswer answer : answers) { @@ -1379,7 +1390,7 @@ row.addCell(answerTitle); for (int numberAttempts : answer.getAttempts()) { - row.addCell(new Long(numberAttempts)); + row.addCell(Integer.valueOf(numberAttempts)); } } @@ -1408,7 +1419,7 @@ Long attempts = (long) scratchieAnswerVisitDao.getLogCountTotal(sessionId); row.addCell(attempts); row.addCell(getMessage("label.mark") + ":"); - row.addCell(new Long(session.getMark())); + row.addCell(Long.valueOf(session.getMark())); row = researchAndAnalysisSheet.initRow(); row.addCell(getMessage("label.team.leader") + session.getSessionName()); @@ -1423,7 +1434,7 @@ item.getUid()); for (ScratchieAnswerVisitLog log : logs) { row = researchAndAnalysisSheet.initRow(); - row.addCell(new Long(i++)); + row.addCell(Integer.valueOf(i++)); String answerDescr = removeHtmlMarkup(log.getScratchieAnswer().getDescription()); row.addCell(answerDescr); row.addCell(fullDateFormat.format(log.getAccessDate())); @@ -1484,7 +1495,7 @@ // group name row.addCell(summary.getSessionName()); // question number - row.addCell(new Long(questionCount++)); + row.addCell(Integer.valueOf(questionCount++)); // question title row.addCell(itemDto.getTitle()); @@ -1510,9 +1521,9 @@ } row.addCell(isFirstChoice); // attempts - row.addCell(new Long(attempts)); + row.addCell(Integer.valueOf(attempts)); // mark - Object mark = (itemDto.getUserMark() == -1) ? "" : new Long(itemDto.getUserMark()); + Object mark = (itemDto.getUserMark() == -1) ? "" : Long.valueOf(itemDto.getUserMark()); row.addCell(mark); // Answers selected @@ -2086,17 +2097,31 @@ return; } - // as long as leader aware feature is always ON - copy answers from leader to non-leader user - ScratchieUser scratchieUser = scratchieUserDao.getUserByUserIDAndSessionID(userId, toolSessionId); // create user if he hasn't accessed this activity yet if (scratchieUser == null) { scratchieUser = new ScratchieUser(user.getUserDTO(), session); createUser(scratchieUser); } + + checkLeaderSelectToolForSessionLeader(scratchieUser, toolSessionId); + //if this is a leader finishes, complete all non-leaders as well + boolean isUserGroupLeader = session.isUserGroupLeader(scratchieUser.getUid()); + if (isUserGroupLeader) { + getUsersBySession(toolSessionId).forEach(sessionUser -> { + //finish users + sessionUser.setSessionFinished(true); + scratchieUserDao.saveObject(user); - // as long as there is no individual results in Scratchie tool (but rather one for entire group) there is no - // need to copyAnswersFromLeader() + // as long as there is no individual results in Scratchie tool (but rather one for entire group) there is no + // need to copyAnswersFromLeader() + }); + + } else { + //finish user + scratchieUser.setSessionFinished(true); + scratchieUserDao.saveObject(scratchieUser); + } } /* =================================================================================== */ @@ -2182,7 +2207,6 @@ * "questionText", "displayOrder" (Integer) and a ArrayNode "answers". The answers entry should be ArrayNode * containing JSON objects, which in turn must contain "answerText", "displayOrder" (Integer), "correct" (Boolean). */ - @SuppressWarnings("unchecked") @Override public void createRestToolContent(Integer userID, Long toolContentID, ObjectNode toolContentJSON) { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java =================================================================== diff -u -rc05bc28426be01ab26818fef24699cea98d568c8 -r17de10bb40e34a174c19ccc0b8821bfe08025156 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java (.../LearningController.java) (revision c05bc28426be01ab26818fef24699cea98d568c8) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/LearningController.java (.../LearningController.java) (revision 17de10bb40e34a174c19ccc0b8821bfe08025156) @@ -68,10 +68,13 @@ import org.lamsfoundation.lams.web.util.SessionMap; import org.quartz.SchedulerException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; +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.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -82,7 +85,6 @@ @Controller @RequestMapping("/learning") public class LearningController { - private static Logger log = Logger.getLogger(LearningController.class); @Autowired @@ -92,32 +94,30 @@ * Read scratchie data from database and put them into HttpSession. */ @RequestMapping("/start") - private String start(HttpServletRequest request, HttpServletResponse response) + private String start(HttpServletRequest request, HttpServletResponse response, @RequestParam Long toolSessionID) throws ScratchieApplicationException { - ToolAccessMode mode = WebUtil.readToolAccessModeParam(request, AttributeNames.PARAM_MODE, true); - final Long toolSessionId = new Long(request.getParameter(ScratchieConstants.PARAM_TOOL_SESSION_ID)); - ScratchieSession toolSession = scratchieService.getScratchieSessionBySessionId(toolSessionId); + ScratchieSession toolSession = scratchieService.getScratchieSessionBySessionId(toolSessionID); // get back the scratchie and item list and display them on page - final Scratchie scratchie = scratchieService.getScratchieBySessionId(toolSessionId); + final Scratchie scratchie = scratchieService.getScratchieBySessionId(toolSessionID); boolean isReflectOnActivity = scratchie.isReflectOnActivity(); final ScratchieUser user; if ((mode != null) && mode.isTeacher()) { // monitoring mode - user is specified in URL // scratchieUser may be null if the user was force completed. - user = getSpecifiedUser(toolSessionId, WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, false)); + user = getSpecifiedUser(toolSessionID, WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, false)); } else { - user = getCurrentUser(toolSessionId); + user = getCurrentUser(toolSessionID); } - ScratchieUser groupLeader = scratchieService.checkLeaderSelectToolForSessionLeader(user, toolSessionId); + ScratchieUser groupLeader = scratchieService.checkLeaderSelectToolForSessionLeader(user, toolSessionID); // forwards to the leaderSelection page if (groupLeader == null) { // get group users and store it to request as DTO objects - List groupUsers = scratchieService.getUsersBySession(toolSessionId); + List groupUsers = scratchieService.getUsersBySession(toolSessionID); List groupUserDtos = new ArrayList<>(); for (ScratchieUser groupUser : groupUsers) { User groupUserDto = new User(); @@ -126,7 +126,7 @@ groupUserDtos.add(groupUserDto); } request.setAttribute(ScratchieConstants.ATTR_GROUP_USERS, groupUserDtos); - request.setAttribute(ScratchieConstants.PARAM_TOOL_SESSION_ID, toolSessionId); + request.setAttribute(ScratchieConstants.PARAM_TOOL_SESSION_ID, toolSessionID); request.setAttribute(ScratchieConstants.ATTR_SCRATCHIE, scratchie); request.setAttribute(AttributeNames.ATTR_MODE, mode); return "pages/learning/waitforleader"; @@ -140,7 +140,7 @@ // get notebook entry NotebookEntry notebookEntry = null; if (isReflectOnActivity && (groupLeader != null)) { - notebookEntry = scratchieService.getEntry(toolSessionId, CoreNotebookConstants.NOTEBOOK_TOOL, + notebookEntry = scratchieService.getEntry(toolSessionID, CoreNotebookConstants.NOTEBOOK_TOOL, ScratchieConstants.TOOL_SIGNATURE, groupLeader.getUserId().intValue()); } String entryText = (notebookEntry == null) ? null : notebookEntry.getEntry(); @@ -157,7 +157,7 @@ sessionMap.put(ScratchieConstants.ATTR_IS_USER_LEADER, isUserLeader); boolean isUserFinished = (user != null) && user.isSessionFinished(); sessionMap.put(ScratchieConstants.ATTR_USER_FINISHED, isUserFinished); - sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, toolSessionId); + sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, toolSessionID); sessionMap.put(AttributeNames.ATTR_MODE, mode); sessionMap.put(ScratchieConstants.ATTR_IS_BURNING_QUESTIONS_ENABLED, scratchie.isBurningQuestionsEnabled()); // reflection information @@ -180,7 +180,7 @@ return "pages/learning/definelater"; } - sessionMap.put(AttributeNames.ATTR_IS_LAST_ACTIVITY, scratchieService.isLastActivity(toolSessionId)); + sessionMap.put(AttributeNames.ATTR_IS_LAST_ACTIVITY, scratchieService.isLastActivity(toolSessionID)); // check if there is submission deadline Date submissionDeadline = scratchie.getSubmissionDeadline(); @@ -200,7 +200,7 @@ } } - storeItemsToSessionMap(toolSessionId, scratchie, sessionMap, mode.isTeacher()); + storeItemsToSessionMap(toolSessionID, scratchie, sessionMap, mode.isTeacher()); sessionMap.put(ScratchieConstants.ATTR_SCRATCHIE, scratchie); // calculate max score @@ -348,7 +348,8 @@ * Record in DB that leader has scratched specified answer. And return whether scratchie answer is correct or not. */ @RequestMapping("/recordItemScratched") - private String recordItemScratched(HttpServletRequest request, HttpServletResponse response) + @ResponseStatus(HttpStatus.OK) + private void recordItemScratched(HttpServletRequest request, HttpServletResponse response) throws IOException, ScratchieApplicationException { String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession() @@ -361,19 +362,19 @@ ScratchieUser leader = getCurrentUser(toolSessionId); // only leader is allowed to scratch answers if (!toolSession.isUserGroupLeader(leader.getUid())) { - return null; + return; } // check answer is belong to current session Set answerUids = (Set) sessionMap.get(ScratchieConstants.ATTR_ANSWER_UIDS); if (!answerUids.contains(answerUid)) { - return null; + return; } // Return whether scratchie answer is correct or not ScratchieAnswer answer = scratchieService.getScratchieAnswerByUid(answerUid); if (answer == null) { - return null; + return; } ObjectNode ObjectNode = JsonNodeFactory.instance.objectNode(); @@ -390,15 +391,14 @@ } }, "LAMS_recordItemScratched_thread"); recordItemScratchedThread.start(); - - return null; } /** * Stores date when user has started activity with time limit. */ @RequestMapping("/launchTimeLimit") - private String launchTimeLimit(HttpServletRequest request) + @ResponseStatus(HttpStatus.OK) + private void launchTimeLimit(HttpServletRequest request) throws ScratchieApplicationException, SchedulerException { String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession() @@ -409,12 +409,10 @@ ScratchieUser leader = getCurrentUser(toolSessionId); // only leader is allowed to launch time limit if (!toolSession.isUserGroupLeader(leader.getUid())) { - return null; + return; } scratchieService.launchTimeLimit(toolSessionId); - - return null; } /** @@ -495,23 +493,23 @@ * Saves newly entered burning question. Used by jqGrid cellediting feature. */ @RequestMapping("/editBurningQuestion") - private String editBurningQuestion(HttpServletRequest request) { - - if (!StringUtils.isEmpty(request.getParameter(ScratchieConstants.ATTR_ITEM_UID)) - && !StringUtils.isEmpty(request.getParameter(ScratchieConstants.PARAM_SESSION_ID))) { - - Long itemUid = WebUtil.readLongParam(request, ScratchieConstants.ATTR_ITEM_UID) == 0 ? null - : WebUtil.readLongParam(request, ScratchieConstants.ATTR_ITEM_UID); - Long sessionId = WebUtil.readLongParam(request, ScratchieConstants.PARAM_SESSION_ID); - String question = request.getParameter(ScratchieConstants.ATTR_BURNING_QUESTION_PREFIX); - scratchieService.saveBurningQuestion(sessionId, itemUid, question); + @ResponseStatus(HttpStatus.OK) + private void editBurningQuestion(HttpServletRequest request) { + if (StringUtils.isEmpty(request.getParameter(ScratchieConstants.ATTR_ITEM_UID)) + || StringUtils.isEmpty(request.getParameter(ScratchieConstants.PARAM_SESSION_ID))) { + return; } - return null; + Long itemUid = WebUtil.readLongParam(request, ScratchieConstants.ATTR_ITEM_UID) == 0 ? null + : WebUtil.readLongParam(request, ScratchieConstants.ATTR_ITEM_UID); + Long sessionId = WebUtil.readLongParam(request, ScratchieConstants.PARAM_SESSION_ID); + String question = request.getParameter(ScratchieConstants.ATTR_BURNING_QUESTION_PREFIX); + scratchieService.saveBurningQuestion(sessionId, itemUid, question); } @RequestMapping("/like") - private String like(HttpServletRequest request, HttpServletResponse response) + @ResponseStatus(HttpStatus.OK) + private void like(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, ScratchieApplicationException { String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); @@ -525,7 +523,7 @@ ScratchieUser leader = this.getCurrentUser(sessionId); // only leader is allowed to scratch answers if (!toolSession.isUserGroupLeader(leader.getUid())) { - return null; + return; } boolean added = scratchieService.addLike(burningQuestionUid, sessionId); @@ -534,11 +532,11 @@ ObjectNode.put("added", added); response.setContentType("application/json;charset=utf-8"); response.getWriter().print(ObjectNode); - return null; } @RequestMapping("/removeLike") - private String removeLike(HttpServletRequest request, HttpServletResponse response) + @ResponseStatus(HttpStatus.OK) + private void removeLike(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, ScratchieApplicationException { String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); @@ -552,7 +550,7 @@ ScratchieUser leader = this.getCurrentUser(sessionId); // only leader is allowed to scratch answers if (!toolSession.isUserGroupLeader(leader.getUid())) { - return null; + return; } scratchieService.removeLike(burningQuestionUid, sessionId); @@ -561,7 +559,6 @@ ObjectNode.put("added", true); response.setContentType("application/json;charset=utf-8"); response.getWriter().print(ObjectNode); - return null; } /** @@ -594,7 +591,7 @@ * Autosaves burning questions. Only leaders can perform it. */ @RequestMapping("/autosaveBurningQuestions") - @ResponseBody + @ResponseStatus(HttpStatus.OK) private void autosaveBurningQuestions(HttpServletRequest request) throws ScratchieApplicationException { String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession() @@ -613,7 +610,6 @@ /** * Saves burning questions entered by user. It also updates its values in SessionMap. */ - private void saveBurningQuestions(HttpServletRequest request) { String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID);