/** * Save session metadata. * * @param array $metaData Meta data array to be saved. * @param RouteItem $routeItem item for which data will be saved * @param string $assessmentSectionId section id for which data will be saved * Example: * array( * 'TEST' => array('TEST_EXIT_CODE' => 'IC'), * 'SECTION' => array('SECTION_EXIT_CODE' => 701), * ) */ public function save(array $metaData, RouteItem $routeItem = null, $assessmentSectionId = null) { $testUri = $this->session->getTest()->getUri(); $resultServer = \taoResultServer_models_classes_ResultServerStateFull::singleton(); foreach ($metaData as $type => $data) { foreach ($data as $key => $value) { $metaVariable = $this->getVariable($key, $value); if (strcasecmp($type, 'ITEM') === 0) { if ($routeItem === null) { $itemRef = $this->session->getCurrentAssessmentItemRef(); $occurence = $this->session->getCurrentAssessmentItemRefOccurence(); } else { $itemRef = $routeItem->getAssessmentItemRef(); $occurence = $routeItem->getOccurence(); } $itemUri = $this->getItemUri($itemRef); $sessionId = $this->session->getSessionId(); $transmissionId = "{$sessionId}.{$itemRef}.{$occurence}"; $resultServer->storeItemVariable($testUri, $itemUri, $metaVariable, $transmissionId); } elseif (strcasecmp($type, 'TEST') === 0) { $resultServer->storeTestVariable($testUri, $metaVariable, $this->session->getSessionId()); } elseif (strcasecmp($type, 'SECTION') === 0) { //suffix section variables with _{SECTION_IDENTIFIER} if ($assessmentSectionId === null) { $assessmentSectionId = $this->session->getCurrentAssessmentSection()->getIdentifier(); } $metaVariable->setIdentifier($key . '_' . $assessmentSectionId); $resultServer->storeTestVariable($testUri, $metaVariable, $this->session->getSessionId()); } } } }
/** * Persist the binary stream $stream which contains the binary equivalent of $assessmentTestSession in * the temporary directory of the file system. * * @param \qtism\runtime\tests\AssessmentTestSession $assessmentTestSession The AssessmentTestSession to be persisted. * @param \qtism\common\storage\MemoryStream $stream The MemoryStream to be stored in the temporary directory of the host file system. * @throws \RuntimeException If the binary stream cannot be persisted. */ protected function persistStream(AssessmentTestSession $assessmentTestSession, MemoryStream $stream) { $sessionId = $assessmentTestSession->getSessionId(); $path = sys_get_temp_dir() . DIRECTORY_SEPARATOR . md5($sessionId) . '.bin'; $written = @file_put_contents($path, $stream->getBinary()); if ($written === false || $written === 0) { $msg = "An error occured while persisting the binary stream at '{$path}'."; throw new RuntimeException($msg); } }
/** * Gets a call identifier for a particular item in the test * @param AssessmentTestSession $session * @param string|Jump|RouteItem $itemPosition * @return null|string */ public static function getItemCallId(AssessmentTestSession $session, $itemPosition) { $sessionId = $session->getSessionId(); $transmissionId = null; $routeItem = null; if ($itemPosition && is_object($itemPosition)) { if ($itemPosition instanceof RouteItem) { $routeItem = $itemPosition; } else { if ($itemPosition instanceof Jump) { $routeItem = $itemPosition->getTarget(); } } } else { $jumps = $session->getPossibleJumps(); foreach ($jumps as $jump) { if ($itemPosition == $jump->getPosition()) { $routeItem = $jump->getTarget(); break; } } } if ($routeItem) { $itemRef = $routeItem->getAssessmentItemRef(); $occurrence = $routeItem->getOccurence(); $transmissionId = "{$sessionId}.{$itemRef}.{$occurrence}"; } return $transmissionId; }
protected function persistStream(AssessmentTestSession $assessmentTestSession, MemoryStream $stream) { $storageService = tao_models_classes_service_StateStorage::singleton(); $userUri = common_session_SessionManager::getSession()->getUserUri(); if (is_null($userUri) === true) { $msg = "Could not retrieve current user URI."; throw new StorageException($msg, StorageException::RETRIEVAL); } $data = $this->getLastError() . $stream->getBinary(); $storageService->set($userUri, $assessmentTestSession->getSessionId(), $data); }
/** * @param AssessmentTestSession $session * @return \taoDelivery_models_classes_execution_DeliveryExecution */ private function getDeliveryExecution(AssessmentTestSession $session) { return $this->deliveryExecutionService->getDeliveryExecution($session->getSessionId()); }
/** * Build the URL to be called to perform a given action on the Test Runner controller. * * @param AssessmentTestSession $session An AssessmentTestSession object. * @param string $action The action name e.g. 'moveForward', 'moveBackward', 'skip', ... * @param string $qtiTestDefinitionUri The URI of a reference to an Assessment Test definition in the knowledge base. * @param string $qtiTestCompilationUri The Uri of a reference to an Assessment Test compilation in the knowledge base. * @param string $standalone * @return string A URL to be called to perform an action. */ public static function buildActionCallUrl(AssessmentTestSession $session, $action, $qtiTestDefinitionUri, $qtiTestCompilationUri, $standalone) { $url = BASE_URL . "TestRunner/{$action}"; $url .= '?QtiTestDefinition=' . urlencode($qtiTestDefinitionUri); $url .= '&QtiTestCompilation=' . urlencode($qtiTestCompilationUri); $url .= '&standalone=' . urlencode($standalone); $url .= '&serviceCallId=' . urlencode($session->getSessionId()); return $url; }
/** * @param AssessmentTestSession $session */ public function persist(AssessmentTestSession $session) { $sessionId = $session->getSessionId(); $storage = $this->cache[$sessionId]['storage']; $storage->persist($session); }
/** * Gets the item reference for a particular item in the test * * @param AssessmentTestSession $session * @param string|Jump|RouteItem $itemPosition * @return null|string */ public static function getItemRef(AssessmentTestSession $session, $itemPosition) { $sessionId = $session->getSessionId(); $itemRef = null; $routeItem = null; if ($itemPosition && is_object($itemPosition)) { if ($itemPosition instanceof RouteItem) { $routeItem = $itemPosition; } else { if ($itemPosition instanceof Jump) { $routeItem = $itemPosition->getTarget(); } } } else { $jumps = $session->getPossibleJumps(); foreach ($jumps as $jump) { if ($itemPosition == $jump->getPosition()) { $routeItem = $jump->getTarget(); break; } } } if ($routeItem) { $itemRef = (string) $routeItem->getAssessmentItemRef(); } return $itemRef; }