Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java =================================================================== diff -u -rf494ac5c2f49f92be600b6392d9c85c291df7bb7 -r347569bcf8c86a502e240c5e906a14b1b37fd1f6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision f494ac5c2f49f92be600b6392d9c85c291df7bb7) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/AssessmentResultDAO.java (.../AssessmentResultDAO.java) (revision 347569bcf8c86a502e240c5e906a14b1b37fd1f6) @@ -50,6 +50,14 @@ Integer getLastFinishedAssessmentResultTimeTaken(Long assessmentUid, Long userId); AssessmentResult getLastFinishedAssessmentResultByUser(Long sessionId, Long userId); + + /** + * Returns all last finished results for the specified assessment. + * + * @param contentId + * @return + */ + List getLastFinishedAssessmentResults(Long contentId); int getAssessmentResultCount(Long assessmentUid, Long userId); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== diff -u -rf494ac5c2f49f92be600b6392d9c85c291df7bb7 -r347569bcf8c86a502e240c5e906a14b1b37fd1f6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision f494ac5c2f49f92be600b6392d9c85c291df7bb7) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java (.../AssessmentResultDAOHibernate.java) (revision 347569bcf8c86a502e240c5e906a14b1b37fd1f6) @@ -53,6 +53,10 @@ private static final String FIND_LAST_FINISHED_BY_SESSION_AND_USER = "FROM " + AssessmentResult.class.getName() + " AS r WHERE r.user.userId = ? AND r.sessionId=? AND (r.finishDate != null) AND r.latest=1"; + + private static final String FIND_LAST_FINISHED_RESULTS_BY_CONTENT_ID = "FROM " + + AssessmentResult.class.getName() + + " AS r WHERE r.assessment.contentId=? AND (r.finishDate != null) AND r.latest=1"; private static final String FIND_ASSESSMENT_RESULT_COUNT_BY_ASSESSMENT_AND_USER = "select COUNT(*) FROM " + AssessmentResult.class.getName() @@ -172,6 +176,12 @@ q.setParameter(1, sessionId); return (AssessmentResult) q.uniqueResult(); } + + @Override + public List getLastFinishedAssessmentResults(Long contentId) { + return (List) doFind(AssessmentResultDAOHibernate.FIND_LAST_FINISHED_RESULTS_BY_CONTENT_ID, + new Object[] { contentId }); + } @Override public int getAssessmentResultCount(Long assessmentUid, Long userId) { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -rf494ac5c2f49f92be600b6392d9c85c291df7bb7 -r347569bcf8c86a502e240c5e906a14b1b37fd1f6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision f494ac5c2f49f92be600b6392d9c85c291df7bb7) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 347569bcf8c86a502e240c5e906a14b1b37fd1f6) @@ -29,6 +29,7 @@ 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; @@ -104,6 +105,7 @@ import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.ExcelCell; import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.audit.IAuditService; @@ -383,24 +385,6 @@ } @Override - public List getAssessmentQuestionsBySessionId(Long sessionId) { - AssessmentSession session = assessmentSessionDao.getSessionBySessionId(sessionId); - if (session == null) { - AssessmentServiceImpl.log.error("Failed get AssessmentSession by ID [" + sessionId + "]"); - return null; - } - // add assessment questions from Authoring - Assessment assessment = session.getAssessment(); - List questions = new ArrayList(); - questions.addAll(assessment.getQuestions()); - - // add assessment questions from AssessmentSession - questions.addAll(session.getAssessmentQuestions()); - - return questions; - } - - @Override public Assessment getAssessmentBySessionId(Long sessionId) { AssessmentSession session = assessmentSessionDao.getSessionBySessionId(sessionId); // to skip CGLib problem @@ -415,11 +399,6 @@ } @Override - public void saveOrUpdateAssessmentSession(AssessmentSession resSession) { - assessmentSessionDao.saveObject(resSession); - } - - @Override public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId) { AssessmentResult lastResult = getLastAssessmentResult(assessment.getUid(), assessmentUser.getUserId()); if (lastResult != null) { @@ -527,41 +506,41 @@ */ private float storeUserAnswer(AssessmentResult assessmentResult, AssessmentQuestion question, boolean isAutosave) { - AssessmentQuestionResult questionAnswer = null; + AssessmentQuestionResult questionResult = null; // get questionResult from DB instance of AssessmentResult for (AssessmentQuestionResult dbQuestionAnswer : assessmentResult.getQuestionResults()) { if (question.getUid().equals(dbQuestionAnswer.getAssessmentQuestion().getUid())) { - questionAnswer = dbQuestionAnswer; + questionResult = dbQuestionAnswer; } } // create new questionAnswer if it's nonexistent - if (questionAnswer == null) { - questionAnswer = new AssessmentQuestionResult(); - questionAnswer.setAssessmentQuestion(question); - questionAnswer.setAssessmentResult(assessmentResult); + if (questionResult == null) { + questionResult = new AssessmentQuestionResult(); + questionResult.setAssessmentQuestion(question); + questionResult.setAssessmentResult(assessmentResult); - Set optionAnswers = questionAnswer.getOptionAnswers(); + Set optionAnswers = questionResult.getOptionAnswers(); for (AssessmentQuestionOption option : question.getOptions()) { AssessmentOptionAnswer optionAnswer = new AssessmentOptionAnswer(); optionAnswer.setOptionUid(option.getUid()); optionAnswers.add(optionAnswer); } - assessmentQuestionResultDao.saveObject(questionAnswer); + assessmentQuestionResultDao.saveObject(questionResult); } // store question answer values - questionAnswer.setAnswerBoolean(question.getAnswerBoolean()); - questionAnswer.setAnswerFloat(question.getAnswerFloat()); - questionAnswer.setAnswerString(question.getAnswerString()); + questionResult.setAnswerBoolean(question.getAnswerBoolean()); + questionResult.setAnswerFloat(question.getAnswerFloat()); + questionResult.setAnswerString(question.getAnswerString()); int j = 0; for (AssessmentQuestionOption option : question.getOptions()) { // get optionAnswer from questionAnswer AssessmentOptionAnswer optionAnswer = null; - for (AssessmentOptionAnswer dbOptionAnswer : questionAnswer.getOptionAnswers()) { + for (AssessmentOptionAnswer dbOptionAnswer : questionResult.getOptionAnswers()) { if (option.getUid().equals(dbOptionAnswer.getOptionUid())) { optionAnswer = dbOptionAnswer; } @@ -622,7 +601,7 @@ if (isAnswerCorrect) { mark = option.getGrade() * maxMark; - questionAnswer.setSubmittedOptionUid(option.getUid()); + questionResult.setSubmittedOptionUid(option.getUid()); break; } } @@ -663,7 +642,7 @@ } if (isAnswerCorrect) { mark = option.getGrade() * maxMark; - questionAnswer.setSubmittedOptionUid(option.getUid()); + questionResult.setSubmittedOptionUid(option.getUid()); break; } } @@ -700,7 +679,7 @@ // we start calculating and storing marks only in case it's not an autosave request if (!isAutosave) { - questionAnswer.setFinishDate(new Date()); + questionResult.setFinishDate(new Date()); if (mark > maxMark) { mark = maxMark; @@ -724,16 +703,16 @@ if (penalty > maxMark) { penalty = maxMark; } - questionAnswer.setPenalty(penalty); + questionResult.setPenalty(penalty); // don't let penalty make mark less than 0 if (mark < 0) { mark = 0; } } - questionAnswer.setMark(mark); - questionAnswer.setMaxMark(maxMark); + questionResult.setMark(mark); + questionResult.setMaxMark(maxMark); // for displaying purposes in case of submitSingleMarkHedgingQuestion() Ajax call question.setMark(mark); } @@ -870,11 +849,6 @@ } @Override - public AssessmentQuestion getAssessmentQuestionByUid(Long questionUid) { - return assessmentQuestionDao.getByUid(questionUid); - } - - @Override public List getSessionDtos(Long contentId) { List sessionDtos = new ArrayList(); @@ -893,7 +867,9 @@ return sessionDtos; } + // remove method once we remove export portfolio @Override + @Deprecated public List getSessionDataForExport(Long contentId) { List sessionDtos = new ArrayList(); @@ -1015,18 +991,26 @@ } @Override - public QuestionSummary getQuestionDataForExport(Long contentId, Long questionUid) { - QuestionSummary questionSummary = new QuestionSummary(); - AssessmentQuestion question = assessmentQuestionDao.getByUid(questionUid); - questionSummary.setQuestion(question); + public Map getQuestionSummaryForExport(Assessment assessment) { + Map questionSummaries = new HashMap(); - List> questionResults = new ArrayList>(); - SortedSet sessionList = new TreeSet(new AssessmentSessionComparator()); - sessionList.addAll(assessmentSessionDao.getByContentId(contentId)); + if (assessment.getQuestions() == null) { + return questionSummaries; + } - for (AssessmentSession session : sessionList) { + SortedSet sessions = new TreeSet(new AssessmentSessionComparator()); + sessions.addAll(assessmentSessionDao.getByContentId(assessment.getContentId())); - Assessment assessment = session.getAssessment(); + List assessmentResults = assessmentResultDao + .getLastFinishedAssessmentResults(assessment.getContentId()); + Map userUidToResultMap = new HashMap(); + for (AssessmentResult assessmentResult : assessmentResults) { + userUidToResultMap.put(assessmentResult.getUser().getUid(), assessmentResult); + } + + Map> sessionIdToUsersMap = new HashMap>(); + for (AssessmentSession session : sessions) { + Long sessionId = session.getSessionId(); List users = new ArrayList(); @@ -1040,50 +1024,501 @@ users = assessmentUserDao.getBySessionID(sessionId); } - ArrayList sessionQuestionResults = new ArrayList(); - for (AssessmentUser user : users) { - AssessmentResult assessmentResult = assessmentResultDao - .getLastFinishedAssessmentResultByUser(sessionId, user.getUserId()); - AssessmentQuestionResult questionResult = null; - if (assessmentResult == null) { - questionResult = new AssessmentQuestionResult(); - questionResult.setAssessmentQuestion(question); - } else { - for (AssessmentQuestionResult dbQuestionResult : assessmentResult.getQuestionResults()) { - if (dbQuestionResult.getAssessmentQuestion().getUid().equals(questionUid)) { - questionResult = dbQuestionResult; - break; + sessionIdToUsersMap.put(sessionId, users); + } + + for (AssessmentQuestion question : (Set) assessment.getQuestions()) { + Long questionUid = question.getUid(); + QuestionSummary questionSummary = new QuestionSummary(); + questionSummary.setQuestion(question); + + List> questionResults = new ArrayList>(); + + for (AssessmentSession session : sessions) { + + Long sessionId = session.getSessionId(); + List users = sessionIdToUsersMap.get(sessionId); + + ArrayList sessionQuestionResults = new ArrayList(); + for (AssessmentUser user : users) { + AssessmentResult assessmentResult = userUidToResultMap.get(user.getUid()); + AssessmentQuestionResult questionResult = null; + if (assessmentResult == null) { + questionResult = new AssessmentQuestionResult(); + questionResult.setAssessmentQuestion(question); + } else { + for (AssessmentQuestionResult dbQuestionResult : assessmentResult.getQuestionResults()) { + if (dbQuestionResult.getAssessmentQuestion().getUid().equals(questionUid)) { + questionResult = dbQuestionResult; + break; + } } + if (questionResult == null) { + continue; + } } - if (questionResult == null) { - continue; + questionResult.setUser(user); + sessionQuestionResults.add(questionResult); + } + questionResults.add(sessionQuestionResults); + } + questionSummary.setQuestionResultsPerSession(questionResults); + + int count = 0; + float total = 0; + for (List sessionQuestionResults : questionResults) { + for (AssessmentQuestionResult questionResult : sessionQuestionResults) { + if (questionResult.getUid() != null) { + count++; + total += questionResult.getMark(); } } - questionResult.setUser(user); - sessionQuestionResults.add(questionResult); } - questionResults.add(sessionQuestionResults); + float averageMark = (count == 0) ? 0 : total / count; + questionSummary.setAverageMark(averageMark); + + AssessmentEscapeUtils.escapeQuotes(questionSummary); + + questionSummaries.put(questionUid, questionSummary); } - questionSummary.setQuestionResultsPerSession(questionResults); - int count = 0; - float total = 0; - for (List sessionQuestionResults : questionResults) { - for (AssessmentQuestionResult questionResult : sessionQuestionResults) { - if (questionResult.getUid() != null) { - count++; - total += questionResult.getMark(); + return questionSummaries; + } + + @Override + public LinkedHashMap exportSummary(Assessment assessment, List sessionDtos, + boolean showUserNames) { + LinkedHashMap dataToExport = new LinkedHashMap(); + final ExcelCell[] EMPTY_ROW = new ExcelCell[0]; + + // -------------- First tab: Summary ---------------------------------------------------- + if (showUserNames) { + ArrayList summaryTab = new ArrayList(); + + if (sessionDtos != null) { + for (SessionDTO sessionDTO : sessionDtos) { + Long sessionId = sessionDTO.getSessionId(); + + summaryTab.add(EMPTY_ROW); + + ExcelCell[] sessionTitle = new ExcelCell[1]; + sessionTitle[0] = new ExcelCell(sessionDTO.getSessionName(), true); + summaryTab.add(sessionTitle); + + ExcelCell[] summaryRowTitle = new ExcelCell[3]; + summaryRowTitle[0] = new ExcelCell(getMessage("label.export.user.id"), true); + summaryRowTitle[1] = new ExcelCell(getMessage("label.monitoring.summary.user.name"), true); + summaryRowTitle[2] = new ExcelCell(getMessage("label.monitoring.summary.total"), true); + summaryTab.add(summaryRowTitle); + + List userDtos = new ArrayList(); + // in case of UseSelectLeaderToolOuput - display only one user + if (assessment.isUseSelectLeaderToolOuput()) { + + AssessmentSession session = getAssessmentSessionBySessionId(sessionId); + AssessmentUser groupLeader = session.getGroupLeader(); + + if (groupLeader != null) { + + float assessmentResult = getLastTotalScoreByUser(assessment.getUid(), + groupLeader.getUserId()); + + AssessmentUserDTO userDto = new AssessmentUserDTO(); + userDto.setFirstName(groupLeader.getFirstName()); + userDto.setLastName(groupLeader.getLastName()); + userDto.setGrade(assessmentResult); + userDtos.add(userDto); + } + + } else { + int countSessionUsers = sessionDTO.getNumberLearners(); + + // Get the user list from the db + userDtos = getPagedUsersBySession(sessionId, 0, countSessionUsers, "userName", "ASC", ""); + } + + for (AssessmentUserDTO userDto : userDtos) { + ExcelCell[] userResultRow = new ExcelCell[2]; + userResultRow[1] = new ExcelCell(userDto.getFirstName() + " " + userDto.getLastName(), false); + userResultRow[2] = new ExcelCell(userDto.getGrade(), false); + summaryTab.add(userResultRow); + } + + summaryTab.add(EMPTY_ROW); } } + + dataToExport.put(getMessage("label.export.summary"), summaryTab.toArray(new ExcelCell[][] {})); } - float averageMark = (count == 0) ? 0 : total / count; - questionSummary.setAverageMark(averageMark); - AssessmentEscapeUtils.escapeQuotes(questionSummary); + // ------------------------------------------------------------------ + // -------------- Second tab: Question Summary ---------------------- - return questionSummary; + ArrayList questionSummaryTab = new ArrayList(); + + // Create the question summary + ExcelCell[] summaryTitle = new ExcelCell[1]; + summaryTitle[0] = new ExcelCell(getMessage("label.export.question.summary"), true); + questionSummaryTab.add(summaryTitle); + + Map questionSummaries = getQuestionSummaryForExport(assessment); + + if (assessment.getQuestions() != null) { + Set questions = assessment.getQuestions(); + + // question row title + int count = 0; + ExcelCell[] summaryRowTitle = showUserNames ? new ExcelCell[10] : new ExcelCell[9]; + summaryRowTitle[count++] = new ExcelCell(getMessage("label.monitoring.question.summary.question"), true); + summaryRowTitle[count++] = new ExcelCell(getMessage("label.authoring.basic.list.header.type"), true); + summaryRowTitle[count++] = new ExcelCell(getMessage("label.authoring.basic.penalty.factor"), true); + summaryRowTitle[count++] = new ExcelCell(getMessage("label.monitoring.question.summary.default.mark"), + true); + summaryRowTitle[count++] = new ExcelCell(getMessage("label.export.user.id"), true); + if (showUserNames) { + summaryRowTitle[count++] = new ExcelCell(getMessage("label.monitoring.user.summary.user.name"), true); + } + summaryRowTitle[count++] = new ExcelCell(getMessage("label.export.date.attempted"), true); + summaryRowTitle[count++] = new ExcelCell(getMessage("label.authoring.basic.option.answer"), true); + summaryRowTitle[count++] = new ExcelCell(getMessage("label.export.time.taken"), true); + summaryRowTitle[count++] = new ExcelCell(getMessage("label.export.mark"), true); + + for (AssessmentQuestion question : questions) { + questionSummaryTab.add(summaryRowTitle); + + QuestionSummary questionSummary = questionSummaries.get(question.getUid()); + + List> allResultsForQuestion = questionSummary + .getQuestionResultsPerSession(); + + int markCount = 0; + Float markTotal = new Float(0.0); + int timeTakenCount = 0; + int timeTakenTotal = 0; + for (List resultList : allResultsForQuestion) { + for (AssessmentQuestionResult questionResult : resultList) { + + if (showUserNames) { + ExcelCell[] userResultRow = new ExcelCell[10]; + userResultRow[0] = new ExcelCell(questionResult.getAssessmentQuestion().getTitle(), false); + userResultRow[1] = new ExcelCell( + getQuestionTypeLanguageLabel(questionResult.getAssessmentQuestion().getType()), + false); + userResultRow[2] = new ExcelCell( + new Float(questionResult.getAssessmentQuestion().getPenaltyFactor()), false); + Float maxMark = (questionResult.getMaxMark() == null) ? 0 + : new Float(questionResult.getMaxMark()); + userResultRow[3] = new ExcelCell(maxMark, false); + userResultRow[4] = new ExcelCell(questionResult.getUser().getLoginName(), false); + userResultRow[5] = new ExcelCell(questionResult.getUser().getFullName(), false); + userResultRow[6] = new ExcelCell(questionResult.getFinishDate(), false); + userResultRow[7] = new ExcelCell( + AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), false); + + AssessmentResult assessmentResult = questionResult.getAssessmentResult(); + Date finishDate = questionResult.getFinishDate(); + if ((assessmentResult != null) && (finishDate != null)) { + Date startDate = assessmentResult.getStartDate(); + if (startDate != null) { + Long seconds = (finishDate.getTime() - startDate.getTime()) / 1000; + userResultRow[8] = new ExcelCell(seconds, false); + timeTakenCount++; + timeTakenTotal += seconds; + } + } + + Float mark = questionResult.getMark(); + if (mark != null) { + userResultRow[9] = new ExcelCell(questionResult.getMark(), false); + markCount++; + markTotal += questionResult.getMark(); + } + + questionSummaryTab.add(userResultRow); + } else { + ExcelCell[] userResultRow = new ExcelCell[9]; + userResultRow[0] = new ExcelCell(questionResult.getAssessmentQuestion().getTitle(), false); + userResultRow[1] = new ExcelCell( + getQuestionTypeLanguageLabel(questionResult.getAssessmentQuestion().getType()), + false); + userResultRow[2] = new ExcelCell( + new Float(questionResult.getAssessmentQuestion().getPenaltyFactor()), false); + Float maxMark = (questionResult.getMaxMark() == null) ? 0 + : new Float(questionResult.getMaxMark()); + userResultRow[3] = new ExcelCell(maxMark, false); + userResultRow[4] = new ExcelCell(questionResult.getUser().getUserId(), false); + userResultRow[5] = new ExcelCell(questionResult.getFinishDate(), false); + userResultRow[6] = new ExcelCell( + AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), false); + + if (questionResult.getAssessmentResult() != null) { + Date startDate = questionResult.getAssessmentResult().getStartDate(); + Date finishDate = questionResult.getFinishDate(); + if ((startDate != null) && (finishDate != null)) { + Long seconds = (finishDate.getTime() - startDate.getTime()) / 1000; + userResultRow[7] = new ExcelCell(seconds, false); + timeTakenCount++; + timeTakenTotal += seconds; + } + } + + userResultRow[8] = new ExcelCell(questionResult.getMark(), false); + + if (questionResult.getMark() != null) { + markCount++; + markTotal += questionResult.getMark(); + } + + questionSummaryTab.add(userResultRow); + } + + } + } + + // Calculating the averages + ExcelCell[] averageRow; + + if (showUserNames) { + averageRow = new ExcelCell[10]; + + averageRow[7] = new ExcelCell(getMessage("label.export.average"), true); + + if (timeTakenTotal > 0) { + averageRow[8] = new ExcelCell(new Long(timeTakenTotal / timeTakenCount), false); + } + if (markTotal > 0) { + Float averageMark = new Float(markTotal / markCount); + averageRow[9] = new ExcelCell(averageMark, false); + } else { + averageRow[9] = new ExcelCell(new Float(0.0), false); + } + } else { + averageRow = new ExcelCell[9]; + averageRow[6] = new ExcelCell(getMessage("label.export.average"), true); + + if (timeTakenTotal > 0) { + averageRow[7] = new ExcelCell(new Long(timeTakenTotal / timeTakenCount), false); + } + if (markTotal > 0) { + Float averageMark = new Float(markTotal / markCount); + averageRow[8] = new ExcelCell(averageMark, false); + } else { + averageRow[8] = new ExcelCell(new Float(0.0), false); + } + } + + questionSummaryTab.add(averageRow); + questionSummaryTab.add(EMPTY_ROW); + } + + } + dataToExport.put(getMessage("lable.export.summary.by.question"), + questionSummaryTab.toArray(new ExcelCell[][] {})); + + // ------------------------------------------------------------------ + // -------------- Third tab: User Summary --------------------------- + + ArrayList userSummaryTab = new ArrayList(); + + // Create the question summary + ExcelCell[] userSummaryTitle = new ExcelCell[1]; + userSummaryTitle[0] = new ExcelCell(getMessage("label.export.user.summary"), true); + userSummaryTab.add(userSummaryTitle); + + ExcelCell[] summaryRowTitle = new ExcelCell[5]; + summaryRowTitle[0] = new ExcelCell(getMessage("label.monitoring.question.summary.question"), true); + summaryRowTitle[1] = new ExcelCell(getMessage("label.authoring.basic.list.header.type"), true); + summaryRowTitle[2] = new ExcelCell(getMessage("label.authoring.basic.penalty.factor"), true); + summaryRowTitle[3] = new ExcelCell(getMessage("label.monitoring.question.summary.default.mark"), true); + summaryRowTitle[4] = new ExcelCell(getMessage("label.monitoring.question.summary.average.mark"), true); + userSummaryTab.add(summaryRowTitle); + Float totalGradesPossible = new Float(0); + Float totalAverage = new Float(0); + if (assessment.getQuestionReferences() != null) { + Set questionReferences = new TreeSet(new SequencableComparator()); + questionReferences.addAll(assessment.getQuestionReferences()); + + int randomQuestionsCount = 1; + for (QuestionReference questionReference : questionReferences) { + + String title; + String questionType; + Float penaltyFactor; + Float averageMark = null; + if (questionReference.isRandomQuestion()) { + + title = getMessage("label.authoring.basic.type.random.question") + randomQuestionsCount++; + questionType = getMessage("label.authoring.basic.type.random.question"); + penaltyFactor = null; + averageMark = null; + } else { + + AssessmentQuestion question = questionReference.getQuestion(); + title = question.getTitle(); + questionType = getQuestionTypeLanguageLabel(question.getType()); + penaltyFactor = question.getPenaltyFactor(); + + QuestionSummary questionSummary = questionSummaries.get(question.getUid()); + if (questionSummary != null) { + averageMark = questionSummary.getAverageMark(); + totalAverage += questionSummary.getAverageMark(); + } + } + + int maxGrade = questionReference.getDefaultGrade(); + totalGradesPossible += maxGrade; + + ExcelCell[] questCell = new ExcelCell[5]; + questCell[0] = new ExcelCell(title, false); + questCell[1] = new ExcelCell(questionType, false); + questCell[2] = new ExcelCell(penaltyFactor, false); + questCell[3] = new ExcelCell(maxGrade, false); + questCell[4] = new ExcelCell(averageMark, false); + + userSummaryTab.add(questCell); + } + + if (totalGradesPossible.floatValue() > 0) { + ExcelCell[] totalCell = new ExcelCell[5]; + totalCell[2] = new ExcelCell(getMessage("label.monitoring.summary.total"), true); + totalCell[3] = new ExcelCell(totalGradesPossible, false); + totalCell[4] = new ExcelCell(totalAverage, false); + userSummaryTab.add(totalCell); + } + userSummaryTab.add(EMPTY_ROW); + } + + if (sessionDtos != null) { + List assessmentResults = assessmentResultDao + .getLastFinishedAssessmentResults(assessment.getContentId()); + Map userUidToResultMap = new HashMap(); + for (AssessmentResult assessmentResult : assessmentResults) { + userUidToResultMap.put(assessmentResult.getUser().getUid(), assessmentResult); + } + + for (SessionDTO sessionDTO : sessionDtos) { + + userSummaryTab.add(EMPTY_ROW); + + ExcelCell[] sessionTitle = new ExcelCell[1]; + sessionTitle[0] = new ExcelCell(sessionDTO.getSessionName(), true); + userSummaryTab.add(sessionTitle); + + AssessmentSession assessmentSession = getAssessmentSessionBySessionId(sessionDTO.getSessionId()); + + Set assessmentUsers = assessmentSession.getAssessmentUsers(); + + if (assessmentUsers != null) { + + for (AssessmentUser assessmentUser : assessmentUsers) { + + if (showUserNames) { + ExcelCell[] userTitleRow = new ExcelCell[6]; + userTitleRow[0] = new ExcelCell(getMessage("label.export.user.id"), true); + userTitleRow[1] = new ExcelCell(getMessage("label.monitoring.user.summary.user.name"), + true); + userTitleRow[2] = new ExcelCell(getMessage("label.export.date.attempted"), true); + userTitleRow[3] = new ExcelCell(getMessage("label.monitoring.question.summary.question"), + true); + userTitleRow[4] = new ExcelCell(getMessage("label.authoring.basic.option.answer"), true); + userTitleRow[5] = new ExcelCell(getMessage("label.export.mark"), true); + userSummaryTab.add(userTitleRow); + } else { + ExcelCell[] userTitleRow = new ExcelCell[5]; + userTitleRow[0] = new ExcelCell(getMessage("label.export.user.id"), true); + userTitleRow[1] = new ExcelCell(getMessage("label.export.date.attempted"), true); + userTitleRow[2] = new ExcelCell(getMessage("label.monitoring.question.summary.question"), + true); + userTitleRow[3] = new ExcelCell(getMessage("label.authoring.basic.option.answer"), true); + userTitleRow[4] = new ExcelCell(getMessage("label.export.mark"), true); + userSummaryTab.add(userTitleRow); + } + + AssessmentResult assessmentResult = userUidToResultMap.get(assessmentUser.getUid()); + + if (assessmentResult != null) { + Set questionResults = assessmentResult.getQuestionResults(); + + if (questionResults != null) { + + for (AssessmentQuestionResult questionResult : questionResults) { + + if (showUserNames) { + ExcelCell[] userResultRow = new ExcelCell[6]; + userResultRow[0] = new ExcelCell(assessmentUser.getLoginName(), false); + userResultRow[1] = new ExcelCell(assessmentUser.getFullName(), false); + userResultRow[2] = new ExcelCell(assessmentResult.getStartDate(), false); + userResultRow[3] = new ExcelCell( + questionResult.getAssessmentQuestion().getTitle(), false); + userResultRow[4] = new ExcelCell( + AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), + false); + userResultRow[5] = new ExcelCell(questionResult.getMark(), false); + userSummaryTab.add(userResultRow); + } else { + ExcelCell[] userResultRow = new ExcelCell[5]; + userResultRow[0] = new ExcelCell(assessmentUser.getUserId(), false); + userResultRow[1] = new ExcelCell(assessmentResult.getStartDate(), false); + userResultRow[2] = new ExcelCell( + questionResult.getAssessmentQuestion().getTitle(), false); + userResultRow[3] = new ExcelCell( + AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), + false); + userResultRow[4] = new ExcelCell(questionResult.getMark(), false); + userSummaryTab.add(userResultRow); + } + } + } + + ExcelCell[] userTotalRow; + if (showUserNames) { + userTotalRow = new ExcelCell[6]; + userTotalRow[4] = new ExcelCell(getMessage("label.monitoring.summary.total"), true); + userTotalRow[5] = new ExcelCell(assessmentResult.getGrade(), false); + } else { + userTotalRow = new ExcelCell[5]; + userTotalRow[3] = new ExcelCell(getMessage("label.monitoring.summary.total"), true); + userTotalRow[4] = new ExcelCell(assessmentResult.getGrade(), false); + } + + userSummaryTab.add(userTotalRow); + userSummaryTab.add(EMPTY_ROW); + } + } + } + } + } + dataToExport.put(getMessage("label.export.summary.by.user"), userSummaryTab.toArray(new ExcelCell[][] {})); + + return dataToExport; } + /** + * Used only for excell export (for getUserSummaryData() method). + */ + private String getQuestionTypeLanguageLabel(short type) { + switch (type) { + case AssessmentConstants.QUESTION_TYPE_ESSAY: + return "Essay"; + case AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS: + return "Matching Pairs"; + case AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE: + return "Multiple Choice"; + case AssessmentConstants.QUESTION_TYPE_NUMERICAL: + return "Numerical"; + case AssessmentConstants.QUESTION_TYPE_ORDERING: + return "Ordering"; + case AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER: + return "Short Answer"; + case AssessmentConstants.QUESTION_TYPE_TRUE_FALSE: + return "True/False"; + case AssessmentConstants.QUESTION_TYPE_MARK_HEDGING: + return "Mark Hedging"; + default: + return null; + } + } + @Override public void changeQuestionResultMark(Long questionResultUid, float newMark) { AssessmentQuestionResult questionAnswer = assessmentQuestionResultDao @@ -1493,11 +1928,6 @@ } @Override - public AssessmentUser getUser(Long uid) { - return (AssessmentUser) assessmentUserDao.getObject(AssessmentUser.class, uid); - } - - @Override public String getMessage(String key) { return messageService.getMessage(key); } @@ -1524,7 +1954,7 @@ @Override public void notifyTeachersOnAttemptCompletion(Long sessionId, String userName) { - String message = getLocalisedMessage("event.learner.completes.attempt.body", new Object[] { userName }); + String message = messageService.getMessage("event.learner.completes.attempt.body", new Object[] { userName }); eventNotificationService.notifyLessonMonitors(sessionId, message, false); } @@ -1729,6 +2159,7 @@ coreNotebookService.deleteEntry(entry); } } + assessmentDao.delete(assessment); } @@ -1927,11 +2358,6 @@ this.eventNotificationService = eventNotificationService; } - @Override - public String getLocalisedMessage(String key, Object[] args) { - return messageService.getMessage(key, args); - } - public AssessmentOutputFactory getAssessmentOutputFactory() { return assessmentOutputFactory; } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== diff -u -rf494ac5c2f49f92be600b6392d9c85c291df7bb7 -r347569bcf8c86a502e240c5e906a14b1b37fd1f6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision f494ac5c2f49f92be600b6392d9c85c291df7bb7) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java (.../IAssessmentService.java) (revision 347569bcf8c86a502e240c5e906a14b1b37fd1f6) @@ -25,8 +25,10 @@ import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; import org.lamsfoundation.lams.notebook.model.NotebookEntry; @@ -43,6 +45,7 @@ import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; import org.lamsfoundation.lams.tool.assessment.model.QuestionReference; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.ExcelCell; /** * @author Andrey Balan @@ -160,14 +163,6 @@ void deleteQuestionReference(Long uid); /** - * Return all reource questions within the given toolSessionID. - * - * @param sessionId - * @return - */ - List getAssessmentQuestionsBySessionId(Long sessionId); - - /** * Get assessment which is relative with the special toolSession. * * @param sessionId @@ -182,13 +177,6 @@ * @return */ AssessmentSession getAssessmentSessionBySessionId(Long sessionId); - - /** - * Save or update assessment session. - * - * @param resSession - */ - void saveOrUpdateAssessmentSession(AssessmentSession resSession); /** * Save or update assessment result. @@ -324,8 +312,6 @@ * @return */ String finishToolSession(Long toolSessionId, Long userId) throws AssessmentApplicationException; - - AssessmentQuestion getAssessmentQuestionByUid(Long questionUid); /** * Returns sessionDtos containing only session ids and session names. @@ -370,30 +356,21 @@ * @param questionUid * @return */ - QuestionSummary getQuestionDataForExport(Long contentId, Long questionUid); + Map getQuestionSummaryForExport(Assessment assessment); - void changeQuestionResultMark(Long questionResultUid, float newMark); - /** - * Get user by UID + * Prepares data for Summary excel export * - * @param uid + * @param assessment + * @param sessionDtos + * @param showUserNames * @return */ - AssessmentUser getUser(Long uid); + LinkedHashMap exportSummary(Assessment assessment, List sessionDtos, boolean showUserNames); + + void changeQuestionResultMark(Long questionResultUid, float newMark); void notifyTeachersOnAttemptCompletion(Long sessionId, String userName); - - /** - * Gets a message from assessment bundle. Same as in JSP pages. - * - * @param key - * key of the message - * @param args - * arguments for the message - * @return message content - */ - String getLocalisedMessage(String key, Object[] args); /** * Get a message from the language files with the given key Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java =================================================================== diff -u -rf494ac5c2f49f92be600b6392d9c85c291df7bb7 -r347569bcf8c86a502e240c5e906a14b1b37fd1f6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision f494ac5c2f49f92be600b6392d9c85c291df7bb7) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java (.../MonitoringAction.java) (revision 347569bcf8c86a502e240c5e906a14b1b37fd1f6) @@ -86,7 +86,6 @@ public class MonitoringAction extends Action { public static Logger log = Logger.getLogger(MonitoringAction.class); - public static final ExcelCell[] EMPTY_ROW = new ExcelCell[0]; private IAssessmentService service; @@ -506,7 +505,7 @@ } /** - * Export Excel format survey data. + * Excel Summary Export. * * @param mapping * @param form @@ -524,518 +523,43 @@ boolean showUserNames = true; Long contentId = null; + List sessionDtos; if (sessionMap != null) { request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); contentId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_CONTENT_ID); showUserNames = true; + sessionDtos = (List) sessionMap.get("sessionDtos"); + } else { contentId = WebUtil.readLongParam(request, "toolContentID"); fileName = WebUtil.readStrParam(request, "fileName"); showUserNames = false; + sessionDtos = service.getSessionDtos(contentId); } - List sessionDtos = (List) sessionMap.get("sessionDtos"); Assessment assessment = service.getAssessmentByContentId(contentId); - - if (assessment != null) { - LinkedHashMap dataToExport = new LinkedHashMap(); - - if (showUserNames) { - ExcelCell[][] summaryData = getSummaryData(assessment, sessionDtos); - dataToExport.put(service.getMessage("label.export.summary"), summaryData); - } - - ExcelCell[][] questionSummaryData = getQuestionSummaryData(assessment, showUserNames); - dataToExport.put(service.getMessage("lable.export.summary.by.question"), questionSummaryData); - - ExcelCell[][] userSummaryData = getUserSummaryData(assessment, sessionDtos, showUserNames); - dataToExport.put(service.getMessage("label.export.summary.by.user"), userSummaryData); - - // Setting the filename if it wasn't passed in the request - if (fileName == null) { - fileName = "assessment_" + assessment.getUid() + "_export.xlsx"; - } - - response.setContentType("application/x-download"); - response.setHeader("Content-Disposition", "attachment;filename=" + fileName); - log.debug("Exporting assessment to a spreadsheet: " + assessment.getContentId()); - - ServletOutputStream out = response.getOutputStream(); - ExcelUtil.createExcel(out, dataToExport, service.getMessage("label.export.exported.on"), true); - } - - return null; - } - - @SuppressWarnings("unchecked") - private ExcelCell[][] getSummaryData(Assessment assessment, List sessionDtos) { - initAssessmentService(); - ArrayList data = new ArrayList(); - if (assessment == null) { - return new ExcelCell[0][0]; + return null; } - // Adding the user results/marks summary --------------------------- - if (sessionDtos != null) { - for (SessionDTO sessionDTO : sessionDtos) { - Long sessionId = sessionDTO.getSessionId(); - - data.add(EMPTY_ROW); + LinkedHashMap dataToExport = service.exportSummary(assessment, sessionDtos, + showUserNames); - ExcelCell[] sessionTitle = new ExcelCell[1]; - sessionTitle[0] = new ExcelCell(sessionDTO.getSessionName(), true); - data.add(sessionTitle); - - // Adding the question summary ------------------------------------- - ExcelCell[] summaryRowTitle = new ExcelCell[2]; - summaryRowTitle[0] = new ExcelCell(service.getMessage("label.monitoring.summary.user.name"), true); - summaryRowTitle[1] = new ExcelCell(service.getMessage("label.monitoring.summary.total"), true); - data.add(summaryRowTitle); - - List userDtos = new ArrayList(); - //in case of UseSelectLeaderToolOuput - display only one user - if (assessment.isUseSelectLeaderToolOuput()) { - - AssessmentSession session = service.getAssessmentSessionBySessionId(sessionId); - AssessmentUser groupLeader = session.getGroupLeader(); - - if (groupLeader != null) { - - float assessmentResult = service.getLastTotalScoreByUser(assessment.getUid(), - groupLeader.getUserId()); - - AssessmentUserDTO userDto = new AssessmentUserDTO(); - userDto.setFirstName(groupLeader.getFirstName()); - userDto.setLastName(groupLeader.getLastName()); - userDto.setGrade(assessmentResult); - userDtos.add(userDto); - } - - } else { - int countSessionUsers = sessionDTO.getNumberLearners(); - - // Get the user list from the db - userDtos = service.getPagedUsersBySession(sessionId, 0, countSessionUsers, "userName", "ASC", ""); - } - - for (AssessmentUserDTO userDto : userDtos) { - ExcelCell[] userResultRow = new ExcelCell[2]; - userResultRow[0] = new ExcelCell(userDto.getFirstName() + " " + userDto.getLastName(), false); - userResultRow[1] = new ExcelCell(userDto.getGrade(), false); - data.add(userResultRow); - } - - data.add(EMPTY_ROW); - } + // Setting the filename if it wasn't passed in the request + if (fileName == null) { + fileName = "assessment_" + assessment.getUid() + "_export.xlsx"; } - // ------------------------------------------------------------------ + response.setContentType("application/x-download"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + log.debug("Exporting assessment to a spreadsheet: " + assessment.getContentId()); - return data.toArray(new ExcelCell[][] {}); + ServletOutputStream out = response.getOutputStream(); + ExcelUtil.createExcel(out, dataToExport, service.getMessage("label.export.exported.on"), true); + + return null; } - @SuppressWarnings("unchecked") - private ExcelCell[][] getUserSummaryData(Assessment assessment, List sessionDtos, boolean showUserNames) { - initAssessmentService(); - ArrayList data = new ArrayList(); - - if (assessment != null) { - // Create the question summary - ExcelCell[] summaryTitle = new ExcelCell[1]; - summaryTitle[0] = new ExcelCell(service.getMessage("label.export.user.summary"), true); - data.add(summaryTitle); - - // Adding the question summary ------------------------------------- - ExcelCell[] summaryRowTitle = new ExcelCell[5]; - summaryRowTitle[0] = new ExcelCell(service.getMessage("label.monitoring.question.summary.question"), true); - summaryRowTitle[1] = new ExcelCell(service.getMessage("label.authoring.basic.list.header.type"), true); - summaryRowTitle[2] = new ExcelCell(service.getMessage("label.authoring.basic.penalty.factor"), true); - summaryRowTitle[3] = new ExcelCell(service.getMessage("label.monitoring.question.summary.default.mark"), - true); - summaryRowTitle[4] = new ExcelCell(service.getMessage("label.monitoring.question.summary.average.mark"), - true); - data.add(summaryRowTitle); - Float totalGradesPossible = new Float(0); - Float totalAverage = new Float(0); - if (assessment.getQuestionReferences() != null) { - Set questionReferences = new TreeSet(new SequencableComparator()); - questionReferences.addAll(assessment.getQuestionReferences()); - - int randomQuestionsCount = 1; - for (QuestionReference questionReference : questionReferences) { - - String title; - String questionType; - Float penaltyFactor; - Float averageMark = null; - if (questionReference.isRandomQuestion()) { - - title = service.getMessage("label.authoring.basic.type.random.question") - + randomQuestionsCount++; - questionType = service.getMessage("label.authoring.basic.type.random.question"); - penaltyFactor = null; - averageMark = null; - } else { - - AssessmentQuestion question = questionReference.getQuestion(); - title = question.getTitle(); - questionType = getQuestionTypeLanguageLabel(question.getType()); - penaltyFactor = question.getPenaltyFactor(); - - QuestionSummary questionSummary = service.getQuestionDataForExport(assessment.getContentId(), - question.getUid()); - if (questionSummary != null) { - averageMark = questionSummary.getAverageMark(); - totalAverage += questionSummary.getAverageMark(); - } - } - - int maxGrade = questionReference.getDefaultGrade(); - totalGradesPossible += maxGrade; - - ExcelCell[] questCell = new ExcelCell[5]; - questCell[0] = new ExcelCell(title, false); - questCell[1] = new ExcelCell(questionType, false); - questCell[2] = new ExcelCell(penaltyFactor, false); - questCell[3] = new ExcelCell(maxGrade, false); - questCell[4] = new ExcelCell(averageMark, false); - - data.add(questCell); - - } - - if (totalGradesPossible.floatValue() > 0) { - ExcelCell[] totalCell = new ExcelCell[5]; - totalCell[2] = new ExcelCell(service.getMessage("label.monitoring.summary.total"), true); - totalCell[3] = new ExcelCell(totalGradesPossible, false); - totalCell[4] = new ExcelCell(totalAverage, false); - data.add(totalCell); - } - data.add(EMPTY_ROW); - } - //------------------------------------------------------------------ - - // Adding the user results/marks summary --------------------------- - if (sessionDtos != null) { - for (SessionDTO sessionDTO : sessionDtos) { - - data.add(EMPTY_ROW); - - ExcelCell[] sessionTitle = new ExcelCell[1]; - sessionTitle[0] = new ExcelCell(sessionDTO.getSessionName(), true); - data.add(sessionTitle); - - //List assessmentResults = summary.getAssessmentResults(); - - AssessmentSession assessmentSession = service.getAssessmentSessionBySessionId(sessionDTO - .getSessionId()); - - Set assessmentUsers = assessmentSession.getAssessmentUsers(); - - if (assessmentUsers != null) { - - for (AssessmentUser assessmentUser : assessmentUsers) { - - if (showUserNames) { - ExcelCell[] userTitleRow = new ExcelCell[6]; - userTitleRow[0] = new ExcelCell(service.getMessage("label.export.user.id"), true); - userTitleRow[1] = new ExcelCell(service - .getMessage("label.monitoring.user.summary.user.name"), true); - userTitleRow[2] = new ExcelCell(service.getMessage("label.export.date.attempted"), true); - userTitleRow[3] = new ExcelCell(service - .getMessage("label.monitoring.question.summary.question"), true); - userTitleRow[4] = new ExcelCell(service - .getMessage("label.authoring.basic.option.answer"), true); - userTitleRow[5] = new ExcelCell(service.getMessage("label.export.mark"), true); - data.add(userTitleRow); - } else { - ExcelCell[] userTitleRow = new ExcelCell[5]; - userTitleRow[0] = new ExcelCell(service.getMessage("label.export.user.id"), true); - userTitleRow[1] = new ExcelCell(service.getMessage("label.export.date.attempted"), true); - userTitleRow[2] = new ExcelCell(service - .getMessage("label.monitoring.question.summary.question"), true); - userTitleRow[3] = new ExcelCell(service - .getMessage("label.authoring.basic.option.answer"), true); - userTitleRow[4] = new ExcelCell(service.getMessage("label.export.mark"), true); - data.add(userTitleRow); - } - - AssessmentResult assessmentResult = service.getLastFinishedAssessmentResult(assessment.getUid(), - assessmentUser.getUserId()); - - if (assessmentResult != null) { - Set questionResults = assessmentResult - .getQuestionResults(); - - if (questionResults != null) { - - for (AssessmentQuestionResult questionResult : questionResults) { - - if (showUserNames) { - ExcelCell[] userResultRow = new ExcelCell[6]; - userResultRow[0] = new ExcelCell(assessmentUser.getUserId(), false); - userResultRow[1] = new ExcelCell(assessmentUser.getFullName(), false); - userResultRow[2] = new ExcelCell(assessmentResult.getStartDate(), false); - userResultRow[3] = new ExcelCell(questionResult - .getAssessmentQuestion().getTitle(), false); - userResultRow[4] = new ExcelCell(AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), - false); - userResultRow[5] = new ExcelCell(questionResult.getMark(), false); - data.add(userResultRow); - } else { - ExcelCell[] userResultRow = new ExcelCell[5]; - userResultRow[0] = new ExcelCell(assessmentUser.getUserId(), false); - userResultRow[1] = new ExcelCell(assessmentResult.getStartDate(), false); - userResultRow[2] = new ExcelCell(questionResult - .getAssessmentQuestion().getTitle(), false); - userResultRow[3] = new ExcelCell(AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), - false); - userResultRow[4] = new ExcelCell(questionResult.getMark(), false); - data.add(userResultRow); - } - } - } - - ExcelCell[] userTotalRow; - if (showUserNames) { - userTotalRow = new ExcelCell[6]; - userTotalRow[4] = new ExcelCell(service - .getMessage("label.monitoring.summary.total"), true); - userTotalRow[5] = new ExcelCell(assessmentResult.getGrade(), false); - } else { - userTotalRow = new ExcelCell[5]; - userTotalRow[3] = new ExcelCell(service - .getMessage("label.monitoring.summary.total"), true); - userTotalRow[4] = new ExcelCell(assessmentResult.getGrade(), false); - } - - data.add(userTotalRow); - data.add(EMPTY_ROW); - } - } - } - } - } - - //------------------------------------------------------------------ - - } - - return data.toArray(new ExcelCell[][] {}); - } - - @SuppressWarnings("unchecked") - private ExcelCell[][] getQuestionSummaryData(Assessment assessment, boolean showUserNames) { - initAssessmentService(); - ArrayList data = new ArrayList(); - - if (assessment != null) { - // Create the question summary - ExcelCell[] summaryTitle = new ExcelCell[1]; - summaryTitle[0] = new ExcelCell(service.getMessage("label.export.question.summary"), true); - data.add(summaryTitle); - - if (assessment.getQuestions() != null) { - Set questions = (Set) assessment.getQuestions(); - - for (AssessmentQuestion question : questions) { - - // Adding the question summary - if (showUserNames) { - ExcelCell[] summaryRowTitle = new ExcelCell[10]; - summaryRowTitle[0] = new ExcelCell(service - .getMessage("label.monitoring.question.summary.question"), true); - summaryRowTitle[1] = new ExcelCell( - service.getMessage("label.authoring.basic.list.header.type"), true); - summaryRowTitle[2] = new ExcelCell(service.getMessage("label.authoring.basic.penalty.factor"), - true); - summaryRowTitle[3] = new ExcelCell(service - .getMessage("label.monitoring.question.summary.default.mark"), true); - summaryRowTitle[4] = new ExcelCell(service.getMessage("label.export.user.id"), true); - summaryRowTitle[5] = new ExcelCell(service - .getMessage("label.monitoring.user.summary.user.name"), true); - summaryRowTitle[6] = new ExcelCell(service.getMessage("label.export.date.attempted"), true); - summaryRowTitle[7] = new ExcelCell(service.getMessage("label.authoring.basic.option.answer"), - true); - summaryRowTitle[8] = new ExcelCell(service.getMessage("label.export.time.taken"), true); - summaryRowTitle[9] = new ExcelCell(service.getMessage("label.export.mark"), true); - data.add(summaryRowTitle); - } else { - ExcelCell[] summaryRowTitle = new ExcelCell[9]; - summaryRowTitle[0] = new ExcelCell(service - .getMessage("label.monitoring.question.summary.question"), true); - summaryRowTitle[1] = new ExcelCell( - service.getMessage("label.authoring.basic.list.header.type"), true); - summaryRowTitle[2] = new ExcelCell(service.getMessage("label.authoring.basic.penalty.factor"), - true); - summaryRowTitle[3] = new ExcelCell(service - .getMessage("label.monitoring.question.summary.default.mark"), true); - summaryRowTitle[4] = new ExcelCell(service.getMessage("label.export.user.id"), true); - summaryRowTitle[5] = new ExcelCell(service.getMessage("label.export.date.attempted"), true); - summaryRowTitle[6] = new ExcelCell(service.getMessage("label.authoring.basic.option.answer"), - true); - summaryRowTitle[7] = new ExcelCell(service.getMessage("label.export.time.taken"), true); - summaryRowTitle[8] = new ExcelCell(service.getMessage("label.export.mark"), true); - data.add(summaryRowTitle); - } - - QuestionSummary questionSummary = service.getQuestionDataForExport(assessment.getContentId(), question - .getUid()); - - List> allResultsForQuestion = questionSummary - .getQuestionResultsPerSession(); - - int markCount = 0; - Float markTotal = new Float(0.0); - int timeTakenCount = 0; - int timeTakenTotal = 0; - for (List resultList : allResultsForQuestion) { - for (AssessmentQuestionResult questionResult : resultList) { - - if (showUserNames) { - ExcelCell[] userResultRow = new ExcelCell[10]; - userResultRow[0] = new ExcelCell(questionResult.getAssessmentQuestion().getTitle(), - false); - userResultRow[1] = new ExcelCell(getQuestionTypeLanguageLabel(questionResult - .getAssessmentQuestion().getType()), false); - userResultRow[2] = new ExcelCell(new Float(questionResult.getAssessmentQuestion() - .getPenaltyFactor()), false); - Float maxMark = (questionResult.getMaxMark() == null) ? 0 : new Float( - questionResult.getMaxMark()); - userResultRow[3] = new ExcelCell(maxMark, false); - userResultRow[4] = new ExcelCell(questionResult.getUser().getUserId(), false); - userResultRow[5] = new ExcelCell(questionResult.getUser().getFullName(), false); - userResultRow[6] = new ExcelCell(questionResult.getFinishDate(), false); - userResultRow[7] = new ExcelCell(AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), false); - - AssessmentResult assessmentResult = questionResult.getAssessmentResult(); - Date finishDate = questionResult.getFinishDate(); - if (assessmentResult != null && finishDate != null) { - Date startDate = assessmentResult.getStartDate(); - if (startDate != null) { - Long seconds = (finishDate.getTime() - startDate.getTime()) / 1000; - userResultRow[8] = new ExcelCell(seconds, false); - timeTakenCount++; - timeTakenTotal += seconds; - } - } - - Float mark = questionResult.getMark(); - if (mark != null) { - userResultRow[9] = new ExcelCell(questionResult.getMark(), false); - markCount++; - markTotal += questionResult.getMark(); - } - - data.add(userResultRow); - } else { - ExcelCell[] userResultRow = new ExcelCell[9]; - userResultRow[0] = new ExcelCell(questionResult.getAssessmentQuestion().getTitle(), - false); - userResultRow[1] = new ExcelCell(getQuestionTypeLanguageLabel(questionResult - .getAssessmentQuestion().getType()), false); - userResultRow[2] = new ExcelCell(new Float(questionResult.getAssessmentQuestion() - .getPenaltyFactor()), false); - Float maxMark = (questionResult.getMaxMark() == null) ? 0 : new Float( - questionResult.getMaxMark()); - userResultRow[3] = new ExcelCell(maxMark, false); - userResultRow[4] = new ExcelCell(questionResult.getUser().getUserId(), false); - userResultRow[5] = new ExcelCell(questionResult.getFinishDate(), false); - userResultRow[6] = new ExcelCell(AssessmentEscapeUtils.printResponsesForExcelExport(questionResult), false); - - if (questionResult.getAssessmentResult() != null) { - Date startDate = questionResult.getAssessmentResult().getStartDate(); - Date finishDate = questionResult.getFinishDate(); - if (startDate != null && finishDate != null) { - Long seconds = (finishDate.getTime() - startDate.getTime()) / 1000; - userResultRow[7] = new ExcelCell(seconds, false); - timeTakenCount++; - timeTakenTotal += seconds; - } - } - - userResultRow[8] = new ExcelCell(questionResult.getMark(), false); - - if (questionResult.getMark() != null) { - markCount++; - markTotal += questionResult.getMark(); - } - - data.add(userResultRow); - } - - } - } - - // Calculating the averages - ExcelCell[] averageRow; - - if (showUserNames) { - averageRow = new ExcelCell[10]; - - averageRow[7] = new ExcelCell(service.getMessage("label.export.average"), true); - - if (timeTakenTotal > 0) { - averageRow[8] = new ExcelCell(new Long(timeTakenTotal / timeTakenCount), false); - } - if (markTotal > 0) { - Float averageMark = new Float(markTotal / markCount); - averageRow[9] = new ExcelCell(averageMark, false); - } else { - averageRow[9] = new ExcelCell(new Float(0.0), false); - } - } else { - averageRow = new ExcelCell[9]; - averageRow[6] = new ExcelCell(service.getMessage("label.export.average"), true); - - if (timeTakenTotal > 0) { - averageRow[7] = new ExcelCell(new Long(timeTakenTotal / timeTakenCount), false); - } - if (markTotal > 0) { - Float averageMark = new Float(markTotal / markCount); - averageRow[8] = new ExcelCell(averageMark, false); - } else { - averageRow[8] = new ExcelCell(new Float(0.0), false); - } - } - - data.add(averageRow); - data.add(EMPTY_ROW); - } - - } - } - - return data.toArray(new ExcelCell[][] {}); - } - - /** - * Used only for excell export (for getUserSummaryData() method). - */ - private String getQuestionTypeLanguageLabel(short type) { - switch (type) { - case AssessmentConstants.QUESTION_TYPE_ESSAY: - return "Essay"; - case AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS: - return "Matching Pairs"; - case AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE: - return "Multiple Choice"; - case AssessmentConstants.QUESTION_TYPE_NUMERICAL: - return "Numerical"; - case AssessmentConstants.QUESTION_TYPE_ORDERING: - return "Ordering"; - case AssessmentConstants.QUESTION_TYPE_SHORT_ANSWER: - return "Short Answer"; - case AssessmentConstants.QUESTION_TYPE_TRUE_FALSE: - return "True/False"; - case AssessmentConstants.QUESTION_TYPE_MARK_HEDGING: - return "Mark Hedging"; - default: - return null; - } - } - // ************************************************************************************* // Private method // *************************************************************************************