Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql =================================================================== diff -u -rc6668111b5787f1b5f18cf4cb47d0e1eb7420dea -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision c6668111b5787f1b5f18cf4cb47d0e1eb7420dea) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -48,12 +48,12 @@ CREATE TABLE lams_qb_option (`uid` BIGINT AUTO_INCREMENT, `qb_question_uid` BIGINT NOT NULL, `display_order` TINYINT NOT NULL DEFAULT 1, - `name` TEXT NOT NULL, + `name` TEXT, `correct` TINYINT(1) NOT NULL DEFAULT 0, `matching_pair` TEXT, - `numerical_option` float, - `max_mark` float, - `accepted_error` float, + `numerical_option` float DEFAULT 0, + `max_mark` float DEFAULT 0, + `accepted_error` float DEFAULT 0, `feedback` TEXT, PRIMARY KEY (uid), INDEX (display_order), @@ -64,7 +64,7 @@ `qb_question_uid` BIGINT NOT NULL, `display_order` TINYINT NOT NULL DEFAULT 1, `multiplier` float DEFAULT 0, - `unit` varchar(255), + `name` varchar(255), PRIMARY KEY (uid), CONSTRAINT FK_lams_qb_question_unit_1 FOREIGN KEY (qb_question_uid) REFERENCES lams_qb_question (uid) ON DELETE CASCADE ON UPDATE CASCADE); @@ -487,7 +487,7 @@ -- fill table with units matching unique QB questions inserted above -INSERT INTO lams_qb_question_unit (qb_question_uid, display_order, multiplier, unit) +INSERT INTO lams_qb_question_unit (qb_question_uid, display_order, multiplier, name) SELECT q.uid, u.sequence_id, u.multiplier, u.unit FROM tl_laasse10_assessment_unit AS u JOIN lams_qb_question AS q Index: lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java (.../QbQuestion.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java (.../QbQuestion.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -18,6 +18,8 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; /** * A question in Question Bank. @@ -131,9 +133,11 @@ private boolean hedgingJustificationEnabled; @OneToMany(mappedBy = "qbQuestion", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) + @Fetch(value = FetchMode.SUBSELECT) private List qbOptions = new ArrayList<>(); @OneToMany(mappedBy = "qbQuestion", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) + @Fetch(value = FetchMode.SUBSELECT) private List units = new ArrayList<>(); // compares if current question data and the other one (probably modified with new data) are the same Index: lams_common/src/java/org/lamsfoundation/lams/qb/model/QbToolAnswer.java =================================================================== diff -u -reb5312af3f0d7ca64ca3b41988129079c7509427 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_common/src/java/org/lamsfoundation/lams/qb/model/QbToolAnswer.java (.../QbToolAnswer.java) (revision eb5312af3f0d7ca64ca3b41988129079c7509427) +++ lams_common/src/java/org/lamsfoundation/lams/qb/model/QbToolAnswer.java (.../QbToolAnswer.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -29,7 +29,7 @@ @JoinColumn(name = "tool_question_uid") protected QbToolQuestion qbToolQuestion; - @ManyToOne(optional = false, fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "qb_option_uid") protected QbOption qbOption; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java (.../AssessmentQuestionResultDAOHibernate.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentQuestionResultDAOHibernate.java (.../AssessmentQuestionResultDAOHibernate.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -40,15 +40,15 @@ private static final String FIND_BY_ASSESSMENT_QUESTION_AND_USER = "FROM " + AssessmentQuestionResult.class.getName() + " AS q, " + AssessmentResult.class.getName() + " AS r " - + " WHERE q.assessmentResult.uid = 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.qbToolQuestion.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.assessmentResult.uid = r.uid AND r.assessment.uid = ? AND r.user.userId =? AND q.assessmentQuestion.uid =? AND (ROUND(q.mark + q.penalty) < q.maxMark) AND (r.finishDate != null)"; + + " WHERE q.assessmentResult.uid = r.uid AND r.assessment.uid = ? AND r.user.userId =? AND q.qbToolQuestion.uid =? AND (ROUND(q.mark + q.penalty) < q.maxMark) AND (r.finishDate != null)"; private static final String GET_ANSWER_MARK = "SELECT q.mark FROM " + AssessmentQuestionResult.class.getName() + " AS q, " + AssessmentResult.class.getName() + " AS r " - + " WHERE q.assessmentResult.uid = r.uid AND r.assessment.uid = :assessmentUid AND (r.finishDate != null) AND r.user.userId =:userId AND q.assessmentQuestion.displayOrder =:questionDisplayOrder ORDER BY r.startDate DESC"; + + " WHERE q.assessmentResult.uid = r.uid AND r.assessment.uid = :assessmentUid AND (r.finishDate != null) AND r.user.userId =:userId AND q.qbToolQuestion.displayOrder =:questionDisplayOrder ORDER BY r.startDate DESC"; @Override public int getNumberWrongAnswersDoneBefore(Long assessmentUid, Long userId, Long questionUid) { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java =================================================================== diff -u -rdcdc1487609bd4f00afaa93c09272d84ab0cd325 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java (.../AssessmentUserDAOHibernate.java) (revision dcdc1487609bd4f00afaa93c09272d84ab0cd325) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dao/hibernate/AssessmentUserDAOHibernate.java (.../AssessmentUserDAOHibernate.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -235,8 +235,10 @@ " LEFT OUTER JOIN tl_laasse10_assessment_result result " + " ON result.user_uid = user.uid" + " AND result.finish_date IS NOT NULL" + " AND result.latest = 1" + + " INNER JOIN lams_qb_tool_answer qbToolAnswer " + " ON qbToolAnswer.tool_question_uid = :questionUid " + + " INNER JOIN tl_laasse10_question_result question_result " + " ON result.uid=question_result.result_uid" - + " AND question_result.assessment_question_uid = :questionUid" + + + " AND question_result.uid = qbToolAnswer.answer_uid" + " WHERE session.session_id = :sessionId " + " AND (CONCAT(user.last_name, ' ', user.first_name) LIKE CONCAT('%', :searchString, '%')) "; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/QuestionDTO.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/QuestionDTO.java (.../QuestionDTO.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/dto/QuestionDTO.java (.../QuestionDTO.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -5,7 +5,9 @@ import java.util.TreeSet; import org.lamsfoundation.lams.qb.model.QbOption; +import org.lamsfoundation.lams.qb.model.QbQuestion; import org.lamsfoundation.lams.qb.model.QbQuestionUnit; +import org.lamsfoundation.lams.qb.model.QbToolQuestion; import org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion; public class QuestionDTO implements Comparable{ @@ -92,35 +94,52 @@ private int confidenceLevel; - public QuestionDTO(AssessmentQuestion question) { - this.uid = question.getUid(); - this.type = question.getQbQuestion().getType(); - this.title = question.getQbQuestion().getName(); - this.question = question.getQbQuestion().getDescription(); - this.displayOrder = question.getDisplayOrder(); - this.maxMark = question.getQbQuestion().getMaxMark(); - this.penaltyFactor = question.getQbQuestion().getPenaltyFactor(); - this.answerRequired = question.getQbQuestion().isAnswerRequired(); - this.feedback = question.getQbQuestion().getFeedback(); - this.multipleAnswersAllowed = question.getQbQuestion().isMultipleAnswersAllowed(); - this.incorrectAnswerNullifiesMark = question.getQbQuestion().isIncorrectAnswerNullifiesMark(); - this.feedbackOnCorrect = question.getQbQuestion().getFeedbackOnCorrect(); - this.feedbackOnPartiallyCorrect = question.getQbQuestion().getFeedbackOnPartiallyCorrect(); - this.feedbackOnIncorrect = question.getQbQuestion().getFeedbackOnIncorrect(); - this.shuffle = question.getQbQuestion().isShuffle(); - this.prefixAnswersWithLetters = question.getQbQuestion().isPrefixAnswersWithLetters(); - this.caseSensitive = question.getQbQuestion().isCaseSensitive(); - this.correctAnswer = question.getQbQuestion().getCorrectAnswer(); - this.allowRichEditor = question.getQbQuestion().isAllowRichEditor(); - this.units = question.getQbQuestion().getUnits(); - this.maxWordsLimit = question.getQbQuestion().getMaxWordsLimit(); - this.minWordsLimit = question.getQbQuestion().getMinWordsLimit(); - this.hedgingJustificationEnabled = question.getQbQuestion().isHedgingJustificationEnabled(); - this.correctAnswersDisclosed = question.isCorrectAnswersDisclosed(); - this.groupsAnswersDisclosed = question.isGroupsAnswersDisclosed(); + /** + * Expanded version of the constructor which also sets correctAnswersDisclosed and groupsAnswersDisclosed. + * + * @param assessmentQuestion + */ + public QuestionDTO(AssessmentQuestion assessmentQuestion) { + this((QbToolQuestion) assessmentQuestion); + + this.correctAnswersDisclosed = assessmentQuestion.isCorrectAnswersDisclosed(); + this.groupsAnswersDisclosed = assessmentQuestion.isGroupsAnswersDisclosed(); + } + + /** + * Same as above, but skips setting correctAnswersDisclosed and groupsAnswersDisclosed + * + * @param qbToolQuestion + */ + public QuestionDTO(QbToolQuestion qbToolQuestion) { + this.uid = qbToolQuestion.getUid(); + this.displayOrder = qbToolQuestion.getDisplayOrder(); + + QbQuestion qbQuestion = qbToolQuestion.getQbQuestion(); + this.type = qbQuestion.getType(); + this.title = qbQuestion.getName(); + this.question = qbQuestion.getDescription(); + this.maxMark = qbQuestion.getMaxMark(); + this.penaltyFactor = qbQuestion.getPenaltyFactor(); + this.answerRequired = qbQuestion.isAnswerRequired(); + this.feedback = qbQuestion.getFeedback(); + this.multipleAnswersAllowed = qbQuestion.isMultipleAnswersAllowed(); + this.incorrectAnswerNullifiesMark = qbQuestion.isIncorrectAnswerNullifiesMark(); + this.feedbackOnCorrect = qbQuestion.getFeedbackOnCorrect(); + this.feedbackOnPartiallyCorrect = qbQuestion.getFeedbackOnPartiallyCorrect(); + this.feedbackOnIncorrect = qbQuestion.getFeedbackOnIncorrect(); + this.shuffle = qbQuestion.isShuffle(); + this.prefixAnswersWithLetters = qbQuestion.isPrefixAnswersWithLetters(); + this.caseSensitive = qbQuestion.isCaseSensitive(); + this.correctAnswer = qbQuestion.getCorrectAnswer(); + this.allowRichEditor = qbQuestion.isAllowRichEditor(); + this.units = qbQuestion.getUnits(); + this.maxWordsLimit = qbQuestion.getMaxWordsLimit(); + this.minWordsLimit = qbQuestion.getMinWordsLimit(); + this.hedgingJustificationEnabled = qbQuestion.isHedgingJustificationEnabled(); optionDtos = new TreeSet<>(); - for (QbOption option : question.getQbQuestion().getQbOptions()) { + for (QbOption option : qbQuestion.getQbOptions()) { optionDtos.add(new OptionDTO(option)); } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java (.../Assessment.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/Assessment.java (.../Assessment.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -150,8 +150,8 @@ private AssessmentUser createdBy; // Question bank questions + @OneToMany @JoinColumn(name = "assessment_uid") - @OrderBy("sequence_id ASC") private Set questions = new TreeSet<>(); // assessment questions references that form question list @@ -481,6 +481,9 @@ public void setContentId(Long contentId) { this.contentId = contentId; + for (AssessmentQuestion question : questions) { + question.setToolContentId(contentId); + } } public boolean isAllowQuestionFeedback() { Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java (.../AssessmentQuestionResult.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/model/AssessmentQuestionResult.java (.../AssessmentQuestionResult.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -32,9 +32,6 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; @@ -68,9 +65,6 @@ @Column(name = "answer_boolean") private boolean answerBoolean; -// @Column(name = "submitted_option_uid") -// private Long submittedOptionUid; - @Column private float mark; @@ -86,10 +80,6 @@ @Column(name = "confidence_level") private int confidenceLevel; -// @ManyToOne(fetch = FetchType.LAZY) -// @JoinColumn(name = "assessment_question_uid") -// private AssessmentQuestion assessmentQuestion; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "result_uid") private AssessmentResult assessmentResult; @@ -128,17 +118,7 @@ public QbQuestion getQbQuestion() { return qbToolQuestion.getQbQuestion(); } - - //TODO remove - public AssessmentQuestion getAssessmentQuestion() { - return null; - } - //TODO remove - public void setAssessmentQuestion(AssessmentQuestion question) { -// this.assessmentQuestion = question; - } - public AssessmentResult getAssessmentResult() { return assessmentResult; } @@ -179,17 +159,7 @@ public void setAnswerBoolean(boolean answerBoolean) { this.answerBoolean = answerBoolean; } - - //TODO REMOVE - public Long getSubmittedOptionUid() { - return qbOption.getUid(); - } - //TODO REMOVE - public void setSubmittedOptionUid(Long submittedOptionUid) { - this.qbOption.setUid(submittedOptionUid); - } - public Float getMark() { return mark; } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -228,7 +228,7 @@ Set userQuestionResults = userResult.getQuestionResults(); for (AssessmentQuestionResult leaderQuestionResult : leaderQuestionResults) { AssessmentQuestionResult userQuestionResult = new AssessmentQuestionResult(); - userQuestionResult.setAssessmentQuestion(leaderQuestionResult.getAssessmentQuestion()); + userQuestionResult.setQbToolQuestion(leaderQuestionResult.getQbToolQuestion()); userQuestionResult.setAssessmentResult(userResult); userQuestionResults.add(userQuestionResult); @@ -253,13 +253,13 @@ Set userQuestionResults = userResult.getQuestionResults(); for (AssessmentQuestionResult leaderQuestionResult : leaderQuestionResults) { for (AssessmentQuestionResult userQuestionResult : userQuestionResults) { - if (userQuestionResult.getQbQuestion().getUid() - .equals(leaderQuestionResult.getQbQuestion().getUid())) { + if (userQuestionResult.getQbToolQuestion().getUid() + .equals(leaderQuestionResult.getQbToolQuestion().getUid())) { userQuestionResult.setAnswerString(leaderQuestionResult.getAnswerString()); userQuestionResult.setAnswerFloat(leaderQuestionResult.getAnswerFloat()); userQuestionResult.setAnswerBoolean(leaderQuestionResult.getAnswerBoolean()); - userQuestionResult.setSubmittedOptionUid(leaderQuestionResult.getSubmittedOptionUid()); + userQuestionResult.setQbOption(leaderQuestionResult.getQbOption()); userQuestionResult.setMark(leaderQuestionResult.getMark()); userQuestionResult.setMaxMark(leaderQuestionResult.getMaxMark()); userQuestionResult.setPenalty(leaderQuestionResult.getPenalty()); @@ -415,11 +415,17 @@ @Override public void saveOrUpdateAssessment(Assessment assessment) { - //update questions' hashes in case questions' titles or descriptions got changed - for (AssessmentQuestion question : (Set) assessment.getQuestions()) { + for (AssessmentQuestion question : assessment.getQuestions()) { + //update questions' hashes in case questions' titles or descriptions got changed String newHash = question.getQbQuestion().getDescription() == null ? null : HashUtil.sha1(question.getQbQuestion().getDescription()); question.setQuestionHash(newHash); + + //update only in case QbQuestion was modified, to prevent updating the same QbQuestions received from SesssionMap + if (question.getQbQuestionModified() != IQbService.QUESTION_MODIFIED_NONE) { + assessmentQuestionDao.saveObject(question.getQbQuestion()); + } + assessmentQuestionDao.saveObject(question); } //store object in DB @@ -441,15 +447,15 @@ public void releaseFromCache(Object object) { assessmentDao.releaseFromCache(object); - if (object instanceof AssessmentQuestion) { - AssessmentQuestion question = (AssessmentQuestion) object; - for (QbOption option : question.getQbQuestion().getQbOptions()) { - assessmentDao.releaseFromCache(option); - } - for (QbQuestionUnit unit : question.getQbQuestion().getUnits()) { - assessmentDao.releaseFromCache(unit); - } - } +// if (object instanceof AssessmentQuestion) { +// AssessmentQuestion question = (AssessmentQuestion) object; +// for (QbOption option : question.getQbQuestion().getQbOptions()) { +// assessmentDao.releaseFromCache(option); +// } +// for (QbQuestionUnit unit : question.getQbQuestion().getUnits()) { +// assessmentDao.releaseFromCache(unit); +// } +// } if (object instanceof QuestionReference) { QuestionReference reference = (QuestionReference) object; @@ -512,7 +518,7 @@ // get questionResult from DB instance of AssessmentResult AssessmentQuestionResult questionResult = null; for (AssessmentQuestionResult questionResultIter : questionResults) { - if (question.getUid().equals(questionResultIter.getQbQuestion().getUid())) { + if (question.getUid().equals(questionResultIter.getQbToolQuestion().getUid())) { questionResult = questionResultIter; } } @@ -556,7 +562,7 @@ */ private AssessmentQuestionResult createQuestionResultObject(AssessmentQuestion question) { AssessmentQuestionResult questionResult = new AssessmentQuestionResult(); - questionResult.setAssessmentQuestion(question); + questionResult.setQbToolQuestion(question); // create optionAnswer for each option Set optionAnswers = questionResult.getOptionAnswers(); @@ -642,7 +648,7 @@ // get questionResult from DB instance of AssessmentResult AssessmentQuestionResult questionResult = null; for (AssessmentQuestionResult questionResultIter : result.getQuestionResults()) { - if (questionDto.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { + if (questionDto.getUid().equals(questionResultIter.getQbToolQuestion().getUid())) { questionResult = questionResultIter; } } @@ -673,7 +679,7 @@ // get questionResult from DB instance of AssessmentResult AssessmentQuestionResult questionResult = null; for (AssessmentQuestionResult questionResultIter : assessmentResult.getQuestionResults()) { - if (questionDto.getUid().equals(questionResultIter.getAssessmentQuestion().getUid())) { + if (questionDto.getUid().equals(questionResultIter.getQbToolQuestion().getUid())) { questionResult = questionResultIter; } } @@ -758,7 +764,7 @@ } else if (questionDto.getType() == QbQuestion.TYPE_SHORT_ANSWER) { //clear previous answer - questionResult.setSubmittedOptionUid(null); + questionResult.setQbOption(null); for (OptionDTO optionDto : questionDto.getOptionDtos()) { @@ -789,7 +795,8 @@ if (isAnswerMatchedCurrentOption) { mark = optionDto.getMaxMark() * maxMark; - questionResult.setSubmittedOptionUid(optionDto.getUid()); + QbOption qbOption = getQbOptionByUid(optionDto.getUid()); + questionResult.setQbOption(qbOption); break; } } @@ -832,7 +839,8 @@ } if (isAnswerMatchedCurrentOption) { mark = optionDto.getMaxMark() * maxMark; - questionResult.setSubmittedOptionUid(optionDto.getUid()); + QbOption qbOption = getQbOptionByUid(optionDto.getUid()); + questionResult.setQbOption(qbOption); break; } } @@ -924,7 +932,7 @@ } for (AssessmentQuestionResult questionResult : questionResults) { - if (questionDto.getUid().equals(questionResult.getAssessmentQuestion().getUid())) { + if (questionDto.getUid().equals(questionResult.getQbToolQuestion().getUid())) { loadupQuestionResultIntoQuestionDto(questionDto, questionResult); break; } @@ -1240,7 +1248,7 @@ } else { for (QuestionReference reference : questionReferences) { for (AssessmentQuestionResult questionResult : questionResults) { - if (reference.getQuestion().getUid().equals(questionResult.getQbQuestion().getUid())) { + if (reference.getQuestion().getUid().equals(questionResult.getQbToolQuestion().getUid())) { questionResultsToDisplay.add(questionResult); } } @@ -1299,7 +1307,7 @@ List questionResults = new ArrayList<>(); for (AssessmentResult result : results) { for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { - if (question.getUid().equals(questionResult.getQbQuestion().getUid())) { + if (question.getUid().equals(questionResult.getQbToolQuestion().getUid())) { // for displaying purposes only (no saving occurs) questionResult.setFinishDate(result.getFinishDate()); @@ -1381,10 +1389,10 @@ AssessmentQuestionResult questionResult = null; if (assessmentResult == null) { questionResult = new AssessmentQuestionResult(); - questionResult.setAssessmentQuestion(question); + questionResult.setQbToolQuestion(question); } else { for (AssessmentQuestionResult dbQuestionResult : assessmentResult.getQuestionResults()) { - if (dbQuestionResult.getQbQuestion().getUid().equals(questionUid)) { + if (dbQuestionResult.getQbToolQuestion().getUid().equals(questionUid)) { questionResult = dbQuestionResult; break; } @@ -2026,16 +2034,16 @@ } } else if (question.getType() == QbQuestion.TYPE_SHORT_ANSWER || question.getType() == QbQuestion.TYPE_NUMERICAL) { - Long submittedUid = questionResult.getSubmittedOptionUid(); - if (submittedUid != null) { - Integer currentCount = summaryOfAnswers.get(submittedUid); + Long submittedOptionUid = questionResult.getQbOption().getUid(); + if (submittedOptionUid != null) { + Integer currentCount = summaryOfAnswers.get(submittedOptionUid); if (currentCount == null) { log.error( "Assessment Export: Unable to count answer in summary, refers to an unexpected option. QuestionResult " - + questionResult.getUid() + " submittedOptionUid " + submittedUid + " question " + + questionResult.getUid() + " chosen optionUid " + submittedOptionUid + " question " + question.getUid()); } else { - summaryOfAnswers.put(submittedUid, currentCount + 1); + summaryOfAnswers.put(submittedOptionUid, currentCount + 1); } } else { summaryNACount++; @@ -2122,7 +2130,7 @@ Long toolSessionId = assessmentResult.getSessionId(); Assessment assessment = assessmentResult.getAssessment(); - Long questionUid = questionResult.getQbQuestion().getUid(); + Long questionUid = questionResult.getQbToolQuestion().getUid(); // When changing a mark for user and isUseSelectLeaderToolOuput is true, the mark should be propagated to all // students within the group @@ -2270,15 +2278,14 @@ // [+] if the question is modified for (AssessmentQuestionResult questionResult : questionResults) { - AssessmentQuestion question = questionResult.getAssessmentQuestion(); + QuestionDTO questionDto = new QuestionDTO(questionResult.getQbToolQuestion()); //check whether according question was modified for (AssessmentQuestion modifiedQuestion : modifiedQuestions) { - if (question.getUid().equals(modifiedQuestion.getUid())) { + if (questionDto.getUid().equals(modifiedQuestion.getUid())) { Float oldQuestionAnswerMark = questionResult.getMark(); //actually recalculate marks - QuestionDTO questionDto = question.getQuestionDTO(); questionDto.setMaxMark(questionResult.getMaxMark().intValue()); loadupQuestionResultIntoQuestionDto(questionDto, questionResult); calculateAnswerMark(assessmentUid, user.getUserId(), questionResult, questionDto); @@ -2293,7 +2300,7 @@ // [+] if the question reference mark is modified for (AssessmentQuestionResult questionResult:questionResults) { - Long questionUid = questionResult.getQbQuestion().getUid(); + Long questionUid = questionResult.getQbToolQuestion().getUid(); for (QuestionReference modifiedReference : modifiedReferences.keySet()) { if (!modifiedReference.isRandomQuestion() @@ -2320,7 +2327,7 @@ ArrayList nonRandomQuestionResults = new ArrayList<>(); for (AssessmentQuestionResult questionResult : questionResults) { for (QuestionReference reference : newReferences) { - if (!reference.isRandomQuestion() && questionResult.getQbQuestion().getUid() + if (!reference.isRandomQuestion() && questionResult.getQbToolQuestion().getUid() .equals(reference.getQuestion().getUid())) { nonRandomQuestionResults.add(questionResult); } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java (.../AssessmentEscapeUtils.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/AssessmentEscapeUtils.java (.../AssessmentEscapeUtils.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -81,7 +81,7 @@ questionResult.setAnswerStringEscaped(answerStringEscaped); } - QuestionDTO questionDto = new QuestionDTO(questionResult.getAssessmentQuestion()); + QuestionDTO questionDto = new QuestionDTO(questionResult.getQbToolQuestion()); questionResult.setQuestionDto(questionDto); String title = questionDto.getTitle(); Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/QTIUtil.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/QTIUtil.java (.../QTIUtil.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/util/QTIUtil.java (.../QTIUtil.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -14,6 +14,7 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.qb.model.QbOption; import org.lamsfoundation.lams.qb.model.QbQuestion; +import org.lamsfoundation.lams.qb.service.IQbService; import org.lamsfoundation.lams.questions.Answer; import org.lamsfoundation.lams.questions.Question; import org.lamsfoundation.lams.questions.QuestionParser; @@ -25,18 +26,19 @@ public static List exportQTI(SortedSet questionList) { List questions = new LinkedList<>(); for (AssessmentQuestion assessmentQuestion : questionList) { + QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); Question question = new Question(); List answers = new ArrayList<>(); switch (assessmentQuestion.getType()) { case QbQuestion.TYPE_MULTIPLE_CHOICE: - if (assessmentQuestion.getQbQuestion().isMultipleAnswersAllowed()) { + if (qbQuestion.isMultipleAnswersAllowed()) { question.setType(Question.QUESTION_TYPE_MULTIPLE_RESPONSE); int correctAnswerCount = 0; - for (QbOption assessmentAnswer : assessmentQuestion.getQbQuestion().getQbOptions()) { + for (QbOption assessmentAnswer : qbQuestion.getQbOptions()) { if (assessmentAnswer.getMaxMark() > 0) { correctAnswerCount++; } @@ -45,36 +47,36 @@ Float correctAnswerScore = correctAnswerCount > 0 ? Integer.valueOf(100 / correctAnswerCount).floatValue() : null; - int incorrectAnswerCount = assessmentQuestion.getQbQuestion().getQbOptions().size() - correctAnswerCount; + int incorrectAnswerCount = qbQuestion.getQbOptions().size() - correctAnswerCount; Float incorrectAnswerScore = incorrectAnswerCount > 0 ? Integer.valueOf(-100 / incorrectAnswerCount).floatValue() : null; - for (QbOption assessmentAnswer : assessmentQuestion.getQbQuestion().getQbOptions()) { + for (QbOption assessmentAnswer : qbQuestion.getQbOptions()) { Answer answer = new Answer(); boolean isCorrectAnswer = assessmentAnswer.getMaxMark() > 0; answer.setText(assessmentAnswer.getName()); answer.setScore(isCorrectAnswer ? correctAnswerScore : incorrectAnswerScore); - answer.setFeedback(isCorrectAnswer ? assessmentQuestion.getQbQuestion().getFeedbackOnCorrect() - : assessmentQuestion.getQbQuestion().getFeedbackOnIncorrect()); + answer.setFeedback(isCorrectAnswer ? qbQuestion.getFeedbackOnCorrect() + : qbQuestion.getFeedbackOnIncorrect()); answers.add(assessmentAnswer.getDisplayOrder(), answer); } } else { question.setType(Question.QUESTION_TYPE_MULTIPLE_CHOICE); - for (QbOption assessmentAnswer : assessmentQuestion.getQbQuestion().getQbOptions()) { + for (QbOption assessmentAnswer : qbQuestion.getQbOptions()) { Answer answer = new Answer(); boolean isCorrectAnswer = assessmentAnswer.getMaxMark() == 1F; answer.setText(assessmentAnswer.getName()); answer.setScore( - isCorrectAnswer ? Integer.valueOf(assessmentQuestion.getQbQuestion().getMaxMark()).floatValue() + isCorrectAnswer ? Integer.valueOf(qbQuestion.getMaxMark()).floatValue() : 0); - answer.setFeedback(isCorrectAnswer ? assessmentQuestion.getQbQuestion().getFeedbackOnCorrect() - : assessmentQuestion.getQbQuestion().getFeedbackOnIncorrect()); + answer.setFeedback(isCorrectAnswer ? qbQuestion.getFeedbackOnCorrect() + : qbQuestion.getFeedbackOnIncorrect()); answers.add(assessmentAnswer.getDisplayOrder(), answer); } @@ -84,12 +86,12 @@ case QbQuestion.TYPE_SHORT_ANSWER: question.setType(Question.QUESTION_TYPE_FILL_IN_BLANK); - for (QbOption assessmentAnswer : assessmentQuestion.getQbQuestion().getQbOptions()) { + for (QbOption assessmentAnswer : qbQuestion.getQbOptions()) { // only answer which has more than 0% is considered a correct one if (assessmentAnswer.getMaxMark() > 0) { Answer answer = new Answer(); answer.setText(assessmentAnswer.getName()); - answer.setScore(Integer.valueOf(assessmentQuestion.getQbQuestion().getMaxMark()).floatValue()); + answer.setScore(Integer.valueOf(qbQuestion.getMaxMark()).floatValue()); answers.add(answer); } @@ -98,34 +100,34 @@ case QbQuestion.TYPE_TRUE_FALSE: question.setType(Question.QUESTION_TYPE_TRUE_FALSE); - boolean isTrueCorrect = assessmentQuestion.getQbQuestion().getCorrectAnswer(); + boolean isTrueCorrect = qbQuestion.getCorrectAnswer(); // true/false question is basically the same for QTI, just with special answers Answer trueAnswer = new Answer(); trueAnswer.setText("True"); trueAnswer.setScore( - isTrueCorrect ? Integer.valueOf(assessmentQuestion.getQbQuestion().getMaxMark()).floatValue() : 0); - trueAnswer.setFeedback(isTrueCorrect ? assessmentQuestion.getQbQuestion().getFeedbackOnCorrect() - : assessmentQuestion.getQbQuestion().getFeedbackOnIncorrect()); + isTrueCorrect ? Integer.valueOf(qbQuestion.getMaxMark()).floatValue() : 0); + trueAnswer.setFeedback(isTrueCorrect ? qbQuestion.getFeedbackOnCorrect() + : qbQuestion.getFeedbackOnIncorrect()); answers.add(trueAnswer); Answer falseAnswer = new Answer(); falseAnswer.setText("False"); falseAnswer.setScore( - !isTrueCorrect ? Integer.valueOf(assessmentQuestion.getQbQuestion().getMaxMark()).floatValue() : 0); - falseAnswer.setFeedback(!isTrueCorrect ? assessmentQuestion.getQbQuestion().getFeedbackOnCorrect() - : assessmentQuestion.getQbQuestion().getFeedbackOnIncorrect()); + !isTrueCorrect ? Integer.valueOf(qbQuestion.getMaxMark()).floatValue() : 0); + falseAnswer.setFeedback(!isTrueCorrect ? qbQuestion.getFeedbackOnCorrect() + : qbQuestion.getFeedbackOnIncorrect()); answers.add(falseAnswer); break; case QbQuestion.TYPE_MATCHING_PAIRS: question.setType(Question.QUESTION_TYPE_MATCHING); int answerIndex = 0; - float score = assessmentQuestion.getQbQuestion().getMaxMark() / assessmentQuestion.getQbQuestion().getQbOptions().size(); - question.setMatchAnswers(new ArrayList(assessmentQuestion.getQbQuestion().getQbOptions().size())); + float score = qbQuestion.getMaxMark() / qbQuestion.getQbOptions().size(); + question.setMatchAnswers(new ArrayList(qbQuestion.getQbOptions().size())); question.setMatchMap(new TreeMap()); - for (QbOption assessmentAnswer : assessmentQuestion.getQbQuestion().getQbOptions()) { + for (QbOption assessmentAnswer : qbQuestion.getQbOptions()) { Answer answer = new Answer(); answer.setText(assessmentAnswer.getMatchingPair()); @@ -152,15 +154,15 @@ question.setType(Question.QUESTION_TYPE_MARK_HEDGING); - for (QbOption assessmentAnswer : assessmentQuestion.getQbQuestion().getQbOptions()) { + for (QbOption assessmentAnswer : qbQuestion.getQbOptions()) { Answer answer = new Answer(); boolean isCorrectAnswer = assessmentAnswer.isCorrect(); answer.setText(assessmentAnswer.getName()); answer.setScore( - isCorrectAnswer ? Integer.valueOf(assessmentQuestion.getQbQuestion().getMaxMark()).floatValue() : 0); - answer.setFeedback(isCorrectAnswer ? assessmentQuestion.getQbQuestion().getFeedbackOnCorrect() - : assessmentQuestion.getQbQuestion().getFeedbackOnIncorrect()); + isCorrectAnswer ? Integer.valueOf(qbQuestion.getMaxMark()).floatValue() : 0); + answer.setFeedback(isCorrectAnswer ? qbQuestion.getFeedbackOnCorrect() + : qbQuestion.getFeedbackOnIncorrect()); answers.add(assessmentAnswer.getDisplayOrder(), answer); } @@ -170,9 +172,9 @@ continue; } - question.setTitle(assessmentQuestion.getQbQuestion().getName()); - question.setText(assessmentQuestion.getQbQuestion().getDescription()); - question.setFeedback(assessmentQuestion.getQbQuestion().getFeedback()); + question.setTitle(qbQuestion.getName()); + question.setText(qbQuestion.getDescription()); + question.setFeedback(qbQuestion.getFeedback()); question.setAnswers(answers); questions.add(question); @@ -186,18 +188,21 @@ Question[] questions = QuestionParser.parseQuestionChoiceForm(request); for (Question question : questions) { AssessmentQuestion assessmentQuestion = new AssessmentQuestion(); + assessmentQuestion.setQbQuestionModified(IQbService.QUESTION_MODIFIED_ID_BUMP); + QbQuestion qbQuestion = new QbQuestion(); + assessmentQuestion.setQbQuestion(qbQuestion); int maxDisplayOrder = 0; if ((questionList != null) && (questionList.size() > 0)) { AssessmentQuestion last = questionList.last(); maxDisplayOrder = last.getDisplayOrder() + 1; } assessmentQuestion.setDisplayOrder(maxDisplayOrder); - assessmentQuestion.getQbQuestion().setName(question.getTitle()); - assessmentQuestion.getQbQuestion().setDescription(QuestionParser.processHTMLField(question.getText(), false, contentFolderID, + qbQuestion.setName(question.getTitle()); + qbQuestion.setDescription(QuestionParser.processHTMLField(question.getText(), false, contentFolderID, question.getResourcesFolderPath())); - assessmentQuestion.getQbQuestion().setFeedback(QuestionParser.processHTMLField(question.getFeedback(), false, + qbQuestion.setFeedback(QuestionParser.processHTMLField(question.getFeedback(), false, contentFolderID, question.getResourcesFolderPath())); - assessmentQuestion.getQbQuestion().setPenaltyFactor(0); + qbQuestion.setPenaltyFactor(0); int questionMark = 1; @@ -210,17 +215,17 @@ // setting answers is very similar in both types, so they were put together here if (isMarkHedgingType) { - assessmentQuestion.getQbQuestion().setType(QbQuestion.TYPE_MARK_HEDGING); + qbQuestion.setType(QbQuestion.TYPE_MARK_HEDGING); } else if (isMultipleChoice) { - assessmentQuestion.getQbQuestion().setType(QbQuestion.TYPE_MULTIPLE_CHOICE); - assessmentQuestion.getQbQuestion().setMultipleAnswersAllowed(false); - assessmentQuestion.getQbQuestion().setShuffle(false); - assessmentQuestion.getQbQuestion().setPrefixAnswersWithLetters(false); + qbQuestion.setType(QbQuestion.TYPE_MULTIPLE_CHOICE); + qbQuestion.setMultipleAnswersAllowed(false); + qbQuestion.setShuffle(false); + qbQuestion.setPrefixAnswersWithLetters(false); } else { - assessmentQuestion.getQbQuestion().setType(QbQuestion.TYPE_SHORT_ANSWER); - assessmentQuestion.getQbQuestion().setCaseSensitive(false); + qbQuestion.setType(QbQuestion.TYPE_SHORT_ANSWER); + qbQuestion.setCaseSensitive(false); } String correctAnswer = null; @@ -259,7 +264,7 @@ optionList.add(option); } - assessmentQuestion.getQbQuestion().setQbOptions(new ArrayList<>(optionList)); + qbQuestion.setQbOptions(new ArrayList<>(optionList)); } if (correctAnswer == null) { @@ -268,10 +273,10 @@ } } else if (Question.QUESTION_TYPE_MULTIPLE_RESPONSE.equals(question.getType())) { - assessmentQuestion.getQbQuestion().setType(QbQuestion.TYPE_MULTIPLE_CHOICE); - assessmentQuestion.getQbQuestion().setMultipleAnswersAllowed(true); - assessmentQuestion.getQbQuestion().setShuffle(false); - assessmentQuestion.getQbQuestion().setPrefixAnswersWithLetters(false); + qbQuestion.setType(QbQuestion.TYPE_MULTIPLE_CHOICE); + qbQuestion.setMultipleAnswersAllowed(true); + qbQuestion.setShuffle(false); + qbQuestion.setPrefixAnswersWithLetters(false); if (question.getAnswers() != null) { float totalScore = 0; @@ -302,34 +307,34 @@ optionList.add(assessmentAnswer); } - assessmentQuestion.getQbQuestion().setQbOptions(new ArrayList<>(optionList)); + qbQuestion.setQbOptions(new ArrayList<>(optionList)); } } else if (Question.QUESTION_TYPE_TRUE_FALSE.equals(question.getType())) { - assessmentQuestion.getQbQuestion().setType(QbQuestion.TYPE_TRUE_FALSE); + qbQuestion.setType(QbQuestion.TYPE_TRUE_FALSE); if (question.getAnswers() == null) { log.warn("Answers missing from true-false question: " + question.getText()); continue; } else { for (Answer answer : question.getAnswers()) { if ((answer.getScore() != null) && (answer.getScore() > 0)) { - assessmentQuestion.getQbQuestion().setCorrectAnswer(Boolean.parseBoolean(answer.getText())); + qbQuestion.setCorrectAnswer(Boolean.parseBoolean(answer.getText())); questionMark = Double.valueOf(Math.ceil(answer.getScore())).intValue(); } if (!StringUtils.isBlank(answer.getFeedback())) { // set feedback for true/false answers if (Boolean.parseBoolean(answer.getText())) { - assessmentQuestion.getQbQuestion().setFeedbackOnCorrect(answer.getFeedback()); + qbQuestion.setFeedbackOnCorrect(answer.getFeedback()); } else { - assessmentQuestion.getQbQuestion().setFeedbackOnIncorrect(answer.getFeedback()); + qbQuestion.setFeedbackOnIncorrect(answer.getFeedback()); } } } } } else if (Question.QUESTION_TYPE_MATCHING.equals(question.getType())) { - assessmentQuestion.getQbQuestion().setType(QbQuestion.TYPE_MATCHING_PAIRS); - assessmentQuestion.getQbQuestion().setShuffle(true); + qbQuestion.setType(QbQuestion.TYPE_MATCHING_PAIRS); + qbQuestion.setShuffle(true); if (question.getAnswers() != null) { // the question score information is stored as sum of answer scores @@ -362,16 +367,16 @@ } } - assessmentQuestion.getQbQuestion().setQbOptions(new ArrayList<>(optionList)); + qbQuestion.setQbOptions(new ArrayList<>(optionList)); } } else if (Question.QUESTION_TYPE_ESSAY.equals(question.getType())) { - assessmentQuestion.getQbQuestion().setType(QbQuestion.TYPE_ESSAY); - assessmentQuestion.getQbQuestion().setAllowRichEditor(false); + qbQuestion.setType(QbQuestion.TYPE_ESSAY); + qbQuestion.setAllowRichEditor(false); } else if (Question.QUESTION_TYPE_ESSAY.equals(question.getType())) { - assessmentQuestion.getQbQuestion().setType(QbQuestion.TYPE_MULTIPLE_CHOICE); - assessmentQuestion.getQbQuestion().setShuffle(false); - assessmentQuestion.getQbQuestion().setPrefixAnswersWithLetters(false); + qbQuestion.setType(QbQuestion.TYPE_MULTIPLE_CHOICE); + qbQuestion.setShuffle(false); + qbQuestion.setPrefixAnswersWithLetters(false); String correctAnswer = null; if (question.getAnswers() != null) { @@ -409,7 +414,7 @@ optionList.add(option); } - assessmentQuestion.getQbQuestion().setQbOptions(new ArrayList<>(optionList)); + qbQuestion.setQbOptions(new ArrayList<>(optionList)); } if (correctAnswer == null) { @@ -422,11 +427,11 @@ continue; } - assessmentQuestion.getQbQuestion().setMaxMark(questionMark); + qbQuestion.setMaxMark(questionMark); questionList.add(assessmentQuestion); if (log.isDebugEnabled()) { - log.debug("Added question: " + assessmentQuestion.getQbQuestion().getName()); + log.debug("Added question: " + qbQuestion.getName()); } } } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/AuthoringController.java (.../AuthoringController.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -300,6 +300,7 @@ // ************************* Handle assessment questions ******************* Set newQuestions = getQuestionList(sessionMap); + int maxQuestionId = qbService.getMaxQuestionId(); for (AssessmentQuestion question : newQuestions) { question.setToolContentId(assessmentPO.getContentId()); removeNewLineCharacters(question); @@ -320,7 +321,7 @@ question.setQbQuestion(qbQuestion); qbQuestion.clearID(); qbQuestion.setVersion(1); - qbQuestion.setQuestionId(qbService.getMaxQuestionId()); + qbQuestion.setQuestionId(maxQuestionId++); qbQuestion.setCreateDate(new Date()); } break; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/LearningController.java (.../LearningController.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -1017,15 +1017,15 @@ // find corresponding questionResult for (AssessmentQuestionResult questionResult : result.getQuestionResults()) { - if (questionDto.getUid().equals(questionResult.getQbQuestion().getUid())) { + if (questionDto.getUid().equals(questionResult.getQbToolQuestion().getUid())) { // copy questionResult's info to the question questionDto.setMark(questionResult.getMark()); questionDto.setResponseSubmitted(questionResult.getFinishDate() != null); questionDto.setPenalty(questionResult.getPenalty()); questionDto.setQuestionFeedback(null); for (OptionDTO optionDto : questionDto.getOptionDtos()) { - if (optionDto.getUid().equals(questionResult.getSubmittedOptionUid())) { + if (optionDto.getUid().equals(questionResult.getQbOption().getUid())) { questionDto.setQuestionFeedback(optionDto.getFeedback()); break; } @@ -1035,7 +1035,7 @@ || questionDto.getType() == QbQuestion.TYPE_NUMERICAL) { boolean isAnsweredCorrectly = false; for (OptionDTO optionDto : questionDto.getOptionDtos()) { - if (optionDto.getUid().equals(questionResult.getSubmittedOptionUid())) { + if (optionDto.getUid().equals(questionResult.getQbOption().getUid())) { isAnsweredCorrectly = optionDto.getMaxMark() > 0; break; } Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rb41c8a8bc5134e78088378360a37f3906fadb3de --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/web/controller/MonitoringController.java (.../MonitoringController.java) (revision b41c8a8bc5134e78088378360a37f3906fadb3de) @@ -380,7 +380,7 @@ Long questionResultUid = null; if (assessmentResult != null) { for (AssessmentQuestionResult dbQuestionResult : assessmentResult.getQuestionResults()) { - if (dbQuestionResult.getQbQuestion().getUid().equals(questionUid)) { + if (dbQuestionResult.getQbToolQuestion().getUid().equals(questionUid)) { questionResultUid = dbQuestionResult.getUid(); break; }