Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/ImsQtiController.java =================================================================== diff -u -r3568517ed841a9c1cfe1b4831ee240929323ca2b -r17f106d9b03871e7278c6eb87f793193d8ff0908 --- lams_central/src/java/org/lamsfoundation/lams/web/qb/ImsQtiController.java (.../ImsQtiController.java) (revision 3568517ed841a9c1cfe1b4831ee240929323ca2b) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/ImsQtiController.java (.../ImsQtiController.java) (revision 17f106d9b03871e7278c6eb87f793193d8ff0908) @@ -42,8 +42,6 @@ public class ImsQtiController { private static Logger log = Logger.getLogger(ImsQtiController.class); - private static final String UUID_LABEL_PREFIX = "lams-qb-uuid-"; - @Autowired @Qualifier("centralMessageService") private MessageService messageService; @@ -66,13 +64,11 @@ Set collectionUUIDs = null; for (Question question : questions) { - // UUID in QTI question label is LAMS custom idea - String label = question.getLabel(); - // try to match the question to an existing QB question in DB - if (label != null && label.startsWith(UUID_LABEL_PREFIX)) { - String uuid = label.substring(UUID_LABEL_PREFIX.length(), label.length()); + String uuid = question.getQbUUID(); + // try to match the question to an existing QB question in DB + if (uuid != null) { QbQuestion qbQuestion = qbService.getQuestionByUUID(UUID.fromString(uuid)); if (qbQuestion != null) { // found an existing question with same UUID @@ -100,10 +96,10 @@ } continue; } - } QbQuestion qbQuestion = new QbQuestion(); + qbQuestion.setUuid(uuid); qbQuestion.setName(question.getTitle()); qbQuestion.setDescription(QuestionParser.processHTMLField(question.getText(), false, contentFolderID, question.getResourcesFolderPath())); @@ -533,7 +529,7 @@ question.setTitle(qbQuestion.getName()); if (qbQuestion.getUuid() != null) { // UUID in QTI question label is LAMS custom idea - question.setLabel(UUID_LABEL_PREFIX + qbQuestion.getUuid()); + question.setLabel(QuestionParser.UUID_LABEL_PREFIX + qbQuestion.getUuid()); } question.setText(qbQuestion.getDescription()); question.setFeedback(qbQuestion.getFeedback()); Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20191023.sql =================================================================== diff -u --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20191023.sql (revision 0) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20191023.sql (revision 17f106d9b03871e7278c6eb87f793193d8ff0908) @@ -0,0 +1,19 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +----------------------Put all sql statements below here------------------------- + +-- LDEV-4884 Allow pre-filling QB question UUID, for example when it gets imported +DROP TRIGGER IF EXISTS before_insert_qb_question; + +CREATE TRIGGER before_insert_qb_question + BEFORE INSERT ON lams_qb_question + FOR EACH ROW + SET new.uuid = IF(new.uuid IS NULL, UUID_TO_BIN(UUID()), new.uuid); + +----------------------Put all sql statements above here------------------------- + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java =================================================================== diff -u -re8a7110708b15579af2c6b31ac52a6da427fef6d -r17f106d9b03871e7278c6eb87f793193d8ff0908 --- lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java (.../QbQuestion.java) (revision e8a7110708b15579af2c6b31ac52a6da427fef6d) +++ lams_common/src/java/org/lamsfoundation/lams/qb/model/QbQuestion.java (.../QbQuestion.java) (revision 17f106d9b03871e7278c6eb87f793193d8ff0908) @@ -134,7 +134,7 @@ /** ---- only for hedging type of question ---- */ @Column(name = "hedging_justification_enabled") private boolean hedgingJustificationEnabled; - + /** ---- only for VSA type of question ---- */ @Column(name = "autocomplete_enabled") private boolean autocompleteEnabled; @@ -252,13 +252,13 @@ } } } - + /** * Check if it's a TBL case, i.e. only two option groups available, one has 0%, second - 100% */ public boolean isVsaAndCompatibleWithTbl() { boolean isVsaAndCompatibleWithTbl = false; - + if (qbOptions.size() == 2) { float firstGroupMark = qbOptions.get(0).getMaxMark(); float secondGroupMark = qbOptions.get(1).getMaxMark(); @@ -267,7 +267,7 @@ && (secondGroupMark == 0 || secondGroupMark == 1) && (firstGroupMark != secondGroupMark) && type == QbQuestion.TYPE_VERY_SHORT_ANSWERS; } - + return isVsaAndCompatibleWithTbl; } @@ -279,6 +279,14 @@ return uuid; } + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid == null ? null : UUID.fromString(uuid); + } + public Integer getType() { return type; } @@ -476,7 +484,7 @@ public void setHedgingJustificationEnabled(boolean hedgingJustificationEnabled) { this.hedgingJustificationEnabled = hedgingJustificationEnabled; } - + public boolean isAutocompleteEnabled() { return autocompleteEnabled; } Index: lams_common/src/java/org/lamsfoundation/lams/questions/Question.java =================================================================== diff -u -r3568517ed841a9c1cfe1b4831ee240929323ca2b -r17f106d9b03871e7278c6eb87f793193d8ff0908 --- lams_common/src/java/org/lamsfoundation/lams/questions/Question.java (.../Question.java) (revision 3568517ed841a9c1cfe1b4831ee240929323ca2b) +++ lams_common/src/java/org/lamsfoundation/lams/questions/Question.java (.../Question.java) (revision 17f106d9b03871e7278c6eb87f793193d8ff0908) @@ -56,6 +56,12 @@ private Map matchMap; private String resourcesFolderPath; + // UUID in QTI question label is LAMS custom idea + public String getQbUUID() { + return label == null || !label.startsWith(QuestionParser.UUID_LABEL_PREFIX) ? null + : label.substring(QuestionParser.UUID_LABEL_PREFIX.length(), label.length()); + } + public String getType() { return type; } Index: lams_common/src/java/org/lamsfoundation/lams/questions/QuestionParser.java =================================================================== diff -u -r3568517ed841a9c1cfe1b4831ee240929323ca2b -r17f106d9b03871e7278c6eb87f793193d8ff0908 --- lams_common/src/java/org/lamsfoundation/lams/questions/QuestionParser.java (.../QuestionParser.java) (revision 3568517ed841a9c1cfe1b4831ee240929323ca2b) +++ lams_common/src/java/org/lamsfoundation/lams/questions/QuestionParser.java (.../QuestionParser.java) (revision 17f106d9b03871e7278c6eb87f793193d8ff0908) @@ -71,6 +71,8 @@ private static final String TEMP_PACKAGE_NAME_PREFIX = "QTI_PACKAGE_"; private static final Pattern IMAGE_PATTERN = Pattern.compile("\\[IMAGE: (.*)\\]"); + public static final String UUID_LABEL_PREFIX = "lams-qb-uuid-"; + /** * Extracts questions from IMS QTI zip file. */