/** * Register all needed information about the AssessmentSection involved in a given * $routeItem. * * @param \qtism\runtime\tests\RouteItem $routeItem A RouteItem object. */ protected function registerAssessmentSection(RouteItem $routeItem) { foreach ($routeItem->getAssessmentSections() as $assessmentSection) { if (isset($this->assessmentSectionMap[$assessmentSection]) === false) { $this->assessmentSectionMap[$assessmentSection] = array(); } $target = $this->assessmentSectionMap[$assessmentSection]; $target[] = $routeItem; $this->assessmentSectionMap[$assessmentSection] = $target; // Register the RouteItem in the assessmentSectionIdentifierMap. $id = $assessmentSection->getIdentifier(); if (isset($this->assessmentSectionIdentifierMap[$id]) === false) { $assessmentSectionIdentifierMap[$id] = array(); } $this->assessmentSectionIdentifierMap[$id][] = $routeItem; } }
/** * Write a route item in the current binary stream. * * @param AssessmentTestSeeker $seeker An AssessmentTestSeeker object in order to know tree position for involved QTI Components. * @param RouteItem $routeItem A RouteItem object. * @throws QtiBinaryStreamAccessException */ public function writeRouteItem(AssessmentTestSeeker $seeker, RouteItem $routeItem) { try { $this->writeTinyInt($routeItem->getOccurence()); $this->writeShort($seeker->seekPosition($routeItem->getAssessmentItemRef())); if (QtiBinaryConstants::QTI_BINARY_STORAGE_VERSION <= 2) { // Prior to version 3, only a single assessmentSection might be bound // to the RouteItem. $this->writeShort($seeker->seekPosition($routeItem->getAssessmentSection())); } $this->writeShort($seeker->seekPosition($routeItem->getTestPart())); if (QtiBinaryConstants::QTI_BINARY_STORAGE_VERSION >= 3) { $assessmentSections = $routeItem->getAssessmentSections(); // From version 3, multiple assessmentSections might be bound // to the RouteItem. $this->writeTinyInt(count($assessmentSections)); foreach ($assessmentSections as $assessmentSection) { $this->writeShort($seeker->seekPosition($assessmentSection)); } } $branchRules = $routeItem->getBranchRules(); $this->writeTinyInt(count($branchRules)); foreach ($branchRules as $branchRule) { $this->writeShort($seeker->seekPosition($branchRule)); } $preConditions = $routeItem->getPreConditions(); $this->writeTinyInt(count($preConditions)); foreach ($preConditions as $preCondition) { $this->writeShort($seeker->seekPosition($preCondition)); } } catch (BinaryStreamAccessException $e) { $msg = "An error occured while writing a route item."; throw new QtiBinaryStreamAccessException($msg, $this, QtiBinaryStreamAccessException::ROUTE_ITEM, $e); } catch (OutOfBoundsException $e) { $msg = "A QTI Component position was not found in the assessmentTest tree structure."; throw new QtiBinaryStreamAccessException($msg, $this, QtiBinaryStreamAccessException::ROUTE_ITEM, $e); } }
/** * Gets the tags describing a particular item with an assessment test * @param RouteItem $routeItem * @return array */ public function getItemTags(RouteItem $routeItem) { $test = $routeItem->getAssessmentTest(); $testPart = $routeItem->getTestPart(); $sections = $routeItem->getAssessmentSections(); $sectionId = key(current($sections)); $itemRef = $routeItem->getAssessmentItemRef(); $itemId = $itemRef->getIdentifier(); $occurrence = $routeItem->getOccurence(); $tags = [$itemId, $itemId . '#' . $occurrence, $sectionId, $testPart->getIdentifier(), $test->getIdentifier(), $itemRef->getHref()]; if ($this->isRunning() === true) { $tags[] = $this->getItemAttemptTag($routeItem); } return $tags; }
/** * Write a route item in the current binary stream. * * @param \qtism\runtime\storage\common\AssessmentTestSeeker $seeker An AssessmentTestSeeker object in order to know tree position for involved QTI Components. * @param \qtism\runtime\tests\RouteItem $routeItem A RouteItem object. * @throws \qtism\runtime\storage\binary\QtiBinaryStreamAccessException */ public function writeRouteItem(AssessmentTestSeeker $seeker, RouteItem $routeItem) { try { $this->writeTinyInt($routeItem->getOccurence()); $this->writeShort($seeker->seekPosition($routeItem->getAssessmentItemRef())); $this->writeShort($seeker->seekPosition($routeItem->getTestPart())); $assessmentSections = $routeItem->getAssessmentSections(); $this->writeTinyInt(count($assessmentSections)); foreach ($assessmentSections as $assessmentSection) { $this->writeShort($seeker->seekPosition($assessmentSection)); } $branchRules = $routeItem->getBranchRules(); $this->writeTinyInt(count($branchRules)); foreach ($branchRules as $branchRule) { $this->writeShort($seeker->seekPosition($branchRule)); } $preConditions = $routeItem->getPreConditions(); $this->writeTinyInt(count($preConditions)); foreach ($preConditions as $preCondition) { $this->writeShort($seeker->seekPosition($preCondition)); } } catch (BinaryStreamAccessException $e) { $msg = "An error occured while writing a route item."; throw new QtiBinaryStreamAccessException($msg, $this, QtiBinaryStreamAccessException::ROUTE_ITEM, $e); } catch (OutOfBoundsException $e) { $msg = "A QTI Component position was not found in the assessmentTest tree structure."; throw new QtiBinaryStreamAccessException($msg, $this, QtiBinaryStreamAccessException::ROUTE_ITEM, $e); } }