From 885d19b9a80b76ef3a2439448a8a599deef3263b Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Fri, 27 Sep 2013 14:42:13 +0200 Subject: [PATCH] OO-794: generate the ident of the QTI item after exporting them, fix an issue with seelction of items in flexi table bigger than 100 rows, fix an annoying message in item selection from the bank in QTI editor --- .../elements/table/FlexiTableElementImpl.java | 16 +++++++--------- .../org/olat/ims/qti/editor/QTIEditHelper.java | 17 +++++++++++++++++ .../qti/editor/beecom/parser/ItemParser.java | 2 ++ .../olat/ims/qti/qpool/QTIExportProcessor.java | 11 +++++++++++ .../ims/qti/qpool/QTIQPoolServiceProvider.java | 12 +++++++++++- .../modules/qpool/ui/ItemListController.java | 2 +- .../modules/qpool/ui/_content/item_list.html | 3 +++ 7 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java index a3e02e7bdb3..e7a24a76bc2 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java @@ -586,15 +586,13 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle } multiSelectedIndex.clear(); //selection format row_{formDispId}-{index} - if(selections.length > 0) { - int index = selections[0].lastIndexOf('-'); - if(index > 0) { - for(String selection:selections) { - if(index > 0 && index+1 < selection.length()) { - String rowStr = selection.substring(index+1); - int row = Integer.parseInt(rowStr); - multiSelectedIndex.add(new Integer(row)); - } + if(selections != null && selections.length > 0) { + for(String selection:selections) { + int index = selection.lastIndexOf('-'); + if(index > 0 && index+1 < selection.length()) { + String rowStr = selection.substring(index+1); + int row = Integer.parseInt(rowStr); + multiSelectedIndex.add(new Integer(row)); } } } diff --git a/src/main/java/org/olat/ims/qti/editor/QTIEditHelper.java b/src/main/java/org/olat/ims/qti/editor/QTIEditHelper.java index 3519db6be06..61984b743d2 100644 --- a/src/main/java/org/olat/ims/qti/editor/QTIEditHelper.java +++ b/src/main/java/org/olat/ims/qti/editor/QTIEditHelper.java @@ -34,6 +34,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.UUID; import org.dom4j.Document; import org.dom4j.DocumentFactory; @@ -66,6 +67,7 @@ import org.olat.ims.qti.editor.beecom.objects.QTIObject; import org.olat.ims.qti.editor.beecom.objects.Question; import org.olat.ims.qti.editor.beecom.objects.Response; import org.olat.ims.qti.editor.beecom.objects.Section; +import org.olat.ims.qti.editor.beecom.parser.ItemParser; import org.olat.ims.qti.editor.beecom.parser.ParserManager; import org.olat.ims.qti.process.AssessmentInstance; import org.olat.ims.resources.IMSEntityResolver; @@ -115,6 +117,21 @@ public class QTIEditHelper { return itemCount; } + public static String generateNewIdent(String currentIdent) { + String newIdent = null; + if(currentIdent != null) { + for(String ooPrefix:ItemParser.OO_ITEM_PREFIX) { + if(currentIdent.startsWith(ooPrefix)) { + newIdent = ooPrefix + UUID.randomUUID().toString().replace("-", ""); + } + } + } + if(newIdent == null) { + newIdent = UUID.randomUUID().toString().replace("-", ""); + } + return newIdent; + } + /** * Creates an empty assessment * @param title diff --git a/src/main/java/org/olat/ims/qti/editor/beecom/parser/ItemParser.java b/src/main/java/org/olat/ims/qti/editor/beecom/parser/ItemParser.java index 98df805c190..b35b13487ae 100644 --- a/src/main/java/org/olat/ims/qti/editor/beecom/parser/ItemParser.java +++ b/src/main/java/org/olat/ims/qti/editor/beecom/parser/ItemParser.java @@ -54,6 +54,8 @@ public class ItemParser implements IParser { public static final String ITEM_PREFIX_ESSAY = "QTIEDIT:ESSAY:"; public static final String ITEM_PREFIX_KPRIM = "QTIEDIT:KPRIM:"; + public static final String[] OO_ITEM_PREFIX = { ITEM_PREFIX_SCQ, ITEM_PREFIX_MCQ, ITEM_PREFIX_FIB, ITEM_PREFIX_ESSAY, ITEM_PREFIX_KPRIM }; + private ParserManager parserManager = new ParserManager(); /** diff --git a/src/main/java/org/olat/ims/qti/qpool/QTIExportProcessor.java b/src/main/java/org/olat/ims/qti/qpool/QTIExportProcessor.java index 6b0fc04c054..05d715307d0 100644 --- a/src/main/java/org/olat/ims/qti/qpool/QTIExportProcessor.java +++ b/src/main/java/org/olat/ims/qti/qpool/QTIExportProcessor.java @@ -52,6 +52,7 @@ import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSManager; import org.olat.core.util.xml.XMLParser; import org.olat.ims.qti.QTIConstants; +import org.olat.ims.qti.editor.QTIEditHelper; import org.olat.ims.resources.IMSEntityResolver; import org.olat.modules.qpool.QuestionItemFull; import org.olat.modules.qpool.manager.QPoolFileStorage; @@ -106,6 +107,10 @@ public class QTIExportProcessor { //write qti.xml Element sectionEl = createSectionBasedAssessment("Assessment"); for(Element itemEl:itemAndMaterials.getItemEls()) { + //generate new ident per item + String ident = getAttributeValue(itemEl, "ident"); + String exportIdent = QTIEditHelper.generateNewIdent(ident); + itemEl.addAttribute("ident", exportIdent); sectionEl.add(itemEl); } zout.putNextEntry(new ZipEntry("qti.xml")); @@ -163,6 +168,12 @@ public class QTIExportProcessor { materials.addItemEl(itemEl); } } + + private String getAttributeValue(Element el, String attrName) { + if(el == null) return null; + Attribute attr = el.attribute(attrName); + return (attr == null) ? null : attr.getStringValue(); + } private void collectResources(Element el, VFSContainer container, ItemsAndMaterials materials) { collectResourcesInMatText(el, container, materials); diff --git a/src/main/java/org/olat/ims/qti/qpool/QTIQPoolServiceProvider.java b/src/main/java/org/olat/ims/qti/qpool/QTIQPoolServiceProvider.java index 3e4e1584571..e00406ffeaa 100644 --- a/src/main/java/org/olat/ims/qti/qpool/QTIQPoolServiceProvider.java +++ b/src/main/java/org/olat/ims/qti/qpool/QTIQPoolServiceProvider.java @@ -269,6 +269,7 @@ public class QTIQPoolServiceProvider implements QPoolSPI { for(QuestionItemFull fullItem:fullItems) { Element itemEl = processor.exportToQTIEditor(fullItem, editorContainer); Item item = (Item)new ParserManager().parse(itemEl); + item.setIdent(QTIEditHelper.generateNewIdent(item.getIdent())); section.getItems().add(item); } } @@ -306,11 +307,20 @@ public class QTIQPoolServiceProvider implements QPoolSPI { processor.assembleTest(fullItems, zout); } + /** + * Export to QTI editor an item from the pool. The ident of the item + * is always regenerated as an UUID. + * @param qitem + * @param editorContainer + * @return + */ public Item exportToQTIEditor(QuestionItemShort qitem, VFSContainer editorContainer) { QTIExportProcessor processor = new QTIExportProcessor(qpoolFileStorage); QuestionItemFull fullItem = questionItemDao.loadById(qitem.getKey()); Element itemEl = processor.exportToQTIEditor(fullItem, editorContainer); - return (Item)new ParserManager().parse(itemEl); + Item exportedItem = (Item)new ParserManager().parse(itemEl); + exportedItem.setIdent(QTIEditHelper.generateNewIdent(exportedItem.getIdent())); + return exportedItem; } @Override diff --git a/src/main/java/org/olat/modules/qpool/ui/ItemListController.java b/src/main/java/org/olat/modules/qpool/ui/ItemListController.java index 13e30a1469d..2a61d110176 100644 --- a/src/main/java/org/olat/modules/qpool/ui/ItemListController.java +++ b/src/main/java/org/olat/modules/qpool/ui/ItemListController.java @@ -51,7 +51,7 @@ public class ItemListController extends AbstractItemListController { @Override protected void initButtons(FormItemContainer formLayout) { getItemsTable().setMultiSelect(true); - selectLink = uifactory.addFormLink("select", formLayout, Link.BUTTON); + selectLink = uifactory.addFormLink("select-to-import", "select", null, formLayout, Link.BUTTON); } @Override diff --git a/src/main/java/org/olat/modules/qpool/ui/_content/item_list.html b/src/main/java/org/olat/modules/qpool/ui/_content/item_list.html index 29154361943..a6d85d5a331 100644 --- a/src/main/java/org/olat/modules/qpool/ui/_content/item_list.html +++ b/src/main/java/org/olat/modules/qpool/ui/_content/item_list.html @@ -31,6 +31,9 @@ $r.render("items") #if($r.available("select")) $r.render("select") #end + #if($r.available("select-to-import")) + $r.render("select-to-import") + #end #if($r.available("bulk.change")) $r.render("bulk.change") #end -- GitLab