/**
  * 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;
 }