/** * Wraps the given {@link ItemSessionState} in a {@link ItemSessionController}. * * <p>It is assumed that the item was runnable, so this will never return null. */ public ItemSessionController createItemSessionController( final CandidateSession candidateSession, final ItemSessionState itemSessionState, final NotificationRecorder notificationRecorder) { final User candidate = candidateSession.getCandidate(); final Delivery delivery = candidateSession.getDelivery(); ensureItemDelivery(delivery); Assert.notNull(itemSessionState, "itemSessionState"); /* Try to resolve the underlying JQTI+ object */ final AssessmentPackage assessmentPackage = assessmentDataService.ensureSelectedAssessmentPackage(delivery); final ItemProcessingMap itemProcessingMap = assessmentObjectManagementService.getItemProcessingMap(assessmentPackage); if (itemProcessingMap == null) { throw new QtiWorksLogicException("Expected this item to be runnable"); } /* Create config for ItemSessionController */ final ItemDeliverySettings itemDeliverySettings = (ItemDeliverySettings) assessmentDataService.getEffectiveDeliverySettings(candidate, delivery); final ItemSessionControllerSettings itemSessionControllerSettings = new ItemSessionControllerSettings(); itemSessionControllerSettings.setTemplateProcessingLimit( computeTemplateProcessingLimit(itemDeliverySettings)); itemSessionControllerSettings.setMaxAttempts(itemDeliverySettings.getMaxAttempts()); /* Create controller and wire up notification recorder (if passed) */ final ItemSessionController result = new ItemSessionController( jqtiExtensionManager, itemSessionControllerSettings, itemProcessingMap, itemSessionState); if (notificationRecorder != null) { result.addNotificationListener(notificationRecorder); } return result; }
/** * Attempts to create a fresh {@link ItemSessionState} wrapped into a {@link * ItemSessionController} for the given {@link Delivery}. * * <p>This will return null if the item can't be started because its {@link ItemProcessingMap} * can't be created, e.g. if its XML can't be parsed. * * @param delivery * @param notificationRecorder * @return */ public ItemSessionController createNewItemSessionStateAndController( final User candidate, final Delivery delivery, final NotificationRecorder notificationRecorder) { ensureItemDelivery(delivery); /* Resolve the underlying JQTI+ object */ final AssessmentPackage assessmentPackage = assessmentDataService.ensureSelectedAssessmentPackage(delivery); final ItemProcessingMap itemProcessingMap = assessmentObjectManagementService.getItemProcessingMap(assessmentPackage); if (itemProcessingMap == null) { return null; } /* Create fresh state for session */ final ItemSessionState itemSessionState = new ItemSessionState(); /* Create config for ItemSessionController */ final ItemDeliverySettings itemDeliverySettings = (ItemDeliverySettings) assessmentDataService.getEffectiveDeliverySettings(candidate, delivery); final ItemSessionControllerSettings itemSessionControllerSettings = new ItemSessionControllerSettings(); itemSessionControllerSettings.setTemplateProcessingLimit( computeTemplateProcessingLimit(itemDeliverySettings)); itemSessionControllerSettings.setMaxAttempts(itemDeliverySettings.getMaxAttempts()); /* Create controller and wire up notification recorder */ final ItemSessionController result = new ItemSessionController( jqtiExtensionManager, itemSessionControllerSettings, itemProcessingMap, itemSessionState); if (notificationRecorder != null) { result.addNotificationListener(notificationRecorder); } return result; }