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.19 -r1.20 --- lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties 20 Mar 2009 16:39:38 -0000 1.19 +++ lams_tool_assessment/conf/language/lams/ApplicationResources_en_AU.properties 25 Mar 2009 22:46:28 -0000 1.20 @@ -228,11 +228,17 @@ label.monitoring.question.summary.average.mark =Average mark label.monitoring.question.summary.group =Group: label.monitoring.question.summary.ok =Ok +label.export.portfolio.activity.summary =Activity Summary +label.export.portfolio.question.summaries =Question summaries label.resoruce.to.review =Resources to view -message.monitoring.edit.activity.not.editable =This Activity is no longer editable +message.monitoring.edit.activity.not.editable =This Activity is no longer editable. +output.desc.learner.total.score =User's total score +output.desc.learner.time.taken =Time taken +output.desc.learner.number.of.attempts =Number of attempts made by user +output.user.score.for.question =User's score for the question: export.label.resource =Resource export.label.no.learning.object =No offline package available -export.title =Export portfolio of Share Resource +export.title =Export portfolio of Assessment tool export.init.resource =Initial Resources errors.header = errors.footer = Index: lams_tool_assessment/conf/xdoclet/struts-actions.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/conf/xdoclet/struts-actions.xml,v diff -u -r1.10 -r1.11 --- lams_tool_assessment/conf/xdoclet/struts-actions.xml 19 Mar 2009 22:06:53 -0000 1.10 +++ lams_tool_assessment/conf/xdoclet/struts-actions.xml 25 Mar 2009 22:46:29 -0000 1.11 @@ -224,6 +224,11 @@ parameter="summary" > + + + 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.11 -r1.12 --- lams_tool_assessment/db/sql/create_lams_tool_assessment.sql 11 Mar 2009 16:07:01 -0000 1.11 +++ lams_tool_assessment/db/sql/create_lams_tool_assessment.sql 25 Mar 2009 22:46:28 -0000 1.12 @@ -62,8 +62,6 @@ shuffle tinyint, case_sensitive tinyint, correct_answer tinyint DEFAULT 0, - hide tinyint, - create_by_author tinyint, create_date datetime, create_by bigint, assessment_uid bigint, Index: lams_tool_assessment/db/sql/tool_insert.sql =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/db/sql/tool_insert.sql,v diff -u -r1.1 -r1.2 --- lams_tool_assessment/db/sql/tool_insert.sql 29 Jan 2009 05:59:05 -0000 1.1 +++ lams_tool_assessment/db/sql/tool_insert.sql 25 Mar 2009 22:46:28 -0000 1.2 @@ -30,7 +30,8 @@ classpath_addition, context_file, create_date_time, -modified_date_time +modified_date_time, +supports_outputs ) VALUES ( @@ -60,5 +61,6 @@ 'lams-tool-laasse10.jar', '/org/lamsfoundation/lams/tool/assessment/assessmentApplicationContext.xml', NOW(), -NOW() +NOW(), +1 ) Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java,v diff -u -r1.13 -r1.14 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java 19 Mar 2009 22:06:53 -0000 1.13 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/AssessmentConstants.java 25 Mar 2009 22:46:28 -0000 1.14 @@ -163,6 +163,8 @@ public static final String ATTR_USER_SUMMARY = "userSummary"; public static final String ATTR_QUESTION_SUMMARY = "questionSummary"; + + public static final String ATTR_QUESTION_SUMMARY_LIST = "questionSummaryList"; public static final String ATTR_USER_LIST = "userList"; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/assessmentApplicationContext.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/assessmentApplicationContext.xml,v diff -u -r1.5 -r1.6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/assessmentApplicationContext.xml 19 Mar 2009 22:06:53 -0000 1.5 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/assessmentApplicationContext.xml 25 Mar 2009 22:46:28 -0000 1.6 @@ -34,6 +34,11 @@ + + + + + @@ -131,6 +136,9 @@ + + + Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java,v diff -u -r1.6 -r1.7 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java 20 Mar 2009 16:39:38 -0000 1.6 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentResultDAOHibernate.java 25 Mar 2009 22:46:28 -0000 1.7 @@ -26,7 +26,6 @@ import java.util.List; import org.lamsfoundation.lams.tool.assessment.dao.AssessmentResultDAO; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; public class AssessmentResultDAOHibernate extends BaseDAOHibernate implements AssessmentResultDAO { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/JQGridJSONModel.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/Attic/JQGridJSONModel.java,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/JQGridJSONModel.java 25 Mar 2009 22:46:28 -0000 1.1 @@ -0,0 +1,95 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id: JQGridJSONModel.java,v 1.1 2009/03/25 22:46:28 andreyb Exp $ */ +package org.lamsfoundation.lams.tool.assessment.dto; + +import java.util.List; + +public class JQGridJSONModel { + + private String page; + private String total; + private Integer records; + private List rows; + + /** + * @return the page + */ + public String getPage() { + return page; + } + + /** + * @param page + * the page to set + */ + public void setPage(String page) { + this.page = page; + } + + /** + * @return the total + */ + public String getTotal() { + return total; + } + + /** + * @param total + * the total to set + */ + public void setTotal(String total) { + this.total = total; + } + + /** + * @return the records + */ + public Integer getRecords() { + return records; + } + + /** + * @param records + * the records to set + */ + public void setRecords(Integer records) { + this.records = records; + } + + /** + * @return the rows + */ + public List getRows() { + return rows; + } + + /** + * @param rows + * the rows to set + */ + public void setRows(List rows) { + this.rows = rows; + } + +} Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/JQGridRow.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/Attic/JQGridRow.java,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/JQGridRow.java 25 Mar 2009 22:46:28 -0000 1.1 @@ -0,0 +1,47 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id: JQGridRow.java,v 1.1 2009/03/25 22:46:28 andreyb Exp $ */ +package org.lamsfoundation.lams.tool.assessment.dto; + +import java.util.List; + +public class JQGridRow { + + private Integer id; + private List cell; + + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + public List getCell() { + return cell; + } + public void setCell(List cell) { + this.cell = cell; + } + +} + \ No newline at end of file Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/QuestionSummary.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/QuestionSummary.java,v diff -u -r1.1 -r1.2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/QuestionSummary.java 19 Mar 2009 22:06:53 -0000 1.1 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/QuestionSummary.java 25 Mar 2009 22:46:28 -0000 1.2 @@ -23,12 +23,10 @@ /* $Id$ */ package org.lamsfoundation.lams.tool.assessment.dto; -import java.util.Date; import java.util.List; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; /** * List contains following element:
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/UserSummary.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/UserSummary.java,v diff -u -r1.1 -r1.2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/UserSummary.java 17 Mar 2009 22:40:48 -0000 1.1 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/UserSummary.java 25 Mar 2009 22:46:28 -0000 1.2 @@ -26,7 +26,6 @@ import java.util.Date; import java.util.List; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentResult; import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; /** Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/UserSummaryItem.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/UserSummaryItem.java,v diff -u -r1.1 -r1.2 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/UserSummaryItem.java 17 Mar 2009 22:40:48 -0000 1.1 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/UserSummaryItem.java 25 Mar 2009 22:46:28 -0000 1.2 @@ -23,12 +23,10 @@ /* $Id$ */ package org.lamsfoundation.lams.tool.assessment.dto; -import java.util.Date; import java.util.List; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestionResult; -import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; /** * List contains following element:
Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.hbm.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Attic/AssessmentQuestion.hbm.xml,v diff -u -r1.5 -r1.6 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.hbm.xml 25 Feb 2009 22:16:33 -0000 1.5 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestion.hbm.xml 25 Mar 2009 22:46:28 -0000 1.6 @@ -147,22 +147,6 @@ /> - - - - getToolOutputDefinitions(Object toolContentObject) { + + TreeMap definitionMap = new TreeMap(); + + ToolOutputDefinition definition = buildRangeDefinition(OUTPUT_NAME_LEARNER_TOTAL_SCORE, new Long(0), null); + definitionMap.put(OUTPUT_NAME_LEARNER_TOTAL_SCORE, definition); + + definition = buildRangeDefinition(OUTPUT_NAME_LEARNER_TIME_TAKEN, new Long(0), null); + definitionMap.put(OUTPUT_NAME_LEARNER_TIME_TAKEN, definition); + + definition = buildRangeDefinition(OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS, new Long(0), null); + definitionMap.put(OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS, definition); + + if (toolContentObject != null) { + + Assessment assessment = (Assessment) toolContentObject; + + Set questions = assessment.getQuestions(); + for(AssessmentQuestion question : questions) { + definition = buildRangeDefinition(String.valueOf(question.getSequenceId()), new Long(0), null); + definition.setDescription(getI18NText("output.user.score.for.question", false) + question.getTitle()); + definitionMap.put(String.valueOf(question.getSequenceId()), definition); + }; + } + + return definitionMap; + } + + public SortedMap getToolOutput(List names, IAssessmentService assessmentService, Long toolSessionId, + Long learnerId) { + + TreeMap output = new TreeMap(); + + AssessmentSession session = assessmentService.getAssessmentSessionBySessionId(toolSessionId); + if ((session != null) && (session.getAssessment() != null)) { + Assessment assessment = session.getAssessment(); + + if (names == null || names.contains(OUTPUT_NAME_LEARNER_TOTAL_SCORE)) { + output.put(OUTPUT_NAME_LEARNER_TOTAL_SCORE, getTotalScore(assessmentService, learnerId, assessment)); + } + if (names == null || names.contains(OUTPUT_NAME_LEARNER_TIME_TAKEN)) { + output.put(OUTPUT_NAME_LEARNER_TIME_TAKEN, getTimeTaken(assessmentService, learnerId, assessment)); + } + if (names == null || names.contains(OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS)) { + output.put(OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS, getNumberAttempts(assessmentService, learnerId, assessment)); + } + Set questions = assessment.getQuestions(); + for(AssessmentQuestion question : questions) { + if (names == null || names.contains(String.valueOf(question.getSequenceId()))) { + output.put(OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS, getQuestionScore(assessmentService, learnerId, assessment, question.getSequenceId())); + } + } + } + + return output; + } + + public ToolOutput getToolOutput(String name, IAssessmentService assessmentService, Long toolSessionId, Long learnerId) { + if (name != null) { + AssessmentSession session = assessmentService.getAssessmentSessionBySessionId(toolSessionId); + + if ((session != null) && (session.getAssessment() != null)) { + Assessment assessment = session.getAssessment(); + + if (name.equals(OUTPUT_NAME_LEARNER_TOTAL_SCORE)) { + return getTotalScore(assessmentService, learnerId, assessment); + } else if (name.equals(OUTPUT_NAME_LEARNER_TIME_TAKEN)) { + return getTimeTaken(assessmentService, learnerId, assessment); + } else if (name.equals(OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS)) { + return getNumberAttempts(assessmentService, learnerId, assessment); + } else { + Set questions = assessment.getQuestions(); + for(AssessmentQuestion question : questions) { + if (name.equals(String.valueOf(question.getSequenceId()))) { + return getQuestionScore(assessmentService, learnerId, assessment, question.getSequenceId()); + } + } + } + } + } + return null; + } + + /** + * Get total score for a user. Will always return a ToolOutput object. + */ + private ToolOutput getTotalScore(IAssessmentService assessmentService, Long learnerId, Assessment assessment) { + AssessmentResult assessmentResult = assessmentService.getLastAssessmentResult(assessment.getUid(), learnerId); + + float totalScore = (assessmentResult == null) ? 0 : assessmentResult.getGrade(); + + return new ToolOutput(AssessmentOutputFactory.OUTPUT_NAME_LEARNER_TOTAL_SCORE, getI18NText( + AssessmentOutputFactory.OUTPUT_NAME_LEARNER_TOTAL_SCORE, true), totalScore); + } + + /** + * Get time taken for a specific user to accomplish this assessment. Will always return a ToolOutput object. + */ + private ToolOutput getTimeTaken(IAssessmentService assessmentService, Long learnerId, Assessment assessment) { + AssessmentResult assessmentResult = assessmentService.getLastAssessmentResult(assessment.getUid(), learnerId); + + long timeTaken = 0; + if ((assessmentResult != null) && (assessmentResult.getFinishDate() != null)) { + timeTaken = (assessmentResult.getFinishDate().getTime() - assessmentResult.getStartDate().getTime()) / 1000; + } + + return new ToolOutput(AssessmentOutputFactory.OUTPUT_NAME_LEARNER_TIME_TAKEN, getI18NText( + AssessmentOutputFactory.OUTPUT_NAME_LEARNER_TIME_TAKEN, true), timeTaken); + } + + /** + * Get the number of attempts done by user. Will always return a ToolOutput object. + */ + private ToolOutput getNumberAttempts(IAssessmentService assessmentService, Long learnerId, Assessment assessment) { + int numberAttempts = assessmentService.getAssessmentResultCount(assessment.getUid(), learnerId); + + return new ToolOutput(AssessmentOutputFactory.OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS, getI18NText( + AssessmentOutputFactory.OUTPUT_NAME_LEARNER_NUMBER_ATTEMPTS, true), numberAttempts); + } + + /** + * Get user's score for the question. Will always return a ToolOutput object. + */ + private ToolOutput getQuestionScore(IAssessmentService assessmentService, Long learnerId, Assessment assessment, + int questionSequenceId) { + AssessmentResult assessmentResult = assessmentService.getLastAssessmentResult(assessment.getUid(), learnerId); + + float questionScore = 0; + for (AssessmentQuestionResult questionResult : assessmentResult.getQuestionResults()) { + if (questionResult.getAssessmentQuestion().getSequenceId() == questionSequenceId) { + questionScore = questionResult.getMark(); + break; + } + } + + return new ToolOutput(String.valueOf(questionSequenceId), "description", questionScore); + } + +} 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.12 -r1.13 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java 20 Mar 2009 16:39:38 -0000 1.12 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java 25 Mar 2009 22:46:28 -0000 1.13 @@ -35,7 +35,6 @@ import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; -import java.util.TreeMap; import java.util.TreeSet; import java.util.regex.Pattern; @@ -129,6 +128,8 @@ private AssessmentToolContentHandler assessmentToolContentHandler; private MessageService messageService; + + private AssessmentOutputFactory assessmentOutputFactory; // system services private IRepositoryService repositoryService; @@ -310,80 +311,6 @@ return questions; } - public List exportBySessionId(Long sessionId, boolean skipHide) { - AssessmentSession session = assessmentSessionDao.getSessionBySessionId(sessionId); - if (session == null) { - AssessmentServiceImpl.log.error("Failed get AssessmentSession by ID [" + sessionId + "]"); - return null; - } - // initial assessment questions list - List questionList = new ArrayList(); -// Set resList = session.getAssessment().getQuestions(); -// for (AssessmentQuestion question : resList) { -// if (skipHide && question.isHide()) { -// continue; -// } -// // if question is create by author -// if (question.isCreateByAuthor()) { -// Summary sum = new Summary(session.getSessionId(), session.getSessionName(), question, false); -// questionList.add(sum); -// } -// } -// -// // get this session's all assessment questions -// Set sessList = session.getAssessmentQuestions(); -// for (AssessmentQuestion question : sessList) { -// if (skipHide && question.isHide()) { -// continue; -// } -// -// // to skip all question create by author -// if (!question.isCreateByAuthor()) { -// Summary sum = new Summary(session.getSessionId(), session.getSessionName(), question, false); -// questionList.add(sum); -// } -// } - - return questionList; - } - - public List> exportByContentId(Long contentId) { - Assessment assessment = assessmentDao.getByContentId(contentId); - List> groupList = new ArrayList(); - -// // create init assessment questions list -// List initList = new ArrayList(); -// groupList.add(initList); -// Set resList = assessment.getQuestions(); -// for (AssessmentQuestion question : resList) { -// if (question.isCreateByAuthor()) { -// Summary sum = new Summary(null, null, question, true); -// initList.add(sum); -// } -// } -// -// // session by session -// List sessionList = assessmentSessionDao.getByContentId(contentId); -// for (AssessmentSession session : sessionList) { -// List group = new ArrayList(); -// // get this session's all assessment questions -// Set sessList = session.getAssessmentQuestions(); -// for (AssessmentQuestion question : sessList) { -// // to skip all question create by author -// if (!question.isCreateByAuthor()) { -// Summary sum = new Summary(session.getSessionId(), session.getSessionName(), question, false); -// group.add(sum); -// } -// } -// if (group.size() == 0) { -// group.add(new Summary(session.getSessionId(), session.getSessionName(), null, false)); -// } -// groupList.add(group); -// } - - return groupList; - } - public Assessment getAssessmentBySessionId(Long sessionId) { AssessmentSession session = assessmentSessionDao.getSessionBySessionId(sessionId); // to skip CGLib problem @@ -620,18 +547,30 @@ summary.setAssessmentResults(assessmentResults); summaryList.add(summary); } + + escapeQuotes(summaryList); return summaryList; } + public AssessmentResult getUserMasterDetail(Long sessionId, Long 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.getLastFinishedAssessmentResult(sessionId, userId); + 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) { @@ -659,6 +598,8 @@ userSummaryItems.add(userSummaryItem); } userSummary.setUserSummaryItems(userSummaryItems); + + escapeQuotes(userSummary); return userSummary; } @@ -711,6 +652,8 @@ float averageMark = (count == 0) ? 0 : total/count; questionSummary.setAverageMark(averageMark); + escapeQuotes(questionSummary); + return questionSummary; } @@ -732,6 +675,67 @@ // ***************************************************************************** // private methods // ***************************************************************************** + + private static void escapeQuotes(Object object) { + if (object instanceof UserSummary) { + UserSummary userSummary = (UserSummary) object; + for (UserSummaryItem userSummaryItem : userSummary.getUserSummaryItems()) { + for (AssessmentQuestionResult questionResult : userSummaryItem.getQuestionResults()) { + escapeQuotesInQuestionResult(questionResult); + } + } + } else if (object instanceof QuestionSummary) { + QuestionSummary questionSummary = (QuestionSummary) object; + + for (List sessionQuestionResults : questionSummary.getQuestionResultsPerSession()) { + for (AssessmentQuestionResult questionResult : sessionQuestionResults) { + escapeQuotesInQuestionResult(questionResult); + } + } + } else if (object instanceof List) { + List summaryList = (List) object; + + for (Summary summary : summaryList) { + for (AssessmentResult result : summary.getAssessmentResults()) { + for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { + escapeQuotesInQuestionResult(questionResult); + } + } + } + } else if (object instanceof AssessmentResult) { + AssessmentResult assessmentResult = (AssessmentResult) object; + + for (AssessmentQuestionResult questionResult : assessmentResult.getQuestionResults()) { + escapeQuotesInQuestionResult(questionResult); + } + } + } + + private static void escapeQuotesInQuestionResult(AssessmentQuestionResult questionResult) { + String answerString = questionResult.getAnswerString(); + if (answerString != null) { + questionResult.setAnswerString(answerString.replaceAll("[\"]", """)); + } + + AssessmentQuestion question = questionResult.getAssessmentQuestion(); + String title = question.getTitle(); + if (title != null) { + question.setTitle(title.replaceAll("[\"]", """)); + } + + for (AssessmentQuestionOption questionOption : question.getQuestionOptions()) { + String questionStr = questionOption.getQuestion(); + if (questionStr != null) { + questionOption.setQuestion(questionStr.replaceAll("[\"]", """)); + } + + String optionStr = questionOption.getOptionString(); + if (optionStr != null) { + questionOption.setOptionString(optionStr.replaceAll("[\"]", """)); + } + } + } + private Assessment getDefaultAssessment() throws AssessmentApplicationException { Long defaultAssessmentId = getToolDefaultContentIdBySignature(AssessmentConstants.TOOL_SIGNATURE); Assessment defaultAssessment = getAssessmentByContentId(defaultAssessmentId); @@ -922,7 +926,11 @@ * @return SortedMap of ToolOutputDefinitions with the key being the name of each definition */ public SortedMap getToolOutputDefinitions(Long toolContentId) throws ToolException { - return new TreeMap(); + Assessment assessment = getAssessmentByContentId(toolContentId); + if (assessment == null) { + assessment = getDefaultAssessment(); + } + return getAssessmentOutputFactory().getToolOutputDefinitions(assessment); } public void copyToolContent(Long fromContentId, Long toContentId) throws ToolException { @@ -1038,7 +1046,7 @@ * java.lang.Long) */ public SortedMap getToolOutput(List names, Long toolSessionId, Long learnerId) { - return new TreeMap(); + return assessmentOutputFactory.getToolOutput(names, this, toolSessionId, learnerId); } /** @@ -1048,7 +1056,7 @@ * java.lang.Long) */ public ToolOutput getToolOutput(String name, Long toolSessionId, Long learnerId) { - return null; + return assessmentOutputFactory.getToolOutput(name, this, toolSessionId, learnerId); } /* ===============Methods implemented from ToolContentImport102Manager =============== */ @@ -1107,7 +1115,15 @@ public String getLocalisedMessage(String key, Object[] args) { return messageService.getMessage(key, args); } + + public AssessmentOutputFactory getAssessmentOutputFactory() { + return assessmentOutputFactory; + } + public void setAssessmentOutputFactory(AssessmentOutputFactory assessmentOutputFactory) { + this.assessmentOutputFactory = assessmentOutputFactory; + } + public ILessonService getLessonService() { return lessonService; } 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.8 -r1.9 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java 19 Mar 2009 22:06:53 -0000 1.8 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/IAssessmentService.java 25 Mar 2009 22:46:28 -0000 1.9 @@ -200,6 +200,8 @@ */ List getSummaryList(Long contentId); + AssessmentResult getUserMasterDetail(Long sessionId, Long userId); + /** * Return user summary. This summary contains list of all attempts made by user. * @@ -214,19 +216,6 @@ void changeQuestionResultMark(Long questionResultUid, float newMark); /** - * Get assessment question Summary list according to sessionId and skipHide flag. - * - * @param sessionId - * @param skipHide - * true, don't get assessment question if its isHide flag is true. Otherwise, get all assessment - * question - * @return - */ - public List exportBySessionId(Long sessionId, boolean skipHide); - - public List> exportByContentId(Long contentId); - - /** * Get user by UID * * @param uid Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentBundler.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentBundler.java,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentBundler.java 25 Mar 2009 22:46:28 -0000 1.1 @@ -0,0 +1,135 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id: AssessmentBundler.java,v 1.1 2009/03/25 22:46:28 andreyb Exp $ */ +package org.lamsfoundation.lams.tool.assessment.util; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +import org.lamsfoundation.lams.learning.export.web.action.Bundler; +import org.lamsfoundation.lams.tool.assessment.AssessmentConstants; +import org.lamsfoundation.lams.util.Configuration; +import org.lamsfoundation.lams.util.ConfigurationKeys; +import org.lamsfoundation.lams.util.HttpUrlConnectionUtil; + +public class AssessmentBundler extends Bundler { + + public AssessmentBundler() { + } + + /** + * This method bundles the files to the given output dir + * + * @param request + * the request for the export + * @param cookies + * cookies for the request + * @param outputDirectory + * the location where the files should be written + * @throws Exception + */ + public void bundle(HttpServletRequest request, Cookie[] cookies, String outputDirectory) throws Exception { + bundleViaHTTP(request, cookies, outputDirectory); + } + + /** + * See bundle + * + * @param request + * @param cookies + * @param outputDirectory + * @throws MalformedURLException + * @throws FileNotFoundException + * @throws IOException + */ + private void bundleViaHTTP(HttpServletRequest request, Cookie[] cookies, String outputDirectory) + throws MalformedURLException, FileNotFoundException, IOException { + String[] directoriesNames = { "jqGrid" + File.separator + "min", + "images" + File.separator + "jqGrid.basic.theme", "css" }; + List directories = new ArrayList(); + for (String directoryName : directoriesNames) { + directories.add(outputDirectory + File.separator + "javascript" + File.separator + directoryName); + } + this.createDirectories(directories); + + String[] imageNames = new String[] { "cd_run.gif", "dirty.gif", "down.gif", + "find.gif", "first.gif", "folder.png", "grid-blue-ft.gif", "grid-blue-hd.gif", "headerbg.gif", + "headerleft.gif", "headerright.gif", "ico-close.gif", "last.gif", "leaf.gif", "line3.gif", + "loading.gif", "minus.gif", "next.gif", "nochild.gif", "off-first.gif", "off-last.gif", "off-next.gif", + "off-prev.gif", "plus.gif", "prev.gif", "refresh.gif", "resize.gif", "row_add.gif", "row_delete.gif", + "row_edit.gif", "sort_asc.gif", "sort_desc.gif", "spacer.gif", "tab_close-on.gif", "tree_leaf.gif", + "tree_minus.gif", "tree_plus.gif", "up.gif" }; + + for (String imageName : imageNames) { + String urlToConnectTo = getIncludesFolder() + "images" + File.separator + "jqGrid.basic.theme" + File.separator + imageName; + String directoryToStoreFile = outputDirectory + File.separator + "javascript" + File.separator + "images" + File.separator + "jqGrid.basic.theme"; + HttpUrlConnectionUtil.writeResponseToFile(urlToConnectTo, directoryToStoreFile, imageName, cookies);// cookies aren't really needed here. + } + + String urlToConnectTo = getIncludesFolder() + "javascript" + File.separator + "jquery.jqGrid.js"; + String directoryToStoreFile = outputDirectory + File.separator + "javascript"; + HttpUrlConnectionUtil.writeResponseToFile(urlToConnectTo, directoryToStoreFile, "jquery.jqGrid.js", cookies); + + urlToConnectTo = getIncludesFolder() + "javascript" + File.separator + "jquery-1.2.6.pack.js"; + directoryToStoreFile = outputDirectory + File.separator + "javascript"; + HttpUrlConnectionUtil.writeResponseToFile(urlToConnectTo, directoryToStoreFile, "jquery-1.2.6.pack.js", cookies); + + String[] jsFileNames = new String[] { "grid.locale-en-min.js", "grid.base-min.js", "grid.celledit-min.js", "grid.common-min.js", + "grid.custom-min.js", "grid.formedit-min.js", "grid.import-min.js", "grid.inlinedit-min.js", + "grid.postext-min.js", "grid.setcolumns-min.js", "grid.subgrid-min.js", "grid.tbltogrid-min.js", + "grid.treegrid-min.js", "jquery.fmatter-min.js", "json2-min.js", "JsonXml-min.js" }; + + for (String jsFileName : jsFileNames) { + urlToConnectTo = getIncludesFolder() + "javascript" + File.separator + "jqGrid" + File.separator + "min" + File.separator + jsFileName; + directoryToStoreFile = outputDirectory + File.separator + "javascript" + File.separator + "jqGrid" + File.separator + "min"; + HttpUrlConnectionUtil.writeResponseToFile(urlToConnectTo, directoryToStoreFile, jsFileName, cookies);// cookies aren't really needed here. + } + + urlToConnectTo = getIncludesFolder() + "css" + File.separator + "jqGrid.grid.css"; + directoryToStoreFile = outputDirectory + File.separator + "javascript" + File.separator + "css"; + HttpUrlConnectionUtil.writeResponseToFile(urlToConnectTo, directoryToStoreFile, "jqGrid.grid.css", cookies); + + } + + private String getIncludesFolder() { + String spreadsheetUrlPath = Configuration.get(ConfigurationKeys.SERVER_URL); + if (spreadsheetUrlPath == null) { + log.error("Unable to get path to the LAMS Spreadsheet URL from the configuration table. Spreadsheet javascript files export failed"); + return ""; + } else { + spreadsheetUrlPath = spreadsheetUrlPath + File.separator + "tool" + File.separator + + AssessmentConstants.TOOL_SIGNATURE + File.separator + "includes" + File.separator; + return spreadsheetUrlPath; + } + } + +} Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java,v diff -u -r1.14 -r1.15 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java 11 Mar 2009 16:07:01 -0000 1.14 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/AuthoringAction.java 25 Mar 2009 22:46:28 -0000 1.15 @@ -1196,8 +1196,6 @@ question.setTitle(questionForm.getTitle()); question.setQuestion(questionForm.getQuestion()); - question.setCreateByAuthor(true); - question.setHide(false); question.setDefaultGrade(Integer.parseInt(questionForm.getDefaultGrade())); question.setGeneralFeedback(questionForm.getGeneralFeedback()); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java,v diff -u -r1.11 -r1.12 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java 17 Mar 2009 22:37:16 -0000 1.11 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/LearningAction.java 25 Mar 2009 22:46:28 -0000 1.12 @@ -197,9 +197,7 @@ if (question.getCreateBy() != null) { question.getCreateBy().getLoginName(); } - if (!question.isHide()) { - questionList.add(question); - } + questionList.add(question); } } 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.6 -r1.7 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java 20 Mar 2009 16:39:38 -0000 1.6 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/action/MonitoringAction.java 25 Mar 2009 22:46:28 -0000 1.7 @@ -25,6 +25,7 @@ package org.lamsfoundation.lams.tool.assessment.web.action; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; @@ -38,6 +39,8 @@ import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.lamsfoundation.lams.tool.assessment.AssessmentConstants; +import org.lamsfoundation.lams.tool.assessment.dto.JQGridJSONModel; +import org.lamsfoundation.lams.tool.assessment.dto.JQGridRow; import org.lamsfoundation.lams.tool.assessment.dto.QuestionSummary; import org.lamsfoundation.lams.tool.assessment.dto.Summary; import org.lamsfoundation.lams.tool.assessment.dto.UserSummary; @@ -66,6 +69,9 @@ if (param.equals("summary")) { return summary(mapping, form, request, response); } + if (param.equals("userMasterDetail")) { + return userMasterDetail(mapping, form, request, response); + } if (param.equals("questionSummary")) { return questionSummary(mapping, form, request, response); } @@ -89,14 +95,6 @@ Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); IAssessmentService service = getAssessmentService(); List summaryList = service.getSummaryList(contentId); - - for (Summary summary : summaryList) { - for (AssessmentResult result : summary.getAssessmentResults()) { - for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { - escapeQuotesInQuestionResult(questionResult); - } - } - } Assessment assessment = service.getAssessmentByContentId(contentId); assessment.toDTO(); @@ -110,7 +108,44 @@ AttributeNames.PARAM_CONTENT_FOLDER_ID)); return mapping.findForward(AssessmentConstants.SUCCESS); } + + private ActionForward userMasterDetail(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) { + Long userId = WebUtil.readLongParam(request, AttributeNames.PARAM_USER_ID); + Long sessionId = WebUtil.readLongParam(request, AssessmentConstants.PARAM_SESSION_ID); + IAssessmentService service = getAssessmentService(); + AssessmentResult result = service.getUserMasterDetail(sessionId, userId); + +// // Construct the json data +// JQGridJSONModel json = new JQGridJSONModel(); +// json.setPage("1"); +// int records = (result.getQuestionResults() == null) ? 0 : result.getQuestionResults().size(); +// json.setRecords(records); +// json.setTotal("1"); +// +// List rows = new ArrayList(); +// +// for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { +// JQGridRow row = new JQGridRow(); +// row.setId(questionResult.getAssessmentQuestion().getSequenceId()); +// List cells = new ArrayList(); +// cells.add(questionResult.getUid().toString()); +// cells.add(questionResult.getFinishDate().toString()); +// cells.add(questionResult.getAnswerString()); +// cells.add(questionResult.getMark().toString()); +// row.setCell(cells); +// rows.add(row); +// } +// json.setRows(rows); +// +// JSONSerializer serializer = new JSONSerializer(); +// String jsonResult = serializer.exclude("*.class").deepSerialize(json); + + request.setAttribute(AssessmentConstants.ATTR_ASSESSMENT_RESULT, result); + return mapping.findForward(AssessmentConstants.SUCCESS); + } + private ActionForward questionSummary(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { String sessionMapID = request.getParameter(AssessmentConstants.ATTR_SESSION_MAP_ID); @@ -125,12 +160,6 @@ IAssessmentService service = getAssessmentService(); QuestionSummary questionSummary = service.getQuestionSummary(contentId, questionUid); - for (List sessionQuestionResults : questionSummary.getQuestionResultsPerSession()) { - for (AssessmentQuestionResult questionResult : sessionQuestionResults) { - escapeQuotesInQuestionResult(questionResult); - } - } - request.setAttribute(AssessmentConstants.ATTR_QUESTION_SUMMARY, questionSummary); return mapping.findForward(AssessmentConstants.SUCCESS); } @@ -147,12 +176,6 @@ IAssessmentService service = getAssessmentService(); UserSummary userSummary = service.getUserSummary(contentId, userId, sessionId); - for (UserSummaryItem userSummaryItem : userSummary.getUserSummaryItems()) { - for (AssessmentQuestionResult questionResult : userSummaryItem.getQuestionResults()) { - escapeQuotesInQuestionResult(questionResult); - } - } - request.setAttribute(AssessmentConstants.ATTR_USER_SUMMARY, userSummary); return mapping.findForward(AssessmentConstants.SUCCESS); } @@ -179,29 +202,5 @@ .getServletContext()); return (IAssessmentService) wac.getBean(AssessmentConstants.ASSESSMENT_SERVICE); } - - private void escapeQuotesInQuestionResult(AssessmentQuestionResult questionResult) { - String answerString = questionResult.getAnswerString(); - if (answerString != null) { - questionResult.setAnswerString(answerString.replaceAll("[\"]", """)); - } - AssessmentQuestion question = questionResult.getAssessmentQuestion(); - String title = question.getTitle(); - if (title != null) { - question.setTitle(title.replaceAll("[\"]", """)); - } - - for (AssessmentQuestionOption questionOption : question.getQuestionOptions()) { - String questionStr = questionOption.getQuestion(); - if (questionStr != null) { - questionOption.setQuestion(questionStr.replaceAll("[\"]", """)); - } - - String optionStr = questionOption.getOptionString(); - if (optionStr != null) { - questionOption.setOptionString(optionStr.replaceAll("[\"]", """)); - } - } - } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/servlet/ExportServlet.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/servlet/ExportServlet.java,v diff -u -r1.4 -r1.5 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/servlet/ExportServlet.java 17 Mar 2009 22:40:50 -0000 1.4 +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/servlet/ExportServlet.java 25 Mar 2009 22:46:28 -0000 1.5 @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Set; import javax.servlet.ServletException; import javax.servlet.http.Cookie; @@ -38,14 +39,19 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.tool.ToolAccessMode; import org.lamsfoundation.lams.tool.assessment.AssessmentConstants; +import org.lamsfoundation.lams.tool.assessment.dto.QuestionSummary; import org.lamsfoundation.lams.tool.assessment.dto.Summary; +import org.lamsfoundation.lams.tool.assessment.dto.UserSummary; import org.lamsfoundation.lams.tool.assessment.model.Assessment; +import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion; import org.lamsfoundation.lams.tool.assessment.model.AssessmentSession; import org.lamsfoundation.lams.tool.assessment.model.AssessmentUser; import org.lamsfoundation.lams.tool.assessment.service.AssessmentApplicationException; import org.lamsfoundation.lams.tool.assessment.service.AssessmentServiceProxy; import org.lamsfoundation.lams.tool.assessment.service.IAssessmentService; +import org.lamsfoundation.lams.tool.assessment.util.AssessmentBundler; import org.lamsfoundation.lams.tool.assessment.util.AssessmentToolContentHandler; +import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.servlet.AbstractExportPortfolioServlet; import org.lamsfoundation.lams.web.util.AttributeNames; import org.lamsfoundation.lams.web.util.SessionMap; @@ -95,6 +101,16 @@ String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); + + // Attempting to export required js and image files + try { + AssessmentBundler imageBundler = new AssessmentBundler(); + imageBundler.bundle(request, cookies, directoryName); + } catch (Exception e) { + logger.error( + "Could not export spreadsheet javascript files, some files may be missing in export portfolio", e); + } + writeResponseToFile(basePath + "/pages/export/exportportfolio.jsp?sessionMapID=" + sessionMap.getSessionID(), directoryName, FILENAME, cookies); @@ -146,17 +162,18 @@ logger.error(error); throw new AssessmentApplicationException(error); } + + AssessmentSession session = service.getAssessmentSessionBySessionId(toolSessionID); + if (session == null) { + String error = "Failed get AssessmentSession by ID [" + toolSessionID + "]"; + logger.error(error); + throw new AssessmentApplicationException(error); + } - List group = service.exportBySessionId(toolSessionID, true); - saveFileToLocal(group, directoryName); + UserSummary userSummary = service.getUserSummary(content.getContentId(), userID, toolSessionID); - List groupList = new ArrayList(); - if (group.size() > 0) - groupList.add(group); - - sessionMap.put(AssessmentConstants.ATTR_TITLE, content.getTitle()); - sessionMap.put(AssessmentConstants.ATTR_INSTRUCTIONS, content.getInstructions()); - sessionMap.put(AssessmentConstants.ATTR_SUMMARY_LIST, groupList); + sessionMap.put(AssessmentConstants.ATTR_ASSESSMENT, content); + sessionMap.put(AssessmentConstants.ATTR_USER_SUMMARY, userSummary); } public void teacher(HttpServletRequest request, HttpServletResponse response, String directoryName, @@ -176,50 +193,22 @@ logger.error(error); throw new AssessmentApplicationException(error); } - List> groupList = service.exportByContentId(toolContentID); - if (groupList != null) { - for (List list : groupList) { - saveFileToLocal(list, directoryName); - } + + List summaryList = service.getSummaryList(toolContentID); + + ArrayList questionSummaryList = new ArrayList(); + Set questions = content.getQuestions(); + for (AssessmentQuestion question : questions) { + QuestionSummary questionSummary = service.getQuestionSummary(toolContentID, question.getUid()); + questionSummaryList.add(questionSummary); } - // put it into HTTPSession - sessionMap.put(AssessmentConstants.ATTR_TITLE, content.getTitle()); - sessionMap.put(AssessmentConstants.ATTR_INSTRUCTIONS, content.getInstructions()); - sessionMap.put(AssessmentConstants.ATTR_SUMMARY_LIST, groupList); + // cache into sessionMap + sessionMap.put(AssessmentConstants.ATTR_ASSESSMENT, content); + sessionMap.put(AssessmentConstants.ATTR_SUMMARY_LIST, summaryList); + sessionMap.put(AssessmentConstants.ATTR_QUESTION_SUMMARY_LIST, questionSummaryList); } - private void saveFileToLocal(List list, String directoryName) { - handler = getToolContentHandler(); - for (Summary summary : list) { - // for learning object, it just display "No offlice pakcage avaliable" information. -// if (summary.getQuestionType() == AssessmentConstants.QUESTION_TYPE_FILL_THE_GAP -// || summary.getQuestionType() == AssessmentConstants.QUESTION_TYPE_CHOICE) -// continue; -// try { -// int idx = 1; -// String userName = summary.getUsername(); -// String localDir; -// while (true) { -// localDir = FileUtil.getFullPath(directoryName, userName + "/" + idx); -// File local = new File(localDir); -// if (!local.exists()) { -// local.mkdirs(); -// break; -// } -// idx++; -// } -// summary.setAttachmentLocalUrl(userName + "/" + idx + "/" + summary.getFileUuid() + '.' -// + FileUtil.getFileExtension(summary.getFileName())); -// handler.saveFile(summary.getFileUuid(), FileUtil.getFullPath(directoryName, summary -// .getAttachmentLocalUrl())); -// } catch (Exception e) { -// logger.error("Export forum topic attachment failed: " + e.toString()); -// } - } - - } - private AssessmentToolContentHandler getToolContentHandler() { if (handler == null) { WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(this Index: lams_tool_assessment/web/pages/export/exportportfolio.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/export/exportportfolio.jsp,v diff -u -r1.1 -r1.2 --- lams_tool_assessment/web/pages/export/exportportfolio.jsp 29 Jan 2009 05:59:06 -0000 1.1 +++ lams_tool_assessment/web/pages/export/exportportfolio.jsp 25 Mar 2009 22:46:28 -0000 1.2 @@ -1,220 +1,18 @@ -<%@ include file="/common/taglibs.jsp"%> - - - - - - + "http://www.w3.org/TR/html4/loose.dtd"> - - - <fmt:message key="export.title" /> - - - - - - +<%@ include file="/common/taglibs.jsp"%> - + + + - - - -
- -

- ${title} -

- -
- ${instructions} -
- - - -

- - - - - - - ${group[0].sessionName} - - -

- - - - - - - - - - - - - - - - - <%-- Bold styling is to indicate an item created by the author --%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
-
- -
-
- - - - - - - - - - - - - - - - ${item.itemTitle} - - - -
    - -
  1. - ${itemInstruction} -
  2. -
    -
-
- -   - -
-
- ${item.username} - - - - - - - - - - - - - - - - - - - -
- - <%-- Display reflection entries --%> - - - - <%-- End all answers for this question --%> -

- -

- - -

- ${reflectDTO.fullName} -

-

- -

-
-
- -
- -
- -
- - - - - - -
+ + + <%@ include file="parts/exportlearner.jsp"%> + + + + <%@ include file="parts/exportteacher.jsp"%> + + Index: lams_tool_assessment/web/pages/export/parts/exportlearner.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/export/parts/exportlearner.jsp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_tool_assessment/web/pages/export/parts/exportlearner.jsp 25 Mar 2009 22:46:28 -0000 1.1 @@ -0,0 +1,158 @@ + + + <fmt:message key="export.title" /> + + + + + + + + + + + + + + + + + +
+ +

${assessment.title}

+ +

${assessment.instructions}

+ +

+ + + + + + + + + + + + + + + + + + + + + +
+ + + ${userSummary.user.lastName}, ${userSummary.user.firstName} +
+ + + ${userSummary.numberOfAttempts} +
+ + + + +
+ + + ${userSummary.lastAttemptGrade} +
+

+ + +
+ + + + + + + + + +
+ + + ${userSummaryItem.question.title} +
+ + + ${userSummaryItem.question.question} +
+ +
+
+
+ +
+ + + + + + +
+ \ No newline at end of file Index: lams_tool_assessment/web/pages/export/parts/exportteacher.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/export/parts/exportteacher.jsp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_tool_assessment/web/pages/export/parts/exportteacher.jsp 25 Mar 2009 22:46:27 -0000 1.1 @@ -0,0 +1,234 @@ + + + <fmt:message key="export.title" /> + + + + + + + + + + + + + + + + + + +
+ +

${assessment.title}

+ +

${assessment.instructions}

+ +
+

+
+ + +
+
+ ${summary.sessionName} +
+ +
+
+
+ +

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + ${questionSummary.question.title} +
+ + + ${questionSummary.question.question} +
+ + + ${questionSummary.question.defaultGrade} +
+ + + ${questionSummary.question.penaltyFactor} +
+ + +
${questionSummary.averageMark}
+
+

+ + + +
+
+
+
+




+
+
+ +
+ + + + + + +
+ \ No newline at end of file Index: lams_tool_assessment/web/pages/export/parts/userresponse.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/export/parts/userresponse.jsp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_tool_assessment/web/pages/export/parts/userresponse.jsp 25 Mar 2009 22:46:28 -0000 1.1 @@ -0,0 +1,62 @@ + + + + + + responseStr += "${questionOption.optionString}"; + + + + + + responseStr +=''; + + responseStr +=''; + responseStr +=''; + responseStr +=''; + responseStr +=''; + + responseStr +='
'; + responseStr +="${questionOption.question}"; + responseStr +=''; + responseStr +='-'; + + + + + responseStr +="${questionOption2.optionString}"; + + + + + responseStr +='
'; +
+ + responseStr +="${questionResult.answerString}"; + + + responseStr +="${questionResult.answerString}"; + + + + responseStr +="${questionResult.answerBoolean}"; + + + + responseStr +="${questionResult.answerString}"; + + + + + + + + responseStr +="${questionOption.optionString}"; + + + + + + + +
\ No newline at end of file Index: lams_tool_assessment/web/pages/monitoring/summary.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/monitoring/summary.jsp,v diff -u -r1.5 -r1.6 --- lams_tool_assessment/web/pages/monitoring/summary.jsp 20 Mar 2009 16:39:38 -0000 1.5 +++ lams_tool_assessment/web/pages/monitoring/summary.jsp 25 Mar 2009 22:46:28 -0000 1.6 @@ -39,22 +39,41 @@ multiselect: false, caption: "${summary.sessionName}", ondblClickRow: function(rowid) { - var userId = jQuery("#list${summary.sessionId}").getCell(rowid, 'userId'); var sessionId = jQuery("#list${summary.sessionId}").getCell(rowid, 'sessionId'); var userSummaryUrl = ''; var newUserSummaryHref = userSummaryUrl + "&userID=" + userId + "&sessionId=" + sessionId + "&KeepThis=true&TB_iframe=true&height=540&width=650&modal=true"; $("#userSummaryHref").attr("href", newUserSummaryHref); $("#userSummaryHref").click(); - } + }, + onSelectRow: function(rowid) { + if(rowid == null) { + rowid=0; + } + var userId = jQuery("#list${summary.sessionId}").getCell(rowid, 'userId'); + var sessionId = jQuery("#list${summary.sessionId}").getCell(rowid, 'sessionId'); + var userMasterDetailUrl = ''; + //userMasterDetailUrl += "?userID=" + userId + "&sessionId=" + sessionId; + jQuery("#userSummary${summary.sessionId}").clearGridData().setGridParam({gridstate: "visible",caption:"ss"}).trigger("reloadGrid"); + // jQuery("#userSummary${summary.sessionId}").setGridParam({caption:"ss"}); + // jQuery("#userSummary${summary.sessionId}").trigger("reloadGrid"); + $("#masterDetailArea").load( + userMasterDetailUrl, + { + userID: userId, + sessionId: sessionId + } + ); + + } }).hideCol("userId").hideCol("sessionId"); jQuery("#list${summary.sessionId}").addRowData(${i.index + 1}, { id:"${i.index + 1}", userId:"${assessmentResult.user.userId}", sessionId:"${assessmentResult.user.session.sessionId}", - userName:"${assessmentResult.user.loginName}", + userName:"${assessmentResult.user.lastName}, ${assessmentResult.user.firstName}", @@ -70,7 +89,49 @@ total:"" }); - + + + jQuery("#userSummary${summary.sessionId}").jqGrid({ + datatype: "local", + + hiddengrid: true, + height: 90, + width: 530, + shrinkToFit: false, + + colNames:['#', + 'questionResultUid', + 'Question', + '', + ''], + + colModel:[ + {name:'id', index:'id', width:25, sorttype:"int"}, + {name:'questionResultUid', index:'questionResultUid', width:0}, + {name:'title', index:'title', width:200}, + {name:'response', index:'response', width:200, sortable:false}, + {name:'grade', index:'grade', width:80, sorttype:"float", editable:true, editoptions: {size:4, maxlength: 4} } + ], + + imgpath: pathToImageFolder + "jqGrid.basic.theme", + multiselect: false, + caption: "User summary", + cellurl: '', + cellEdit: true, + afterSaveCell : function (rowid,name,val,iRow,iCol){ + if (isNaN(val)) { + jQuery("#userSummary${summary.sessionId}").restoreCell(iRow,iCol); + } + }, + beforeSubmitCell : function (rowid,name,val,iRow,iCol){ + if (isNaN(val)) { + return {nan:true}; + } else { + var questionResultUid = jQuery("#userSummary${summary.sessionId}").getCell(rowid, 'questionResultUid'); + return {questionResultUid:questionResultUid}; + } + } + }).hideCol("questionResultUid"); @@ -82,14 +143,6 @@ $("#questionSummaryHref").click(); }); }); -/* - function createQuestionSummaryHref() { - - }; -*/ - function updateRowData(rowid){ - jQuery("#list").setRowData( rowid, { tax:"5", total:"205" }) - }; function refreshThickbox(){ tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox @@ -114,24 +167,6 @@ } }; window.onresize = resizeIframe; - - /* - function resizeIframe() { - - var width = this.window.innerWidth; - alert(width); - if ( width == undefined || width == 0 ) { - // IE doesn't use window.innerWidth. - width = document.documentElement.clientWidth; - // alert("using clientWidth"); - } - alert("doc width "+width); - var newWidth = width * 0.8; - - jQuery("#list4").setGridWidth(newWidth, true); - }; - window.onresize = resizeIframe; - */ --> @@ -146,10 +181,13 @@ +
+ <%@ include file="parts/masterDetailLoadUp.jsp"%> +
+ -
@@ -163,11 +201,6 @@ -
@@ -177,6 +210,9 @@
+
+
+
Index: lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ lams_tool_assessment/web/pages/monitoring/parts/masterDetailLoadUp.jsp 25 Mar 2009 22:46:28 -0000 1.1 @@ -0,0 +1,19 @@ +<%@ include file="/common/taglibs.jsp"%> + + Index: lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp,v diff -u -r1.2 -r1.3 --- lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp 20 Mar 2009 16:39:38 -0000 1.2 +++ lams_tool_assessment/web/pages/monitoring/parts/questionsummary.jsp 25 Mar 2009 22:46:28 -0000 1.3 @@ -53,10 +53,10 @@ }, afterSaveCell : function (rowid,name,val,iRow,iCol){ var questionResultUid = jQuery("#session${session.sessionId}").getCell(rowid, 'questionResultUid'); - alert(isNaN(val)); + //alert(isNaN(val)); if (isNaN(val) || (questionResultUid=="")) { jQuery("#session${session.sessionId}").restoreCell(iRow,iCol); - alert(jQuery("#session${session.sessionId}").getCell(iRow,iCol)); + //alert(jQuery("#session${session.sessionId}").getCell(iRow,iCol)); } else { var averageMark = (eval($("#averageMark").html())*numberOfValues - eval(previousCellValue) + eval(val))/numberOfValues; $("#averageMark").html(averageMark); @@ -99,7 +99,7 @@ jQuery("#session${session.sessionId}").addRowData(${i.index + 1}, { questionResultUid:"${questionResult.uid}", - userName:"${questionResult.user.firstName} ${questionResult.user.lastName}", + userName:"${questionResult.user.lastName}, ${questionResult.user.firstName}", response:responseStr, grade:grade }); Index: lams_tool_assessment/web/pages/monitoring/parts/usersummary.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_assessment/web/pages/monitoring/parts/usersummary.jsp,v diff -u -r1.4 -r1.5 --- lams_tool_assessment/web/pages/monitoring/parts/usersummary.jsp 20 Mar 2009 16:39:38 -0000 1.4 +++ lams_tool_assessment/web/pages/monitoring/parts/usersummary.jsp 25 Mar 2009 22:46:28 -0000 1.5 @@ -36,7 +36,7 @@ ''], colModel:[ - {name:'id', index:'id', width:50, sorttype:"int"}, + {name:'id', index:'id', width:55, sorttype:"int"}, {name:'questionResultUid', index:'questionResultUid', width:0}, {name:'time', index:'time', width:150, sorttype:'date', datefmt:'Y-m-d'}, {name:'response', index:'response', width:200, sortable:false}, @@ -112,7 +112,7 @@ - ${userSummary.user.firstName} ${userSummary.user.lastName} + ${userSummary.user.lastName}, ${userSummary.user.firstName}