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 8fbf6aeec6ab982b3327b765561e9243199e8285..b3f531b7b55727a788e7619b80b0f1b7d12b80b3 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 522ebc77612459af89939bd364bac9be2b71c921..b443c8c119467f720e3553ddefe018c725881179 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 b5bee7ec1f0243ba6f0da9512b41dbdd29499e6b..840cde8c0c5956f18435d0818f7e46fc690756d3 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 ccc421389770c4938a4613aee8e4f9671d559234..f39949c59b23d38b784eee678b79010f7f5ac73d 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 8f075f3ec1fa5eb31fd289d09c40fbb503406c24..295c2b18212da99ba0eda0ef56aac9840fc793de 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(),