Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/AssessmentResultDTO.java =================================================================== diff -u --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/AssessmentResultDTO.java (revision 0) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/AssessmentResultDTO.java (revision 06bf1c491a054104ea4e5cc55fc867af5519c200) @@ -0,0 +1,44 @@ +package org.lamsfoundation.lams.tool.assessment.dto; + +import java.util.Set; + +import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; + +/** + * DTO for AssessmentResult.java. + * + * @author Andrey Balan + */ +public class AssessmentResultDTO { + + private Long sessionId; + private Set questionResults; + + /** + * + * @return + */ + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } + + /** + * @return a set of answerOptions to this AssessmentQuestion. + */ + public Set getQuestionResults() { + return questionResults; + } + + /** + * @param answerOptions + * answerOptions to set. + */ + public void setQuestionResults(Set questionResults) { + this.questionResults = questionResults; + } + +} Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java =================================================================== diff -u -rc97b41d72e071f6293126bd85f6eba0b756f7836 -r06bf1c491a054104ea4e5cc55fc867af5519c200 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java (.../Assessment.java) (revision c97b41d72e071f6293126bd85f6eba0b756f7836) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java (.../Assessment.java) (revision 06bf1c491a054104ea4e5cc55fc867af5519c200) @@ -242,6 +242,17 @@ public boolean isContentModifiedInMonitor(Date attemptStartingDate) { return (updated != null) && updated.after(attemptStartingDate); } + + /** + * @return true if there is at least one random question reference, false otherwise + */ + public boolean hasRandomQuestion() { + boolean hasRandomQuestion = false; + for (QuestionReference reference : (Set) questionReferences) { + hasRandomQuestion |= reference.isRandomQuestion(); + } + return hasRandomQuestion; + } // ********************************************************** // get/set methods Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 -r06bf1c491a054104ea4e5cc55fc867af5519c200 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 06bf1c491a054104ea4e5cc55fc867af5519c200) @@ -75,6 +75,7 @@ import org.lamsfoundation.lams.tool.assessment.dao.AssessmentResultDAO; import org.lamsfoundation.lams.tool.assessment.dao.AssessmentSessionDAO; import org.lamsfoundation.lams.tool.assessment.dao.AssessmentUserDAO; +import org.lamsfoundation.lams.tool.assessment.dto.AssessmentResultDTO; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO; import org.lamsfoundation.lams.tool.assessment.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.assessment.dto.OptionDTO; @@ -1009,24 +1010,47 @@ } @Override - public AssessmentResult getUserMasterDetail(Long sessionId, Long userId) { + public AssessmentResultDTO getUserMasterDetail(Long sessionId, Long userId) { + AssessmentResultDTO resultDto = new AssessmentResultDTO(); + resultDto.setSessionId(sessionId); + AssessmentResult lastFinishedResult = assessmentResultDao.getLastFinishedAssessmentResultByUser(sessionId, userId); if (lastFinishedResult != null) { - //sorting - SortedSet questionResults = new TreeSet( + Assessment assessment = lastFinishedResult.getAssessment(); + Set questionReferences = lastFinishedResult.getAssessment().getQuestionReferences(); + Set questionResults = lastFinishedResult.getQuestionResults(); + + //prepare list of the questions to display in user master detail table, filtering out questions that aren't supposed to be answered + SortedSet questionResultsToDisplay = new TreeSet( new AssessmentQuestionResultComparator()); - questionResults.addAll(lastFinishedResult.getQuestionResults()); - lastFinishedResult.setQuestionResults(questionResults); + //in case there is at least one random question - we need to show all questions + if (assessment.hasRandomQuestion()) { + questionResultsToDisplay.addAll(questionResults); + + //otherwise show only questions from the question list + } else { + for (QuestionReference reference : questionReferences) { + for (AssessmentQuestionResult questionResult : questionResults) { + if (reference.getQuestion().getUid().equals(questionResult.getAssessmentQuestion().getUid())) { + questionResultsToDisplay.add(questionResult); + } + } + } + } + resultDto.setQuestionResults(questionResultsToDisplay); + //escaping - AssessmentEscapeUtils.escapeQuotes(lastFinishedResult); + AssessmentEscapeUtils.escapeQuotes(resultDto); } - return lastFinishedResult; + return resultDto; } @Override public UserSummary getUserSummary(Long contentId, Long userId, Long sessionId) { + Assessment assessment = assessmentDao.getByContentId(contentId); + UserSummary userSummary = new UserSummary(); AssessmentUser user = assessmentUserDao.getUserByUserIDAndSessionID(userId, sessionId); userSummary.setUser(user); @@ -1041,39 +1065,49 @@ if (lastFinishedResult != null) { userSummary.setLastAttemptGrade(lastFinishedResult.getGrade()); } + + if (!results.isEmpty()) { - Assessment assessment = assessmentDao.getByContentId(contentId); - ArrayList userSummaryItems = new ArrayList(); - Set questions = assessment.getQuestions(); - for (AssessmentQuestion question : questions) { - UserSummaryItem userSummaryItem = new UserSummaryItem(question); - List questionResultsForSummary = new ArrayList(); + //prepare list of the questions to display, filtering out questions that aren't supposed to be answered + Set questions = new TreeSet(); + //in case there is at least one random question - we need to show all questions in a drop down select + if (assessment.hasRandomQuestion()) { + questions.addAll(assessment.getQuestions()); - for (AssessmentResult result : results) { - for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { - if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { + //otherwise show only questions from the question list + } else { + for (QuestionReference reference : (Set) assessment.getQuestionReferences()) { + questions.add(reference.getQuestion()); + } + } - // for displaying purposes, no saving occurrs - questionResult.setFinishDate(result.getFinishDate()); + //prepare list of UserSummaryItems + ArrayList userSummaryItems = new ArrayList(); + for (AssessmentQuestion question : questions) { + UserSummaryItem userSummaryItem = new UserSummaryItem(question); - questionResultsForSummary.add(questionResult); - break; + //find all questionResults that correspond to the current question + List questionResults = new ArrayList(); + for (AssessmentResult result : results) { + for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { + if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { + + // for displaying purposes only (no saving occurrs) + questionResult.setFinishDate(result.getFinishDate()); + + questionResults.add(questionResult); + break; + } } } - } - // skip questions without answers - if (questionResultsForSummary.isEmpty()) { - continue; - } else { - userSummaryItem.setQuestionResults(questionResultsForSummary); + userSummaryItem.setQuestionResults(questionResults); userSummaryItems.add(userSummaryItem); } + userSummary.setUserSummaryItems(userSummaryItems); + AssessmentEscapeUtils.escapeQuotes(userSummary); } - userSummary.setUserSummaryItems(userSummaryItems); - AssessmentEscapeUtils.escapeQuotes(userSummary); - return userSummary; } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 -r06bf1c491a054104ea4e5cc55fc867af5519c200 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 06bf1c491a054104ea4e5cc55fc867af5519c200) @@ -31,6 +31,7 @@ import java.util.TreeMap; import org.lamsfoundation.lams.notebook.model.NotebookEntry; +import org.lamsfoundation.lams.tool.assessment.dto.AssessmentResultDTO; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO; import org.lamsfoundation.lams.tool.assessment.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.assessment.dto.QuestionDTO; @@ -360,7 +361,11 @@ */ List getSessionDtos(Long contentId, boolean includeStatistics); - AssessmentResult getUserMasterDetail(Long sessionId, Long userId); + /** + * Prepares question results to be displayed in "Learner Summary" table. Shows all of them in case there is at least + * one random question present, and just questions from the question list if no random questions. + */ + AssessmentResultDTO getUserMasterDetail(Long sessionId, Long userId); /** * Return user summary. This summary contains list of all attempts made by user. Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java =================================================================== diff -u -rc97b41d72e071f6293126bd85f6eba0b756f7836 -r06bf1c491a054104ea4e5cc55fc867af5519c200 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java (.../AssessmentEscapeUtils.java) (revision c97b41d72e071f6293126bd85f6eba0b756f7836) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java (.../AssessmentEscapeUtils.java) (revision 06bf1c491a054104ea4e5cc55fc867af5519c200) @@ -28,6 +28,7 @@ import org.apache.commons.lang.StringEscapeUtils; import org.lamsfoundation.lams.tool.assessment.AssessmentConstants; +import org.lamsfoundation.lams.tool.assessment.dto.AssessmentResultDTO; import org.lamsfoundation.lams.tool.assessment.dto.QuestionSummary; import org.lamsfoundation.lams.tool.assessment.dto.SessionDTO; import org.lamsfoundation.lams.tool.assessment.dto.UserSummary; @@ -68,8 +69,8 @@ * Escapes all characters that may brake JS code on assigning Java value to JS String variable (particularly escapes * all quotes in the following way \"). */ - public static void escapeQuotes(AssessmentResult assessmentResult) { - for (AssessmentQuestionResult questionResult : assessmentResult.getQuestionResults()) { + public static void escapeQuotes(AssessmentResultDTO assessmentResultDto) { + for (AssessmentQuestionResult questionResult : assessmentResultDto.getQuestionResults()) { AssessmentEscapeUtils.escapeQuotesInQuestionResult(questionResult); } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java =================================================================== diff -u -r7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344 -r06bf1c491a054104ea4e5cc55fc867af5519c200 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 7cacaf3ab86dd7b0e794e7b4c710fb73ecb61344) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 06bf1c491a054104ea4e5cc55fc867af5519c200) @@ -52,6 +52,7 @@ import org.apache.tomcat.util.json.JSONObject; import org.lamsfoundation.lams.gradebook.util.GradebookConstants; import org.lamsfoundation.lams.tool.assessment.AssessmentConstants; +import org.lamsfoundation.lams.tool.assessment.dto.AssessmentResultDTO; import org.lamsfoundation.lams.tool.assessment.dto.AssessmentUserDTO; import org.lamsfoundation.lams.tool.assessment.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.assessment.dto.QuestionSummary; @@ -163,14 +164,10 @@ sessionMap.put(AssessmentConstants.ATTR_REFLECT_LIST, reflectList); } - //create list of questions to display in question drop down menu + //prepare list of the questions to display in question drop down menu, filtering out questions that aren't supposed to be answered Set questionList = new TreeSet(); - boolean hasRandomQuestion = false; - for (QuestionReference reference : (Set) assessment.getQuestionReferences()) { - hasRandomQuestion |= reference.isRandomQuestion(); - } //in case there is at least one random question - we need to show all questions in a drop down select - if (hasRandomQuestion) { + if (assessment.hasRandomQuestion()) { questionList.addAll(assessment.getQuestions()); //show only questions from question list otherwise @@ -207,7 +204,7 @@ initAssessmentService(); Long userId = WebUtil.readLongParam(request, AttributeNames.PARAM_USER_ID); Long sessionId = WebUtil.readLongParam(request, AssessmentConstants.PARAM_SESSION_ID); - AssessmentResult result = service.getUserMasterDetail(sessionId, userId); + AssessmentResultDTO result = service.getUserMasterDetail(sessionId, userId); request.setAttribute(AssessmentConstants.ATTR_ASSESSMENT_RESULT, result); return (result == null) ? null : mapping.findForward(AssessmentConstants.SUCCESS);