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.");
         }
     }
 }
Esempio n. 4
0
 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();
 }
Esempio n. 5
0
 /**
  * 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;
 }
Esempio n. 7
0
 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);
 }
Esempio n. 11
0
 /**
  * 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;
 }
Esempio n. 14
0
 /**
  * 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;
 }
Esempio n. 15
0
 /**
  * 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();
 }
Esempio n. 17
0
 /**
  * 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();
 }
Esempio n. 19
0
 /**
  *
  * @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');
     }
 }
Esempio n. 21
0
 /**
  * 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);
 }