Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java =================================================================== diff -u -rab94e5496032d88b61432704eb05cc66061e4bcd -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java (.../EditQbQuestionController.java) (revision ab94e5496032d88b61432704eb05cc66061e4bcd) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java (.../EditQbQuestionController.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -69,6 +69,7 @@ @RequestParam(required = false) Long collectionUid) throws ServletException, IOException { form.setUid(-1L);//which signifies it's a new question + form.setQuestionId(qbService.generateNextQuestionId()); // generate a new question ID right away, so another user won't "take it" form.setMaxMark(1); form.setPenaltyFactor("0"); form.setAnswerRequired(true); @@ -215,6 +216,7 @@ if (isAddingQuestion) { qbQuestion = new QbQuestion(); qbQuestion.setType(form.getQuestionType()); + qbQuestion.setQuestionId(form.getQuestionId()); // edit } else { @@ -238,8 +240,8 @@ qbQuestion = qbQuestion.clone(); qbQuestion.clearID(); qbQuestion.setVersion(1); - qbQuestion.setQuestionId(qbService.getMaxQuestionId() + 1); qbQuestion.setCreateDate(new Date()); + // no need to bump question ID as the new question already has a new ID generated in initNewQuestion() } break; } Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/ImsQtiController.java =================================================================== diff -u -r0b1e74374b821758fdda7835d8d283bf84fa8db0 -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/src/java/org/lamsfoundation/lams/web/qb/ImsQtiController.java (.../ImsQtiController.java) (revision 0b1e74374b821758fdda7835d8d283bf84fa8db0) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/ImsQtiController.java (.../ImsQtiController.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -56,7 +56,7 @@ @ResponseBody public void saveQTI(HttpServletRequest request, @RequestParam long collectionUid, @RequestParam String contentFolderID) throws UnsupportedEncodingException { - int questionId = qbService.getMaxQuestionId(); + int questionId = qbService.generateNextQuestionId(); Question[] questions = QuestionParser.parseQuestionChoiceForm(request); for (Question question : questions) { @@ -67,7 +67,7 @@ qbQuestion.setFeedback(QuestionParser.processHTMLField(question.getFeedback(), false, contentFolderID, question.getResourcesFolderPath())); qbQuestion.setPenaltyFactor(0); - qbQuestion.setQuestionId(++questionId); + qbQuestion.setQuestionId(questionId); int questionMark = 1; Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/XmlQuestionsController.java =================================================================== diff -u -r80ab947256f1314103a88c68432755741615271b -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/src/java/org/lamsfoundation/lams/web/qb/XmlQuestionsController.java (.../XmlQuestionsController.java) (revision 80ab947256f1314103a88c68432755741615271b) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/XmlQuestionsController.java (.../XmlQuestionsController.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -62,7 +62,7 @@ @ResponseBody public void importQuestionsXml(@RequestParam("UPLOAD_FILE") MultipartFile file, HttpServletRequest request, @RequestParam long collectionUid) throws ServletException { - int questionId = qbService.getMaxQuestionId(); + int questionId = qbService.generateNextQuestionId(); List toolsErrorMsgs = new ArrayList<>(); try { @@ -85,7 +85,7 @@ List questions = (List) FileUtil.getObjectFromXML(null, fullFilePath); if (questions != null) { for (QbQuestion qbQuestion : questions) { - qbQuestion.setQuestionId(++questionId); + qbQuestion.setQuestionId(questionId); qbQuestion.setCreateDate(new Date()); userManagementService.save(qbQuestion); Index: lams_central/web/qb/authoring/addessay.jsp =================================================================== diff -u -r7d599b94e007b7e77d4d3611a0eecc6a160fde8f -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/web/qb/authoring/addessay.jsp (.../addessay.jsp) (revision 7d599b94e007b7e77d4d3611a0eecc6a160fde8f) +++ lams_central/web/qb/authoring/addessay.jsp (.../addessay.jsp) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -120,6 +120,7 @@ + Index: lams_central/web/qb/authoring/addmarkhedging.jsp =================================================================== diff -u -r7d599b94e007b7e77d4d3611a0eecc6a160fde8f -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/web/qb/authoring/addmarkhedging.jsp (.../addmarkhedging.jsp) (revision 7d599b94e007b7e77d4d3611a0eecc6a160fde8f) +++ lams_central/web/qb/authoring/addmarkhedging.jsp (.../addmarkhedging.jsp) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -82,6 +82,7 @@ + Index: lams_central/web/qb/authoring/addmatchingpairs.jsp =================================================================== diff -u -r7d599b94e007b7e77d4d3611a0eecc6a160fde8f -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/web/qb/authoring/addmatchingpairs.jsp (.../addmatchingpairs.jsp) (revision 7d599b94e007b7e77d4d3611a0eecc6a160fde8f) +++ lams_central/web/qb/authoring/addmatchingpairs.jsp (.../addmatchingpairs.jsp) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -74,6 +74,7 @@ + Index: lams_central/web/qb/authoring/addmultiplechoice.jsp =================================================================== diff -u -r7d599b94e007b7e77d4d3611a0eecc6a160fde8f -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/web/qb/authoring/addmultiplechoice.jsp (.../addmultiplechoice.jsp) (revision 7d599b94e007b7e77d4d3611a0eecc6a160fde8f) +++ lams_central/web/qb/authoring/addmultiplechoice.jsp (.../addmultiplechoice.jsp) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -123,6 +123,7 @@ + Index: lams_central/web/qb/authoring/addnumerical.jsp =================================================================== diff -u -r7d599b94e007b7e77d4d3611a0eecc6a160fde8f -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/web/qb/authoring/addnumerical.jsp (.../addnumerical.jsp) (revision 7d599b94e007b7e77d4d3611a0eecc6a160fde8f) +++ lams_central/web/qb/authoring/addnumerical.jsp (.../addnumerical.jsp) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -134,6 +134,7 @@ + Index: lams_central/web/qb/authoring/addordering.jsp =================================================================== diff -u -r7d599b94e007b7e77d4d3611a0eecc6a160fde8f -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/web/qb/authoring/addordering.jsp (.../addordering.jsp) (revision 7d599b94e007b7e77d4d3611a0eecc6a160fde8f) +++ lams_central/web/qb/authoring/addordering.jsp (.../addordering.jsp) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -77,6 +77,7 @@ + Index: lams_central/web/qb/authoring/addshortanswer.jsp =================================================================== diff -u -r7d599b94e007b7e77d4d3611a0eecc6a160fde8f -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/web/qb/authoring/addshortanswer.jsp (.../addshortanswer.jsp) (revision 7d599b94e007b7e77d4d3611a0eecc6a160fde8f) +++ lams_central/web/qb/authoring/addshortanswer.jsp (.../addshortanswer.jsp) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -84,6 +84,7 @@ + Index: lams_central/web/qb/authoring/addtruefalse.jsp =================================================================== diff -u -r7d599b94e007b7e77d4d3611a0eecc6a160fde8f -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_central/web/qb/authoring/addtruefalse.jsp (.../addtruefalse.jsp) (revision 7d599b94e007b7e77d4d3611a0eecc6a160fde8f) +++ lams_central/web/qb/authoring/addtruefalse.jsp (.../addtruefalse.jsp) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -83,6 +83,7 @@ + Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql =================================================================== diff -u -r1e5c31379f42fec17040614789715d761c41e66e -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision 1e5c31379f42fec17040614789715d761c41e66e) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -673,4 +673,9 @@ tmp_question_match, tmp_qb_question, tmp_qb_question_match, - tmp_option_answer; \ No newline at end of file + tmp_option_answer; + +-- add a table for generating questionId in QbQuestion and possible other sequences in the future +CREATE TABLE lams_sequence_generator (lams_qb_question_question_id INT); +CREATE UNIQUE INDEX IDX_lams_qb_question_question_id ON lams_sequence_generator(lams_qb_question_question_id); +INSERT INTO lams_sequence_generator(lams_qb_question_question_id) VALUES ((SELECT MAX(question_id) FROM lams_qb_question)); \ No newline at end of file Index: lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java =================================================================== diff -u -r0f2b554d8e5dca78a8e936730490d03ecd0357ba -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java (.../IQbDAO.java) (revision 0f2b554d8e5dca78a8e936730490d03ecd0357ba) +++ lams_common/src/java/org/lamsfoundation/lams/qb/dao/IQbDAO.java (.../IQbDAO.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -27,7 +27,7 @@ List getQuestionsByToolContentId(long toolContentId); // finds next question ID for Question Bank question - int getMaxQuestionId(); + int generateNextQuestionId(); // finds next version for given question ID for Question Bank question int getMaxQuestionVersion(Integer qbQuestionId); Index: lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java =================================================================== diff -u -r3cdf562682c8dda602c4583956be0b13bdaf98c4 -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java (.../QbDAO.java) (revision 3cdf562682c8dda602c4583956be0b13bdaf98c4) +++ lams_common/src/java/org/lamsfoundation/lams/qb/dao/hibernate/QbDAO.java (.../QbDAO.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -22,7 +22,7 @@ public class QbDAO extends LAMSBaseDAO implements IQbDAO { - private static final String FIND_MAX_QUESTION_ID = "SELECT MAX(questionId) FROM QbQuestion"; + private static final String FIND_MAX_QUESTION_ID = "SELECT MAX(lams_qb_question_question_id) FROM lams_sequence_generator"; private static final String FIND_MAX_VERSION = "SELECT MAX(version) FROM QbQuestion AS q WHERE q.questionId = :questionId"; @@ -98,6 +98,8 @@ + "JOIN lams_qb_collection AS c ON cq.collection_uid = c.uid AND " + "(c.user_id = :userId OR c.user_id IS NULL) AND cq.qb_question_id = :qbQuestionId"; + private static final String GENERATE_QUESTION_ID = "INSERT INTO lams_sequence_generator(lams_qb_question_question_id) VALUES (:qbQuestionId)"; + @Override public QbQuestion getQuestionByUid(Long qbQuestionUid) { return this.find(QbQuestion.class, qbQuestionUid); @@ -121,10 +123,11 @@ } @Override - public int getMaxQuestionId() { - Object result = this.getSession().createQuery(FIND_MAX_QUESTION_ID).uniqueResult(); - Integer max = (Integer) result; - return max == null ? 1 : max; + public int generateNextQuestionId() { + Integer max = (Integer) this.getSession().createNativeQuery(FIND_MAX_QUESTION_ID).uniqueResult(); + max++; + this.getSession().createNativeQuery(GENERATE_QUESTION_ID).setParameter("qbQuestionId", max).executeUpdate(); + return max; } @Override Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java =================================================================== diff -u -r5129d828c41c0731ee7889271cffde6421e2146c -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision 5129d828c41c0731ee7889271cffde6421e2146c) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/IQbService.java (.../IQbService.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -49,7 +49,7 @@ QbQuestionUnit getQuestionUnitByUid(Long unitUid); // finds next question ID for Question Bank question - int getMaxQuestionId(); + int generateNextQuestionId(); // finds next version for given question ID for Question Bank question int getMaxQuestionVersion(Integer qbQuestionId); Index: lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java =================================================================== diff -u -r3cdf562682c8dda602c4583956be0b13bdaf98c4 -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 3cdf562682c8dda602c4583956be0b13bdaf98c4) +++ lams_common/src/java/org/lamsfoundation/lams/qb/service/QbService.java (.../QbService.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -84,8 +84,8 @@ } @Override - public int getMaxQuestionId() { - return qbDAO.getMaxQuestionId(); + public int generateNextQuestionId() { + return qbDAO.generateNextQuestionId(); } @Override @@ -431,7 +431,7 @@ List questions = getQuestionsByQuestionId(qbQuestionId); QbQuestion question = questions.get(0); QbQuestion newQuestion = question.clone(); - addQbQuestionId = getMaxQuestionId() + 1; + addQbQuestionId = generateNextQuestionId(); newQuestion.setQuestionId(addQbQuestionId); newQuestion.setVersion(1); newQuestion.setCreateDate(new Date()); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java =================================================================== diff -u -r3cdf562682c8dda602c4583956be0b13bdaf98c4 -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 3cdf562682c8dda602c4583956be0b13bdaf98c4) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -283,7 +283,7 @@ // if it does not exist, create a new one qbQuestion = new QbQuestion(); qbQuestion.setType(QbQuestion.TYPE_MULTIPLE_CHOICE); - qbQuestion.setQuestionId(qbService.getMaxQuestionId() + 1); + qbQuestion.setQuestionId(qbService.generateNextQuestionId()); } // make a clone to check if data changed QbQuestion qbQuestionClone = qbQuestion.clone(); @@ -315,7 +315,7 @@ // new questionDescription gets created qbQuestion = qbQuestionClone; qbQuestion.setVersion(1); - qbQuestion.setQuestionId(qbService.getMaxQuestionId() + 1); + qbQuestion.setQuestionId(qbService.generateNextQuestionId()); qbQuestion.setCreateDate(new Date()); break; } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java =================================================================== diff -u -r3cdf562682c8dda602c4583956be0b13bdaf98c4 -r1f7c5fb422d619e35598ae416565c790d5c76fff --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 3cdf562682c8dda602c4583956be0b13bdaf98c4) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/controller/AuthoringController.java (.../AuthoringController.java) (revision 1f7c5fb422d619e35598ae416565c790d5c76fff) @@ -272,7 +272,7 @@ Set items = new LinkedHashSet<>(); SortedSet newItems = getItemList(sessionMap); Iterator iter = newItems.iterator(); - int maxQuestionId = qbService.getMaxQuestionId(); + int maxQuestionId = qbService.generateNextQuestionId(); while (iter.hasNext()) { ScratchieItem item = iter.next(); if (item != null) { @@ -296,7 +296,7 @@ item.setQbQuestion(qbQuestion); qbQuestion.clearID(); qbQuestion.setVersion(1); - qbQuestion.setQuestionId(++maxQuestionId); + qbQuestion.setQuestionId(maxQuestionId); qbQuestion.setCreateDate(new Date()); } break;