From e2fa489202a3b2e2062d56376742a82b84b4cf1c Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Wed, 30 Mar 2016 20:05:20 +0200
Subject: [PATCH] OO-1965: wait up-to 30 seconds that the export finished

---
 .../ims/qti/editor/QTIEditorMainController.java     | 13 ++++++++++++-
 .../java/org/olat/ims/qti/export/QTIWordExport.java |  7 ++++++-
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
index 8c306d36371..c5a1f2fd682 100644
--- a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
+++ b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
@@ -34,6 +34,8 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 import org.olat.admin.quota.QuotaConstants;
 import org.olat.admin.quota.QuotaImpl;
@@ -256,6 +258,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 	private Set<String> deletableMediaFiles;
 	private StepsMainRunController importTableWizard;
 	private InsertNodeController moveCtrl, copyCtrl, insertCtrl;
+	private CountDownLatch exportLatch;
 
 	@Autowired
 	private UserManager userManager;
@@ -1024,7 +1027,8 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 	private void doExportDocx(UserRequest ureq) {
 		AssessmentNode rootNode = (AssessmentNode)menuTreeModel.getRootNode();
 		VFSContainer editorContainer = qtiPackage.getBaseDir();
-		MediaResource mr = new QTIWordExport(rootNode, editorContainer, getLocale(), "UTF-8");
+		exportLatch = new CountDownLatch(1);
+		MediaResource mr = new QTIWordExport(rootNode, editorContainer, getLocale(), "UTF-8", exportLatch);
 		ureq.getDispatchResult().setResultingMediaResource(mr);
 	}
 	
@@ -1179,6 +1183,13 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 	@Override
 	public boolean requestForClose(UserRequest ureq) {		
 		// enter save/discard dialog if not already in it
+		if(exportLatch != null) {
+			try {
+				exportLatch.await(30, TimeUnit.SECONDS);
+			} catch (InterruptedException e) {
+				logError("", e);
+			}
+		}
 		if (cmcExit == null) {
 			exitVC = createVelocityContainer("exitDialog");
 			exitPanel = new Panel("exitPanel");
diff --git a/src/main/java/org/olat/ims/qti/export/QTIWordExport.java b/src/main/java/org/olat/ims/qti/export/QTIWordExport.java
index 521cbd1c149..e1981cd539a 100644
--- a/src/main/java/org/olat/ims/qti/export/QTIWordExport.java
+++ b/src/main/java/org/olat/ims/qti/export/QTIWordExport.java
@@ -27,6 +27,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.concurrent.CountDownLatch;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -75,11 +76,14 @@ public class QTIWordExport implements MediaResource {
 	private AssessmentNode rootNode;
 	private VFSContainer mediaContainer;
 	private Locale locale;
+	private final CountDownLatch latch;
 	
-	public QTIWordExport(AssessmentNode rootNode, VFSContainer mediaContainer, Locale locale, String encoding) {
+	public QTIWordExport(AssessmentNode rootNode, VFSContainer mediaContainer,
+			Locale locale, String encoding, CountDownLatch latch) {
 		this.encoding = encoding;
 		this.locale = locale;
 		this.rootNode = rootNode;
+		this.latch = latch;
 		this.mediaContainer = mediaContainer;
 	}
 	
@@ -145,6 +149,7 @@ public class QTIWordExport implements MediaResource {
 		} catch (Exception e) {
 			log.error("", e);
 		} finally {
+			latch.countDown();
 			IOUtils.closeQuietly(zout);
 		}
 	}
-- 
GitLab