Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql =================================================================== diff -u -r97b429e997f02bf7a8c0e2bf551fa2941f29ed86 -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision 97b429e997f02bf7a8c0e2bf551fa2941f29ed86) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) @@ -45,13 +45,14 @@ -- create Question Bank option 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, `correct` TINYINT(1) NOT NULL DEFAULT 0, PRIMARY KEY (uid), CONSTRAINT FK_lams_qb_option_1 FOREIGN KEY (qb_question_uid) REFERENCES lams_qb_question (uid) ON DELETE CASCADE ON UPDATE CASCADE); -INSERT INTO lams_qb_option (qb_question_uid, name, correct) - SELECT DISTINCT q.qb_question_uid, TRIM(o.mc_que_option_text), o.correct_option +INSERT INTO lams_qb_option (qb_question_uid, display_order, name, correct) + SELECT DISTINCT q.qb_question_uid, o.displayOrder, TRIM(o.mc_que_option_text), o.correct_option FROM tl_lamc11_que_content AS q JOIN tl_lamc11_options_content AS o ON q.uid = o.mc_que_content_id; ALTER TABLE tl_lamc11_options_content ADD COLUMN qb_option_uid BIGINT AFTER uid, @@ -60,11 +61,12 @@ UPDATE tl_lamc11_options_content AS mco, tl_lamc11_que_content AS mcq, lams_qb_option AS qo SET mco.qb_option_uid = qo.uid WHERE TRIM(mco.mc_que_option_text) = qo.name - AND qo.qb_question_uid = mcq.qb_question_uid - AND mco.mc_que_content_id = mcq.uid; + AND qo.qb_question_uid = mcq.qb_question_uid + AND mco.mc_que_content_id = mcq.uid; ALTER TABLE tl_lamc11_options_content DROP COLUMN mc_que_option_text, - DROP COLUMN correct_option; + DROP COLUMN correct_option, + DROP COLUMN displayOrder; ----------------------Put all sql statements above here------------------------- Index: lams_common/src/java/org/lamsfoundation/lams/qb/QbOption.java =================================================================== diff -u -r4b2b48600119f8594fd3c82b58783c28b63324de -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 --- lams_common/src/java/org/lamsfoundation/lams/qb/QbOption.java (.../QbOption.java) (revision 4b2b48600119f8594fd3c82b58783c28b63324de) +++ lams_common/src/java/org/lamsfoundation/lams/qb/QbOption.java (.../QbOption.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) @@ -35,6 +35,9 @@ @Column private boolean correct = false; + @Column(name = "display_order") + private int displayOrder = 1; + @ManyToOne(optional = false) @JoinColumn(name = "qb_question_uid") private QbQuestion question; @@ -55,14 +58,19 @@ @Override public boolean equals(Object o) { QbOption other = (QbOption) o; - return new EqualsBuilder().append(this.name, other.name).append(this.correct, other.correct).isEquals(); + return new EqualsBuilder().append(this.name, other.name).append(this.correct, other.correct) + .append(this.displayOrder, other.displayOrder).isEquals(); } @Override public int hashCode() { return new HashCodeBuilder().append(this.name).append(this.correct).toHashCode(); } + public Long getUid() { + return uid; + } + public String getName() { return name; } @@ -79,15 +87,19 @@ this.correct = correct; } + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + public QbQuestion getQuestion() { return question; } public void setQuestion(QbQuestion question) { this.question = question; } - - public Long getUid() { - return uid; - } } \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McOptionsContentDAO.java =================================================================== diff -u -rd03a1456d2d0ee7a482273fe35412c67054f133d -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McOptionsContentDAO.java (.../McOptionsContentDAO.java) (revision d03a1456d2d0ee7a482273fe35412c67054f133d) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McOptionsContentDAO.java (.../McOptionsContentDAO.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) @@ -41,7 +41,7 @@ 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.displayOrder"; + 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 Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McOptsContent.java =================================================================== diff -u -r4b2b48600119f8594fd3c82b58783c28b63324de -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McOptsContent.java (.../McOptsContent.java) (revision 4b2b48600119f8594fd3c82b58783c28b63324de) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McOptsContent.java (.../McOptsContent.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) @@ -55,9 +55,6 @@ @GeneratedValue(strategy = GenerationType.IDENTITY) private Long uid; - @Column - private Integer displayOrder; - @ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }) @JoinColumn(name = "qb_option_uid") @@ -73,15 +70,13 @@ @Transient private String escapedOptionText; - public McOptsContent(Integer displayOrder, QbOption qbOption, McQueContent mcQueContent) { - this.displayOrder = displayOrder; + 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.getDisplayOrder(), mcOptsContent.getQbOption(), - newMcQueContent); + McOptsContent newMcOptsContent = new McOptsContent(mcOptsContent.getQbOption(), newMcQueContent); return newMcOptsContent; } @@ -113,6 +108,14 @@ qbOption.setName(mcQueOptionText); } + public Integer getDisplayOrder() { + return qbOption.getDisplayOrder(); + } + + public void setDisplayOrder(Integer displayOrder) { + qbOption.setDisplayOrder(displayOrder); + } + public McQueContent getMcQueContent() { return this.mcQueContent; } @@ -137,21 +140,6 @@ } } - /** - * @return Returns the displayOrder. - */ - public Integer getDisplayOrder() { - return displayOrder; - } - - /** - * @param displayOrder - * The displayOrder to set. - */ - public void setDisplayOrder(Integer displayOrder) { - this.displayOrder = displayOrder; - } - public boolean isSelected() { return this.selected; } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McQueContent.java =================================================================== diff -u -r4b2b48600119f8594fd3c82b58783c28b63324de -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McQueContent.java (.../McQueContent.java) (revision 4b2b48600119f8594fd3c82b58783c28b63324de) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/model/McQueContent.java (.../McQueContent.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) @@ -23,6 +23,7 @@ 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; @@ -37,11 +38,11 @@ import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; -import javax.persistence.OrderBy; 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.QbQuestion; /** @@ -55,6 +56,15 @@ @Entity @Table(name = "tl_lamc11_que_content") public class McQueContent 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; @Id @@ -85,7 +95,7 @@ // 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) - @OrderBy("displayOrder") + @SortComparator(OptionComparator.class) @JoinColumn(name = "mc_que_content_id") private Set mcOptionsContents; @@ -124,7 +134,7 @@ } public Set deepCopyMcOptionsContent(McQueContent newQueContent) { - Set newMcOptionsContent = new TreeSet<>(); + Set newMcOptionsContent = new TreeSet<>(McQueContent.OPTION_COMPARATOR); for (McOptsContent mcOptsContent : this.getMcOptionsContents()) { McOptsContent mcNewOptsContent = McOptsContent.newInstance(mcOptsContent, newQueContent); newMcOptionsContent.add(mcNewOptsContent); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java =================================================================== diff -u -r260b7b6af8c214ba626dd1257c3882c1d3a62620 -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 260b7b6af8c214ba626dd1257c3882c1d3a62620) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) @@ -352,7 +352,7 @@ // persist candidate answers Set oldOptions = question.getMcOptionsContents(); - Set newOptions = new HashSet<>(); + Set newOptions = new TreeSet<>(McQueContent.OPTION_COMPARATOR); int displayOrderOption = 1; Set qbOptionsToRemove = new HashSet<>(qbQuestion.getOptions()); for (McOptionDTO optionDTO : optionDTOs) { @@ -2034,8 +2034,8 @@ QbOption qbOption = new QbOption(); qbOption.setName(JsonUtil.optString(optionData, RestTags.ANSWER_TEXT)); qbOption.setCorrect(JsonUtil.optBoolean(optionData, RestTags.CORRECT)); - question.getMcOptionsContents().add( - new McOptsContent(JsonUtil.optInt(optionData, RestTags.DISPLAY_ORDER), qbOption, question)); + qbOption.setDisplayOrder(JsonUtil.optInt(optionData, RestTags.DISPLAY_ORDER)); + question.getMcOptionsContents().add(new McOptsContent(qbOption, question)); } saveOrUpdateMcQueContent(question); } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McPedagogicalPlannerController.java =================================================================== diff -u -rfd46695dcabc301f28799564c23314aa53d72dc6 -r851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McPedagogicalPlannerController.java (.../McPedagogicalPlannerController.java) (revision fd46695dcabc301f28799564c23314aa53d72dc6) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/controller/McPedagogicalPlannerController.java (.../McPedagogicalPlannerController.java) (revision 851d7676f2e9e74ac0f9346dbb47ee8ed4f4c9e4) @@ -138,8 +138,8 @@ QbOption qbOption = new QbOption(); qbOption.setName(answerDTO.getCandidateAnswer()); qbOption.setCorrect(McAppConstants.CORRECT.equals(answerDTO.getCorrect())); - McOptsContent candidateAnswer = new McOptsContent(candidateAnswerDTOIndex + 1, qbOption, - mcQueContent); + qbOption.setDisplayOrder(candidateAnswerDTOIndex + 1); + McOptsContent candidateAnswer = new McOptsContent(qbOption, mcQueContent); candidateAnswer.setMcQueContent(mcQueContent); candidateAnswers.add(candidateAnswer); }