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