diff --git a/src/main/java/org/olat/ims/qti/qpool/QTIImportProcessor.java b/src/main/java/org/olat/ims/qti/qpool/QTIImportProcessor.java index 6106024213e9cc9bad9dc4ad69545c1e79a83faa..e7ee65978786c9329e29c3c2c3b1c45dab4d8353 100644 --- a/src/main/java/org/olat/ims/qti/qpool/QTIImportProcessor.java +++ b/src/main/java/org/olat/ims/qti/qpool/QTIImportProcessor.java @@ -234,7 +234,7 @@ class QTIImportProcessor { boolean ooFormat = processItemQuestionType(poolItem, ident, itemEl); if(StringHelper.containsNonWhitespace(editor)) { poolItem.setEditor(editor); - poolItem.setEditor(editorVersion); + poolItem.setEditorVersion(editorVersion); } else if(ooFormat) { poolItem.setEditor("OpenOLAT"); } diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21ImportProcessor.java b/src/main/java/org/olat/ims/qti21/pool/QTI21ImportProcessor.java index 038316aa7ce6bb0f8f19aee980a3edc1306f1e28..c5297fc16a748d74febce497d14153324be0c6ce 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21ImportProcessor.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21ImportProcessor.java @@ -25,13 +25,21 @@ import java.util.Locale; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; +import org.olat.core.util.StringHelper; +import org.olat.ims.qti.questionimport.ItemAndMetadata; +import org.olat.ims.qti21.QTI21Constants; import org.olat.modules.qpool.QuestionItem; +import org.olat.modules.qpool.QuestionType; import org.olat.modules.qpool.manager.QEducationalContextDAO; import org.olat.modules.qpool.manager.QItemTypeDAO; import org.olat.modules.qpool.manager.QLicenseDAO; import org.olat.modules.qpool.manager.QPoolFileStorage; import org.olat.modules.qpool.manager.QuestionItemDAO; import org.olat.modules.qpool.manager.TaxonomyLevelDAO; +import org.olat.modules.qpool.model.QItemType; +import org.olat.modules.qpool.model.QuestionItemImpl; + +import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; /** * @@ -41,15 +49,77 @@ import org.olat.modules.qpool.manager.TaxonomyLevelDAO; */ public class QTI21ImportProcessor { + private final Identity owner; + private final Locale defaultLocale; + + private final QItemTypeDAO qItemTypeDao; + private final QuestionItemDAO questionItemDao; + private final QPoolFileStorage qpoolFileStorage; + public QTI21ImportProcessor(Identity owner, Locale defaultLocale, String filename, File file, QuestionItemDAO questionItemDao, QItemTypeDAO qItemTypeDao, QEducationalContextDAO qEduContextDao, TaxonomyLevelDAO taxonomyLevelDao, QLicenseDAO qLicenseDao, QPoolFileStorage qpoolFileStorage, DB dbInstance) { - // TODO Auto-generated constructor stub + this.owner = owner; + this.defaultLocale = defaultLocale; + this.qItemTypeDao = qItemTypeDao; + this.questionItemDao = questionItemDao; + this.qpoolFileStorage = qpoolFileStorage; } public List<QuestionItem> process() { return null; } + + + protected QuestionItemImpl processItem(AssessmentItem assessmentItem, String comment, String originalItemFilename, + String editor, String editorVersion, ItemAndMetadata metadata) { + //filename + String filename; + String ident = assessmentItem.getIdentifier(); + if(originalItemFilename != null) { + filename = originalItemFilename; + } else if(StringHelper.containsNonWhitespace(ident)) { + filename = StringHelper.transformDisplayNameToFileSystemName(ident) + ".xml"; + } else { + filename = "item.xml"; + } + String dir = qpoolFileStorage.generateDir(); + + //title + String title = assessmentItem.getTitle(); + if(!StringHelper.containsNonWhitespace(title)) { + title = assessmentItem.getLabel(); + } + if(!StringHelper.containsNonWhitespace(title)) { + title = ident; + } + + QuestionItemImpl poolItem = questionItemDao.create(title, QTI21Constants.QTI_21_FORMAT, dir, filename); + //description + poolItem.setDescription(comment); + //language from default + poolItem.setLanguage(defaultLocale.getLanguage()); + //question type first + if(StringHelper.containsNonWhitespace(editor)) { + poolItem.setEditor(editor); + poolItem.setEditorVersion(editorVersion); + } + //if question type not found, can be overridden by the metadatas + //processItemMetadata(poolItem, itemEl); + if(poolItem.getType() == null) { + QItemType defType = qItemTypeDao.loadByType(QuestionType.UNKOWN.name()); + poolItem.setType(defType); + } + /*if(docInfos != null) { + processSidecarMetadata(poolItem, docInfos); + }*/ + if(metadata != null) { + //processItemMetadata(poolItem, metadata); + } + questionItemDao.persist(owner, poolItem); + return poolItem; + } + } diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java index 81aaa6c144665ffb886c86903d2b28145bf87aa5..1f89ce41c7b31e4fbda2f27cbbbc203a2413b828 100644 --- a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java +++ b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java @@ -33,15 +33,23 @@ import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.media.MediaResource; +import org.olat.core.helpers.Settings; import org.olat.core.id.Identity; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; +import org.olat.core.util.vfs.LocalImpl; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSManager; import org.olat.ims.qti.fileresource.TestFileResource; import org.olat.ims.qti21.QTI21Constants; +import org.olat.ims.qti21.QTI21Service; +import org.olat.ims.qti21.model.xml.AssessmentItemBuilder; +import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; +import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder; +import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder; +import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder; import org.olat.ims.qti21.pool.QTI21AssessmentItemFactory.Type; import org.olat.ims.resources.IMSEntityResolver; import org.olat.modules.qpool.ExportFormatOptions; @@ -58,12 +66,15 @@ import org.olat.modules.qpool.manager.QPoolFileStorage; import org.olat.modules.qpool.manager.QuestionItemDAO; import org.olat.modules.qpool.manager.TaxonomyLevelDAO; import org.olat.modules.qpool.model.DefaultExportFormat; +import org.olat.modules.qpool.model.QuestionItemImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; +import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; + /** * * Initial date: 05.02.2016<br> @@ -79,6 +90,9 @@ public class QTI21QPoolServiceProvider implements QPoolSPI { @Autowired private DB dbInstance; + @Autowired + private QTI21Service qtiService; + @Autowired private QPoolFileStorage qpoolFileStorage; @Autowired @@ -212,6 +226,28 @@ public class QTI21QPoolServiceProvider implements QPoolSPI { } public QuestionItem createItem(Identity identity, Type type, String title, Locale locale) { - return null; + AssessmentItemBuilder itemBuilder = null; + switch(type) { + case sc: itemBuilder = new SingleChoiceAssessmentItemBuilder(qtiService.qtiSerializer()); break; + case mc: itemBuilder = new MultipleChoiceAssessmentItemBuilder(qtiService.qtiSerializer()); break; + case kprim: itemBuilder = new KPrimAssessmentItemBuilder(qtiService.qtiSerializer()); break; + //case fib: item = QTIEditHelper.createFIBItem(trans); break; + case essay: itemBuilder = new EssayAssessmentItemBuilder(qtiService.qtiSerializer()); break; + default: return null; + } + + AssessmentItem assessmentItem = itemBuilder.getAssessmentItem(); + assessmentItem.setLabel(title); + assessmentItem.setTitle(title); + + QTI21ImportProcessor processor = new QTI21ImportProcessor(identity, locale, null, null, + questionItemDao, qItemTypeDao, qEduContextDao, taxonomyLevelDao, qLicenseDao, qpoolFileStorage, dbInstance); + QuestionItemImpl qitem = processor.processItem(assessmentItem, "", null, "OpenOLAT", Settings.getVersion(), null); + + VFSContainer baseDir = qpoolFileStorage.getContainer(qitem.getDirectory()); + VFSLeaf leaf = baseDir.createChildLeaf(qitem.getRootFilename()); + File itemFile = ((LocalImpl)leaf).getBasefile(); + qtiService.persistAssessmentObject(itemFile, assessmentItem); + return qitem; } } \ No newline at end of file