Index: lams_tool_assessment/build.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/build.xml,v diff -u -r1.3.2.1 -r1.3.2.2 --- lams_tool_assessment/build.xml 11 Jun 2009 06:27:38 -0000 1.3.2.1 +++ lams_tool_assessment/build.xml 15 Jun 2009 00:42:50 -0000 1.3.2.2 @@ -242,7 +242,7 @@ - + Index: lams_tool_assessment/conf/language/lams/ApplicationResources.properties =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/conf/language/lams/ApplicationResources.properties,v diff -u -r1.4.2.1 -r1.4.2.2 --- lams_tool_assessment/conf/language/lams/ApplicationResources.properties 13 May 2009 06:47:49 -0000 1.4.2.1 +++ lams_tool_assessment/conf/language/lams/ApplicationResources.properties 15 Jun 2009 00:42:50 -0000 1.4.2.2 @@ -229,5 +229,16 @@ warning.msg.authoring.do.you.want.to.delete =Do you really want to delete this question? label.learning.summary.time.taken =Time taken (minutes) +label.export.exported.on =Exported on: +label.export.question.summary =Question Summary +label.export.user.summary =User Summary +label.export.date.attempted =Date Attempted +label.export.mark =Mark +label.export.time.taken =Time taken from activity start (seconds) +label.export.average =Average +label.export.summary.by.user =Summary by User +lable.export.summary.by.question =Summary by Question +label.export.user.id =User ID + #======= End labels: Exported 222 labels for en AU ===== Index: lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties,v diff -u -r1.24.2.1 -r1.24.2.2 --- lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties 13 May 2009 06:47:49 -0000 1.24.2.1 +++ lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties 15 Jun 2009 00:42:50 -0000 1.24.2.2 @@ -229,5 +229,15 @@ warning.msg.authoring.do.you.want.to.delete =Do you really want to delete this question? label.learning.summary.time.taken =Time taken (minutes) +label.export.exported.on =Exported on: +label.export.question.summary =Question Summary +label.export.user.summary =User Summary +label.export.date.attempted =Date Attempted +label.export.mark =Mark +label.export.time.taken =Time taken from activity start (seconds) +label.export.average =Average +label.export.summary.by.user =Summary by User +label.export.summary.by.question =Summary by Question +label.export.user.id =User ID #======= End labels: Exported 222 labels for en AU ===== Index: lams_tool_assessment/db/sql/create_lams_tool_assessment.sql =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/db/sql/create_lams_tool_assessment.sql,v diff -u -r1.12 -r1.12.2.1 --- lams_tool_assessment/db/sql/create_lams_tool_assessment.sql 25 Mar 2009 22:46:28 -0000 1.12 +++ lams_tool_assessment/db/sql/create_lams_tool_assessment.sql 15 Jun 2009 00:42:50 -0000 1.12.2.1 @@ -117,6 +117,7 @@ submitted_option_uid bigint, mark float, penalty float, + finish_date datetime, primary key (uid) )type=innodb; create table tl_laasse10_option_answer ( Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java,v diff -u -r1.5 -r1.5.2.1 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java 19 Mar 2009 22:06:53 -0000 1.5 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java 15 Jun 2009 00:42:50 -0000 1.5.2.1 @@ -39,14 +39,14 @@ + " as q, " + AssessmentResult.class.getName() + " as r " - + " where q.resultUid = r.uid and r.assessment.uid = ? and r.user.userId =? and q.assessmentQuestion.uid =? order by r.startDate asc"; + + " where q.assessmentResult.uid = r.uid and r.assessment.uid = ? and r.user.userId =? and q.assessmentQuestion.uid =? order by r.startDate asc"; private static final String FIND_WRONG_ANSWERS_NUMBER = "select count(q) from " + AssessmentQuestionResult.class.getName() + " as q, " + AssessmentResult.class.getName() + " as r " - + " where q.resultUid = r.uid and r.assessment.uid = ? and r.user.userId =? and q.assessmentQuestion.uid =? and q.mark < q.assessmentQuestion.defaultGrade"; + + " where q.assessmentResult.uid = r.uid and r.assessment.uid = ? and r.user.userId =? and q.assessmentQuestion.uid =? and q.mark < q.assessmentQuestion.defaultGrade"; public int getNumberWrongAnswersDoneBefore(Long assessmentUid, Long userId, Long questionUid) { List list = getHibernateTemplate().find(FIND_WRONG_ANSWERS_NUMBER, new Object[] { assessmentUid, userId, questionUid }); Fisheye: Tag 1.1 refers to a dead (removed) revision in file `lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dbupdates/updateTo20090612.sql'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java,v diff -u -r1.7 -r1.7.2.1 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java 19 Mar 2009 22:06:53 -0000 1.7 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java 15 Jun 2009 00:42:50 -0000 1.7.2.1 @@ -40,7 +40,7 @@ private Long uid; private AssessmentQuestion assessmentQuestion; - private Long resultUid; + private AssessmentResult assessmentResult; private String answerString; private float answerFloat; private boolean answerBoolean; @@ -82,16 +82,15 @@ } /** - * @hibernate.property column="result_uid" - * - * @return Returns resultUid. + * @hibernate.many-to-one column="result_uid" cascade="none" + * @return */ - public Long getResultUid() { - return resultUid; + public AssessmentResult getAssessmentResult() { + return assessmentResult; } - public void setResultUid(Long resultUid) { - this.resultUid = resultUid; + public void setAssessmentResult(AssessmentResult assessmentResult) { + this.assessmentResult = assessmentResult; } /** @@ -191,6 +190,12 @@ this.optionAnswers = answers; } + + /** + * @hibernate.property column="finish_date" + * + * @return Returns submittedOptionUid. + */ public Date getFinishDate() { return finishDate; } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java,v diff -u -r1.15 -r1.15.2.1 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java 3 Apr 2009 18:38:48 -0000 1.15 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java 15 Jun 2009 00:42:50 -0000 1.15.2.1 @@ -121,14 +121,14 @@ private AssessmentSessionDAO assessmentSessionDao; private AssessmentQuestionResultDAO assessmentQuestionResultDao; - + private AssessmentResultDAO assessmentResultDao; // tool service private AssessmentToolContentHandler assessmentToolContentHandler; private MessageService messageService; - + private AssessmentOutputFactory assessmentOutputFactory; // system services @@ -154,8 +154,9 @@ // Service method // ******************************************************************************* /** - * Try to get the file. If forceLogin = false and an access denied exception occurs, call this method again to get a - * new ticket and retry file lookup. If forceLogin = true and it then fails then throw exception. + * Try to get the file. If forceLogin = false and an access denied exception + * occurs, call this method again to get a new ticket and retry file lookup. + * If forceLogin = true and it then fails then throw exception. * * @param uuid * @param versionId @@ -184,11 +185,12 @@ } /** - * This method verifies the credentials of the Assessment Tool and gives it the Ticket to login and - * access the Content Repository. + * This method verifies the credentials of the Assessment Tool and gives it + * the Ticket to login and access the Content Repository. * - * A valid ticket is needed in order to access the content from the repository. This method would be called evertime - * the tool needs to upload/download files from the content repository. + * A valid ticket is needed in order to access the content from the + * repository. This method would be called evertime the tool needs to + * upload/download files from the content repository. * * @return ITicket The ticket for repostory access * @throws AssessmentApplicationException @@ -326,27 +328,29 @@ public void saveOrUpdateAssessmentSession(AssessmentSession resSession) { assessmentSessionDao.saveObject(resSession); } - - public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId) { + + public void setAttemptStarted(Assessment assessment, AssessmentUser assessmentUser, Long toolSessionId) { AssessmentResult result = new AssessmentResult(); result.setAssessment(assessment); result.setUser(assessmentUser); result.setSessionId(toolSessionId); result.setStartDate(new Timestamp(new Date().getTime())); assessmentResultDao.saveObject(result); } - - public void processUserAnswers(Long assessmentUid, Long userId, ArrayList> pagedQuestions) { + + public void processUserAnswers(Long assessmentUid, Long userId, + ArrayList> pagedQuestions) { SortedSet questionResultList = new TreeSet( new AssessmentQuestionResultComparator()); int maximumGrade = 0; float grade = 0; for (LinkedHashSet questionsForOnePage : pagedQuestions) { for (AssessmentQuestion question : questionsForOnePage) { - int numberWrongAnswers = assessmentQuestionResultDao.getNumberWrongAnswersDoneBefore(assessmentUid, userId, question.getUid()); + int numberWrongAnswers = assessmentQuestionResultDao.getNumberWrongAnswersDoneBefore(assessmentUid, + userId, question.getUid()); AssessmentQuestionResult processedAnswer = this.processUserAnswer(question, numberWrongAnswers); questionResultList.add(processedAnswer); - + maximumGrade += question.getDefaultGrade(); grade += processedAnswer.getMark(); } @@ -358,7 +362,7 @@ result.setFinishDate(new Timestamp(new Date().getTime())); assessmentResultDao.saveObject(result); } - + private AssessmentQuestionResult processUserAnswer(AssessmentQuestion question, int numberWrongAnswers) { AssessmentQuestionResult questionResult = new AssessmentQuestionResult(); @@ -370,22 +374,23 @@ optionAnswer.setAnswerBoolean(questionOption.getAnswerBoolean()); optionAnswer.setAnswerInt(questionOption.getAnswerInt()); optionAnswers.add(optionAnswer); - + if (question.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) { optionAnswer.setAnswerInt(j++); } - } + } questionResult.setAssessmentQuestion(question); questionResult.setAnswerBoolean(question.getAnswerBoolean()); questionResult.setAnswerFloat(question.getAnswerFloat()); questionResult.setAnswerString(question.getAnswerString()); - + questionResult.setFinishDate(new Date()); + float mark = 0; float maxMark = question.getDefaultGrade(); if (question.getType() == AssessmentConstants.QUESTION_TYPE_MULTIPLE_CHOICE) { for (AssessmentQuestionOption option : question.getQuestionOptions()) { if (option.getAnswerBoolean()) { - mark += option.getGrade()*maxMark; + mark += option.getGrade() * maxMark; } } } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_MATCHING_PAIRS) { @@ -402,13 +407,14 @@ if (question.isCaseSensitive()) { pattern = Pattern.compile(optionString); } else { - pattern = Pattern.compile(optionString, java.util.regex.Pattern.CASE_INSENSITIVE | java.util.regex.Pattern.UNICODE_CASE); - } - boolean isAnswerCorrect = (question.getAnswerString() != null) ? - pattern.matcher(question.getAnswerString()).matches() : false; - + pattern = Pattern.compile(optionString, java.util.regex.Pattern.CASE_INSENSITIVE + | java.util.regex.Pattern.UNICODE_CASE); + } + boolean isAnswerCorrect = (question.getAnswerString() != null) ? pattern.matcher( + question.getAnswerString()).matches() : false; + if (isAnswerCorrect) { - mark = option.getGrade()*maxMark; + mark = option.getGrade() * maxMark; questionResult.setSubmittedOptionUid(option.getUid()); break; } @@ -420,8 +426,8 @@ boolean isAnswerCorrect = false; try { float answerFloat = Float.valueOf(question.getAnswerString()); - isAnswerCorrect = ((answerFloat >= (option.getOptionFloat() - option.getAcceptedError())) - && (answerFloat <= (option.getOptionFloat() + option.getAcceptedError()))); + isAnswerCorrect = ((answerFloat >= (option.getOptionFloat() - option.getAcceptedError())) && (answerFloat <= (option + .getOptionFloat() + option.getAcceptedError()))); } catch (Exception e) { } @@ -431,7 +437,8 @@ Pattern pattern = Pattern.compile(regex, java.util.regex.Pattern.CASE_INSENSITIVE | java.util.regex.Pattern.UNICODE_CASE); if (pattern.matcher(answerString).matches()) { - String answerFloatStr = answerString.substring(0, answerString.length() - unit.getUnit().length()); + String answerFloatStr = answerString.substring(0, answerString.length() + - unit.getUnit().length()); try { float answerFloat = Float.valueOf(answerFloatStr); answerFloat = answerFloat / unit.getMultiplier(); @@ -459,21 +466,23 @@ } } else if (question.getType() == AssessmentConstants.QUESTION_TYPE_ORDERING) { float maxMarkForCorrectAnswer = maxMark / question.getQuestionOptions().size(); - TreeSet correctOptionSet = new TreeSet(new SequencableComparator()); + TreeSet correctOptionSet = new TreeSet( + new SequencableComparator()); correctOptionSet.addAll(question.getQuestionOptions()); - ArrayList correctOptionList = new ArrayList(correctOptionSet); + ArrayList correctOptionList = new ArrayList( + correctOptionSet); int i = 0; for (AssessmentQuestionOption option : question.getQuestionOptions()) { if (option.getUid() == correctOptionList.get(i++).getUid()) { - mark += maxMarkForCorrectAnswer*maxMark; + mark += maxMarkForCorrectAnswer * maxMark; } } } if (mark > maxMark) { mark = maxMark; } if (mark > 0) { - float penalty = question.getPenaltyFactor()*numberWrongAnswers; + float penalty = question.getPenaltyFactor() * numberWrongAnswers; mark -= penalty; if (penalty > maxMark) { penalty = maxMark; @@ -486,20 +495,21 @@ questionResult.setMark(mark); return questionResult; } - + public AssessmentResult getLastAssessmentResult(Long assessmentUid, Long userId) { return assessmentResultDao.getLastAssessmentResult(assessmentUid, userId); } - + public AssessmentResult getLastFinishedAssessmentResult(Long assessmentUid, Long userId) { return assessmentResultDao.getLastFinishedAssessmentResult(assessmentUid, userId); } - + public int getAssessmentResultCount(Long assessmentUid, Long userId) { return assessmentResultDao.getAssessmentResultCount(assessmentUid, userId); } - - public List getAssessmentQuestionResultList(Long assessmentUid, Long userId, Long questionUid) { + + public List getAssessmentQuestionResultList(Long assessmentUid, Long userId, + Long questionUid) { return assessmentQuestionResultDao.getAssessmentQuestionResultList(assessmentUid, userId, questionUid); } @@ -535,78 +545,84 @@ List users = assessmentUserDao.getBySessionID(sessionId); ArrayList assessmentResults = new ArrayList(); for (AssessmentUser user : users) { - AssessmentResult assessmentResult = assessmentResultDao.getLastFinishedAssessmentResultBySessionId(sessionId, user.getUserId()); + AssessmentResult assessmentResult = assessmentResultDao.getLastFinishedAssessmentResultBySessionId( + sessionId, user.getUserId()); if (assessmentResult == null) { assessmentResult = new AssessmentResult(); assessmentResult.setUser(user); } else { Set sortedQuestionResults = new TreeSet( new AssessmentQuestionResultComparator()); sortedQuestionResults.addAll(assessmentResult.getQuestionResults()); - assessmentResult.setQuestionResults(sortedQuestionResults); + assessmentResult.setQuestionResults(sortedQuestionResults); } assessmentResults.add(assessmentResult); } summary.setAssessmentResults(assessmentResults); summaryList.add(summary); } - + escapeQuotes(summaryList); return summaryList; } - + public AssessmentResult getUserMasterDetail(Long sessionId, Long userId) { - AssessmentResult lastFinishedResult = assessmentResultDao.getLastFinishedAssessmentResultBySessionId(sessionId, userId); + AssessmentResult lastFinishedResult = assessmentResultDao.getLastFinishedAssessmentResultBySessionId(sessionId, + userId); SortedSet questionResults = new TreeSet(new AssessmentQuestionResultComparator()); questionResults.addAll(lastFinishedResult.getQuestionResults()); lastFinishedResult.setQuestionResults(questionResults); escapeQuotes(lastFinishedResult); return lastFinishedResult; } - + public UserSummary getUserSummary(Long contentId, Long userId, Long sessionId) { UserSummary userSummary = new UserSummary(); AssessmentUser user = assessmentUserDao.getUserByUserIDAndSessionID(userId, sessionId); userSummary.setUser(user); List results = assessmentResultDao.getAssessmentResultsBySession(sessionId, userId); userSummary.setNumberOfAttempts(results.size()); - - AssessmentResult lastFinishedResult = assessmentResultDao.getLastFinishedAssessmentResultBySessionId(sessionId, userId); - long timeTaken = (lastFinishedResult == null) ? 0 : (lastFinishedResult.getFinishDate().getTime() - lastFinishedResult.getStartDate().getTime()); + + AssessmentResult lastFinishedResult = assessmentResultDao.getLastFinishedAssessmentResultBySessionId(sessionId, + userId); + long timeTaken = (lastFinishedResult == null) ? 0 + : (lastFinishedResult.getFinishDate().getTime() - lastFinishedResult.getStartDate().getTime()); userSummary.setTimeOfLastAttempt(new Date(timeTaken)); if (lastFinishedResult != null) { userSummary.setLastAttemptGrade(lastFinishedResult.getGrade()); } - + 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(); - + for (AssessmentResult result : results) { for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { - if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { - questionResult.setFinishDate(result.getFinishDate()); - questionResultsForSummary.add(questionResult); - break; + if (questionResult.getFinishDate() == null) { + if (question.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { + questionResult.setFinishDate(result.getFinishDate()); + questionResultsForSummary.add(questionResult); + break; + } } } - + } userSummaryItem.setQuestionResults(questionResultsForSummary); userSummaryItems.add(userSummaryItem); } userSummary.setUserSummaryItems(userSummaryItems); - + escapeQuotes(userSummary); return userSummary; } - + public QuestionSummary getQuestionSummary(Long contentId, Long questionUid) { QuestionSummary questionSummary = new QuestionSummary(); AssessmentQuestion question = assessmentQuestionDao.getByUid(questionUid); @@ -622,7 +638,8 @@ // new AssessmentQuestionResultComparator()); ArrayList sessionQuestionResults = new ArrayList(); for (AssessmentUser user : users) { - AssessmentResult assessmentResult = assessmentResultDao.getLastFinishedAssessmentResultBySessionId(sessionId, user.getUserId()); + AssessmentResult assessmentResult = assessmentResultDao.getLastFinishedAssessmentResultBySessionId( + sessionId, user.getUserId()); AssessmentQuestionResult questionResult = null; if (assessmentResult == null) { questionResult = new AssessmentQuestionResult(); @@ -641,32 +658,33 @@ questionResults.add(sessionQuestionResults); } questionSummary.setQuestionResultsPerSession(questionResults); - + int count = 0; float total = 0; - for(List sessionQuestionResults : questionResults) { + for (List sessionQuestionResults : questionResults) { for (AssessmentQuestionResult questionResult : sessionQuestionResults) { if (questionResult.getUid() != null) { count++; total += questionResult.getMark(); } } } - float averageMark = (count == 0) ? 0 : total/count; + float averageMark = (count == 0) ? 0 : total / count; questionSummary.setAverageMark(averageMark); - + escapeQuotes(questionSummary); - + return questionSummary; } - + public void changeQuestionResultMark(Long questionResultUid, float newMark) { - AssessmentQuestionResult questionResult = assessmentQuestionResultDao.getAssessmentQuestionResultByUid(questionResultUid); + AssessmentQuestionResult questionResult = assessmentQuestionResultDao + .getAssessmentQuestionResultByUid(questionResultUid); float oldMark = questionResult.getMark(); questionResult.setMark(newMark); assessmentQuestionResultDao.saveObject(questionResult); - - AssessmentResult result = assessmentResultDao.getAssessmentResultByUid(questionResult.getResultUid()); + + AssessmentResult result = questionResult.getAssessmentResult(); result.setGrade(result.getGrade() - oldMark + newMark); assessmentResultDao.saveObject(result); } @@ -678,7 +696,7 @@ // ***************************************************************************** // private methods // ***************************************************************************** - + private static void escapeQuotes(Object object) { if (object instanceof UserSummary) { UserSummary userSummary = (UserSummary) object; @@ -713,7 +731,7 @@ } } } - + private static void escapeQuotesInQuestionResult(AssessmentQuestionResult questionResult) { String answerString = questionResult.getAnswerString(); if (answerString != null) { @@ -738,7 +756,7 @@ } } } - + private Assessment getDefaultAssessment() throws AssessmentApplicationException { Long defaultAssessmentId = getToolDefaultContentIdBySignature(AssessmentConstants.TOOL_SIGNATURE); Assessment defaultAssessment = getAssessmentByContentId(defaultAssessmentId); @@ -790,6 +808,15 @@ } return node; } + + /** + * Get a message from the language files with the given key + * @param key + * @return + */ + public String getMessage(String key) { + return messageService.getMessage(key); + } // ***************************************************************************** // set methods for Spring Bean @@ -846,7 +873,6 @@ this.assessmentResultDao = assessmentResultDao; } - // ******************************************************************************* // ToolContentManager, ToolSessionManager methods // ******************************************************************************* @@ -921,12 +947,14 @@ } /** - * Get the definitions for possible output for an activity, based on the toolContentId. These may be definitions - * that are always available for the tool (e.g. number of marks for Multiple Choice) or a custom definition created - * for a particular activity such as the answer to the third question contains the word Koala and hence the need for - * the toolContentId + * Get the definitions for possible output for an activity, based on the + * toolContentId. These may be definitions that are always available for the + * tool (e.g. number of marks for Multiple Choice) or a custom definition + * created for a particular activity such as the answer to the third + * question contains the word Koala and hence the need for the toolContentId * - * @return SortedMap of ToolOutputDefinitions with the key being the name of each definition + * @return SortedMap of ToolOutputDefinitions with the key being the name of + * each definition */ public SortedMap getToolOutputDefinitions(Long toolContentId) throws ToolException { Assessment assessment = getAssessmentByContentId(toolContentId); @@ -1045,8 +1073,8 @@ /** * Get the tool output for the given tool output names. * - * @see org.lamsfoundation.lams.tool.ToolSessionManager#getToolOutput(java.util.List, java.lang.Long, - * java.lang.Long) + * @see org.lamsfoundation.lams.tool.ToolSessionManager#getToolOutput(java.util.List, + * java.lang.Long, java.lang.Long) */ public SortedMap getToolOutput(List names, Long toolSessionId, Long learnerId) { return assessmentOutputFactory.getToolOutput(names, this, toolSessionId, learnerId); @@ -1055,8 +1083,8 @@ /** * Get the tool output for the given tool output name. * - * @see org.lamsfoundation.lams.tool.ToolSessionManager#getToolOutput(java.lang.String, java.lang.Long, - * java.lang.Long) + * @see org.lamsfoundation.lams.tool.ToolSessionManager#getToolOutput(java.lang.String, + * java.lang.Long, java.lang.Long) */ public ToolOutput getToolOutput(String name, Long toolSessionId, Long learnerId) { return assessmentOutputFactory.getToolOutput(name, this, toolSessionId, learnerId); @@ -1070,7 +1098,10 @@ public void import102ToolContent(Long toolContentId, UserDTO user, Hashtable importValues) { } - /** Set the description, throws away the title value as this is not supported in 2.0 */ + /** + * Set the description, throws away the title value as this is not supported + * in 2.0 + */ public void setReflectiveData(Long toolContentId, String title, String description) throws ToolException, DataMissingException { @@ -1118,7 +1149,7 @@ public String getLocalisedMessage(String key, Object[] args) { return messageService.getMessage(key, args); } - + public AssessmentOutputFactory getAssessmentOutputFactory() { return assessmentOutputFactory; } @@ -1136,11 +1167,13 @@ } /** - * Finds out which lesson the given tool content belongs to and returns its monitoring users. + * Finds out which lesson the given tool content belongs to and returns its + * monitoring users. * * @param sessionId - * tool session ID - * @return list of teachers that monitor the lesson which contains the tool with given session ID + * tool session ID + * @return list of teachers that monitor the lesson which contains the tool + * with given session ID */ public List getMonitorsByToolSessionId(Long sessionId) { return getLessonService().getMonitorsByToolSessionId(sessionId); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java,v diff -u -r1.10 -r1.10.2.1 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java 3 Apr 2009 18:38:48 -0000 1.10 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java 15 Jun 2009 00:42:50 -0000 1.10.2.1 @@ -246,4 +246,13 @@ * @return list of teachers that monitor the lesson which contains the tool with given session ID */ public List getMonitorsByToolSessionId(Long sessionId); + + /** + * Get a message from the language files with the given key + * @param key + * @return + */ + public String getMessage(String key); } + + Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java,v diff -u -r1.8.2.1 -r1.8.2.2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java 11 Jun 2009 06:27:38 -0000 1.8.2.1 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java 15 Jun 2009 00:42:50 -0000 1.8.2.2 @@ -27,6 +27,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; @@ -197,9 +198,20 @@ HttpServletResponse response) { String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + String fileName = null; + boolean showUserNames = true; - Long contentId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_CONTENT_ID); + Long contentId = null; + if (sessionMap != null) { + request.setAttribute(AssessmentConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); + contentId = (Long) sessionMap.get(AssessmentConstants.ATTR_TOOL_CONTENT_ID); + showUserNames = true; + } else { + contentId = WebUtil.readLongParam(request, "toolContentID"); + fileName = WebUtil.readStrParam(request, "fileName"); + showUserNames = false; + } + service = getAssessmentService(); Assessment assessment = service.getAssessmentByContentId(contentId); @@ -208,20 +220,26 @@ try { LinkedHashMap dataToExport = new LinkedHashMap(); - ExcelCell[][] summaryData = getSummaryData(assessment); - dataToExport.put(assessment.getTitle(), summaryData); + ExcelCell[][] questionSummaryData = getQuestionSummaryData(assessment, showUserNames); + dataToExport.put(service.getMessage("label.export.summary.by.question"), questionSummaryData); - String fileName = "assessment_export.xls"; - if (assessment.getTitle() != null) { + ExcelCell[][] userSummaryData = getUserSummaryData(assessment, 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 && assessment.getTitle() != null) { fileName = assessment.getTitle().replaceAll(" ", "_") + "_export.xls"; + } else if (fileName == null) { + fileName = "assessment_export.xls"; } 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(); - AssessmentExportXLSUtil.exportAssessmentToExcel(out, "Exported on: ", dataToExport); + AssessmentExportXLSUtil.exportAssessmentToExcel(out, service.getMessage("label.export.exported.on"), + dataToExport); } catch (IOException e) { MonitoringAction.log.error(e); @@ -244,23 +262,25 @@ } @SuppressWarnings("unchecked") - private ExcelCell[][] getSummaryData(Assessment assessment) { + private ExcelCell[][] getUserSummaryData(Assessment assessment, boolean showUserNames) { ArrayList data = new ArrayList(); service = getAssessmentService(); if (assessment != null) { // Create the question summary ExcelCell[] summaryTitle = new ExcelCell[1]; - summaryTitle[0] = new ExcelCell("Question Summary", true); + 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("Question", true); - summaryRowTitle[1] = new ExcelCell("Type", true); - summaryRowTitle[2] = new ExcelCell("Penalty Factor", true); - summaryRowTitle[3] = new ExcelCell("Default Grade", true); - summaryRowTitle[4] = new ExcelCell("Average", true); + 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); @@ -287,7 +307,7 @@ } if (totalGradesPossible.floatValue() > 0) { ExcelCell[] totalCell = new ExcelCell[5]; - totalCell[2] = new ExcelCell("Total", true); + 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); @@ -319,13 +339,29 @@ for (AssessmentUser assessmentUser : assessmentUsers) { - ExcelCell[] userTitleRow = new ExcelCell[5]; - userTitleRow[0] = new ExcelCell("User", true); - userTitleRow[1] = new ExcelCell("Date Attempted", true); - userTitleRow[2] = new ExcelCell("Question", true); - userTitleRow[3] = new ExcelCell("Answer", true); - userTitleRow[4] = new ExcelCell("Grade", true); - data.add(userTitleRow); + 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.getLastAssessmentResult(assessment.getUid(), assessmentUser.getUserId()); @@ -337,21 +373,35 @@ if (assessmentQuestionResults != null) { for (AssessmentQuestionResult assessmentQuestionResult : assessmentQuestionResults) { - ExcelCell[] userResultRow = new ExcelCell[5]; - userResultRow[0] = new ExcelCell(assessmentUser.getLoginName(), false); - userResultRow[1] = new ExcelCell(assessmentResult.getStartDate(), false); - userResultRow[2] = new ExcelCell(assessmentQuestionResult - .getAssessmentQuestion().getTitle(), false); - userResultRow[3] = new ExcelCell(getAnswerObject(assessmentQuestionResult), - false); - userResultRow[4] = new ExcelCell(assessmentQuestionResult.getMark(), false); - data.add(userResultRow); - } + if (showUserNames) { + ExcelCell[] userResultRow = new ExcelCell[6]; + userResultRow[0] = new ExcelCell(assessmentUser.getUserId(), false); + userResultRow[1] = new ExcelCell(assessmentUser.getLoginName(), false); + userResultRow[2] = new ExcelCell(assessmentResult.getStartDate(), false); + userResultRow[3] = new ExcelCell(assessmentQuestionResult + .getAssessmentQuestion().getTitle(), false); + userResultRow[4] = new ExcelCell(getAnswerObject(assessmentQuestionResult), + false); + userResultRow[5] = new ExcelCell(assessmentQuestionResult.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(assessmentQuestionResult + .getAssessmentQuestion().getTitle(), false); + userResultRow[3] = new ExcelCell(getAnswerObject(assessmentQuestionResult), + false); + userResultRow[4] = new ExcelCell(assessmentQuestionResult.getMark(), false); + data.add(userResultRow); + } + } } ExcelCell[] userTotalRow = new ExcelCell[5]; - userTotalRow[3] = new ExcelCell("Total", true); + 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); @@ -368,6 +418,166 @@ return data.toArray(new ExcelCell[][] {}); } + @SuppressWarnings("unchecked") + private ExcelCell[][] getQuestionSummaryData(Assessment assessment, boolean showUserNames) { + ArrayList data = new ArrayList(); + service = getAssessmentService(); + + 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.export.user.id"), true); + summaryRowTitle[3] = new ExcelCell(service + .getMessage("label.monitoring.user.summary.user.name"), true); + summaryRowTitle[4] = new ExcelCell(service.getMessage("label.export.date.attempted"), true); + summaryRowTitle[5] = new ExcelCell(service.getMessage("label.authoring.basic.penalty.factor"), + true); + summaryRowTitle[6] = new ExcelCell(service + .getMessage("label.monitoring.question.summary.default.mark"), 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.export.user.id"), true); + summaryRowTitle[3] = new ExcelCell(service.getMessage("label.export.date.attempted"), true); + summaryRowTitle[4] = new ExcelCell(service.getMessage("label.authoring.basic.penalty.factor"), + true); + summaryRowTitle[5] = new ExcelCell(service + .getMessage("label.monitoring.question.summary.default.mark"), 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.getQuestionSummary(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 assessmentQuestionResult : resultList) { + + if (showUserNames) { + ExcelCell[] userResultRow = new ExcelCell[10]; + userResultRow[0] = new ExcelCell(assessmentQuestionResult.getAssessmentQuestion() + .getTitle(), false); + userResultRow[1] = new ExcelCell(getQuestionTypeLanguageLabel(assessmentQuestionResult + .getAssessmentQuestion().getType()), false); + userResultRow[2] = new ExcelCell(assessmentQuestionResult.getUser().getUserId(), false); + userResultRow[3] = new ExcelCell(assessmentQuestionResult.getUser().getLoginName(), + false); + userResultRow[4] = new ExcelCell(assessmentQuestionResult.getFinishDate(), false); + userResultRow[5] = new ExcelCell(new Float(assessmentQuestionResult + .getAssessmentQuestion().getPenaltyFactor()), false); + userResultRow[6] = new ExcelCell(new Long(assessmentQuestionResult + .getAssessmentQuestion().getDefaultGrade()), false); + userResultRow[7] = new ExcelCell(getAnswerObject(assessmentQuestionResult), false); + + Date startDate = assessmentQuestionResult.getAssessmentResult().getStartDate(); + Date finishDate = assessmentQuestionResult.getFinishDate(); + if (startDate != null && finishDate != null) { + Long seconds = (finishDate.getTime() - startDate.getTime()) / 1000; + userResultRow[8] = new ExcelCell(seconds, false); + timeTakenCount++; + timeTakenTotal += seconds; + } + + userResultRow[9] = new ExcelCell(assessmentQuestionResult.getMark(), false); + + if (assessmentQuestionResult.getMark() != null) { + markCount++; + markTotal += assessmentQuestionResult.getMark(); + } + + data.add(userResultRow); + } else { + ExcelCell[] userResultRow = new ExcelCell[9]; + userResultRow[0] = new ExcelCell(assessmentQuestionResult.getAssessmentQuestion() + .getTitle(), false); + userResultRow[1] = new ExcelCell(getQuestionTypeLanguageLabel(assessmentQuestionResult + .getAssessmentQuestion().getType()), false); + userResultRow[2] = new ExcelCell(assessmentQuestionResult.getUser().getUserId(), false); + userResultRow[3] = new ExcelCell(assessmentQuestionResult.getFinishDate(), false); + userResultRow[4] = new ExcelCell(new Float(assessmentQuestionResult + .getAssessmentQuestion().getPenaltyFactor()), false); + userResultRow[5] = new ExcelCell(new Long(assessmentQuestionResult + .getAssessmentQuestion().getDefaultGrade()), false); + userResultRow[6] = new ExcelCell(getAnswerObject(assessmentQuestionResult), false); + + Date startDate = assessmentQuestionResult.getAssessmentResult().getStartDate(); + Date finishDate = assessmentQuestionResult.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(assessmentQuestionResult.getMark(), false); + + if (assessmentQuestionResult.getMark() != null) { + markCount++; + markTotal += assessmentQuestionResult.getMark(); + } + + data.add(userResultRow); + } + + } + } + + // Calculating the averages + ExcelCell[] 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[][] {}); + } + private String getQuestionTypeLanguageLabel(short type) { switch (type) { case AssessmentConstants.QUESTION_TYPE_ESSAY: