public function testDeepCloneTriplesFile() { /** @var \core_kernel_versioning_Repository $repository */ $repository = \tao_models_classes_FileSourceService::singleton()->addLocalSource("repository test", \tao_helpers_File::createTempDir()); //see if clone item content works /** @var \core_kernel_versioning_File $file */ $file = $repository->spawnFile(__DIR__ . '/sample/test.xml', "test", function ($originalName) { return md5($originalName); }); //see if clone file works $rdfsTriple = new \core_kernel_classes_Triple(); $rdfsTriple->predicate = "http://www.w3.org/1999/02/22-rdf-syntax-ns#value"; $rdfsTriple->object = $file->getUri(); $return = CloneHelper::deepCloneTriples(array($rdfsTriple)); $this->assertCount(1, $return); $this->assertEquals($rdfsTriple->predicate, $return[0]->predicate); $this->assertNotEquals($rdfsTriple->object, $return[0]->object); $fileCopy = new \core_kernel_file_File($return[0]->object); $this->assertFileExists($fileCopy->getAbsolutePath()); $this->assertEquals($file->getLabel(), $fileCopy->getLabel()); $this->assertNotEquals($file->getAbsolutePath(), $fileCopy->getAbsolutePath()); $file->delete(true); $fileCopy->delete(true); $repository->delete(true); }
public function getStrings($values) { $contentStrings = array(); $xmlTokenizer = new taoItems_models_classes_search_XmlItemContentTokenizer(); foreach ($values as $valueUri) { $file = new core_kernel_file_File($valueUri); try { $content = file_get_contents($file->getAbsolutePath()); if ($content === false) { common_Logger::w('File ' . $file->getAbsolutePath() . ' not found for item'); } else { // Try to make it a DOM Document... $dom = new DOMDocument('1.0', 'UTF-8'); if (@$dom->loadXML($content) === true) { $contentStrings = array_merge($contentStrings, $xmlTokenizer->getStrings($dom)); unset($dom); } else { common_Logger::d('Skipped non XML content for ' . $file->getUri()); } } } catch (common_Exception $exc) { common_Logger::w('Invalid file ' . $valueUri . ' for ItemContentTokenizer: ' . $exc->getMessage()); } } return $contentStrings; }
public function run() { common_ext_ExtensionsManager::singleton()->getExtensionById('taoTests'); common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $ds = DIRECTORY_SEPARATOR; // 1. Find all the tests that have the QTI Test Model. $testClass = new core_kernel_classes_Class(TAO_TEST_CLASS); $qtiTests = $testClass->searchInstances(array(PROPERTY_TEST_TESTMODEL => INSTANCE_TEST_MODEL_QTI), array('recursive' => true, 'like' => false)); // 2. Find the test definition file for each test. $testContentProp = new core_kernel_classes_Property(TEST_TESTCONTENT_PROP); foreach ($qtiTests as $qtiTest) { $testContentResource = $qtiTest->getOnePropertyValue($testContentProp); $testContent = new core_kernel_file_File($testContentResource); $qtiTestFilePath = $testContent->getAbsolutePath(); $this->out("test.xml file found at '{$qtiTestFilePath}'."); // 2.1. Create a directory using the current file name. $pathinfo = pathinfo($qtiTestFilePath); $targetDirPath = $pathinfo['dirname'] . $ds . $pathinfo['filename']; if (!@mkdir($targetDirPath)) { $this->err("Unable to create QTI Test Content directory at location '{$targetDirPath}'."); } else { $this->out("QTI Test Content directory created at location '{$targetDirPath}'."); } // 2.2 Copy test.xml into the newly created directory. $qtiTestFileCopyDest = $targetDirPath . $ds . 'tao-qtitest-testdefinition.xml'; if (!@copy($qtiTestFilePath, $qtiTestFileCopyDest)) { $this->err("Unable to copy test.xml file from '{$qtiTestFilePath}' to '{$qtiTestFileCopyDest}'."); } else { $this->out("test.xml file copied from '{$qtiTestFilePath}' to '{$qtiTestFileCopyDest}'."); } // 2.3 Update metadata in Knowledge Base. $newFileResource = $testContent->getFileSystem()->createFile('', basename($targetDirPath)); $this->out("New File Resource in ontology refers to '" . $newFileResource->getAbsolutePath() . "'."); $qtiTest->removePropertyValues($testContentProp); $qtiTest->setPropertyValue($testContentProp, $newFileResource); $testContentResource->delete(true); if (!@unlink($qtiTestFilePath)) { $this->err("Unable to remove old test.xml file located at '{$qtiTestFilePath}'."); } else { $this->out("Old test.xml file located at '{$qtiTestFilePath}' removed from file system."); } } }
public function testIsFile() { $clazz = new core_kernel_classes_Class(CLASS_GENERIS_FILE); $instance = $clazz->createInstance('toto.txt', 'toto'); $fileNameProp = new core_kernel_classes_Property(PROPERTY_FILE_FILENAME); $instance->setPropertyValue($fileNameProp, 'file://toto.txt'); $this->assertTrue(core_kernel_file_File::isFile($instance)); $this->assertFalse(core_kernel_file_File::isFile($clazz)); $instance->delete(); }
/** * Short description of method render * * @access public * @author Joel Bout, <*****@*****.**> * @return string */ public function render() { if (!empty($this->value)) { if (common_Utils::isUri($this->value)) { $file = new core_kernel_file_File($this->value); if ($file->fileExists()) { $fileInfo = $file->getFileInfo(); $fileInfo->getFilename(); } else { $file->delete(); } } } $returnValue = $this->renderLabel(); $returnValue .= "<input type='hidden' name='MAX_FILE_SIZE' value='" . tao_helpers_form_elements_File::MAX_FILE_SIZE . "' />"; $returnValue .= "<input type='file' name='{$this->name}' id='{$this->name}' "; $returnValue .= $this->renderAttributes(); $returnValue .= " value='{$this->value}' />"; return (string) $returnValue; }
public function getStrings($values) { $contentStrings = array(); $xmlTokenizer = new taoItems_models_classes_search_XmlItemContentTokenizer(); $rawTokenizer = new RawValue(); foreach ($values as $valueUri) { $file = new core_kernel_file_File($valueUri); $content = file_get_contents($file->getAbsolutePath()); if ($content === false) { common_Logger::w('File ' . $file->getAbsolutePath() . ' not found for fileressource ' . $itemContent->getUri()); } else { // Try to make it a DOM Document... $dom = new DOMDocument('1.0', 'UTF-8'); if (@$dom->loadXML($content) === true) { $contentStrings = array_merge($contentStrings, $xmlTokenizer->getStrings($dom)); unset($dom); } else { $contentStrings = array_merge($contentStrings, $rawTokenizer->getStrings($content)); } } } return $contentStrings; }
public function getPropertyFileInfo() { $data = array('name' => __('(empty)')); if ($this->hasRequestParameter('uri') && $this->hasRequestParameter('propertyUri')) { $uri = tao_helpers_Uri::decode($this->getRequestParameter('uri')); $propertyUri = tao_helpers_Uri::decode($this->getRequestParameter('propertyUri')); $instance = new core_kernel_classes_Resource($uri); $file = $instance->getOnePropertyValue(new core_kernel_classes_Property($propertyUri)); if (!is_null($file) && $file instanceof core_kernel_classes_Resource && core_kernel_file_File::isFile($file)) { $data = $this->getFileInfo($file->getUri()); } } echo json_encode($data); }
/** * Set the directory where the tests' contents are stored. * @param core_kernel_file_File $folder */ public function setQtiTestDirectory(core_kernel_file_File $folder) { $ext = common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $ext->setConfig(self::CONFIG_QTITEST_FOLDER, $folder->getUri()); }
/** * Get the expected absolute path to a given $qtiResource that is already stored in TAO. * * @param core_kernel_file_File|string $testContent The pointer to the TAO Test Content folder. * @param oat\taoQtiItem\model\qti\Resource|string $qtiTestResource The QTI resource to be copied into $testContent. If given as a string, it must be the relative (to the TAO Content Folder) path to the resource file. * @throws InvalidArgumentException If one of the above arguments is invalid. * @return string The absolute path to $qtiResource. */ public static function storedQtiResourcePath($testContent, $qtiResource) { if ($testContent instanceof core_kernel_file_File) { $contentPath = $testContent->getAbsolutePath(); } else { if (is_string($testContent) === true) { $contentPath = $testContent; } else { throw new InvalidArgumentException("The 'testContent' argument must be a string or a taoQTI_models_classes_QTI_Resource object."); } } if ($qtiResource instanceof taoQti_models_classes_QTI_Resource) { $filePath = $qtiResource->getFile(); } else { if (is_string($qtiResource) === true) { $filePath = $qtiResource; } else { throw new InvalidArgumentException("The 'qtiResource' argument must be a string or a taoQTI_models_classes_QTI_Resource object."); } } $ds = DIRECTORY_SEPARATOR; $filePath = ltrim($filePath, '/'); $contentPath = rtrim($contentPath, $ds); return $contentPath . $ds . str_replace('/', $ds, $filePath); }
protected function createNamedSubDirectory(core_kernel_file_File $rootDirectory, $activity) { $name = md5($activity->getUri()); $relPath = $rootDirectory->getRelativePath() . DIRECTORY_SEPARATOR . $name; $absPath = $rootDirectory->getAbsolutePath() . DIRECTORY_SEPARATOR . $name; if (!is_dir($absPath) && !mkdir($absPath)) { throw new taoItems_models_classes_CompilationFailedException("Could not create sub-directory '{$absPath}'."); } return $rootDirectory->getFileSystem()->createFile('', $relPath); }
/** * Delete the file from the file system. * If the versioned file is in conflict solve the problem * and delete it. * * @access public * @author Lionel Lecaque, <*****@*****.**> * @param boolean deleteReference * @return boolean */ public function delete($deleteReference = false) { $returnValue = (bool) false; if ($this->fileExists()) { $filePath = $this->getAbsolutePath(); //check if the file is up to date /** * @todo this code won't work in shell implentation */ //If the file has yet been deleted remotly => udpate it if ($this->getStatus() == VERSIONING_FILE_STATUS_REMOTELY_DELETED) { $returnValue = $this->update(); /** * @todo check the file is now well deleted locally */ } else { //check if the resource is versioned before the delete $isVersioned = $this->isVersioned(); //if in conflict solve before the problem by using our version of the file if ($this->isInConflict()) { $this->resolve(VERSIONING_FILE_VERSION_MINE); } //delete the svn resource $returnValue = core_kernel_versioning_FileProxy::singleton()->delete($this, $filePath, true); //commit the svn delete if ($returnValue && $isVersioned) { //delete the svn resource $returnValue = $this->commit(__('delete the file') . ' ' . $filePath, is_dir($filePath)); } } } else { $returnValue = true; } //delete the tao resource $returnValue &= parent::delete($deleteReference); return (bool) $returnValue; }
/** * Short description of method getItemFolder * * @access public * @author Joel Bout, <*****@*****.**> * @param Resource item * @param string lang * @return string */ public function getItemFolder(core_kernel_classes_Resource $item, $lang = '') { $returnValue = (string) ''; if ($lang === '') { $files = $item->getPropertyValues(new core_kernel_classes_Property(TAO_ITEM_CONTENT_PROPERTY)); } else { $files = $item->getPropertyValuesByLg(new core_kernel_classes_Property(TAO_ITEM_CONTENT_PROPERTY), $lang)->toArray(); } if (count($files) == 0) { // no content found assign default $returnValue = $this->getDefaultItemFolder($item, $lang); } else { if (count($files) > 1) { throw new common_Exception(__METHOD__ . ': Item ' . $item->getUri() . ' has multiple.'); } $content = new core_kernel_file_File(current($files)); $returnValue = dirname($content->getAbsolutePath()) . DIRECTORY_SEPARATOR; } return (string) $returnValue; }
/** * Get the absolute path of the language specific compilation folder for this item to be compiled. * * @param core_kernel_file_File $destinationDirectory * @param string $compilationLanguage A language tag. * @return string The absolute path to the language specific compilation folder for this item to be compiled. */ protected function getLanguageCompilationPath($destinationDirectory, $compilationLanguage) { return $destinationDirectory->getPath() . DIRECTORY_SEPARATOR . $compilationLanguage . DIRECTORY_SEPARATOR; }
/** * Short description of method revert * * @access public * @author Cédric Alfonsi, <*****@*****.**> * @param File resource * @param int revision * @param string msg * @return boolean * @see core_kernel_versioning_File::revert() */ public function revert(core_kernel_file_File $resource, $revision = null, $msg = "") { $returnValue = (bool) false; /** * @todo make all the functions coherent * Sometimes u pass a path sometimes not, the resource is enough * if we use just the resource, the only way to use svn will be to use generis ... so ... 6 */ $path = $resource->getAbsolutePath(); try { $returnValue = core_kernel_versioning_subversionWindows_Utils::exec($resource, 'revert "' . $path . '"'); } catch (Exception $e) { die('Error code `svn_error_revert` in ' . $e->getMessage()); } return (bool) $returnValue; }
/** * Short description of method delete * * @access public * @author Cédric Alfonsi, <*****@*****.**> * @param File resource * @param string path * @return boolean * @see core_kernel_versioning_File::delete() */ public function delete(core_kernel_file_File $resource, $path) { $returnValue = (bool) false; //update before delete, else we get an out of date exception $resource->update(); //and delete $delegate = $this->getImplementationToDelegateTo($resource); $returnValue = $delegate->delete($resource, $path); return (bool) $returnValue; }
/** * (non-PHPdoc) * @see \oat\taoMediaManager\model\fileManagement\FileManagement::deleteFile() */ public function deleteFile($link) { $file = new \core_kernel_file_File($link); unlink($file->getAbsolutePath()); return $file->delete(); }
/** * Retrieve file's status * * @access public * @author Cédric Alfonsi, <*****@*****.**> * @param File resource * @param string path * @param array options * @return int */ public function getStatus(core_kernel_file_File $resource, $path, $options = array()) { $returnValue = (int) 0; $startTime = helpers_Time::getMicroTime(); if ($resource->getRepository()->authenticate()) { //Status of the target $status = null; //Get a list of statuses $svnStatusOptions = SVN_NON_RECURSIVE; if ($options['SHOW_UPDATES']) { $svnStatusOptions = $svnStatusOptions | SVN_SHOW_UPDATES; } $statuses = @svn_status($path, $svnStatusOptions); // * An explanation could be that the file is in a non working copy directory, it occured when we create a folders structure if ($statuses !== false) { //Extract required status foreach ($statuses as $s) { if ($s['path'] == $path) { $status = $s; } } // If the file has a status, check the status is not unversioned or added if (!is_null($status)) { if ($status['locked']) { $returnValue = VERSIONING_FILE_STATUS_LOCKED; } else { if ($status['repos_text_status'] == VERSIONING_FILE_STATUS_DELETED) { $returnValue = VERSIONING_FILE_STATUS_REMOTELY_DELETED; } else { if ($status['repos_text_status'] == VERSIONING_FILE_STATUS_MODIFIED) { $returnValue = VERSIONING_FILE_STATUS_REMOTELY_MODIFIED; } else { $returnValue = $status['text_status']; } } } } else { if (!file_exists($path)) { $returnValue = VERSIONING_FILE_STATUS_UNVERSIONED; } else { $returnValue = VERSIONING_FILE_STATUS_NORMAL; } } } else { $returnValue = VERSIONING_FILE_STATUS_UNVERSIONED; } } $endTime = helpers_Time::getMicroTime(); common_Logger::i("svn_getStatus ('.{$path}.') '.{$returnValue}.' -> " . ($endTime - $startTime) . 's'); return (int) $returnValue; }
/** * (non-PHPdoc) * @see \oat\taoMediaManager\model\fileManagement\FileManagement::deleteFile() */ public function deleteFile($link) { unlink($this->getLocalPath($link)); $file = new \core_kernel_file_File($link); return $file->delete(); }
/** * * @param string $initialVersion * @return string $versionUpdatedTo */ public function update($initialVersion) { $currentVersion = $initialVersion; // add testrunner config if ($currentVersion == '2.6') { \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->setConfig('testRunner', array('progress-indicator' => 'percentage', 'timerWarning' => array('assessmentItemRef' => null, 'assessmentSection' => 300, 'testPart' => null))); $currentVersion = '2.6.1'; } if ($currentVersion == '2.6.1') { $config = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->getConfig('testRunner'); $config['exitButton'] = false; \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->setConfig('testRunner', $config); $currentVersion = '2.6.2'; } // add testrunner review screen config if ($currentVersion == '2.6.2') { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $extension->setConfig('testRunner', array_merge($config, array('test-taker-review' => false, 'test-taker-review-region' => 'left', 'test-taker-review-section-only' => false, 'test-taker-review-prevents-unseen' => true))); $currentVersion = '2.6.3'; } // adjust testrunner config if ($currentVersion == '2.6.3') { $defaultConfig = array('timerWarning' => array('assessmentItemRef' => null, 'assessmentSection' => null, 'testPart' => null), 'progress-indicator' => 'percentage', 'progress-indicator-scope' => 'testSection', 'test-taker-review' => false, 'test-taker-review-region' => 'left', 'test-taker-review-section-only' => false, 'test-taker-review-prevents-unseen' => true, 'exitButton' => false); $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); foreach ($defaultConfig as $key => $value) { if (!isset($config[$key])) { $config[$key] = $value; } } $extension->setConfig('testRunner', $config); $currentVersion = '2.6.4'; } if ($currentVersion == '2.6.4') { $currentVersion = '2.7.0'; } // add markForReview button if ($currentVersion === '2.7.0') { $registry = TestRunnerClientConfigRegistry::getRegistry(); $registry->registerQtiTools('markForReview', array('label' => 'Mark for review', 'icon' => 'anchor', 'hook' => 'taoQtiTest/testRunner/actionBar/markForReview')); $currentVersion = '2.8.0'; } // adjust testrunner config: set the review scope if ($currentVersion == '2.8.0') { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['test-taker-review-scope'] = 'test'; unset($config['test-taker-review-section-only']); $extension->setConfig('testRunner', $config); $currentVersion = '2.9.0'; } // add show/hide button // adjust testrunner config: set the "can collapse" option if ($currentVersion == '2.9.0') { $registry = TestRunnerClientConfigRegistry::getRegistry(); $registry->registerQtiTools('collapseReview', array('title' => 'Show/Hide the review screen', 'label' => 'Review', 'icon' => 'mobile-menu', 'hook' => 'taoQtiTest/testRunner/actionBar/collapseReview', 'order' => -1)); $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['test-taker-review-can-collapse'] = false; $extension->setConfig('testRunner', $config); $currentVersion = '2.10.0'; } // adjust testrunner config: set the item sequence number options if ($currentVersion == '2.10.0') { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['test-taker-review-force-title'] = false; $config['test-taker-review-item-title'] = 'Item %d'; $extension->setConfig('testRunner', $config); $currentVersion = '2.11.0'; } if ($currentVersion == '2.11.0') { $currentVersion = '2.11.1'; } // adjust testrunner config: set the force progress indicator display if ($currentVersion == '2.11.1') { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['progress-indicator-forced'] = false; $extension->setConfig('testRunner', $config); $currentVersion = '2.12.0'; } // update the test taker review action buttons if ($currentVersion == '2.12.0') { $registry = TestRunnerClientConfigRegistry::getRegistry(); $registry->registerQtiTools('collapseReview', array('hook' => 'taoQtiTest/testRunner/actionBar/collapseReview', 'order' => 'first', 'title' => null, 'label' => null, 'icon' => null)); $registry->registerQtiTools('markForReview', array('hook' => 'taoQtiTest/testRunner/actionBar/markForReview', 'order' => 'last', 'title' => null, 'label' => null, 'icon' => null)); $currentVersion = '2.13.0'; } // adjust testrunner config: set the next section button display if ($currentVersion == '2.13.0') { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['next-section'] = false; $extension->setConfig('testRunner', $config); $currentVersion = '2.14.0'; } if ($currentVersion === '2.14.0') { try { $this->getServiceManager()->get('taoQtiTest/SessionStateService'); } catch (ServiceNotFoundException $e) { $sessionStateService = new SessionStateService(); $sessionStateService->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register('taoQtiTest/SessionStateService', $sessionStateService); } $currentVersion = '2.15.0'; } if ($currentVersion === '2.15.0') { $registry = TestRunnerClientConfigRegistry::getRegistry(); $registry->registerQtiTools('comment', array('hook' => 'taoQtiTest/testRunner/actionBar/comment')); $currentVersion = '2.16.0'; } $this->setVersion($currentVersion); if ($this->isBetween('2.16.0', '2.17.0')) { $proctorRole = new \core_kernel_classes_Resource('http://www.tao.lu/Ontologies/TAO.rdf#DeliveryRole'); $accessService = \funcAcl_models_classes_AccessService::singleton(); $accessService->grantModuleAccess($proctorRole, 'taoQtiTest', 'Runner'); try { $this->getServiceManager()->get(QtiRunnerService::CONFIG_ID); } catch (ServiceNotFoundException $e) { $service = new QtiRunnerService(); $service->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(QtiRunnerService::CONFIG_ID, $service); } $this->setVersion('2.17.0'); } $this->skip('2.17.0', '2.19.1'); if ($this->isVersion('2.19.1')) { // sets default plugin options $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); if (!array_key_exists('plugins', $config)) { $config['plugins'] = null; } $extension->setConfig('testRunner', $config); $this->setVersion('2.20.0'); } $this->skip('2.20.0', '2.21.1'); if ($this->isVersion('2.21.1')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $extension->setConfig('testRunner', array_merge($config, array('csrf-token' => true))); $this->setVersion('2.22.0'); } if ($this->isVersion('2.22.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['timer']['target'] = 'server'; $extension->setConfig('testRunner', $config); $this->setVersion('2.23.0'); } $this->skip('2.23.0', '2.24.0'); if ($this->isVersion('2.24.0')) { $className = \taoQtiTest_helpers_SessionManager::DEFAULT_TEST_SESSION; try { $deliveryConfig = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoDelivery')->getConfig('deliveryServer'); if ($deliveryConfig) { $deliveryContainer = $deliveryConfig->getOption('deliveryContainer'); if (false !== strpos($deliveryContainer, 'DeliveryClientContainer')) { $className = 'oat\\taoQtiTest\\models\\runner\\session\\TestSession'; } } } catch (\common_ext_ExtensionException $e) { } $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['test-session'] = $className; $extension->setConfig('testRunner', $config); $this->setVersion('2.25.0'); } if ($this->isVersion('2.25.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['plugins']['overlay']['full'] = false; $extension->setConfig('testRunner', $config); $this->setVersion('2.26.0'); } $this->skip('2.26.0', '2.27.0'); if ($this->isVersion('2.27.0')) { $serviceExtension = 'taoQtiTest'; $serviceController = 'Runner'; try { $deliveryConfig = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoDelivery')->getConfig('testRunner'); if ($deliveryConfig) { $serviceExtension = $deliveryConfig['serviceExtension']; $serviceController = $deliveryConfig['serviceController']; } } catch (\common_ext_ExtensionException $e) { } $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['bootstrap'] = ['serviceExtension' => $serviceExtension, 'serviceController' => $serviceController, 'communication' => ['enabled' => false, 'type' => 'poll', 'extension' => null, 'controller' => null, 'action' => 'messages', 'service' => null, 'params' => []]]; $extension->setConfig('testRunner', $config); try { $this->getServiceManager()->get(QtiCommunicationService::CONFIG_ID); } catch (ServiceNotFoundException $e) { $service = new QtiCommunicationService(); $service->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(QtiCommunicationService::CONFIG_ID, $service); } $this->setVersion('2.28.0'); } if ($this->isVersion('2.28.0')) { $testRunnerConfig = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->getConfig('testRunner'); if (array_key_exists('timerWarning', $testRunnerConfig)) { foreach ($testRunnerConfig['timerWarning'] as &$value) { if ($value !== null && is_int($value)) { $value = [$value => 'warning']; } } \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->setConfig('testRunner', $testRunnerConfig); } $this->setVersion('2.29.0'); } if ($this->isVersion('2.29.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['bootstrap']['timeout'] = 0; $extension->setConfig('testRunner', $config); $this->setVersion('2.30.0'); } if ($this->isVersion('2.30.0')) { try { $service = $this->getServiceManager()->get(QtiCommunicationService::CONFIG_ID); } catch (ServiceNotFoundException $e) { $service = new QtiCommunicationService(); } $service->setServiceManager($this->getServiceManager()); $service->attachChannel(new TestStateChannel(), QtiCommunicationService::CHANNEL_TYPE_OUTPUT); $this->getServiceManager()->register(QtiCommunicationService::CONFIG_ID, $service); $this->setVersion('2.31.0'); } if ($this->isVersion('2.31.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); if (!isset($config['bootstrap']) || isset($config['bootstrap']['timeout']) && count($config['bootstrap']) == 1) { $config['bootstrap'] = array_merge($config['bootstrap'], ['serviceExtension' => 'taoQtiTest', 'serviceController' => 'Runner', 'communication' => ['enabled' => false, 'type' => 'poll', 'extension' => null, 'controller' => null, 'action' => 'messages', 'service' => null, 'params' => []]]); $extension->setConfig('testRunner', $config); } $this->setVersion('2.31.1'); } $this->skip('2.31.1', '3.0.0'); if ($this->isVersion('3.0.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['enable-allow-skipping'] = false; $extension->setConfig('testRunner', $config); $this->setVersion('3.1.0'); } $this->skip('3.1.0', '3.4.0'); if ($this->isVersion('3.4.0')) { $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $uri = $ext->getConfig(\taoQtiTest_models_classes_QtiTestService::CONFIG_QTITEST_FILESYSTEM); $dir = new \core_kernel_file_File($uri); $fs = $dir->getFileSystem(); \taoQtiTest_models_classes_QtiTestService::singleton()->setQtiTestFileSystem($fs->getUri()); $this->setVersion('4.0.0'); } $this->skip('4.0.0', '4.6.0'); if ($this->isVersion('4.6.0')) { $registry = TestRunnerClientConfigRegistry::getRegistry(); $runnerConfig = $registry->get(TestRunnerClientConfigRegistry::RUNNER); if (isset($runnerConfig['plugins']) && is_array($runnerConfig['plugins'])) { foreach ($runnerConfig['plugins'] as $plugin) { //if the plugin is registered if ($plugin['module'] == 'taoQtiTest/runner/plugins/controls/disableRightClick') { //we migrate the category $registry->removePlugin('taoQtiTest/runner/plugins/controls/disableRightClick', 'controls', null); $registry->registerPlugin('taoQtiTest/runner/plugins/security/disableRightClick', 'security', null); break; } } } $this->setVersion('4.7.0'); } $this->skip('4.7.0', '4.8.2'); if ($this->isVersion('4.8.2')) { //regsiter the core plugins into taoTests $registerCorePlugins = new RegisterTestRunnerPlugins(); $registerCorePlugins([]); $registry = PluginRegistry::getRegistry(); //list the installed plugins $oldRegistry = TestRunnerClientConfigRegistry::getRegistry(); $runnerConfig = $oldRegistry->get(TestRunnerClientConfigRegistry::RUNNER); if (isset($runnerConfig['plugins']) && is_array($runnerConfig['plugins'])) { foreach ($runnerConfig['plugins'] as $plugin) { //if they are not yet in the config, migrate them automatically if (!$registry->isRegistered($plugin['module'])) { $pluginId = basename($plugin['module']); $pluginName = ucfirst(join(preg_split('/(?=[A-Z])/', $pluginId), ' ')); $registry->register(TestPlugin::fromArray(['id' => $pluginId, 'name' => $pluginName, 'module' => $plugin['module'], 'category' => $plugin['category'], 'position' => $plugin['position'], 'active' => true])); } } } //then remove the old config $registry->remove(TestRunnerClientConfigRegistry::RUNNER); $registry->remove(TestRunnerClientConfigRegistry::RUNNER_PROD); $this->setVersion('5.0.0'); } $this->skip('5.0.0', '5.4.0'); if ($this->isVersion('5.4.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['plugins']['collapser'] = ['collapseTools' => true, 'collapseNavigation' => false, 'hover' => false]; $extension->setConfig('testRunner', $config); $this->setVersion('5.5.0'); } $this->skip('5.5.0', '5.5.3'); if ($this->isVersion('5.5.3')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['force-branchrules'] = false; $config['force-preconditions'] = false; $config['path-tracking'] = false; $extension->setConfig('testRunner', $config); $this->setVersion('5.6.0'); } if ($this->isVersion('5.6.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['always-allow-jumps'] = false; $extension->setConfig('testRunner', $config); $this->setVersion('5.7.0'); } $this->skip('5.7.0', '5.8.4'); if ($this->isVersion('5.8.4')) { OntologyUpdater::syncModels(); $testModelService = new TestModelService(array('exportHandlers' => array(new \taoQtiTest_models_classes_export_TestExport(), new \taoQtiTest_models_classes_export_TestExport22()), 'importHandlers' => array(new \taoQtiTest_models_classes_import_TestImport()))); $testModelService->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(TestModelService::SERVICE_ID, $testModelService); $this->setVersion('5.9.0'); } $this->skip('5.9.0', '5.10.2'); if ($this->isVersion('5.10.2')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['check-informational'] = false; $extension->setConfig('testRunner', $config); $this->setVersion('5.11.0'); } if ($this->isVersion('5.11.0')) { $registry = PluginRegistry::getRegistry(); $registry->register(TestPlugin::fromArray(['id' => 'modalFeedback', 'name' => 'QTI modal feedbacks', 'module' => 'taoQtiTest/runner/plugins/content/modalFeedback/modalFeedback', 'description' => 'Display Qti modalFeedback element', 'category' => 'content', 'active' => true, 'tags' => ['core', 'qti', 'required']])); $this->setVersion('5.12.0'); } $this->skip('5.12.0', '5.16.2'); if ($this->isVersion('5.16.2')) { $service = new TestExporter(); $service->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(TestMetadataExporter::SERVICE_ID, $service); $this->setVersion('5.17.0'); } $this->skip('5.17.0', '5.17.3'); if ($this->isVersion('5.17.3')) { \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->setConfig('TestCompiler', array('enable-category-rules-generation' => false)); $categoryRulesService = new TestCategoryRulesService(array('score-variable-identifier' => 'SCORE', 'weight-identifier' => 'WEIGHT', 'category-exclusions' => array('/x-tao-/'), 'flags' => TestCategoryRulesGenerator::COUNT | TestCategoryRulesGenerator::CORRECT | TestCategoryRulesGenerator::SCORE)); $categoryRulesService->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(TestCategoryRulesService::SERVICE_ID, $categoryRulesService); $this->setVersion('5.18.0'); } $this->skip('5.18.0', '5.23.0'); if ($this->isVersion('5.23.0')) { $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $uri = $ext->getConfig(\taoQtiTest_models_classes_QtiTestService::CONFIG_QTITEST_FILESYSTEM); if (!is_string($uri)) { if (is_object($uri) && $uri instanceof \core_kernel_classes_Resource) { \taoQtiTest_models_classes_QtiTestService::singleton()->setQtiTestFileSystem($uri->getUri()); } else { throw new \common_exception_InconsistentData('Invalid qti test storage directory configuration'); } } $this->setVersion('5.23.1'); } $this->skip('5.23.1', '5.25.1'); if ($this->isVersion('5.25.1')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['test-taker-unanswered-items-message'] = true; $extension->setConfig('testRunner', $config); $this->setVersion('5.26.0'); } if ($this->isVersion('5.26.0')) { $registry = PluginRegistry::getRegistry(); $registry->register(TestPlugin::fromArray(['id' => 'documentViewer', 'name' => 'Document Viewer', 'module' => 'taoQtiTest/runner/plugins/tools/documentViewer/documentViewer', 'description' => 'Display a document as requested by an event', 'category' => 'tools', 'active' => false, 'tags' => []])); $this->setVersion('5.27.0'); } if ($this->isVersion('5.27.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['keep-timer-up-to-timeout'] = false; $extension->setConfig('testRunner', $config); $this->setVersion('5.28.0'); } $this->skip('5.28.0', '5.30.1'); if ($this->isVersion('5.30.1')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['allow-shortcuts'] = true; $extension->setConfig('testRunner', $config); $this->setVersion('5.31.0'); } $this->skip('5.31.0', '5.31.1'); if ($this->isVersion('5.31.1')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['shortcuts'] = ['calculator' => ['toggle' => 'C'], 'zoom' => ['in' => 'I', 'out' => 'O'], 'comment' => ['toggle' => 'A'], 'itemThemeSwitcher' => ['toggle' => 'T'], 'review' => ['toggle' => 'R', 'flag' => 'M']]; $extension->setConfig('testRunner', $config); $this->setVersion('5.32.0'); } $this->skip('5.32.0', '5.32.1'); if ($this->isVersion('5.32.1')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['shortcuts']['next'] = ['trigger' => 'J']; $config['shortcuts']['previous'] = ['trigger' => 'K']; $extension->setConfig('testRunner', $config); $this->setVersion('5.33.0'); } if ($this->isVersion('5.33.0')) { $registry = PluginRegistry::getRegistry(); $registry->register(TestPlugin::fromArray(['id' => 'responsesAccess', 'name' => 'Shortcuts to access the item responses', 'module' => 'taoQtiTest/runner/plugins/content/accessibility/responsesAccess', 'description' => 'Provide a way to navigate between item responses using the keyboard', 'category' => 'content', 'active' => true, 'tags' => ['core', 'qti']])); $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['shortcuts']['responsesAccess'] = ['previous' => 'Shift+Tab', 'next' => 'Tab']; $extension->setConfig('testRunner', $config); $this->setVersion('5.34.0'); } $this->skip('5.34.0', '5.36.0'); if ($this->isVersion('5.36.0')) { $registry = PluginRegistry::getRegistry(); $registry->register(TestPlugin::fromArray(['id' => 'highlighter', 'name' => 'Text Highlighter', 'module' => 'taoQtiTest/runner/plugins/tools/highlighter/plugin', 'description' => 'Allows the test taker to highlight text', 'category' => 'tools', 'active' => true, 'tags' => []])); $this->setVersion('5.37.0'); } if ($this->isVersion('5.37.0')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest'); $config = $extension->getConfig('testRunner'); $config['shortcuts']['itemThemeSwitcher'] = ['toggle' => 'T', 'loop' => 'Y', 'select' => 'U']; $extension->setConfig('testRunner', $config); $this->setVersion('5.37.1'); } $this->skip('5.37.1', '5.38.1'); if ($this->isVersion('5.38.1')) { $registry = PluginRegistry::getRegistry(); $registry->register(TestPlugin::fromArray(['id' => 'highlighter', 'name' => 'Text Highlighter', 'module' => 'taoQtiTest/runner/plugins/tools/highlighter/plugin', 'description' => 'Allows the test taker to highlight text', 'category' => 'tools', 'active' => false, 'tags' => []])); $this->setVersion('5.38.2'); } $this->skip('5.38.2', '5.39.1'); }
/** * Clone a QTI Test Resource. * * @param core_kernel_classes_Resource $source The resource to be cloned. * @param core_kernel_classes_Resource $destination An existing resource to be filled as the clone of $source. */ public function cloneContent(core_kernel_classes_Resource $source, core_kernel_classes_Resource $destination) { $contentProperty = new core_kernel_classes_Property(TEST_TESTCONTENT_PROP); $existingDir = new core_kernel_file_File($source->getUniquePropertyValue($contentProperty)); $service = taoQtiTest_models_classes_QtiTestService::singleton(); $dir = $service->createContent($destination, false); if ($existingDir->fileExists()) { tao_helpers_File::copy($existingDir->getAbsolutePath(), $dir->getAbsolutePath(), true, false); } else { common_Logger::w('Test "' . $source->getUri() . '" had no content, nothing to clone'); } }
/** * This implementation use \core_kernel_file_File URI as serial * * @see FileReferenceSerializer::cleanUp */ public function cleanUp($serial) { $resourceFile = $this->getResource($serial); $file = new \core_kernel_file_File($resourceFile); return $file->delete(); }
/** * Assign items to a QTI test. * @param XmlDocument $doc * @param array $items * @return type * @throws taoQtiTest_models_classes_QtiTestServiceException */ private function setItemsToDoc(XmlDocument $doc, array $items, $sectionIndex = 0) { $sections = $doc->getDocumentComponent()->getComponentsByClassName('assessmentSection'); if (!isset($sections[$sectionIndex])) { throw new taoQtiTest_models_classes_QtiTestServiceException('No section found in test at index : ' . $sectionIndex, taoQtiTest_models_classes_QtiTestServiceException::TEST_READ_ERROR); } $section = $sections[$sectionIndex]; $itemContentProperty = new core_kernel_classes_Property(TAO_ITEM_CONTENT_PROPERTY); $itemRefs = new SectionPartCollection(); $itemRefIdentifiers = array(); foreach ($items as $itemResource) { $itemContent = new core_kernel_file_File($itemResource->getUniquePropertyValue($itemContentProperty)); $itemDoc = new XmlDocument(); try { $itemDoc->load($itemContent->getAbsolutePath()); } catch (StorageException $e) { // We consider the item not compliant with QTI, let's try the next one. continue; } $itemRefIdentifier = $itemDoc->getDocumentComponent()->getIdentifier(); //enable more than one reference if (array_key_exists($itemRefIdentifier, $itemRefIdentifiers)) { $itemRefIdentifiers[$itemRefIdentifier] += 1; $itemRefIdentifier .= '-' . $itemRefIdentifiers[$itemRefIdentifier]; } else { $itemRefIdentifiers[$itemRefIdentifier] = 0; } $itemRefs[] = new AssessmentItemRef($itemRefIdentifier, $itemResource->getUri()); } $section->setSectionParts($itemRefs); return count($itemRefs); }