Skip to content
Snippets Groups Projects
Commit e62f85e8 authored by srosse's avatar srosse
Browse files

OO-1593: optimize qtiworks for heavy load on huge tests

parent 4aac0c62
No related branches found
No related tags found
No related merge requests found
...@@ -137,7 +137,8 @@ public class QTI21AssessmentRunController extends BasicController implements Gen ...@@ -137,7 +137,8 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
mainVC.contextPut("passed", scoreEval.getPassed()); mainVC.contextPut("passed", scoreEval.getPassed());
StringBuilder comment = Formatter.stripTabsAndReturns(courseNode.getUserUserComment(userCourseEnv)); StringBuilder comment = Formatter.stripTabsAndReturns(courseNode.getUserUserComment(userCourseEnv));
mainVC.contextPut("comment", StringHelper.xssScan(comment)); 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(); UserNodeAuditManager am = userCourseEnv.getCourseEnvironment().getAuditManager();
mainVC.contextPut("log", am.getUserNodeLog(courseNode, identity)); mainVC.contextPut("log", am.getUserNodeLog(courseNode, identity));
......
#if ($enableScoreInfo) #if ($enableScoreInfo)
#if($attempts > 0) #if($attempts && $attempts > 0)
<div class="panel panel-default o_personal"> <div class="panel panel-default o_personal">
<div class="panel-heading"> <div class="panel-heading">
<h4 class="panel-title">$r.translate("personal.title")</h4> <h4 class="panel-title">$r.translate("personal.title")</h4>
......
...@@ -107,7 +107,7 @@ public class ImsQTI21Resource extends FileResource { ...@@ -107,7 +107,7 @@ public class ImsQTI21Resource extends FileResource {
if(cp.hasTest()) { if(cp.hasTest()) {
URI test = cp.getTest().toUri(); URI test = cp.getTest().toUri();
ResourceLocator chainedResourceLocator = createResolvingResourceLocator(resourceLocator); 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 result != null && result.isSchemaValid();
} }
return false; return false;
...@@ -121,7 +121,7 @@ public class ImsQTI21Resource extends FileResource { ...@@ -121,7 +121,7 @@ public class ImsQTI21Resource extends FileResource {
try { try {
PathResourceLocator resourceLocator = new PathResourceLocator(resource.getParentFile().toPath()); PathResourceLocator resourceLocator = new PathResourceLocator(resource.getParentFile().toPath());
ResourceLocator chainedResourceLocator = createResolvingResourceLocator(resourceLocator); 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(); return result != null && result.isSchemaValid();
} catch (Exception e) { } catch (Exception e) {
log.error("", e); log.error("", e);
......
...@@ -49,6 +49,7 @@ import org.olat.core.id.Persistable; ...@@ -49,6 +49,7 @@ import org.olat.core.id.Persistable;
import org.olat.core.logging.OLATRuntimeException; import org.olat.core.logging.OLATRuntimeException;
import org.olat.core.logging.OLog; import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing; import org.olat.core.logging.Tracing;
import org.olat.core.util.CodeHelper;
import org.olat.core.util.FileUtils; import org.olat.core.util.FileUtils;
import org.olat.core.util.cache.CacheWrapper; import org.olat.core.util.cache.CacheWrapper;
import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.coordinate.CoordinatorManager;
...@@ -253,12 +254,15 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa ...@@ -253,12 +254,15 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa
URI assessmentObjectSystemId = createAssessmentObjectUri(resourceDirectory); URI assessmentObjectSystemId = createAssessmentObjectUri(resourceDirectory);
File resourceFile = new File(assessmentObjectSystemId); File resourceFile = new File(assessmentObjectSystemId);
return assessmentTestsCache.computeIfAbsent(resourceFile, file -> { return assessmentTestsCache.computeIfAbsent(resourceFile, file -> {
long start = System.nanoTime();
QtiXmlReader qtiXmlReader = new QtiXmlReader(jqtiExtensionManager()); QtiXmlReader qtiXmlReader = new QtiXmlReader(jqtiExtensionManager());
ResourceLocator fileResourceLocator = new PathResourceLocator(resourceDirectory.toPath()); ResourceLocator fileResourceLocator = new PathResourceLocator(resourceDirectory.toPath());
ResourceLocator inputResourceLocator = ResourceLocator inputResourceLocator =
ImsQTI21Resource.createResolvingResourceLocator(fileResourceLocator); ImsQTI21Resource.createResolvingResourceLocator(fileResourceLocator);
AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, inputResourceLocator); AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, inputResourceLocator);
return assessmentObjectXmlLoader.loadAndResolveAssessmentTest(assessmentObjectSystemId); ResolvedAssessmentTest resolvedAssessmentTest = assessmentObjectXmlLoader.loadAndResolveAssessmentTest(assessmentObjectSystemId);
CodeHelper.printNanoTime(start, "Load test takes");
return resolvedAssessmentTest;
}); });
} }
......
...@@ -768,6 +768,8 @@ public class AssessmentTestDisplayController extends BasicController implements ...@@ -768,6 +768,8 @@ public class AssessmentTestDisplayController extends BasicController implements
final TestSessionControllerSettings testSessionControllerSettings = new TestSessionControllerSettings(); final TestSessionControllerSettings testSessionControllerSettings = new TestSessionControllerSettings();
testSessionControllerSettings.setTemplateProcessingLimit(computeTemplateProcessingLimit()); testSessionControllerSettings.setTemplateProcessingLimit(computeTemplateProcessingLimit());
testProcessingMap.reduceItemProcessingMapMap(testPlan.getTestPlanNodeList());
/* Create controller and wire up notification recorder */ /* Create controller and wire up notification recorder */
final TestSessionController result = new TestSessionController(qtiService.jqtiExtensionManager(), final TestSessionController result = new TestSessionController(qtiService.jqtiExtensionManager(),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment