From e62f85e876cf9fad734de5e6205818b09a08ca8c Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 18 Feb 2016 16:32:28 +0100
Subject: [PATCH] OO-1593: optimize qtiworks for heavy load on huge tests

---
 .../olat/course/nodes/iq/QTI21AssessmentRunController.java  | 3 ++-
 .../org/olat/course/nodes/iq/_content/assessment_run.html   | 2 +-
 .../java/org/olat/fileresource/types/ImsQTI21Resource.java  | 4 ++--
 .../java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java   | 6 +++++-
 .../olat/ims/qti21/ui/AssessmentTestDisplayController.java  | 2 ++
 5 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
index 8fbf6aeec6a..b3f531b7b55 100644
--- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
@@ -137,7 +137,8 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 		mainVC.contextPut("passed", scoreEval.getPassed());
 		StringBuilder comment = Formatter.stripTabsAndReturns(courseNode.getUserUserComment(userCourseEnv));
 		mainVC.contextPut("comment", StringHelper.xssScan(comment));
-		mainVC.contextPut("attempts", courseNode.getUserAttempts(userCourseEnv));
+		Integer attempts = courseNode.getUserAttempts(userCourseEnv);
+		mainVC.contextPut("attempts", attempts == null ? new Integer(0) : attempts);
 		
 		UserNodeAuditManager am = userCourseEnv.getCourseEnvironment().getAuditManager();
 		mainVC.contextPut("log", am.getUserNodeLog(courseNode, identity));
diff --git a/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html b/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
index 522ebc77612..b443c8c1194 100644
--- a/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
+++ b/src/main/java/org/olat/course/nodes/iq/_content/assessment_run.html
@@ -1,5 +1,5 @@
 #if ($enableScoreInfo)
-	#if($attempts > 0)
+	#if($attempts && $attempts > 0)
 		<div class="panel panel-default o_personal">
 		  	<div class="panel-heading">
 	  			<h4 class="panel-title">$r.translate("personal.title")</h4>
diff --git a/src/main/java/org/olat/fileresource/types/ImsQTI21Resource.java b/src/main/java/org/olat/fileresource/types/ImsQTI21Resource.java
index b5bee7ec1f0..840cde8c0c5 100644
--- a/src/main/java/org/olat/fileresource/types/ImsQTI21Resource.java
+++ b/src/main/java/org/olat/fileresource/types/ImsQTI21Resource.java
@@ -107,7 +107,7 @@ public class ImsQTI21Resource extends FileResource {
 			if(cp.hasTest()) {
 				URI test = cp.getTest().toUri();
 				ResourceLocator chainedResourceLocator = createResolvingResourceLocator(resourceLocator);
-				XmlReadResult result = new QtiXmlReader().read(chainedResourceLocator, test, true);
+				XmlReadResult result = new QtiXmlReader().read(chainedResourceLocator, test, true, true);
 				return result != null && result.isSchemaValid();
 			}
 			return false;
@@ -121,7 +121,7 @@ public class ImsQTI21Resource extends FileResource {
 		try {
 			PathResourceLocator resourceLocator = new PathResourceLocator(resource.getParentFile().toPath());
 			ResourceLocator chainedResourceLocator = createResolvingResourceLocator(resourceLocator);
-			XmlReadResult result = new QtiXmlReader().read(chainedResourceLocator, resource.toURI(), true);
+			XmlReadResult result = new QtiXmlReader().read(chainedResourceLocator, resource.toURI(), true, true);
 			return result != null && result.isSchemaValid();
 		} catch (Exception e) {
 			log.error("", e);
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
index ccc42138977..f39949c59b2 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -49,6 +49,7 @@ import org.olat.core.id.Persistable;
 import org.olat.core.logging.OLATRuntimeException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.CodeHelper;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.cache.CacheWrapper;
 import org.olat.core.util.coordinate.CoordinatorManager;
@@ -253,12 +254,15 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa
         URI assessmentObjectSystemId = createAssessmentObjectUri(resourceDirectory);
 		File resourceFile = new File(assessmentObjectSystemId);
 		return assessmentTestsCache.computeIfAbsent(resourceFile, file -> {
+			long start = System.nanoTime();
 			QtiXmlReader qtiXmlReader = new QtiXmlReader(jqtiExtensionManager());
 			ResourceLocator fileResourceLocator = new PathResourceLocator(resourceDirectory.toPath());
 			ResourceLocator inputResourceLocator = 
 	        		ImsQTI21Resource.createResolvingResourceLocator(fileResourceLocator);
 	        AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, inputResourceLocator);
-	        return assessmentObjectXmlLoader.loadAndResolveAssessmentTest(assessmentObjectSystemId);
+	        ResolvedAssessmentTest resolvedAssessmentTest = assessmentObjectXmlLoader.loadAndResolveAssessmentTest(assessmentObjectSystemId);
+	        CodeHelper.printNanoTime(start, "Load test takes");
+	        return resolvedAssessmentTest;
 		});
 	}
 	
diff --git a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
index 8f075f3ec1f..295c2b18212 100644
--- a/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/AssessmentTestDisplayController.java
@@ -768,6 +768,8 @@ public class AssessmentTestDisplayController extends BasicController implements
         
         final TestSessionControllerSettings testSessionControllerSettings = new TestSessionControllerSettings();
         testSessionControllerSettings.setTemplateProcessingLimit(computeTemplateProcessingLimit());
+        
+        testProcessingMap.reduceItemProcessingMapMap(testPlan.getTestPlanNodeList());
 
         /* Create controller and wire up notification recorder */
         final TestSessionController result = new TestSessionController(qtiService.jqtiExtensionManager(),
-- 
GitLab