Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentImportContentVersionFilter.java =================================================================== diff -u -r9b18dabfc4198e4a842adda25a39957b6c4be92e -r136519c454662b99974e8956475b84ac0a49bc20 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentImportContentVersionFilter.java (.../AssessmentImportContentVersionFilter.java) (revision 9b18dabfc4198e4a842adda25a39957b6c4be92e) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentImportContentVersionFilter.java (.../AssessmentImportContentVersionFilter.java) (revision 136519c454662b99974e8956475b84ac0a49bc20) @@ -22,9 +22,14 @@ package org.lamsfoundation.lams.tool.assessment.service; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.util.List; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.lamsfoundation.lams.learningdesign.service.ToolContentVersionFilter; import org.lamsfoundation.lams.qb.QbUtils; import org.lamsfoundation.lams.tool.assessment.model.Assessment; @@ -105,13 +110,29 @@ this.removeField(QuestionReference.class, "type"); } + /** + * Migration to Question Bank + */ public void up20190704To20190809(String toolFilePath) throws IOException { + // find LD's content folder ID to use it in new QB questions + String contentFolderId = null; + try { + File ldFile = new File(new File(toolFilePath).getParentFile().getParentFile(), "learning_design.xml"); + DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(ldFile)); + Element ldRoot = doc.getDocumentElement(); + contentFolderId = XMLUtil.getChildElementValue(ldRoot, "contentFolderID", null); + } catch (Exception e) { + throw new IOException("Error while extracting LD content folder ID for Question Bank migration", e); + } + final String contentFolderIdFinal = contentFolderId; + // tell which file to process and what to do with its root element - transformXML(toolFilePath, root -> { - Document document = root.getOwnerDocument(); + transformXML(toolFilePath, toolRoot -> { + Document document = toolRoot.getOwnerDocument(); // first find questions - NodeList assessmentQuestions = root + NodeList assessmentQuestions = toolRoot .getElementsByTagName("org.lamsfoundation.lams.tool.assessment.model.AssessmentQuestion"); if (assessmentQuestions.getLength() == 0) { return; @@ -129,7 +150,8 @@ XMLUtil.rewriteTextElement(assessmentQuestion, qbQuestion, "type", "type", null, false, true); // Question ID will be filled later as it requires QbService XMLUtil.addTextElement(qbQuestion, "version", "1"); - XMLUtil.rewriteTextElement(root, qbQuestion, "created", "createDate", null, true, false); + XMLUtil.addTextElement(qbQuestion, "contentFolderId", contentFolderIdFinal); + XMLUtil.rewriteTextElement(toolRoot, qbQuestion, "created", "createDate", null, true, false); XMLUtil.rewriteTextElement(assessmentQuestion, qbQuestion, "title", "name", null, false, true, QbUtils.QB_MIGRATION_CKEDITOR_CLEANER, QbUtils.QB_MIGRATION_TAG_CLEANER); XMLUtil.rewriteTextElement(assessmentQuestion, qbQuestion, "question", "description", null, false, true, @@ -244,17 +266,17 @@ Element qbUnit = document.createElement("org.lamsfoundation.lams.qb.model.QbQuestionUnit"); qbUnits.appendChild(qbUnit); - XMLUtil.rewriteTextElement(assessmentUnit, assessmentUnit, "sequenceId", "displayOrder", null); - XMLUtil.rewriteTextElement(assessmentUnit, assessmentUnit, "unit", "name", null); - XMLUtil.rewriteTextElement(assessmentUnit, assessmentUnit, "multiplier", "multiplier", null); + XMLUtil.rewriteTextElement(assessmentUnit, qbUnit, "sequenceId", "displayOrder", null); + XMLUtil.rewriteTextElement(assessmentUnit, qbUnit, "unit", "name", null); + XMLUtil.rewriteTextElement(assessmentUnit, qbUnit, "multiplier", "multiplier", null); } // remove old units section from the legacy assessment question assessmentQuestion.removeChild(assessmentUnits.item(0).getParentNode()); } // now rewrite question references - NodeList questionReferences = root + NodeList questionReferences = toolRoot .getElementsByTagName("org.lamsfoundation.lams.tool.assessment.model.QuestionReference"); if (questionReferences.getLength() == 0) { return; Index: lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java =================================================================== diff -u -r9b18dabfc4198e4a842adda25a39957b6c4be92e -r136519c454662b99974e8956475b84ac0a49bc20 --- lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 9b18dabfc4198e4a842adda25a39957b6c4be92e) +++ lams_tool_assessment/src/java/org/lamsfoundation/lams/tool/assessment/service/AssessmentServiceImpl.java (.../AssessmentServiceImpl.java) (revision 136519c454662b99974e8956475b84ac0a49bc20) @@ -2649,30 +2649,38 @@ QbQuestion qbQuestion = assessmentQuestion.getQbQuestion(); qbQuestion.setQuestionId(qbService.generateNextQuestionId()); - Collection qbOptions = new ArrayList<>(qbQuestion.getQbOptions()); - qbQuestion.getQbOptions().clear(); + Collection qbOptions = qbQuestion.getQbOptions() == null ? null + : new ArrayList<>(qbQuestion.getQbOptions()); + if (qbOptions != null) { + qbQuestion.getQbOptions().clear(); + } - Collection units = qbQuestion.getUnits(); - qbQuestion.getUnits().clear(); + Collection units = qbQuestion.getUnits() == null ? null + : new ArrayList<>(qbQuestion.getUnits()); + if (units != null) { + qbQuestion.getUnits().clear(); + } assessmentDao.insert(qbQuestion); - - qbQuestion.getUnits().addAll(units); - for (QbQuestionUnit unit : units) { - unit.setQbQuestion(qbQuestion); - assessmentDao.insert(units); + + if (units != null) { + qbQuestion.getUnits().addAll(units); + for (QbQuestionUnit unit : units) { + unit.setQbQuestion(qbQuestion); + assessmentDao.insert(unit); + } + units.clear(); } - units.clear(); - - qbQuestion.getQbOptions().addAll(qbOptions); - for (QbOption qbOption : qbOptions) { - qbOption.setQbQuestion(qbQuestion); - assessmentDao.insert(qbOption); + + if (qbOptions != null) { + qbQuestion.getQbOptions().addAll(qbOptions); + for (QbOption qbOption : qbOptions) { + qbOption.setQbQuestion(qbQuestion); + assessmentDao.insert(qbOption); + } + qbOptions.clear(); } - qbOptions.clear(); - - assessmentDao.insert(assessmentQuestion); } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McImportContentVersionFilter.java =================================================================== diff -u -r9b18dabfc4198e4a842adda25a39957b6c4be92e -r136519c454662b99974e8956475b84ac0a49bc20 --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McImportContentVersionFilter.java (.../McImportContentVersionFilter.java) (revision 9b18dabfc4198e4a842adda25a39957b6c4be92e) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McImportContentVersionFilter.java (.../McImportContentVersionFilter.java) (revision 136519c454662b99974e8956475b84ac0a49bc20) @@ -1,9 +1,14 @@ package org.lamsfoundation.lams.tool.mc.service; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.lamsfoundation.lams.learningdesign.service.ToolContentVersionFilter; import org.lamsfoundation.lams.qb.QbUtils; import org.lamsfoundation.lams.tool.mc.model.McContent; @@ -75,19 +80,35 @@ this.removeField(McQueContent.class, "questionHash"); } + /** + * Migration to Question Bank + */ public void up20190517To20190809(String toolFilePath) throws IOException { + // find LD's content folder ID to use it in new QB questions + String contentFolderId = null; + try { + File ldFile = new File(new File(toolFilePath).getParentFile().getParentFile(), "learning_design.xml"); + DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(ldFile)); + Element ldRoot = doc.getDocumentElement(); + contentFolderId = XMLUtil.getChildElementValue(ldRoot, "contentFolderID", null); + } catch (Exception e) { + throw new IOException("Error while extracting LD content folder ID for Question Bank migration", e); + } + final String contentFolderIdFinal = contentFolderId; + // tell which file to process and what to do with its root element - transformXML(toolFilePath, root -> { - Document document = root.getOwnerDocument(); + transformXML(toolFilePath, toolRoot -> { + Document document = toolRoot.getOwnerDocument(); // first find questions - NodeList mcQuestions = root.getElementsByTagName("org.lamsfoundation.lams.tool.mc.model.McQueContent"); + NodeList mcQuestions = toolRoot.getElementsByTagName("org.lamsfoundation.lams.tool.mc.model.McQueContent"); if (mcQuestions.getLength() == 0) { return; } // get create date from MCQ content rather than from each question separately - String createDate = XMLUtil.getChildElementValue(root, "createDate", null); + String createDate = XMLUtil.getChildElementValue(toolRoot, "createDate", null); if (createDate == null) { createDate = new SimpleDateFormat(DateUtil.EXPORT_LD_FORMAT).format(new Date()); } @@ -103,6 +124,7 @@ XMLUtil.addTextElement(qbQuestion, "type", "1"); // Question ID will be filled later as it requires QbService XMLUtil.addTextElement(qbQuestion, "version", "1"); + XMLUtil.addTextElement(qbQuestion, "contentFolderId", contentFolderIdFinal); XMLUtil.addTextElement(qbQuestion, "createDate", createDate); XMLUtil.rewriteTextElement(mcQuestion, qbQuestion, "mark", "maxMark", "1", false, true); XMLUtil.rewriteTextElement(mcQuestion, qbQuestion, "feedback", "feedback", null, false, true, Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieImportContentVersionFilter.java =================================================================== diff -u -r9b18dabfc4198e4a842adda25a39957b6c4be92e -r136519c454662b99974e8956475b84ac0a49bc20 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieImportContentVersionFilter.java (.../ScratchieImportContentVersionFilter.java) (revision 9b18dabfc4198e4a842adda25a39957b6c4be92e) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieImportContentVersionFilter.java (.../ScratchieImportContentVersionFilter.java) (revision 136519c454662b99974e8956475b84ac0a49bc20) @@ -22,10 +22,15 @@ package org.lamsfoundation.lams.tool.scratchie.service; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.lamsfoundation.lams.learningdesign.service.ToolContentVersionFilter; import org.lamsfoundation.lams.qb.QbUtils; import org.lamsfoundation.lams.tool.scratchie.dto.QbOptionDTO; @@ -94,14 +99,30 @@ this.removeField(ScratchieItem.class, "userMark"); this.removeField(ScratchieItem.class, "userAttempts"); } - + + /** + * Migration to Question Bank + */ public void up20190103To20190809(String toolFilePath) throws IOException { + // find LD's content folder ID to use it in new QB questions + String contentFolderId = null; + try { + File ldFile = new File(new File(toolFilePath).getParentFile().getParentFile(), "learning_design.xml"); + DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(ldFile)); + Element ldRoot = doc.getDocumentElement(); + contentFolderId = XMLUtil.getChildElementValue(ldRoot, "contentFolderID", null); + } catch (Exception e) { + throw new IOException("Error while extracting LD content folder ID for Question Bank migration", e); + } + final String contentFolderIdFinal = contentFolderId; + // tell which file to process and what to do with its root element - transformXML(toolFilePath, root -> { - Document document = root.getOwnerDocument(); + transformXML(toolFilePath, toolRoot -> { + Document document = toolRoot.getOwnerDocument(); // first find questions - NodeList scratchieQuestions = root + NodeList scratchieQuestions = toolRoot .getElementsByTagName("org.lamsfoundation.lams.tool.scratchie.model.ScratchieItem"); if (scratchieQuestions.getLength() == 0) { return; @@ -119,6 +140,7 @@ XMLUtil.addTextElement(qbQuestion, "type", "1"); // Question ID will be filled later as it requires QbService XMLUtil.addTextElement(qbQuestion, "version", "1"); + XMLUtil.addTextElement(qbQuestion, "contentFolderId", contentFolderIdFinal); XMLUtil.rewriteTextElement(scratchieQuestion, qbQuestion, "createDate", "createDate", new SimpleDateFormat(DateUtil.EXPORT_LD_FORMAT).format(new Date()), true, true); XMLUtil.rewriteTextElement(scratchieQuestion, qbQuestion, "title", "name", null, false, true,