Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql =================================================================== diff -u -re848f48bb500af94d7a02262bc0efae1cfc8032c -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision e848f48bb500af94d7a02262bc0efae1cfc8032c) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -65,15 +65,20 @@ ALTER TABLE tl_lamc11_options_content ADD COLUMN qb_option_uid BIGINT AFTER uid, ADD CONSTRAINT FK_tl_lamc11_options_content_2 FOREIGN KEY (qb_option_uid) REFERENCES lams_qb_option (uid) ON UPDATE CASCADE; -UPDATE tl_lamc11_options_content AS mco, lams_qb_tool_question AS tq, lams_qb_option AS qo - SET mco.qb_option_uid = qo.uid +UPDATE tl_lamc11_usr_attempt AS ua, tl_lamc11_options_content AS mco, lams_qb_tool_question AS tq, lams_qb_option AS qo + SET ua.mc_que_option_id = qo.uid WHERE TRIM(mco.mc_que_option_text) = qo.name + AND ua.mc_que_option_id = mco.uid AND qo.qb_question_uid = tq.qb_question_uid AND mco.mc_que_content_id = tq.tool_question_uid; -ALTER TABLE tl_lamc11_options_content DROP COLUMN mc_que_option_text, - DROP COLUMN correct_option, - DROP COLUMN displayOrder; +ALTER TABLE tl_lamc11_usr_attempt DROP FOREIGN KEY FK_tl_lamc11_usr_attempt_3, + RENAME COLUMN mc_que_option_id TO qb_option_uid; + +ALTER TABLE tl_lamc11_usr_attempt ADD CONSTRAINT FK_tl_lamc11_usr_attempt_3 FOREIGN KEY (qb_option_uid) + REFERENCES lams_qb_option (uid) ON DELETE CASCADE ON UPDATE CASCADE; + +DROP TABLE tl_lamc11_options_content; ----------------------Put all sql statements above here------------------------- Index: lams_common/src/java/org/lamsfoundation/lams/qb/QbOption.java =================================================================== diff -u -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_common/src/java/org/lamsfoundation/lams/qb/QbOption.java (.../QbOption.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) +++ lams_common/src/java/org/lamsfoundation/lams/qb/QbOption.java (.../QbOption.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -21,7 +21,7 @@ */ @Entity @Table(name = "lams_qb_option") -public class QbOption implements Serializable, Cloneable { +public class QbOption implements Serializable, Cloneable, Comparable { private static final long serialVersionUID = -2354311780882736829L; @Id @@ -40,14 +40,14 @@ @ManyToOne(optional = false) @JoinColumn(name = "qb_question_uid") - private QbQuestion question; + private QbQuestion qbQuestion; @Override public QbOption clone() { QbOption clone = null; try { clone = (QbOption) super.clone(); - clone.question = null; + clone.qbQuestion = null; } catch (CloneNotSupportedException e) { // it should never happen e.printStackTrace(); @@ -67,6 +67,11 @@ return new HashCodeBuilder().append(this.name).append(this.correct).toHashCode(); } + @Override + public int compareTo(QbOption o) { + return Integer.compare(this.displayOrder, o.displayOrder); + } + public Long getUid() { return uid; } @@ -95,11 +100,11 @@ this.displayOrder = displayOrder; } - public QbQuestion getQuestion() { - return question; + public QbQuestion getQbQuestion() { + return qbQuestion; } - public void setQuestion(QbQuestion question) { - this.question = question; + public void setQbQuestion(QbQuestion question) { + this.qbQuestion = question; } } \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/qb/QbQuestion.java =================================================================== diff -u -r260b7b6af8c214ba626dd1257c3882c1d3a62620 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_common/src/java/org/lamsfoundation/lams/qb/QbQuestion.java (.../QbQuestion.java) (revision 260b7b6af8c214ba626dd1257c3882c1d3a62620) +++ lams_common/src/java/org/lamsfoundation/lams/qb/QbQuestion.java (.../QbQuestion.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -67,8 +67,8 @@ @Column private String feedback; - @OneToMany(mappedBy = "question", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) - private List options = new ArrayList<>(); + @OneToMany(mappedBy = "qbQuestion", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) + private List qbOptions = new ArrayList<>(); // compares if current question data and the other one (probably modified with new data) are the same // it detects if question is the same or should another question/version be created @@ -82,7 +82,7 @@ QbQuestion other = (QbQuestion) o; // options are also checked if they are equal return new EqualsBuilder().append(name, other.name).append(feedback, other.feedback).append(mark, other.mark) - .append(options.toArray(), other.getOptions().toArray()).isEquals(); + .append(qbOptions.toArray(), other.getQbOptions().toArray()).isEquals(); } @Override @@ -100,19 +100,19 @@ e.printStackTrace(); } // make a deep copy of options - List optionsClone = new ArrayList<>(options.size()); - clone.setOptions(optionsClone); - for (QbOption option : options) { + List optionsClone = new ArrayList<>(qbOptions.size()); + clone.setQbOptions(optionsClone); + for (QbOption option : qbOptions) { QbOption optionClone = option.clone(); - optionClone.setQuestion(clone); + optionClone.setQbQuestion(clone); optionsClone.add(optionClone); } return clone; } public void clearID() { this.uid = null; - for (QbOption option : options) { + for (QbOption option : qbOptions) { option.uid = null; } } @@ -177,11 +177,11 @@ this.feedback = StringUtils.isBlank(feedback) ? null : feedback.trim(); } - public List getOptions() { - return options; + public List getQbOptions() { + return qbOptions; } - public void setOptions(List options) { - this.options = options; + public void setQbOptions(List options) { + this.qbOptions = options; } } \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcOptionsContentDAO.java =================================================================== diff -u -rd03a1456d2d0ee7a482273fe35412c67054f133d -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcOptionsContentDAO.java (.../IMcOptionsContentDAO.java) (revision d03a1456d2d0ee7a482273fe35412c67054f133d) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcOptionsContentDAO.java (.../IMcOptionsContentDAO.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -24,15 +24,16 @@ import java.util.List; +import org.lamsfoundation.lams.dao.IBaseDAO; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.tool.mc.dto.McOptionDTO; -import org.lamsfoundation.lams.tool.mc.model.McOptsContent; /** * Interface for the McOptionsContent DAO, defines methods needed to access/modify mc options content * * @author Ozgur Demirtas */ -public interface IMcOptionsContentDAO { +public interface IMcOptionsContentDAO extends IBaseDAO { /** *

@@ -43,16 +44,7 @@ * @param mcQueContentId * @return List */ - List findMcOptionsContentByQueId(Long mcQueContentId); + List findOptionsByQueId(Long questionUid); List getOptionDtos(Long mcQueContentId); - - /** - *

- * updates McOptsContent - *

- * - * @param mcOptionsContent - */ - void updateMcOptionsContent(McOptsContent mcOptionsContent); -} +} \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McOptionsContentDAO.java =================================================================== diff -u -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McOptionsContentDAO.java (.../McOptionsContentDAO.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McOptionsContentDAO.java (.../McOptionsContentDAO.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -25,11 +25,12 @@ import java.util.LinkedList; import java.util.List; -import org.apache.log4j.Logger; import org.lamsfoundation.lams.dao.hibernate.LAMSBaseDAO; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.tool.mc.dao.IMcOptionsContentDAO; import org.lamsfoundation.lams.tool.mc.dto.McOptionDTO; import org.lamsfoundation.lams.tool.mc.model.McOptsContent; +import org.lamsfoundation.lams.tool.mc.model.McQueContent; import org.springframework.stereotype.Repository; /** @@ -39,48 +40,26 @@ */ @Repository public class McOptionsContentDAO extends LAMSBaseDAO implements IMcOptionsContentDAO { - private static Logger logger = Logger.getLogger(McOptionsContentDAO.class.getName()); - - private static final String FIND_OPTIONS_BY_QUESTION_UID = "from mcOptsContent in class McOptsContent where mcOptsContent.mcQueContent.uid=:mcQueContentUid order by mcOptsContent.qbOption.displayOrder"; - - @SuppressWarnings("unchecked") @Override - public List findMcOptionsContentByQueId(Long questionUid) { - if (questionUid != null) { - List list = getSessionFactory().getCurrentSession().createQuery(FIND_OPTIONS_BY_QUESTION_UID) - .setParameter("mcQueContentUid", questionUid).list(); - return list; - } - return null; + public List findOptionsByQueId(Long questionUid) { + return ((McQueContent) find(McQueContent.class, questionUid)).getQbQuestion().getQbOptions(); } - @SuppressWarnings("unchecked") @Override public List getOptionDtos(Long questionUid) { - List optionDtos = new LinkedList(); + List optionDtos = new LinkedList<>(); if (questionUid != null) { - List options = getSessionFactory().getCurrentSession() - .createQuery(FIND_OPTIONS_BY_QUESTION_UID).setParameter("mcQueContentUid", questionUid) - .list(); + List options = ((McQueContent) find(McQueContent.class, questionUid)).getQbQuestion() + .getQbOptions(); if (options != null && options.size() > 0) { - for (McOptsContent option : options) { + for (QbOption option : options) { McOptionDTO optionDto = new McOptionDTO(option); optionDtos.add(optionDto); } } } return optionDtos; } - - @Override - public void updateMcOptionsContent(McOptsContent mcOptsContent) { - this.getSession().update(mcOptsContent); - } - - @Override - public void flush() { - this.getSession().flush(); - } } \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java =================================================================== diff -u -rd03a1456d2d0ee7a482273fe35412c67054f133d -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java (.../McUsrAttemptDAO.java) (revision d03a1456d2d0ee7a482273fe35412c67054f133d) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java (.../McUsrAttemptDAO.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -50,17 +50,17 @@ public class McUsrAttemptDAO extends LAMSBaseDAO implements IMcUsrAttemptDAO { private static final String LOAD_PARTICULAR_QUESTION_ATTEMPT = "from attempt in class McUsrAttempt where attempt.mcQueUsr.uid=:queUsrUid" - + " and attempt.mcQueContent.uid=:mcQueContentId" + " order by attempt.mcOptionsContent.uid"; + + " and attempt.mcQueContent.uid=:mcQueContentId order by attempt.qbOption.uid"; private static final String LOAD_FINAL_USER_QUESTION_ATTEMPTS_FOR_QUESTION_SESSION = "from attempt in class McUsrAttempt where " + " attempt.mcQueUsr.mcSessionId=:sessionUid AND attempt.mcQueContent.uid=:mcQueContentId " + " AND attempt.mcQueUsr.responseFinalised = true order by attempt.mcQueUsr.uid"; private static final String LOAD_ALL_QUESTION_ATTEMPTS = "from attempt in class McUsrAttempt where attempt.mcQueUsr.uid=:queUsrUid" - + " AND attempt.mcQueUsr.responseFinalised = true order by attempt.mcQueContent.uid, attempt.mcOptionsContent.uid"; + + " AND attempt.mcQueUsr.responseFinalised = true order by attempt.mcQueContent.uid, attempt.qbOption.uid"; private static final String FIND_ATTEMPTS_COUNT_BY_OPTION = "select count(*) from " + McUsrAttempt.class.getName() - + " as attempt where attempt.mcOptionsContent.uid=? AND attempt.mcQueUsr.responseFinalised = true"; + + " as attempt where attempt.qbOption.uid=? AND attempt.mcQueUsr.responseFinalised = true"; private static final String FIND_USER_TOTAL_MARK = "select COALESCE(SUM(attempt.mark),0) from " + McUsrAttempt.class.getName() Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/AnswerDTO.java =================================================================== diff -u -rd03a1456d2d0ee7a482273fe35412c67054f133d -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/AnswerDTO.java (.../AnswerDTO.java) (revision d03a1456d2d0ee7a482273fe35412c67054f133d) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/AnswerDTO.java (.../AnswerDTO.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -25,6 +25,7 @@ import java.util.List; import org.apache.commons.lang.builder.ToStringBuilder; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.tool.mc.model.McOptsContent; /** @@ -34,7 +35,7 @@ * * @author Ozgur Demirtas */ -public class AnswerDTO implements Comparable { +public class AnswerDTO implements Comparable { protected String question; protected String displayOrder; @@ -43,7 +44,7 @@ protected Integer mark; - protected McOptsContent answerOption; + protected QbOption answerOption; protected List options; @@ -54,37 +55,24 @@ protected String feedbackCorrect; protected String feedback; - + private int confidenceLevel; - /** - * @return Returns the answerOption. - */ - public McOptsContent getAnswerOption() { + public QbOption getAnswerOption() { return answerOption; } - /** - * @param answerOption - * The answerOption to set. - */ - public void setAnswerOption(McOptsContent answerOption) { + public void setAnswerOption(QbOption answerOption) { this.answerOption = answerOption; } - /** - * @return Returns the options. - */ + public List getOptions() { - return options; + return options; } - /** - * @param options - * The options to set. - */ public void setOptions(List options) { - this.options = options; + this.options = options; } /** @@ -109,8 +97,7 @@ } @Override - public int compareTo(Object o) { - AnswerDTO answerDto = (AnswerDTO) o; + public int compareTo(AnswerDTO answerDto) { if (answerDto == null) { return 1; @@ -223,7 +210,7 @@ public void setFeedback(String feedback) { this.feedback = feedback; } - + public int getConfidenceLevel() { return confidenceLevel; } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/McOptionDTO.java =================================================================== diff -u -rfd46695dcabc301f28799564c23314aa53d72dc6 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/McOptionDTO.java (.../McOptionDTO.java) (revision fd46695dcabc301f28799564c23314aa53d72dc6) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/McOptionDTO.java (.../McOptionDTO.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -22,7 +22,7 @@ package org.lamsfoundation.lams.tool.mc.dto; -import org.lamsfoundation.lams.tool.mc.model.McOptsContent; +import org.lamsfoundation.lams.qb.QbOption; /** * DTO that holds candiate answers data for summary page @@ -31,7 +31,6 @@ */ public class McOptionDTO implements Comparable { - private Long uid; private Long qbOptionUid; private String candidateAnswer; private String correct; @@ -45,34 +44,18 @@ } - public McOptionDTO(McOptsContent option) { - this.uid = option.getUid(); - this.candidateAnswer = option.getMcQueOptionText(); - this.qbOptionUid = option.getQbOption().getUid(); + public McOptionDTO(QbOption option) { + this.candidateAnswer = option.getName(); + this.qbOptionUid = option.getUid(); //this.correct = new Boolean(option.isCorrectOption()).toString(); - if (option.isCorrectOption()) { + if (option.isCorrect()) { this.correct = "Correct"; } else { this.correct = "Incorrect"; } } - /** - * @return Returns the uid. - */ - public Long getUid() { - return uid; - } - - /** - * @param uid - * The uid to set. - */ - public void setUid(Long uid) { - this.uid = uid; - } - public Long getQbOptionUid() { return qbOptionUid; } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McOptsContent.java =================================================================== diff -u -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McOptsContent.java (.../McOptsContent.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McOptsContent.java (.../McOptsContent.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -22,124 +22,19 @@ package org.lamsfoundation.lams.tool.mc.model; -import java.io.Serializable; - -import javax.persistence.CascadeType; -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.Table; -import javax.persistence.Transient; - -import org.apache.commons.lang.builder.ToStringBuilder; import org.lamsfoundation.lams.qb.QbOption; /** - * Persistent object/bean that defines the content for the MCQ tool. Provides accessors and mutators to get/set - * attributes It maps to database table: tl_lamc11_options_content + * Acts as a DTO which envelops QbOption and adds extra, transient fields. + * It is not an entity. * - * @author Ozgur Demirtas + * @author Marcin Cieslak */ -@SuppressWarnings("serial") -@Entity -@Table(name = "tl_lamc11_options_content") -public class McOptsContent implements Serializable, Comparable { - - @Id - @Column - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long uid; - - @ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = { CascadeType.DETACH, CascadeType.MERGE, - CascadeType.PERSIST, CascadeType.REFRESH }) - @JoinColumn(name = "qb_option_uid") +public class McOptsContent { private QbOption qbOption; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "mc_que_content_id") - private McQueContent mcQueContent; - - @Transient private boolean selected; - - @Transient private String escapedOptionText; - public McOptsContent(QbOption qbOption, McQueContent mcQueContent) { - this.qbOption = qbOption; - this.mcQueContent = mcQueContent; - } - - public static McOptsContent newInstance(McOptsContent mcOptsContent, McQueContent newMcQueContent) { - McOptsContent newMcOptsContent = new McOptsContent(mcOptsContent.getQbOption(), newMcQueContent); - return newMcOptsContent; - } - - /** default constructor */ - public McOptsContent() { - } - - public Long getUid() { - return this.uid; - } - - public void setUid(Long uid) { - this.uid = uid; - } - - public boolean isCorrectOption() { - return qbOption.isCorrect(); - } - - public void setCorrectOption(boolean correctOption) { - qbOption.setCorrect(correctOption); - } - - public String getMcQueOptionText() { - return qbOption.getName(); - } - - public void setMcQueOptionText(String mcQueOptionText) { - qbOption.setName(mcQueOptionText); - } - - public Integer getDisplayOrder() { - return qbOption.getDisplayOrder(); - } - - public void setDisplayOrder(Integer displayOrder) { - qbOption.setDisplayOrder(displayOrder); - } - - public McQueContent getMcQueContent() { - return this.mcQueContent; - } - - public void setMcQueContent(McQueContent mcQueContent) { - this.mcQueContent = mcQueContent; - this.qbOption.setQuestion(mcQueContent.getQbQuestion()); - } - - @Override - public String toString() { - return new ToStringBuilder(this).append("uid", getUid()).toString(); - } - - @Override - public int compareTo(McOptsContent optContent) { - // if the object does not exist yet, then just return any one of 0, -1, 1. Should not make a difference. - if (uid == null) { - return 1; - } else { - return (int) (uid.longValue() - optContent.uid.longValue()); - } - } - public boolean isSelected() { return this.selected; } @@ -163,8 +58,4 @@ public void setQbOption(QbOption qbOption) { this.qbOption = qbOption; } - - public String formatPrefixLetter(int index) { - return new String(Character.toChars(97 + index)) + ")"; - } -} +} \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McQueContent.java =================================================================== diff -u -r832ea8c2f95a9ae49aa28fea549d1759dbeb27ef -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McQueContent.java (.../McQueContent.java) (revision 832ea8c2f95a9ae49aa28fea549d1759dbeb27ef) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McQueContent.java (.../McQueContent.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -23,24 +23,18 @@ package org.lamsfoundation.lams.tool.mc.model; import java.io.Serializable; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Set; -import java.util.TreeSet; -import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; -import javax.persistence.OneToMany; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import javax.persistence.Transient; import org.apache.commons.lang.builder.ToStringBuilder; -import org.hibernate.annotations.SortComparator; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.qb.QbQuestion; import org.lamsfoundation.lams.qb.QbToolQuestion; @@ -57,15 +51,6 @@ // in this entity's table primary key is "uid", but it references "tool_question_uid" in lams_qb_tool_question @PrimaryKeyJoinColumn(name = "uid") public class McQueContent extends QbToolQuestion implements Serializable, Comparable { - public static class OptionComparator implements Comparator { - @Override - public int compare(McOptsContent o1, McOptsContent o2) { - return Integer.compare(o1.getQbOption().getDisplayOrder(), o2.getQbOption().getDisplayOrder()); - } - } - - public static final Comparator OPTION_COMPARATOR = new OptionComparator(); - private static final long serialVersionUID = 4022287106119453962L; /** @@ -81,29 +66,18 @@ @JoinColumn(name = "mc_content_id") private org.lamsfoundation.lams.tool.mc.model.McContent mcContent; - // TODO Make this orphanRemoval = true, but first fix McService.createQuestions() to stop mucking around with the collections. - // Currently options that are deleted in authoring leave junk records in the database with the mc_que_content_id set to null - @OneToMany(cascade = CascadeType.ALL) - @SortComparator(OptionComparator.class) - @JoinColumn(name = "mc_que_content_id") - private Set mcOptionsContents; - //DTO fields @Transient private String escapedQuestion; - public McQueContent(QbQuestion qbQuestion, String questionHash, Integer displayOrder, McContent mcContent, - Set mcOptionsContents) { + public McQueContent(QbQuestion qbQuestion, String questionHash, Integer displayOrder, McContent mcContent) { this.qbQuestion = qbQuestion; this.questionHash = questionHash; this.displayOrder = displayOrder; this.mcContent = mcContent; - this.mcOptionsContents = mcOptionsContents != null ? mcOptionsContents : new HashSet<>(); } - /** default constructor */ public McQueContent() { - this.mcOptionsContents = new HashSet<>(); } /** @@ -117,20 +91,10 @@ */ public static McQueContent newInstance(McQueContent queContent, McContent newMcContent) { McQueContent newQueContent = new McQueContent(queContent.getQbQuestion(), queContent.getQuestionHash(), - queContent.getDisplayOrder(), newMcContent, new TreeSet()); - newQueContent.setMcOptionsContents(queContent.deepCopyMcOptionsContent(newQueContent)); + queContent.getDisplayOrder(), newMcContent); return newQueContent; } - public Set deepCopyMcOptionsContent(McQueContent newQueContent) { - Set newMcOptionsContent = new TreeSet<>(McQueContent.OPTION_COMPARATOR); - for (McOptsContent mcOptsContent : this.getMcOptionsContents()) { - McOptsContent mcNewOptsContent = McOptsContent.newInstance(mcOptsContent, newQueContent); - newMcOptionsContent.add(mcNewOptsContent); - } - return newMcOptionsContent; - } - public String getQuestion() { return this.qbQuestion.getName(); } @@ -166,19 +130,11 @@ this.mcContent = mcContent; } - public Set getMcOptionsContents() { - return this.mcOptionsContents; - } - - public void setMcOptionsContents(Set mcOptionsContents) { - this.mcOptionsContents = mcOptionsContents; - } - /** * Get an options content record by its uid. Iterates over the set from getMcOptionsContents(). */ - public McOptsContent getOptionsContentByUID(Long uid) { - for (McOptsContent elem : getMcOptionsContents()) { + public QbOption getOptionByUID(Long uid) { + for (QbOption elem : qbQuestion.getQbOptions()) { if (elem.getUid().equals(uid)) { return elem; } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McUsrAttempt.java =================================================================== diff -u -r1ee503e3d0e0228ea8a45025fddf15d9623c0377 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McUsrAttempt.java (.../McUsrAttempt.java) (revision 1ee503e3d0e0228ea8a45025fddf15d9623c0377) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McUsrAttempt.java (.../McUsrAttempt.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -34,8 +34,10 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; +import javax.persistence.Transient; import org.apache.commons.lang.builder.ToStringBuilder; +import org.lamsfoundation.lams.qb.QbOption; /** *

@@ -77,25 +79,27 @@ private McQueUsr mcQueUsr; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "mc_que_option_id") - private McOptsContent mcOptionsContent; + @JoinColumn(name = "qb_option_uid") + private QbOption qbOption; @Column(name = "confidence_level") private int confidenceLevel; - public McUsrAttempt(Date attemptTime, McQueContent mcQueContent, McQueUsr mcQueUsr, McOptsContent mcOptionsContent, - Integer mark, boolean passed, boolean attemptCorrect, int confidenceLevel) { + @Transient + private McOptsContent mcOptionsContent; + + public McUsrAttempt(Date attemptTime, McQueContent mcQueContent, McQueUsr mcQueUsr, QbOption qbOption, Integer mark, + boolean passed, boolean attemptCorrect, int confidenceLevel) { this.attemptTime = attemptTime; this.mcQueContent = mcQueContent; this.mcQueUsr = mcQueUsr; - this.mcOptionsContent = mcOptionsContent; + this.qbOption = qbOption; this.mark = mark; this.passed = passed; this.attemptCorrect = attemptCorrect; this.confidenceLevel = confidenceLevel; } - /** default constructor */ public McUsrAttempt() { } @@ -161,60 +165,47 @@ this.mcQueUsr = mcQueUsr; } - public org.lamsfoundation.lams.tool.mc.model.McOptsContent getMcOptionsContent() { - return this.mcOptionsContent; + public QbOption getQbOption() { + return qbOption; } - public void setMcOptionsContent(org.lamsfoundation.lams.tool.mc.model.McOptsContent mcOptionsContent) { - this.mcOptionsContent = mcOptionsContent; + public void setQbOption(QbOption qbOption) { + this.qbOption = qbOption; } + public McOptsContent getMcOptionsContent() { + if (mcOptionsContent == null) { + mcOptionsContent = new McOptsContent(); + mcOptionsContent.setQbOption(qbOption); + } + return mcOptionsContent; + } + @Override public String toString() { return new ToStringBuilder(this).append("uid", getUid()).toString(); } - /** - * @return Returns the mark. - */ public Integer getMark() { return mark; } - /** - * @param mark - * The mark to set. - */ public void setMark(Integer mark) { this.mark = mark; } - /** - * @return Returns the passed. - */ public boolean isPassed() { return passed; } - /** - * @param passed - * The passed to set. - */ public void setPassed(boolean isPassed) { this.passed = isPassed; } - /** - * @return Returns the attemptCorrect. - */ public boolean isAttemptCorrect() { return attemptCorrect; } - /** - * @param attemptCorrect - * The attemptCorrect to set. - */ public void setAttemptCorrect(boolean attemptCorrect) { this.attemptCorrect = attemptCorrect; } @@ -251,5 +242,4 @@ return (int) (uid.longValue() - other.uid.longValue()); } } - -} +} \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java =================================================================== diff -u -r3bb7e0141ae1cc15ccd737c95d90b5762a34ad61 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision 3bb7e0141ae1cc15ccd737c95d90b5762a34ad61) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -27,6 +27,7 @@ import java.util.Set; import org.lamsfoundation.lams.notebook.model.NotebookEntry; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.tool.Tool; import org.lamsfoundation.lams.tool.ToolSessionExportOutputData; import org.lamsfoundation.lams.tool.exception.DataMissingException; @@ -41,7 +42,6 @@ import org.lamsfoundation.lams.tool.mc.dto.SessionDTO; import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.model.McContent; -import org.lamsfoundation.lams.tool.mc.model.McOptsContent; import org.lamsfoundation.lams.tool.mc.model.McQueContent; import org.lamsfoundation.lams.tool.mc.model.McQueUsr; import org.lamsfoundation.lams.tool.mc.model.McSession; @@ -137,9 +137,9 @@ List getFinalizedUserAttempts(final McQueUsr user); - List findOptionsByQuestionUid(Long mcQueContentId) throws McApplicationException; + List findOptionsByQuestionUid(Long mcQueContentId) throws McApplicationException; - void updateMcOptionsContent(McOptsContent mcOptsContent) throws McApplicationException; + void updateQbOption(QbOption option) throws McApplicationException; McUsrAttempt getUserAttemptByQuestion(Long queUsrUid, Long mcQueContentId); @@ -236,15 +236,15 @@ /** * Gets the basic statistics for the grades for the Leaders when an Assessment is done using * Group Leaders. So the averages, etc are for the whole Assessment, not for a Group. - * + * * @param contentId * @return */ LeaderResultsDTO getLeaderResultsDTOForLeaders(Long contentId); /** * Prepares data for the marks summary graph on the statistics page - * + * * @param assessment * @param sessionDtos * @return @@ -254,7 +254,7 @@ /** * Prepares data for the marks summary graph on the statistics page, using the grades for the Leaders * when an Assessment is done using Group Leaders. So the grades are for the whole Assessment, not for a Group. - * + * * @param assessment * @param sessionDtos * @return Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/MCOutputFactory.java =================================================================== diff -u -rd03a1456d2d0ee7a482273fe35412c67054f133d -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/MCOutputFactory.java (.../MCOutputFactory.java) (revision d03a1456d2d0ee7a482273fe35412c67054f133d) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/MCOutputFactory.java (.../MCOutputFactory.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -20,23 +20,21 @@ * **************************************************************** */ - package org.lamsfoundation.lams.tool.mc.service; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.tool.OutputFactory; import org.lamsfoundation.lams.tool.ToolOutput; import org.lamsfoundation.lams.tool.ToolOutputDefinition; import org.lamsfoundation.lams.tool.mc.McAppConstants; import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.model.McContent; -import org.lamsfoundation.lams.tool.mc.model.McOptsContent; import org.lamsfoundation.lams.tool.mc.model.McQueContent; import org.lamsfoundation.lams.tool.mc.model.McQueUsr; import org.lamsfoundation.lams.tool.mc.model.McSession; @@ -51,7 +49,7 @@ public SortedMap getToolOutputDefinitions(Object toolContentObject, int definitionType) { - TreeMap definitionMap = new TreeMap(); + TreeMap definitionMap = new TreeMap<>(); ToolOutputDefinition definition = buildBooleanOutputDefinition(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT); definitionMap.put(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, definition); @@ -72,7 +70,7 @@ public SortedMap getToolOutput(List names, IMcService mcService, Long toolSessionId, Long learnerId) { - TreeMap output = new TreeMap(); + TreeMap output = new TreeMap<>(); McSession session = mcService.getMcSessionById(toolSessionId); if (session != null) { @@ -110,44 +108,45 @@ } return null; } - + public List getToolOutputs(String name, IMcService assessmentService, Long toolContentId) { if ((name != null) && (toolContentId != null)) { if (name.equals(McAppConstants.OUTPUT_NAME_LEARNER_MARK)) { List toolOutputDtos = assessmentService.getLearnerMarksByContentId(toolContentId); - + //convert toolOutputDtos to toolOutputs - List toolOutputs = new ArrayList(); + List toolOutputs = new ArrayList<>(); for (ToolOutputDTO toolOutputDto : toolOutputDtos) { float totalMark = toolOutputDto.getMark() == null ? 0 : toolOutputDto.getMark().floatValue(); - + ToolOutput toolOutput = new ToolOutput(McAppConstants.OUTPUT_NAME_LEARNER_MARK, getI18NText(McAppConstants.OUTPUT_NAME_LEARNER_MARK, true), totalMark); toolOutput.setUserId(toolOutputDto.getUserId().intValue()); toolOutputs.add(toolOutput); } return toolOutputs; - + } else if (name.equals(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT)) { List toolOutputDtos = assessmentService.getLearnerMarksByContentId(toolContentId); - + //calculate max possible total mark int maxMark = 0; McContent mcContent = assessmentService.getMcContent(toolContentId); - for (McQueContent question : (Set)mcContent.getMcQueContents()) { + for (McQueContent question : mcContent.getMcQueContents()) { maxMark += question.getMark(); } - + //convert toolOutputDtos to toolOutputs - List toolOutputs = new ArrayList(); + List toolOutputs = new ArrayList<>(); for (ToolOutputDTO toolOutputDto : toolOutputDtos) { float totalMark = toolOutputDto.getMark() == null ? 0 : toolOutputDto.getMark().floatValue(); boolean isAllQuestionAnswersCorrect = totalMark == maxMark; - + ToolOutput toolOutput = new ToolOutput(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, - getI18NText(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, true), isAllQuestionAnswersCorrect); + getI18NText(McAppConstants.OUTPUT_NAME_LEARNER_ALL_CORRECT, true), + isAllQuestionAnswersCorrect); toolOutput.setUserId(toolOutputDto.getUserId().intValue()); toolOutputs.add(toolOutput); } @@ -193,8 +192,8 @@ long correctlearnerOptions = 0; List userAttempts = mcService.getFinalizedUserAttempts(user); for (McUsrAttempt userAttempt : userAttempts) { - McOptsContent option = userAttempt.getMcOptionsContent(); - if (!option.isCorrectOption()) { + QbOption option = userAttempt.getQbOption(); + if (!option.isCorrect()) { // wrong answer so no point going any further return false; } else { @@ -208,10 +207,9 @@ Iterator questionIterator = mcContent.getMcQueContents().iterator(); while (questionIterator.hasNext()) { McQueContent mcQueContent = (McQueContent) questionIterator.next(); - Iterator optionIterator = mcQueContent.getMcOptionsContents().iterator(); + Iterator optionIterator = mcQueContent.getQbQuestion().getQbOptions().iterator(); while (optionIterator.hasNext()) { - McOptsContent mcOptsContent = (McOptsContent) optionIterator.next(); - if (mcOptsContent.isCorrectOption()) { + if (optionIterator.next().isCorrect()) { correctOptions++; } } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java =================================================================== diff -u -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -196,13 +196,13 @@ // if response doesn't exist - created mcUsrAttempt in the db if (userAttempt == null) { userAttempt = new McUsrAttempt(leaderAttempt.getAttemptTime(), question, user, - leaderAttempt.getMcOptionsContent(), leaderAttempt.getMark(), leaderAttempt.isPassed(), + leaderAttempt.getQbOption(), leaderAttempt.getMark(), leaderAttempt.isPassed(), leaderAttempt.isAttemptCorrect(), leaderAttempt.getConfidenceLevel()); mcUsrAttemptDAO.saveMcUsrAttempt(userAttempt); // if it's been changed by the leader } else if (leaderAttempt.getAttemptTime().compareTo(userAttempt.getAttemptTime()) != 0) { - userAttempt.setMcOptionsContent(leaderAttempt.getMcOptionsContent()); + userAttempt.setQbOption(leaderAttempt.getQbOption()); userAttempt.setConfidenceLevel(leaderAttempt.getConfidenceLevel()); userAttempt.setAttemptTime(leaderAttempt.getAttemptTime()); this.updateMcUsrAttempt(userAttempt); @@ -252,8 +252,8 @@ mcQueContentDAO.insertOrUpdate(mcQueContent.getQbQuestion()); - for (McOptsContent mcqOption : mcQueContent.getMcOptionsContents()) { - mcQueContentDAO.insertOrUpdate(mcqOption.getQbOption()); + for (QbOption option : mcQueContent.getQbQuestion().getQbOptions()) { + mcQueContentDAO.insertOrUpdate(option); } mcQueContentDAO.saveOrUpdateMcQueContent(mcQueContent); @@ -301,18 +301,20 @@ List optionDTOs = questionDTO.getOptionDtos(); // basic question data does not match, skip option checking boolean isModified = qbQuestion.isModified(qbQuestionClone) - || optionDTOs.size() != qbQuestionClone.getOptions().size(); + || optionDTOs.size() != qbQuestionClone.getQbOptions().size(); if (!isModified) { // check if options changed - for (McOptionDTO optionDTO : optionDTOs) { + for (int i = 0; i < optionDTOs.size(); i++) { + McOptionDTO optionDTO = optionDTOs.get(i); String optionText = optionDTO.getCandidateAnswer(); boolean isCorrectOption = "Correct".equals(optionDTO.getCorrect()); //find persisted option if it exists - for (QbOption qbOption : qbQuestionClone.getOptions()) { + for (QbOption qbOption : qbQuestionClone.getQbOptions()) { if (optionDTO.getQbOptionUid().equals(qbOption.getUid())) { qbOption.setCorrect(isCorrectOption); qbOption.setName(optionText); + qbOption.setDisplayOrder(i + 1); break; } } @@ -330,14 +332,14 @@ } else { // if no modification was made, prevent clone from being persisted mcQueContentDAO.releaseFromCache(qbQuestionClone); - for (QbOption option : qbQuestionClone.getOptions()) { + for (QbOption option : qbQuestionClone.getQbOptions()) { mcQueContentDAO.releaseFromCache(option); } } // in case question doesn't exist if (question == null) { - question = new McQueContent(qbQuestion, null, new Integer(displayOrder), content, null); + question = new McQueContent(qbQuestion, null, new Integer(displayOrder), content); // adding a new question to content content.getMcQueContents().add(question); @@ -351,53 +353,52 @@ } // persist candidate answers - Set oldOptions = question.getMcOptionsContents(); - Set newOptions = new TreeSet<>(McQueContent.OPTION_COMPARATOR); + List oldOptions = question.getQbQuestion().getQbOptions(); + List newOptions = new ArrayList<>(); int displayOrderOption = 1; - Set qbOptionsToRemove = new HashSet<>(qbQuestion.getOptions()); + Set qbOptionsToRemove = new HashSet<>(qbQuestion.getQbOptions()); for (McOptionDTO optionDTO : optionDTOs) { - Long optionUid = optionDTO.getUid(); String optionText = optionDTO.getCandidateAnswer(); boolean isCorrectOption = "Correct".equals(optionDTO.getCorrect()); //find persisted option if it exists - McOptsContent option = new McOptsContent(); - for (McOptsContent oldOption : oldOptions) { - if (oldOption.getUid().equals(optionUid)) { + QbOption option = null; + for (QbOption oldOption : oldOptions) { + if (oldOption.getUid().equals(optionDTO.getQbOptionUid())) { option = oldOption; break; } } if (optionDTO.getQbOptionUid() == null) { // it is a new option - option.setQbOption(new QbOption()); + option = new QbOption(); } else { // match existing options with DTO data - for (QbOption qbOption : qbQuestion.getOptions()) { + for (QbOption qbOption : qbQuestion.getQbOptions()) { if (qbOption.getUid().equals(optionDTO.getQbOptionUid())) { - option.setQbOption(qbOption); + option = qbOption; // if a match was found, we do not remove the option - qbOptionsToRemove.remove(qbOption); + qbOptionsToRemove.remove(option); break; } } } // QB option data is set here option.setDisplayOrder(displayOrderOption); - option.setCorrectOption(isCorrectOption); - option.setMcQueOptionText(optionText); - option.setMcQueContent(question); + option.setCorrect(isCorrectOption); + option.setName(optionText); newOptions.add(option); displayOrderOption++; } - question.setMcOptionsContents(newOptions); + qbQuestion.getQbOptions().clear(); + qbQuestion.getQbOptions().addAll(newOptions); // make removed options orphaned, so they will be removed from DB - qbQuestion.getOptions().removeAll(qbOptionsToRemove); + qbQuestion.getQbOptions().removeAll(qbOptionsToRemove); qbOptionsToRemove.clear(); // if clone is the real question, clear its IDs so it is saved as a new question // it needs to be only now as above we used option UID matching @@ -506,7 +507,7 @@ "Can't find question with specified question uid: " + answerDto.getQuestionUid()); } - McOptsContent answerOption = answerDto.getAnswerOption(); + QbOption answerOption = answerDto.getAnswerOption(); if (answerOption != null) { Integer mark = answerDto.getMark(); @@ -517,7 +518,7 @@ McUsrAttempt userAttempt = this.getUserAttemptByQuestion(user.getUid(), questionUid); if (userAttempt != null) { userAttempt.setAttemptTime(attemptTime); - userAttempt.setMcOptionsContent(answerOption); + userAttempt.setQbOption(answerOption); userAttempt.setMark(mark); userAttempt.setPassed(passed); userAttempt.setAttemptCorrect(isAttemptCorrect); @@ -557,23 +558,29 @@ for (McQueContent question : questions) { AnswerDTO answerDto = new AnswerDTO(); - Set optionSet = question.getMcOptionsContents(); - List optionList = new LinkedList<>(optionSet); + List optionList = question.getQbQuestion().getQbOptions(); + List mcOptsContentList = new ArrayList<>(); boolean randomize = mcContent.isRandomize(); if (randomize) { - ArrayList shuffledList = new ArrayList<>(optionList); + ArrayList shuffledList = new ArrayList<>(optionList); Collections.shuffle(shuffledList); optionList = new LinkedList<>(shuffledList); } + for (QbOption option : optionList) { + McOptsContent mcOptsContent = new McOptsContent(); + mcOptsContent.setQbOption(option); + mcOptsContentList.add(mcOptsContent); + } answerDto.setQuestion(question.getQuestion()); answerDto.setDisplayOrder(question.getDisplayOrder().toString()); answerDto.setQuestionUid(question.getUid()); answerDto.setMark(question.getMark()); - answerDto.setOptions(optionList); + answerDto.setOptions(mcOptsContentList); + answerDtos.add(answerDto); } @@ -588,9 +595,9 @@ answerDto.setConfidenceLevel(dbAttempt.getConfidenceLevel()); // mark selected option as selected - Long selectedOptionUid = dbAttempt.getMcOptionsContent().getUid(); + Long selectedOptionUid = dbAttempt.getQbOption().getUid(); for (McOptsContent option : answerDto.getOptions()) { - if (selectedOptionUid.equals(option.getUid())) { + if (selectedOptionUid.equals(option.getQbOption().getUid())) { option.setSelected(true); } } @@ -667,8 +674,8 @@ // find out the answered option's sequential letter - A,B,C... String answeredOptionLetter = ""; int optionCount = 1; - for (McOptsContent option : attempt.getMcQueContent().getMcOptionsContents()) { - if (attempt.getMcOptionsContent().getUid().equals(option.getUid())) { + for (QbOption option : attempt.getMcQueContent().getQbQuestion().getQbOptions()) { + if (attempt.getQbOption().getUid().equals(option.getUid())) { answeredOptionLetter = String.valueOf((char) ((optionCount + 'A') - 1)); break; } @@ -779,9 +786,9 @@ } @Override - public List findOptionsByQuestionUid(Long mcQueContentId) throws McApplicationException { + public List findOptionsByQuestionUid(Long mcQueContentId) throws McApplicationException { try { - return mcOptionsContentDAO.findMcOptionsContentByQueId(mcQueContentId); + return mcOptionsContentDAO.findOptionsByQueId(mcQueContentId); } catch (DataAccessException e) { throw new McApplicationException( "Exception occured when lams is finding by que id" + " the mc options: " + e.getMessage(), e); @@ -798,9 +805,9 @@ } @Override - public void updateMcOptionsContent(McOptsContent mcOptsContent) throws McApplicationException { + public void updateQbOption(QbOption option) throws McApplicationException { try { - mcOptionsContentDAO.updateMcOptionsContent(mcOptsContent); + mcOptionsContentDAO.update(option); } catch (DataAccessException e) { throw new McApplicationException( "Exception occured when lams is updating" + " the mc options content: " + e.getMessage(), e); @@ -893,14 +900,14 @@ } // options are different - Set oldOptions = oldQuestion.getMcOptionsContents(); + List oldOptions = oldQuestion.getQbQuestion().getQbOptions(); List optionDTOs = questionDTO.getOptionDtos(); - for (McOptsContent oldOption : oldOptions) { + for (QbOption oldOption : oldOptions) { for (McOptionDTO optionDTO : optionDTOs) { - if (oldOption.getUid().equals(optionDTO.getUid())) { + if (oldOption.getUid().equals(optionDTO.getQbOptionUid())) { - if (!StringUtils.equals(oldOption.getMcQueOptionText(), optionDTO.getCandidateAnswer()) - || (oldOption.isCorrectOption() != "Correct".equals(optionDTO.getCorrect()))) { + if (!StringUtils.equals(oldOption.getName(), optionDTO.getCandidateAnswer()) + || (oldOption.isCorrect() != "Correct".equals(optionDTO.getCorrect()))) { isQuestionModified = true; } } @@ -1005,8 +1012,8 @@ Set questions = mcContent.getMcQueContents(); int maxOptionsInQuestion = 0; for (McQueContent question : questions) { - if (question.getMcOptionsContents().size() > maxOptionsInQuestion) { - maxOptionsInQuestion = question.getMcOptionsContents().size(); + if (question.getQbQuestion().getQbOptions().size() > maxOptionsInQuestion) { + maxOptionsInQuestion = question.getQbQuestion().getQbOptions().size(); } } @@ -1057,13 +1064,13 @@ rowCount++; int totalPercentage = 0; - for (McOptsContent option : question.getMcOptionsContents()) { + for (QbOption option : question.getQbQuestion().getQbOptions()) { int optionAttemptCount = mcUsrAttemptDAO.getAttemptsCountPerOption(option.getUid()); cell = row.createCell(count++); int percentage = (optionAttemptCount * 100) / totalNumberOfUsers; cell.setCellValue(percentage + "%"); totalPercentage += percentage; - if (option.isCorrectOption()) { + if (option.isCorrect()) { cell.setCellStyle(greenColor); } } @@ -1111,8 +1118,8 @@ // find out the correct answer's sequential letter - A,B,C... String correctAnswerLetter = ""; int answerCount = 1; - for (McOptsContent option : question.getMcOptionsContents()) { - if (option.isCorrectOption()) { + for (QbOption option : question.getQbQuestion().getQbOptions()) { + if (option.isCorrect()) { correctAnswerLetter = String.valueOf((char) ((answerCount + 'A') - 1)); break; } @@ -1624,7 +1631,7 @@ //fill in question's and user answer's hashes McQueContent question = userAttempt.getMcQueContent(); - String answer = userAttempt.getMcOptionsContent().getMcQueOptionText(); + String answer = userAttempt.getQbOption().getName(); ConfidenceLevelDTO confidenceLevelDto = new ConfidenceLevelDTO(); confidenceLevelDto.setUserId(userId.intValue()); @@ -2027,18 +2034,18 @@ qbQuestion.setName(JsonUtil.optString(questionData, RestTags.QUESTION_TEXT)); qbQuestion.setMark(1); McQueContent question = new McQueContent(qbQuestion, null, - JsonUtil.optInt(questionData, RestTags.DISPLAY_ORDER), mcq, new HashSet()); + JsonUtil.optInt(questionData, RestTags.DISPLAY_ORDER), mcq); ArrayNode optionsData = JsonUtil.optArray(questionData, RestTags.ANSWERS); for (JsonNode optionData : optionsData) { QbOption qbOption = new QbOption(); qbOption.setName(JsonUtil.optString(optionData, RestTags.ANSWER_TEXT)); qbOption.setCorrect(JsonUtil.optBoolean(optionData, RestTags.CORRECT)); qbOption.setDisplayOrder(JsonUtil.optInt(optionData, RestTags.DISPLAY_ORDER)); - question.getMcOptionsContents().add(new McOptsContent(qbOption, question)); + question.getQbQuestion().getQbOptions().add(qbOption); } saveOrUpdateMcQueContent(question); } } -} +} \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java =================================================================== diff -u -rd9b3433f41c2b25011809144d241d33237d9b9d8 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java (.../AuthoringUtil.java) (revision d9b3433f41c2b25011809144d241d33237d9b9d8) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java (.../AuthoringUtil.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -32,11 +32,11 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.tool.mc.McAppConstants; import org.lamsfoundation.lams.tool.mc.dto.McOptionDTO; import org.lamsfoundation.lams.tool.mc.dto.McQuestionDTO; import org.lamsfoundation.lams.tool.mc.model.McContent; -import org.lamsfoundation.lams.tool.mc.model.McOptsContent; import org.lamsfoundation.lams.tool.mc.model.McQueContent; import org.lamsfoundation.lams.tool.mc.service.IMcService; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; @@ -245,7 +245,7 @@ // build candidate dtos List optionDtos = new LinkedList<>(); - for (McOptsContent option : question.getMcOptionsContents()) { + for (QbOption option : question.getQbQuestion().getQbOptions()) { McOptionDTO optionDTO = new McOptionDTO(option); optionDtos.add(optionDTO); } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/LearningUtil.java =================================================================== diff -u -rd03a1456d2d0ee7a482273fe35412c67054f133d -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/LearningUtil.java (.../LearningUtil.java) (revision d03a1456d2d0ee7a482273fe35412c67054f133d) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/LearningUtil.java (.../LearningUtil.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -83,4 +83,7 @@ return Boolean.FALSE; } -} + public static String formatPrefixLetter(int index) { + return new String(Character.toChars(97 + index)) + ")"; + } +} \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McController.java =================================================================== diff -u -r4b2b48600119f8594fd3c82b58783c28b63324de -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McController.java (.../McController.java) (revision 4b2b48600119f8594fd3c82b58783c28b63324de) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McController.java (.../McController.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -799,7 +799,6 @@ for (int i = 0; i < McAppConstants.MAX_OPTION_COUNT; i++) { String optionText = request.getParameter("ca" + i); Long qbOptionUid = WebUtil.readLongParam(request, "qbOptionUid" + i, true); - Long optionUid = WebUtil.readLongParam(request, "caUid" + i, true); String isCorrect = "Incorrect"; @@ -809,7 +808,6 @@ if (optionText != null) { McOptionDTO optionDTO = new McOptionDTO(); - optionDTO.setUid(optionUid); optionDTO.setCandidateAnswer(optionText); optionDTO.setCorrect(isCorrect); optionDTO.setQbOptionUid(qbOptionUid); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McLearningController.java =================================================================== diff -u -r3bb7e0141ae1cc15ccd737c95d90b5762a34ad61 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McLearningController.java (.../McLearningController.java) (revision 3bb7e0141ae1cc15ccd737c95d90b5762a34ad61) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McLearningController.java (.../McLearningController.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -40,14 +40,14 @@ import org.apache.log4j.Logger; import org.lamsfoundation.lams.notebook.model.NotebookEntry; import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.tool.ToolAccessMode; import org.lamsfoundation.lams.tool.exception.DataMissingException; import org.lamsfoundation.lams.tool.exception.ToolException; import org.lamsfoundation.lams.tool.mc.McAppConstants; import org.lamsfoundation.lams.tool.mc.dto.AnswerDTO; import org.lamsfoundation.lams.tool.mc.dto.McGeneralLearnerFlowDTO; import org.lamsfoundation.lams.tool.mc.model.McContent; -import org.lamsfoundation.lams.tool.mc.model.McOptsContent; import org.lamsfoundation.lams.tool.mc.model.McQueContent; import org.lamsfoundation.lams.tool.mc.model.McQueUsr; import org.lamsfoundation.lams.tool.mc.model.McSession; @@ -329,11 +329,12 @@ return null; } - protected List buildAnswerDtos(List answers, Map confidenceLevels, McContent content, HttpServletRequest request) { + protected List buildAnswerDtos(List answers, Map confidenceLevels, + McContent content, HttpServletRequest request) { List answerDtos = new LinkedList<>(); - for (McQueContent question : (Set) content.getMcQueContents()) { + for (McQueContent question : content.getMcQueContents()) { String questionUid = question.getUid().toString(); int questionMark = question.getMark().intValue(); @@ -344,20 +345,20 @@ answerDto.setFeedback(question.getFeedback() != null ? question.getFeedback() : ""); //search for according answer - McOptsContent answerOption = null; + QbOption answerOption = null; for (String answer : answers) { int hyphenPosition = answer.indexOf("-"); String answeredQuestionUid = answer.substring(0, hyphenPosition); if (questionUid.equals(answeredQuestionUid)) { String answeredOptionUid = answer.substring(hyphenPosition + 1); - answerOption = question.getOptionsContentByUID(new Long(answeredOptionUid)); + answerOption = question.getOptionByUID(new Long(answeredOptionUid)); answerDto.setAnswerOption(answerOption); break; } } - boolean isCorrect = (answerOption != null) && answerOption.isCorrectOption(); + boolean isCorrect = (answerOption != null) && answerOption.isCorrect(); answerDto.setAttemptCorrect(isCorrect); if (isCorrect) { answerDto.setFeedbackCorrect(question.getFeedback()); @@ -367,12 +368,13 @@ answerDto.setMark(0); } - // handle confidence levels + // handle confidence levels if (content.isEnableConfidenceLevels()) { String wantedKey = "confidenceLevel" + question.getUid(); Integer confidenceLevel = confidenceLevels.get(wantedKey); - if ( confidenceLevel != null ) + if (confidenceLevel != null) { answerDto.setConfidenceLevel(confidenceLevel); + } } answerDtos.add(answerDto); @@ -401,14 +403,16 @@ mcContent.isQuestionsSequenced()); Map learnerConfidenceLevels = null; - if (mcContent.isEnableConfidenceLevels()) + if (mcContent.isEnableConfidenceLevels()) { learnerConfidenceLevels = parseLearnerConfidenceLevels(mcLearningForm, request, mcContent.isQuestionsSequenced()); + } if (mcContent.isQuestionsSequenced()) { sessionMap.put(McAppConstants.QUESTION_AND_CANDIDATE_ANSWERS_KEY, answers); - if ( mcContent.isEnableConfidenceLevels() ) + if (mcContent.isEnableConfidenceLevels()) { sessionMap.put(McAppConstants.CONFIDENCE_LEVELS_KEY, learnerConfidenceLevels); + } } mcLearningForm.resetCa(request); @@ -473,7 +477,7 @@ mcContent.isQuestionsSequenced()); sessionMap.put(McAppConstants.CONFIDENCE_LEVELS_KEY, learnerConfidenceLevels); } - + //save user attempt List answerDtos = buildAnswerDtos(answers, learnerConfidenceLevels, mcContent, request); mcService.saveUserAttempt(user, answerDtos); @@ -539,17 +543,18 @@ while (itMap.hasNext()) { Map.Entry pairs = (Map.Entry) itMap.next(); String currentQuestionUid = pairs.getValue().toString(); - List listQuestionOptions = mcService.findOptionsByQuestionUid(new Long(currentQuestionUid)); + List listQuestionOptions = mcService.findOptionsByQuestionUid(new Long(currentQuestionUid)); //builds a questions map from questions list Map mapOptsContent = new TreeMap<>(); - Iterator iter = listQuestionOptions.iterator(); + Iterator iter = listQuestionOptions.iterator(); int mapIndex2 = 0; while (iter.hasNext()) { - McOptsContent option = iter.next(); - String stringIndex = mcContent.isPrefixAnswersWithLetters() ? option.formatPrefixLetter(mapIndex2++) + QbOption option = iter.next(); + String stringIndex = mcContent.isPrefixAnswersWithLetters() + ? LearningUtil.formatPrefixLetter(mapIndex2++) : Integer.toString(++mapIndex2); - mapOptsContent.put(stringIndex, option.getMcQueOptionText()); + mapOptsContent.put(stringIndex, option.getName()); } mapStartupGeneralOptionsContent.put(mapIndex.toString(), mapOptsContent); @@ -788,9 +793,10 @@ List answers = McLearningController.parseLearnerAnswers(mcLearningForm, request, mcContent.isQuestionsSequenced()); Map learnerConfidenceLevels = null; - if (mcContent.isEnableConfidenceLevels()) + if (mcContent.isEnableConfidenceLevels()) { learnerConfidenceLevels = parseLearnerConfidenceLevels(mcLearningForm, request, mcContent.isQuestionsSequenced()); + } List answerDtos = buildAnswerDtos(answers, learnerConfidenceLevels, mcContent, request); mcService.saveUserAttempt(user, answerDtos); @@ -842,12 +848,13 @@ String httpSessionID = mcLearningForm.getHttpSessionID(); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(httpSessionID); - Map confidenceLevels = new HashMap(); + Map confidenceLevels = new HashMap<>(); if (isQuestionsSequenced) { Map previousConfidenceLevels = (Map) sessionMap .get(McAppConstants.CONFIDENCE_LEVELS_KEY); - if ( previousConfidenceLevels != null ) + if (previousConfidenceLevels != null) { confidenceLevels.putAll(previousConfidenceLevels); + } } Map parameters = request.getParameterMap(); @@ -860,7 +867,7 @@ } return confidenceLevels; } - + private McQueUsr getCurrentUser(String toolSessionId) { // get back login user DTO Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McMonitoringController.java =================================================================== diff -u -rd03a1456d2d0ee7a482273fe35412c67054f133d -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McMonitoringController.java (.../McMonitoringController.java) (revision d03a1456d2d0ee7a482273fe35412c67054f133d) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McMonitoringController.java (.../McMonitoringController.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -378,7 +378,7 @@ question.setEscapedQuestion(escapedQuestion); } - String optionText = option.getMcQueOptionText(); + String optionText = option.getQbOption().getName(); if (optionText != null) { String escapedOptionText = StringEscapeUtils.escapeJavaScript(optionText); option.setEscapedOptionText(escapedOptionText); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McPedagogicalPlannerController.java =================================================================== diff -u -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McPedagogicalPlannerController.java (.../McPedagogicalPlannerController.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McPedagogicalPlannerController.java (.../McPedagogicalPlannerController.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -28,17 +28,16 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.lamsfoundation.lams.qb.QbOption; +import org.lamsfoundation.lams.qb.QbQuestion; import org.lamsfoundation.lams.tool.mc.McAppConstants; import org.lamsfoundation.lams.tool.mc.dto.McOptionDTO; import org.lamsfoundation.lams.tool.mc.model.McContent; -import org.lamsfoundation.lams.tool.mc.model.McOptsContent; import org.lamsfoundation.lams.tool.mc.model.McQueContent; import org.lamsfoundation.lams.tool.mc.service.IMcService; import org.lamsfoundation.lams.tool.mc.web.form.McPedagogicalPlannerForm; @@ -110,38 +109,38 @@ mcContent.getUid()); mcQueContent.setQuestion(question); int candidateAnswerDTOIndex = 0; - Set candidateAnswers = mcQueContent.getMcOptionsContents(); - Iterator candidateAnswerIter = candidateAnswers.iterator(); + List candidateAnswers = mcQueContent.getQbQuestion().getQbOptions(); + Iterator candidateAnswerIter = candidateAnswers.iterator(); while (candidateAnswerIter.hasNext()) { - McOptsContent candidateAnswer = candidateAnswerIter.next(); + QbOption candidateAnswer = candidateAnswerIter.next(); if (candidateAnswerDTOIndex >= candidateAnswerDTOList.size()) { candidateAnswerIter.remove(); } else { McOptionDTO answerDTO = candidateAnswerDTOList.get(candidateAnswerDTOIndex); - candidateAnswer.setCorrectOption(McAppConstants.CORRECT.equals(answerDTO.getCorrect())); - candidateAnswer.setMcQueOptionText(answerDTO.getCandidateAnswer()); - mcService.updateMcOptionsContent(candidateAnswer); + candidateAnswer.setCorrect(McAppConstants.CORRECT.equals(answerDTO.getCorrect())); + candidateAnswer.setName(answerDTO.getCandidateAnswer()); + mcService.updateQbOption(candidateAnswer); } candidateAnswerDTOIndex++; } mcService.saveOrUpdateMcQueContent(mcQueContent); } else { McQueContent mcQueContent = new McQueContent(); + mcQueContent.setQbQuestion(new QbQuestion()); + // TODO Set question ID and version mcQueContent.setDisplayOrder(questionIndex); mcQueContent.setMcContent(mcContent); mcQueContent.setQuestion(question); mcQueContent.setMark(McAppConstants.QUESTION_DEFAULT_MARK); - Set candidateAnswers = mcQueContent.getMcOptionsContents(); + List candidateAnswers = mcQueContent.getQbQuestion().getQbOptions(); for (int candidateAnswerDTOIndex = 0; candidateAnswerDTOIndex < candidateAnswerDTOList .size(); candidateAnswerDTOIndex++) { McOptionDTO answerDTO = candidateAnswerDTOList.get(candidateAnswerDTOIndex); QbOption qbOption = new QbOption(); qbOption.setName(answerDTO.getCandidateAnswer()); qbOption.setCorrect(McAppConstants.CORRECT.equals(answerDTO.getCorrect())); qbOption.setDisplayOrder(candidateAnswerDTOIndex + 1); - McOptsContent candidateAnswer = new McOptsContent(qbOption, mcQueContent); - candidateAnswer.setMcQueContent(mcQueContent); - candidateAnswers.add(candidateAnswer); + candidateAnswers.add(qbOption); } mcService.saveOrUpdateMcQueContent(mcQueContent); mcContent.getMcQueContents().add(mcQueContent); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/TblMonitoringController.java =================================================================== diff -u -rd03a1456d2d0ee7a482273fe35412c67054f133d -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/TblMonitoringController.java (.../TblMonitoringController.java) (revision d03a1456d2d0ee7a482273fe35412c67054f133d) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/TblMonitoringController.java (.../TblMonitoringController.java) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -7,11 +7,10 @@ import javax.servlet.http.HttpServletRequest; -import org.apache.log4j.Logger; +import org.lamsfoundation.lams.qb.QbOption; import org.lamsfoundation.lams.tool.mc.dto.McOptionDTO; import org.lamsfoundation.lams.tool.mc.dto.McQuestionDTO; import org.lamsfoundation.lams.tool.mc.model.McContent; -import org.lamsfoundation.lams.tool.mc.model.McOptsContent; import org.lamsfoundation.lams.tool.mc.model.McQueContent; import org.lamsfoundation.lams.tool.mc.model.McQueUsr; import org.lamsfoundation.lams.tool.mc.model.McSession; @@ -20,16 +19,13 @@ import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.util.AttributeNames; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/tblmonitoring") public class TblMonitoringController { - private static Logger logger = Logger.getLogger(TblMonitoringController.class.getName()); - @Autowired private IMcService mcService; @@ -43,7 +39,7 @@ McContent mcContent = mcService.getMcContent(toolContentId); int attemptedLearnersNumber = 0; - for (McSession session : (Set) mcContent.getMcSessions()) { + for (McSession session : mcContent.getMcSessions()) { attemptedLearnersNumber += session.getMcQueUsers().size(); } request.setAttribute("attemptedLearnersNumber", attemptedLearnersNumber); @@ -67,14 +63,14 @@ Set questions = mcContent.getMcQueContents(); int maxOptionsInQuestion = 0; for (McQueContent question : questions) { - if (question.getMcOptionsContents().size() > maxOptionsInQuestion) { - maxOptionsInQuestion = question.getMcOptionsContents().size(); + if (question.getQbQuestion().getQbOptions().size() > maxOptionsInQuestion) { + maxOptionsInQuestion = question.getQbQuestion().getQbOptions().size(); } } request.setAttribute("maxOptionsInQuestion", maxOptionsInQuestion); int totalNumberOfUsers = 0; - for (McSession session : (Set) mcContent.getMcSessions()) { + for (McSession session : mcContent.getMcSessions()) { totalNumberOfUsers += session.getMcQueUsers().size(); } @@ -83,7 +79,7 @@ // build candidate dtos List optionDtos = new LinkedList<>(); - for (McOptsContent option : (Set) question.getMcOptionsContents()) { + for (QbOption option : question.getQbQuestion().getQbOptions()) { int optionAttemptCount = mcService.getAttemptsCountPerOption(option.getUid()); float percentage = (float) (optionAttemptCount * 100) / totalNumberOfUsers; Index: lams_tool_lamc/web/authoring/candidateAnswersList.jsp =================================================================== diff -u -r4b2b48600119f8594fd3c82b58783c28b63324de -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/web/authoring/candidateAnswersList.jsp (.../candidateAnswersList.jsp) (revision 4b2b48600119f8594fd3c82b58783c28b63324de) +++ lams_tool_lamc/web/authoring/candidateAnswersList.jsp (.../candidateAnswersList.jsp) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -43,7 +43,6 @@ - Index: lams_tool_lamc/web/learning/ViewAnswers.jsp =================================================================== diff -u -r3bb7e0141ae1cc15ccd737c95d90b5762a34ad61 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/web/learning/ViewAnswers.jsp (.../ViewAnswers.jsp) (revision 3bb7e0141ae1cc15ccd737c95d90b5762a34ad61) +++ lams_tool_lamc/web/learning/ViewAnswers.jsp (.../ViewAnswers.jsp) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -152,7 +152,7 @@ - + @@ -172,7 +172,7 @@ - + Index: lams_tool_lamc/web/monitoring/parts/advanceQuestions.jsp =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/web/monitoring/parts/advanceQuestions.jsp (.../advanceQuestions.jsp) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_lamc/web/monitoring/parts/advanceQuestions.jsp (.../advanceQuestions.jsp) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -1,3 +1,5 @@ +<%@ page import="org.lamsfoundation.lams.tool.mc.util.LearningUtil"%> +

@@ -21,18 +23,18 @@ - + Index: lams_tool_lamc/web/tblmonitoring/mcq.jsp =================================================================== diff -u -re7ba02fbd771cb86ff621168fed50bd21d00d0d1 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/web/tblmonitoring/mcq.jsp (.../mcq.jsp) (revision e7ba02fbd771cb86ff621168fed50bd21d00d0d1) +++ lams_tool_lamc/web/tblmonitoring/mcq.jsp (.../mcq.jsp) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -57,13 +57,13 @@
- ${option.formatPrefixLetter(optionStatus.index)} + ${LearningUtil.formatPrefixLetter(optionStatus.index)} - + () - +
- + Index: lams_tool_lamc/web/tblmonitoring/teams.jsp =================================================================== diff -u -r7475d08afc280b5e2e5ddf04e8bf35e3166aaf80 -r650202864c49257c570cd5c4d496ca3789db7846 --- lams_tool_lamc/web/tblmonitoring/teams.jsp (.../teams.jsp) (revision 7475d08afc280b5e2e5ddf04e8bf35e3166aaf80) +++ lams_tool_lamc/web/tblmonitoring/teams.jsp (.../teams.jsp) (revision 650202864c49257c570cd5c4d496ca3789db7846) @@ -15,13 +15,13 @@
${ALPHABET[j.index]}. - +
- ${ALPHABET[userAttempt.mcOptionsContent.displayOrder-1]}. + ${ALPHABET[userAttempt.qbOption.displayOrder-1]}. - + - +