use of uk.ac.ed.ph.jqtiplus.running.TestSessionController in project openolat by klemens.
the class AssessmentTreeComponentRenderer method renderAssessmentItemLink.
/**
* @param sb
* @param component
* @param itemNode
* @return The event used or null
*/
private Event renderAssessmentItemLink(StringOutput sb, AssessmentTreeComponent component, TestPlanNode itemNode, Translator translator) {
String key = itemNode.getKey().toString();
Form form = component.getQtiItem().getRootForm();
String dispatchId = component.getQtiItem().getFormDispatchId();
TestSessionController testSessionController = component.getTestSessionController();
TestSessionState testSessionState = testSessionController.getTestSessionState();
TestPart testPart = testSessionController.getCurrentTestPart();
TestPlanNodeKey currentTestPartKey = testSessionState.getCurrentTestPartKey();
TestPartSessionState currentTestPartSessionState = testSessionState.getTestPartSessionStates().get(currentTestPartKey);
Event event;
if (testPart == null || testPart.getNavigationMode() == NavigationMode.NONLINEAR) {
if (testSessionState.isEnded() || currentTestPartSessionState.isEnded()) {
if (itemNode.getEffectiveItemSessionControl().isAllowReview() || itemNode.getEffectiveItemSessionControl().isShowFeedback()) {
event = Event.reviewItem;
} else {
event = null;
}
} else {
event = Event.selectItem;
}
} else {
event = null;
}
if (event == null) {
sb.append("<span class='o_assessmentitem_nav_disabled'>");
} else {
sb.append("<a href='javascript:;' onclick=\"").append(FormJSHelper.getXHRFnCallFor(form, dispatchId, 1, true, true, new NameValuePair("cid", event.name()), new NameValuePair("item", key))).append(";\" class='o_sel_assessmentitem'>");
}
String title;
if (component.isShowTitles()) {
title = StringHelper.escapeHtml(itemNode.getSectionPartTitle());
} else {
int num = component.getCandidateSessionContext().getNumber(itemNode);
title = translator.translate("question.title", new String[] { Integer.toString(num) });
}
sb.append("<span class='questionTitle'>").append(title).append("</span>");
if (event == null) {
sb.append("</span>");
} else {
sb.append("</a>");
}
return event;
}
use of uk.ac.ed.ph.jqtiplus.running.TestSessionController in project openolat by klemens.
the class AssessmentTreeComponentRenderer method renderNavigationAssessmentItem.
private void renderNavigationAssessmentItem(StringOutput sb, AssessmentTreeComponent component, TestPlanNode itemNode, Translator translator, RenderingRequest options) {
// check if currently rendered item is the active item
boolean active = false;
TestSessionController sessionCtr = component.getTestSessionController();
if (sessionCtr != null && itemNode != null) {
TestSessionState sessionState = sessionCtr.getTestSessionState();
if (sessionState != null && sessionState.getCurrentItemKey() != null) {
TestPlanNodeKey testPlanNodeKey = sessionState.getCurrentItemKey();
active = (testPlanNodeKey.getIdentifier().equals(itemNode.getIdentifier()));
}
}
sb.append("<li class='o_assessmentitem").append(" active", active).append("'>");
try {
renderAssessmentItemMark(sb, component, itemNode, translator);
renderAssessmentItemAttempts(sb, component, itemNode, translator);
renderItemStatus(sb, component, itemNode, translator, options);
renderAssessmentItemLink(sb, component, itemNode, translator);
} catch (IllegalStateException ex) {
log.error("", ex);
sb.append("<span class='o_danger'>ERROR</span>");
}
sb.append("</li>");
}
use of uk.ac.ed.ph.jqtiplus.running.TestSessionController in project OpenOLAT by OpenOLAT.
the class AssessmentTestDisplayController method resumeSession.
private TestSessionController resumeSession(UserRequest ureq) {
Date requestTimestamp = ureq.getRequestTimestamp();
final NotificationRecorder notificationRecorder = new NotificationRecorder(NotificationLevel.INFO);
TestSessionController controller = createTestSessionController(notificationRecorder);
if (!controller.getTestSessionState().isEnded() && !controller.getTestSessionState().isExited()) {
controller.unsuspendTestSession(requestTimestamp);
TestSessionState testSessionState = controller.getTestSessionState();
TestPlanNodeKey currentItemKey = testSessionState.getCurrentItemKey();
if (currentItemKey != null) {
TestPlanNode currentItemNode = testSessionState.getTestPlan().getNode(currentItemKey);
ItemProcessingContext itemProcessingContext = controller.getItemProcessingContext(currentItemNode);
ItemSessionState itemSessionState = itemProcessingContext.getItemSessionState();
if (itemProcessingContext instanceof ItemSessionController && itemSessionState.isSuspended()) {
ItemSessionController itemSessionController = (ItemSessionController) itemProcessingContext;
itemSessionController.unsuspendItemSession(requestTimestamp);
}
}
}
return controller;
}
use of uk.ac.ed.ph.jqtiplus.running.TestSessionController in project OpenOLAT by OpenOLAT.
the class AssessmentTestDisplayController method createTestSessionController.
public TestSessionController createTestSessionController(TestSessionState testSessionState, NotificationRecorder notificationRecorder) {
/* Try to resolve the underlying JQTI+ object */
final TestProcessingMap testProcessingMap = getTestProcessingMap();
if (testProcessingMap == null) {
return null;
}
/* Create config for TestSessionController */
final TestSessionControllerSettings testSessionControllerSettings = new TestSessionControllerSettings();
testSessionControllerSettings.setTemplateProcessingLimit(computeTemplateProcessingLimit());
/* Create controller and wire up notification recorder (if passed) */
final TestSessionController result = new TestSessionController(qtiService.jqtiExtensionManager(), testSessionControllerSettings, testProcessingMap, testSessionState);
if (notificationRecorder != null) {
result.addNotificationListener(notificationRecorder);
}
return result;
}
use of uk.ac.ed.ph.jqtiplus.running.TestSessionController in project OpenOLAT by OpenOLAT.
the class AssessmentTestComponentRenderer method render.
@Override
public void render(Renderer renderer, StringOutput sb, Component source, URLBuilder ubu, Translator translator, RenderResult renderResult, String[] args) {
AssessmentTestComponent cmp = (AssessmentTestComponent) source;
TestSessionController testSessionController = cmp.getTestSessionController();
if (testSessionController.getTestSessionState().isEnded()) {
renderTerminated(sb, translator);
} else {
/* Create appropriate options that link back to this controller */
TestSessionState testSessionState = testSessionController.getTestSessionState();
CandidateSessionContext candidateSessionContext = cmp.getCandidateSessionContext();
final AssessmentTestSession candidateSession = candidateSessionContext.getCandidateSession();
if (candidateSession.isExploded()) {
renderExploded(sb, translator);
} else if (candidateSessionContext.isTerminated()) {
renderTerminated(sb, translator);
} else {
/* Touch the session's duration state if appropriate */
if (testSessionState.isEntered() && !testSessionState.isEnded()) {
final Date timestamp = candidateSessionContext.getCurrentRequestTimestamp();
testSessionController.touchDurations(timestamp);
}
/* Render event */
AssessmentRenderer renderHints = new AssessmentRenderer(renderer);
renderTestEvent(testSessionController, renderHints, sb, cmp, ubu, translator);
}
}
}
Aggregations