/** * Test: * - {@link ClientLibRegistry::remove} * * @depends testRegister */ public function testRemove($libId) { ClientLibRegistry::getRegistry()->remove($libId); $map = ClientLibRegistry::getRegistry()->getMap(); $this->assertInternalType('array', $map); $this->assertFalse(isset($map[$libId])); }
/** * * Return all lib alias with relative path * * @author Lionel Lecaque, lionel@taotesting.com * @return array */ public function getLibAliasMap() { $extensionsAliases = array(); foreach (ClientLibRegistry::getRegistry()->getMap() as $alias => $lib) { $extensionsAliases[$alias] = str_replace(ROOT_URL, '../../../', $lib); } return $extensionsAliases; }
public function testRegister() { $map = ClientLibRegistry::getRegistry()->getMap(); $this->assertFalse(empty($map)); ClientLibRegistry::getRegistry()->register('OAT/test', dirname(__FILE__) . '/samples/fakeSourceCode/views/js/'); $map = ClientLibRegistry::getRegistry()->getMap(); $this->assertInternalType('array', $map); $this->assertTrue(isset($map['OAT/test'])); $this->assertEquals(dirname(__FILE__) . '/samples/fakeSourceCode/views/js/', $map['OAT/test']); ClientLibRegistry::getRegistry()->remove('OAT/test'); }
/** * * @param string $initialVersion * @return string $versionUpdatedTo */ public function update($initialVersion) { $currentVersion = $initialVersion; if ($currentVersion === '0.1') { ClientLibRegistry::getRegistry()->register('ace', ROOT_URL . 'xmlEdit/views/js/lib/ace-1.2.0/'); ClientLibConfigRegistry::getRegistry()->register('taoQtiItem/controller/apip-creator/main', array('hooks' => array('xmlEdit/hooks/apipCreatorDebugger/hook'))); ClientLibConfigRegistry::getRegistry()->register('taoQtiItem/controller/creator/main', array('hooks' => array('xmlEdit/hooks/qtiCreatorDebugger/hook'))); $currentVersion = '0.2.0'; } $this->setVersion($currentVersion); $this->skip('0.2.0', '1.1.0'); }
/** * * Return all lib alias with relative path * * @author Lionel Lecaque, lionel@taotesting.com * @return array */ public function getLibAliasMap() { $extensionsAliases = array(); $assetservice = ServiceManager::getServiceManager()->get(AssetService::SERVICE_ID); foreach (ClientLibRegistry::getRegistry()->getMap() as $alias => $lib) { if (is_array($lib) && isset($lib['extId']) && isset($lib['path'])) { $extensionsAliases[$alias] = $assetservice->getJsBaseWww($lib['extId']) . $lib['path']; } elseif (is_string($lib)) { $extensionsAliases[$alias] = str_replace(ROOT_URL, '../../../', $lib); } else { throw new \common_exception_InconsistentData('Invalid ' . self::getConfigId() . ' entry found'); } } return $extensionsAliases; }
/** * * Return all lib alias with relative path * * @author Lionel Lecaque, lionel@taotesting.com * @return array */ public function getLibAliasMap() { $extensionsAliases = array(); foreach (ClientLibRegistry::getRegistry()->getMap() as $alias => $lib) { if (is_array($lib) && isset($lib['extId']) && isset($lib['path'])) { $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById($lib['extId']); $extensionsAliases[$alias] = $ext->getConstant('BASE_WWW') . $lib['path']; } elseif (is_string($lib)) { $extensionsAliases[$alias] = str_replace(ROOT_URL, '../../../', $lib); } else { throw new \common_exception_InconsistentData('Invalid ' . self::getConfigId() . ' entry found'); } } return $extensionsAliases; }
/** * Get the require.js' config file */ public function config() { $this->setContentHeader('application/javascript'); //get extension paths to set up aliases dynamically $extensionsAliases = ClientLibRegistry::getRegistry()->getLibAliasMap(); $this->setData('extensionsAliases', $extensionsAliases); $libConfigs = ClientLibConfigRegistry::getRegistry()->getMap(); $this->setData('libConfigs', $libConfigs); $extendedConfig = $this->getServiceManager()->get(ClientConfigService::SERVICE_ID)->getExtendedConfig(); foreach ($extendedConfig as $key => $value) { $this->setData($key, json_encode($value)); } $extensionManager = common_ext_ExtensionsManager::singleton(); $langCode = tao_helpers_I18n::getLangCode(); //loads the URLs context /** @var AssetService $assetService */ $assetService = ServiceManager::getServiceManager()->get(AssetService::SERVICE_ID); $tao_base_www = $assetService->getJsBaseWww('tao'); $extensionId = $this->hasRequestParameter('extension') ? $this->getRequestParameter('extension') : \Context::getInstance()->getExtensionName(); $extension = $extensionManager->getExtensionById($extensionId); $base_www = $assetService->getJsBaseWww($extensionId); $base_url = $extension->getConstant('BASE_URL'); //set contextual data $this->setData('locale', $langCode); if (strpos($langCode, '-') > 0) { $lang = strtolower(substr($langCode, 0, strpos($langCode, '-'))); } else { $lang = strtolower($langCode); } $this->setData('lang', $lang); $this->setData('version', TAO_VERSION); $this->setData('extension', $this->getRequestParameter('extension')); $this->setData('module', $this->getRequestParameter('module')); $this->setData('action', $this->getRequestParameter('action')); $this->setData('base_www', $base_www); $this->setData('tao_base_www', $tao_base_www); $this->setData('base_url', $base_url); $this->setData('shownExtension', $this->getRequestParameter('shownExtension')); $this->setData('shownStructure', $this->getRequestParameter('shownStructure')); $this->setData('client_timeout', $this->getClientTimeout()); $this->setView('client_config.tpl'); }
/** * Get the require.js' config file */ public function config() { $this->setContentHeader('application/javascript'); //get extension paths to set up aliases dynamically $extensionsAliases = ClientLibRegistry::getRegistry()->getLibAliasMap(); $this->setData('extensionsAliases', $extensionsAliases); $libConfigs = ClientLibConfigRegistry::getRegistry()->getMap(); $this->setData('libConfigs', $libConfigs); $themesAvailable = ThemeRegistry::getRegistry()->getAvailableThemes(); $this->setData('themesAvailable', $themesAvailable); $extensionManager = common_ext_ExtensionsManager::singleton(); $langCode = tao_helpers_I18n::getLangCode(); //loads the URLs context $base_www = BASE_WWW; $base_url = BASE_URL; if ($this->hasRequestParameter('extension')) { $extension = $extensionManager->getExtensionById($this->getRequestParameter('extension')); if (!is_null($extension)) { $base_www = $extension->getConstant('BASE_WWW'); $base_url = $extension->getConstant('BASE_URL'); } } //set contextual data $this->setData('locale', $langCode); if (strpos($langCode, '-') > 0) { $lang = strtolower(substr($langCode, 0, strpos($langCode, '-'))); } else { $lang = strtolower($langCode); } $this->setData('lang', $lang); $this->setData('extension', $this->getRequestParameter('extension')); $this->setData('module', $this->getRequestParameter('module')); $this->setData('action', $this->getRequestParameter('action')); $this->setData('base_www', $base_www); $this->setData('base_url', $base_url); $this->setData('shownExtension', $this->getRequestParameter('shownExtension')); $this->setData('shownStructure', $this->getRequestParameter('shownStructure')); $this->setData('client_timeout', $this->getClientTimeout()); $this->setView('client_config.tpl'); }
/** * Load assets from the custom elements (CustomInteraction, PCI, PIC) * @param Element $element the custom element */ private function loadCustomElementAssets(Element $element) { $libBasePath = ROOT_PATH . 'taoQtiItem/views/js/portableSharedLibraries'; $libRootUrl = ROOT_URL . 'taoQtiItem/views/js/portableSharedLibraries'; if ($element instanceof PortableCustomInteraction || $element instanceof PortableInfoControl) { $entryPoint = $element->getEntryPoint(); $fileName = substr($entryPoint, -3) != '.js' ? $entryPoint . '.js' : $entryPoint; $this->addAsset('js', $fileName); foreach ($element->getLibraries() as $lib) { if ($this->getGetSharedLibraries() || !ClientLibRegistry::getRegistry()->isRegistered($lib)) { $fileName = substr($lib, -3) != '.js' ? $lib . '.js' : $lib; $this->addAsset('js', $fileName); } } } //parse and extract assets from markup using XPATH if ($element instanceof CustomInteraction || $element instanceof InfoControl) { $xml = new SimpleXMLElement($element->getMarkup()); foreach ($xml->xpath('//img') as $img) { $this->addAsset('img', (string) $img['src']); } foreach ($xml->xpath('//video') as $video) { $this->addAsset('video', (string) $video['src']); } foreach ($xml->xpath('//audio') as $audio) { $this->addAsset('audio', (string) $audio['src']); } } }
/** * Add required resources for a custom interaction (css, js) in the item directory * * @param string $typeIdentifier * @param \core_kernel_classes_Resource $item * @throws common_exception_Error */ public function addRequiredResources($typeIdentifier, core_kernel_classes_Resource $item) { //find the interaction in the registry $implementationData = $this->getImplementatioByTypeIdentifier($typeIdentifier); if (is_null($implementationData)) { throw new common_exception_Error('no implementation found with the type identifier ' . $typeIdentifier); } //get the root directory of the interaction $directory = $implementationData['directory']; //get the lists of all required resources $manifest = $implementationData['manifest']; $required = array($manifest['entryPoint']); //include libraries remotely only, so this block is temporarily disabled foreach ($manifest['libraries'] as $lib) { if (!ClientLibRegistry::getRegistry()->isRegistered($lib)) { $lib = preg_replace('/^.\\//', '', $lib); $lib .= '.js'; //add js extension $required[] = $lib; } } //include custom interaction specific css in the item if (isset($manifest['css'])) { $required = array_merge($required, array_values($manifest['css'])); } //include media in the item if (isset($manifest['media'])) { $required = array_merge($required, array_values($manifest['media'])); } //add them to the rdf item $resources = Authoring::addRequiredResources($directory, $required, $typeIdentifier, $item, ''); return $resources; }
/** * * @param string $currentVersion * @return string $versionUpdatedTo */ public function update($initialVersion) { $currentVersion = $initialVersion; $extensionManager = common_ext_ExtensionsManager::singleton(); //migrate from 2.6 to 2.7.0 if ($currentVersion == '2.6') { //create Js config $ext = $extensionManager->getExtensionById('tao'); $config = array('timeout' => 30); $ext->setConfig('js', $config); $currentVersion = '2.7.0'; } //migrate from 2.7.0 to 2.7.1 if ($currentVersion == '2.7.0') { $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'indexation_2_7_1.rdf'; $adapter = new tao_helpers_data_GenerisAdapterRdf(); if ($adapter->import($file)) { $currentVersion = '2.7.1'; } else { common_Logger::w('Import failed for ' . $file); } } if ($currentVersion == '2.7.1') { foreach ($extensionManager->getInstalledExtensions() as $extension) { $extManifestConsts = $extension->getConstants(); if (isset($extManifestConsts['BASE_WWW'])) { ClientLibRegistry::getRegistry()->register($extension->getId(), $extManifestConsts['BASE_WWW'] . 'js'); ClientLibRegistry::getRegistry()->register($extension->getId() . 'Css', $extManifestConsts['BASE_WWW'] . 'css'); } } $currentVersion = '2.7.2'; } if ($currentVersion == '2.7.2') { // zendSearch Update only $currentVersion = '2.7.3'; } if ($currentVersion == '2.7.3') { $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'indexation_2_7_4.rdf'; $adapter = new tao_helpers_data_GenerisAdapterRdf(); if ($adapter->import($file)) { $currentVersion = '2.7.4'; } else { common_Logger::w('Import failed for ' . $file); } } if ($currentVersion == '2.7.4') { $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'model_2_7_5.rdf'; $adapter = new tao_helpers_data_GenerisAdapterRdf(); if ($adapter->import($file)) { $currentVersion = '2.7.5'; } else { common_Logger::w('Import failed for ' . $file); } } if ($currentVersion == '2.7.5') { $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'index_type_2_7_6.rdf'; $adapter = new tao_helpers_data_GenerisAdapterRdf(); if ($adapter->import($file)) { $currentVersion = '2.7.6'; } else { common_Logger::w('Import failed for ' . $file); } } if ($currentVersion == '2.7.6') { $dir = FILES_PATH . 'updates' . DIRECTORY_SEPARATOR . 'pre_' . $currentVersion; if (!mkdir($dir, 0700, true)) { throw new \common_exception_Error('Unable to log update to ' . $dir); } FileModel::toFile($dir . DIRECTORY_SEPARATOR . 'backup.rdf', ModelManager::getModel()->getRdfInterface()); OntologyUpdater::correctModelId(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'indexation_2_7_1.rdf'); OntologyUpdater::correctModelId(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'indexation_2_7_4.rdf'); OntologyUpdater::correctModelId(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'model_2_7_5.rdf'); OntologyUpdater::correctModelId(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'index_type_2_7_6.rdf'); // syncronise also adds translations to correct modelid OntologyUpdater::syncModels(); // remove translations from model 1 $persistence = \common_persistence_SqlPersistence::getPersistence('default'); $result = $persistence->query("SELECT DISTINCT subject FROM statements WHERE NOT modelId = 1"); $toCleanup = array(); while ($row = $result->fetch()) { $toCleanup[] = $row['subject']; } $query = "DELETE from statements WHERE modelId = 1 AND subject = ? " . "AND predicate IN ('" . RDFS_LABEL . "','" . RDFS_COMMENT . "') "; foreach ($toCleanup as $subject) { $persistence->exec($query, array($subject)); } $currentVersion = '2.7.7'; } if ($currentVersion == '2.7.7') { $lockImpl = defined('ENABLE_LOCK') && ENABLE_LOCK ? new OntoLock() : new NoLock(); LockManager::setImplementation($lockImpl); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('ext' => 'tao', 'mod' => 'Lock'))); $currentVersion = '2.7.8'; } if ($currentVersion == '2.7.8') { if ($this->migrateFsAccess()) { $currentVersion = '2.7.9'; } } if ($currentVersion == '2.7.9') { // update role classes OntologyUpdater::syncModels(); $currentVersion = '2.7.10'; } if ($currentVersion == '2.7.10') { // correct access roles AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('act' => 'tao_actions_Lists@getListElements'))); AclProxy::revokeRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('ext' => 'tao', 'mod' => 'Lock'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('act' => 'tao_actions_Lock@release'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('act' => 'tao_actions_Lock@locked'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#LockManagerRole', array('act' => 'tao_actions_Lock@forceRelease'))); $currentVersion = '2.7.11'; } if ($currentVersion == '2.7.11') { // move session abstraction if (defined("PHP_SESSION_HANDLER") && class_exists(PHP_SESSION_HANDLER)) { if (PHP_SESSION_HANDLER == 'common_session_php_KeyValueSessionHandler') { $sessionHandler = new \common_session_php_KeyValueSessionHandler(array(\common_session_php_KeyValueSessionHandler::OPTION_PERSISTENCE => 'session')); } else { $sessionHandler = new PHP_SESSION_HANDLER(); } $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('tao'); $ext->setConfig(\Bootstrap::CONFIG_SESSION_HANDLER, $sessionHandler); } $currentVersion = '2.7.12'; } if ($currentVersion == '2.7.12') { // add the property manager OntologyUpdater::syncModels(); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#PropertyManagerRole', array('controller' => 'tao_actions_Lists'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#PropertyManagerRole', array('controller' => 'tao_actions_PropertiesAuthoring'))); $currentVersion = '2.7.13'; } return $currentVersion; }
/** * * @param $initialVersion * @return string $initialVersion * @throws \common_exception_Error * @throws \common_exception_InconsistentData * @throws \common_ext_ExtensionException * @throws common_Exception */ public function update($initialVersion) { $extensionManager = common_ext_ExtensionsManager::singleton(); //migrate from 2.6 to 2.7.0 if ($this->isVersion('2.6')) { //create Js config $ext = $extensionManager->getExtensionById('tao'); $config = array('timeout' => 30); $ext->setConfig('js', $config); $this->setVersion('2.7.0'); } //migrate from 2.7.0 to 2.7.1 if ($this->isVersion('2.7.0')) { $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'indexation_2_7_1.rdf'; $adapter = new tao_helpers_data_GenerisAdapterRdf(); if ($adapter->import($file)) { $this->setVersion('2.7.1'); } else { common_Logger::w('Import failed for ' . $file); } } if ($this->isVersion('2.7.1')) { SearchService::setSearchImplementation(ZendSearch::createSearch()); $this->setVersion('2.7.2'); } // upgrade is requied for asset service to continue working if ($this->isBetween('2.7.2', '2.13.2')) { if (!$this->getServiceManager()->has(AssetService::SERVICE_ID)) { $this->getServiceManager()->register(AssetService::SERVICE_ID, new AssetService()); } } if ($this->isVersion('2.7.2')) { foreach ($extensionManager->getInstalledExtensions() as $extension) { $extManifestConsts = $extension->getConstants(); if (isset($extManifestConsts['BASE_WWW'])) { ClientLibRegistry::getRegistry()->register($extension->getId(), $extManifestConsts['BASE_WWW'] . 'js'); ClientLibRegistry::getRegistry()->register($extension->getId() . 'Css', $extManifestConsts['BASE_WWW'] . 'css'); } } $this->setVersion('2.7.3'); } if ($this->isVersion('2.7.3')) { $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'indexation_2_7_4.rdf'; $adapter = new tao_helpers_data_GenerisAdapterRdf(); if ($adapter->import($file)) { $this->setVersion('2.7.4'); } else { common_Logger::w('Import failed for ' . $file); } } if ($this->isVersion('2.7.4')) { $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'model_2_7_5.rdf'; $adapter = new tao_helpers_data_GenerisAdapterRdf(); if ($adapter->import($file)) { $this->setVersion('2.7.5'); } else { common_Logger::w('Import failed for ' . $file); } } if ($this->isVersion('2.7.5')) { $file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'index_type_2_7_6.rdf'; $adapter = new tao_helpers_data_GenerisAdapterRdf(); if ($adapter->import($file)) { $this->setVersion('2.7.6'); } else { common_Logger::w('Import failed for ' . $file); } } if ($this->isVersion('2.7.6')) { $dir = FILES_PATH . 'updates' . DIRECTORY_SEPARATOR . 'pre_2.7.6'; if (!mkdir($dir, 0700, true)) { throw new \common_exception_Error('Unable to log update to ' . $dir); } FileModel::toFile($dir . DIRECTORY_SEPARATOR . 'backup.rdf', ModelManager::getModel()->getRdfInterface()); OntologyUpdater::correctModelId(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'indexation_2_7_1.rdf'); OntologyUpdater::correctModelId(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'indexation_2_7_4.rdf'); OntologyUpdater::correctModelId(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'model_2_7_5.rdf'); OntologyUpdater::correctModelId(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'index_type_2_7_6.rdf'); // syncronise also adds translations to correct modelid OntologyUpdater::syncModels(); // remove translations from model 1 $persistence = \common_persistence_SqlPersistence::getPersistence('default'); $result = $persistence->query("SELECT DISTINCT subject FROM statements WHERE NOT modelId = 1"); $toCleanup = array(); while ($row = $result->fetch()) { $toCleanup[] = $row['subject']; } $query = "DELETE from statements WHERE modelId = 1 AND subject = ? " . "AND predicate IN ('" . RDFS_LABEL . "','" . RDFS_COMMENT . "') "; foreach ($toCleanup as $subject) { $persistence->exec($query, array($subject)); } $this->setVersion('2.7.7'); } // update FuncAccessControl early to support access changes if ($this->isBetween('2.7.7', '2.17.4')) { $implClass = common_ext_ExtensionsManager::singleton()->getExtensionById('tao')->getConfig('FuncAccessControl'); if (is_string($implClass)) { $impl = new $implClass(); $this->getServiceManager()->register(AclProxy::SERVICE_ID, $impl); } } if ($this->isVersion('2.7.7')) { $lockImpl = defined('ENABLE_LOCK') && ENABLE_LOCK ? new OntoLock() : new NoLock(); LockManager::setImplementation($lockImpl); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('ext' => 'tao', 'mod' => 'Lock'))); $this->setVersion('2.7.8'); } if ($this->isVersion('2.7.8')) { if ($this->migrateFsAccess()) { $this->setVersion('2.7.9'); } } if ($this->isVersion('2.7.9')) { // update role classes OntologyUpdater::syncModels(); $this->setVersion('2.7.10'); } if ($this->isVersion('2.7.10')) { // correct access roles AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('act' => 'tao_actions_Lists@getListElements'))); AclProxy::revokeRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('ext' => 'tao', 'mod' => 'Lock'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('act' => 'tao_actions_Lock@release'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('act' => 'tao_actions_Lock@locked'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#LockManagerRole', array('act' => 'tao_actions_Lock@forceRelease'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#BackOfficeRole', array('ext' => 'tao', 'mod' => 'Search'))); $this->setVersion('2.7.11'); } if ($this->isVersion('2.7.11')) { // move session abstraction if (defined("PHP_SESSION_HANDLER") && class_exists(PHP_SESSION_HANDLER)) { if (PHP_SESSION_HANDLER == 'common_session_php_KeyValueSessionHandler') { $sessionHandler = new \common_session_php_KeyValueSessionHandler(array(\common_session_php_KeyValueSessionHandler::OPTION_PERSISTENCE => 'session')); } else { $sessionHandler = new PHP_SESSION_HANDLER(); } $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('tao'); $ext->setConfig(\Bootstrap::CONFIG_SESSION_HANDLER, $sessionHandler); } $this->setVersion('2.7.12'); } if ($this->isVersion('2.7.12')) { // add the property manager OntologyUpdater::syncModels(); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#PropertyManagerRole', array('controller' => 'tao_actions_Lists'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#PropertyManagerRole', array('controller' => 'tao_actions_PropertiesAuthoring'))); $this->setVersion('2.7.13'); } if ($this->isVersion('2.7.13')) { AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/generis.rdf#AnonymousRole', array('ext' => 'tao', 'mod' => 'PasswordRecovery', 'act' => 'index'))); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/generis.rdf#AnonymousRole', array('ext' => 'tao', 'mod' => 'PasswordRecovery', 'act' => 'resetPassword'))); $this->setVersion('2.7.14'); } if ($this->isVersion('2.7.14')) { // index user logins OntologyUpdater::syncModels(); $this->setVersion('2.7.15'); } // reset the search impl for machines that missed 2.7.1 update due to merge if ($this->isVersion('2.7.15') || $this->isVersion('2.7.16')) { try { SearchService::getSearchImplementation(); // all good } catch (\common_exception_Error $error) { SearchService::setSearchImplementation(new GenerisSearch()); } $this->setVersion('2.7.16'); } if ($this->isVersion('2.7.16')) { $registry = ClientLibRegistry::getRegistry(); $map = $registry->getLibAliasMap(); foreach ($map as $id => $fqp) { $registry->remove($id); $registry->register($id, $fqp); } $this->setVersion('2.7.17'); } // semantic versioning $this->skip('2.7.17', '2.8.0'); if ($this->isBetween('2.8.0', '2.13.0')) { $tao = \common_ext_ExtensionsManager::singleton()->getExtensionById('tao'); $entryPoints = $tao->getConfig('entrypoint'); if (is_array($entryPoints) || $entryPoints == false) { $service = new EntryPointService(); if (is_array($entryPoints)) { foreach ($entryPoints as $id => $entryPoint) { $service->overrideEntryPoint($id, $entryPoint); $service->activateEntryPoint($id, EntryPointService::OPTION_POSTLOGIN); } } // register, don't activate $passwordResetEntry = new PasswordReset(); $service->overrideEntryPoint($passwordResetEntry->getId(), $passwordResetEntry); $this->getServiceManager()->register(EntryPointService::SERVICE_ID, $service); } } if ($this->isVersion('2.8.0')) { $service = $this->getServiceManager()->get(EntryPointService::SERVICE_ID); $service->registerEntryPoint(new BackOfficeEntrypoint()); $this->getServiceManager()->register(EntryPointService::SERVICE_ID, $service); $this->setVersion('2.8.1'); } // semantic versioning $this->skip('2.8.1', '2.9'); // remove id properties if ($this->isVersion('2.9')) { $rdf = ModelManager::getModel()->getRdfInterface(); foreach ($rdf as $triple) { if ($triple->predicate == 'id') { $rdf->remove($triple); } } $this->setVersion('2.9.1'); } // tao object split if ($this->isVersion('2.9.1')) { OntologyUpdater::syncModels(); $this->setVersion('2.10.0'); } // widget definitions if ($this->isVersion('2.10.0')) { OntologyUpdater::syncModels(); $this->setVersion('2.10.1'); } // add login form config if ($this->isVersion('2.10.1')) { $loginFormSettings = array('elements' => array()); $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('tao'); $ext->setConfig('loginForm', $loginFormSettings); $this->setVersion('2.10.2'); } if ($this->isVersion('2.10.2')) { $s = DIRECTORY_SEPARATOR; ThemeRegistry::getRegistry()->createTarget('frontOffice', array('css' => 'tao' . $s . 'views' . $s . 'css' . $s . 'tao-3.css', 'templates' => array('header-logo' => 'taoDelivery' . $s . 'views' . $s . 'templates' . $s . 'DeliveryServer' . $s . 'blocks' . $s . 'header-logo.tpl', 'footer' => 'taoDelivery' . $s . 'views' . $s . 'templates' . $s . 'DeliveryServer' . $s . 'blocks' . $s . 'footer.tpl'))); ThemeRegistry::getRegistry()->createTarget('backOffice', array('css' => 'tao' . $s . 'views' . $s . 'css' . $s . 'tao-3.css', 'templates' => array('header-logo' => 'tao' . $s . 'views' . $s . 'templates' . $s . 'blocks' . $s . 'header-logo.tpl', 'footer' => 'tao' . $s . 'views' . $s . 'templates' . $s . 'blocks' . $s . 'footer.tpl'))); $this->setVersion('2.11.0'); } if ($this->isVersion('2.11.0')) { $service = new \tao_models_classes_service_StateStorage(array('persistence' => 'serviceState')); $this->getServiceManager()->register('tao/stateStorage', $service); $this->setVersion('2.12.0'); } $this->skip('2.12.0', '2.13.0'); // moved to 2.8.0 $this->skip('2.13.0', '2.13.1'); // moved to 2.7.2 $this->skip('2.13.1', '2.13.2'); if ($this->isVersion('2.13.2')) { //add the new customizable template "login-message" to backOffice target $themeService = new ThemeService(); //test for overrides $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('tao'); $oldConfig = $ext->getConfig('themes'); $compatibilityConfig = array(); foreach ($oldConfig['frontOffice']['available'] as $arr) { if ($arr['id'] == $oldConfig['frontOffice']['default']) { $compatibilityConfig[Theme::CONTEXT_FRONTOFFICE] = $arr; } } foreach ($oldConfig['backOffice']['available'] as $arr) { if ($arr['id'] == $oldConfig['backOffice']['default']) { $compatibilityConfig[Theme::CONTEXT_BACKOFFICE] = $arr; } } if (empty($compatibilityConfig)) { $themeService->setTheme(new DefaultTheme()); } else { $themeService->setTheme(new CompatibilityTheme($compatibilityConfig)); } unset($oldConfig['backOffice']); unset($oldConfig['frontOffice']); $ext->setConfig('themes', $oldConfig); $this->getServiceManager()->register(ThemeService::SERVICE_ID, $themeService); $this->setVersion('2.14.0'); } $this->skip('2.14.0', '2.15.0'); if ($this->isVersion('2.15.0')) { (new SimpleAccess())->revokeRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/generis.rdf#AnonymousRole', ['ext' => 'tao', 'mod' => 'AuthApi'])); $this->setVersion('2.15.1'); } $this->skip('2.15.1', '2.15.2'); if ($this->isVersion('2.15.2')) { ClientLibConfigRegistry::getRegistry()->register('util/locale', ['decimalSeparator' => '.', 'thousandsSeparator' => '']); $this->setVersion('2.15.3'); } $this->skip('2.15.3', '2.16.0'); if ($this->isVersion('2.16.0')) { try { $this->getServiceManager()->get(RequiredActionService::CONFIG_ID); // all good, already configured } catch (ServiceNotFoundException $error) { $requiredActionService = new RequiredActionService(); $this->getServiceManager()->register(RequiredActionService::CONFIG_ID, $requiredActionService); } OntologyUpdater::syncModels(); $this->setVersion('2.17.0'); } if ($this->isBetween('2.17.0', '2.17.4')) { ClientLibConfigRegistry::getRegistry()->register('util/locale', ['decimalSeparator' => '.', 'thousandsSeparator' => '']); $this->setVersion('2.17.4'); } // skiped registering of func ACL proxy as done before 2.7.7 $this->skip('2.17.4', '2.18.2'); if ($this->isVersion('2.18.2')) { $extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('tao'); $config = $extension->getConfig('login'); if (!is_array($config)) { $config = []; } if (!array_key_exists('disableAutocomplete', $config)) { $config['disableAutocomplete'] = false; } $extension->setConfig('login', $config); $this->setVersion('2.19.0'); } $this->skip('2.19.0', '2.21.0'); if ($this->isVersion('2.21.0')) { $config = common_ext_ExtensionsManager::singleton()->getExtensionById('tao')->getConfig('ServiceFileStorage'); $service = new \tao_models_classes_service_FileStorage($config); $this->getServiceManager()->register(\tao_models_classes_service_FileStorage::SERVICE_ID, $service); $this->setVersion('2.22.0'); } $this->skip('2.22.0', '5.5.0'); if ($this->isVersion('5.5.0')) { $clientConfig = new ClientConfigService(); $clientConfig->setClientConfig('themesAvailable', new ThemeConfig()); $this->getServiceManager()->register(ClientConfigService::SERVICE_ID, $clientConfig); $this->setVersion('5.6.0'); } $this->skip('5.6.0', '5.6.2'); if ($this->isVersion('5.6.2')) { if (!$this->getServiceManager()->has(UpdateLogger::SERVICE_ID)) { // setup log fs $fsm = $this->getServiceManager()->get(FileSystemService::SERVICE_ID); $fsm->createFileSystem('log', 'tao/log'); $this->getServiceManager()->register(FileSystemService::SERVICE_ID, $fsm); $this->getServiceManager()->register(UpdateLogger::SERVICE_ID, new UpdateLogger(array(UpdateLogger::OPTION_FILESYSTEM => 'log'))); } $this->setVersion('5.6.3'); } $this->skip('5.6.3', '5.9.1'); if ($this->isVersion('5.9.1')) { /** @var EventManager $eventManager */ $eventManager = $this->getServiceManager()->get(EventManager::CONFIG_ID); $eventManager->detach(RoleRemovedEvent::class, ['oat\\tao\\scripts\\update\\LoggerService', 'logEvent']); $eventManager->detach(RoleCreatedEvent::class, ['oat\\tao\\scripts\\update\\LoggerService', 'logEvent']); $eventManager->detach(RoleChangedEvent::class, ['oat\\tao\\scripts\\update\\LoggerService', 'logEvent']); $eventManager->detach(UserCreatedEvent::class, ['oat\\tao\\scripts\\update\\LoggerService', 'logEvent']); $eventManager->detach(UserUpdatedEvent::class, ['oat\\tao\\scripts\\update\\LoggerService', 'logEvent']); $eventManager->detach(UserRemovedEvent::class, ['oat\\tao\\scripts\\update\\LoggerService', 'logEvent']); $this->getServiceManager()->register(EventManager::CONFIG_ID, $eventManager); $this->setVersion('5.9.2'); } $this->skip('5.9.2', '6.0.1'); if ($this->isVersion('6.0.1')) { OntologyUpdater::syncModels(); $this->setVersion('6.1.0'); } $this->skip('6.1.0', '7.16.2'); if ($this->isVersion('7.16.2')) { OntologyUpdater::syncModels(); ValidationRuleRegistry::getRegistry()->set('notEmpty', new \tao_helpers_form_validators_NotEmpty()); $this->setVersion('7.17.0'); } $this->skip('7.17.0', '7.23.0'); if ($this->isVersion('7.23.0')) { $service = new \oat\tao\model\mvc\DefaultUrlService(['default' => ['ext' => 'tao', 'controller' => 'Main', 'action' => 'index'], 'login' => ['ext' => 'tao', 'controller' => 'Main', 'action' => 'login']]); $this->getServiceManager()->register(\oat\tao\model\mvc\DefaultUrlService::SERVICE_ID, $service); $this->setVersion('7.24.0'); } $this->skip('7.24.0', '7.27.0'); if ($this->isVersion('7.27.0')) { OntologyUpdater::syncModels(); $this->setVersion('7.28.0'); } $this->skip('7.28.0', '7.30.1'); }
<?php /* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; under version 2 * of the License (non-upgradable). * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Copyright (c) 2015 (original work) Open Assessment Technologies SA ; * */ use oat\tao\model\ClientLibRegistry; ClientLibRegistry::getRegistry()->register('ace', ROOT_URL . 'xmlEdit/views/js/lib/ace-1.2.0/');
/** * Register a library from a file existing on the file system. * * Example: * <code> * <?php * // ... * $registry = new SharedLibrariesRegistry($basePath, $baseUrl); * $registry->registerFromFile('IMSGlobal/jquery_2_1_1', '/tmp/jquery_2_1_1.js'); * * // The registry now maps 'IMSGlobal/jquery_2_1_1' to '$baseUrl/IMSGlobal/jquery_2_1_1.js' * ?> * </code> * * @param string $id A shared library name e.g. 'IMSGlobal/jquery_2_1_1'. * @param string $path The path to library implementation to register. * @throws SharedLibraryNotFoundException If no library can be found at $path. */ public function registerFromFile($id, $path) { if (file_exists($path) === false) { $msg = "Shared Library could not be found at location '{$path}'."; throw new SharedLibraryNotFoundException($msg, $id); } $basePath = $this->getBasePath(); $baseUrl = $this->getBaseUrl(); $finalPath = "{$basePath}/{$id}"; $dirName = pathinfo($finalPath, PATHINFO_DIRNAME); $dirName = str_replace(array('css!', 'tpl!'), '', $dirName); if (is_dir($dirName) === false) { mkdir($dirName, 0777, true); } $fileBaseName = pathinfo($path, PATHINFO_BASENAME); $fileName = pathinfo($path, PATHINFO_FILENAME); $destination = "{$dirName}/{$fileBaseName}"; // Subtract eventual css!, tpl! prefixes. copy($path, $destination); // Subtract $basePath from final destination. $mappingPath = str_replace($basePath . '/', '', $destination); // Take care with windows... $mappingPath = str_replace("\\", '/', $mappingPath); $map = self::set($id, "{$baseUrl}/{$mappingPath}"); $mappingDirname = pathinfo($mappingPath, PATHINFO_DIRNAME); ClientLibRegistry::getRegistry()->register($id, "{$baseUrl}/{$mappingDirname}/{$fileName}"); }
<?php /** * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; under version 2 * of the License (non-upgradable). * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Copyright (c) 2015 (original work) Open Assessment Technologies SA * */ use oat\tao\model\ClientLibRegistry; $basePath = '../../../taoQtiItem/views/js/runtime/'; $registry = ClientLibRegistry::getRegistry(); $registry->register('qtiCustomInteractionContext', $basePath . 'qtiCustomInteractionContext'); $registry->register('qtiInfoControlContext', $basePath . 'qtiInfoControlContext');
/** * Extension may declare client lib to add alias into requireJs * * @author Lionel Lecaque, lionel@taotesting.com */ public function registerClientLib() { $extManifestConsts = $this->extension->getConstants(); if (isset($extManifestConsts['BASE_WWW'])) { ClientLibRegistry::getRegistry()->register($this->extension->getId(), $extManifestConsts['BASE_WWW'] . 'js'); ClientLibRegistry::getRegistry()->register($this->extension->getId() . 'Css', $extManifestConsts['BASE_WWW'] . 'css'); } }
/** * @dataProvider isRegisteredProvider * @depends testRegisterFromFile * * @param string $id The identifier of the library * @param boolean $expected The expected return value for $id. */ public function testIsRegistered($id, $expected) { $registry = $this->getRegistry(); self::registerOfficialLibraries($registry); $this->assertSame($expected, ClientLibRegistry::getRegistry()->isRegistered($id)); }
/** * Valid a file if exists or alias * * @param string $source Temporary directory source * @param string $file Path to the file * @return bool * @throws PortableElementInvalidAssetException * @throws PortableElementParserException */ public function validFile($source, $file) { if (!file_exists($source)) { throw new PortableElementParserException('Unable to locate extracted zip file.'); } $filePath = $source . $file; if (file_exists($filePath) || file_exists($filePath . '.js')) { return true; } if (array_key_exists($file, ClientLibRegistry::getRegistry()->getLibAliasMap())) { return true; } throw new PortableElementInvalidAssetException('Asset ' . $file . ' is not found in archive neither through alias'); }
/** * * @param string $initialVersion * @return string */ public function update($initialVersion) { $currentVersion = $initialVersion; //add portable shared libraries: $libBasePath = ROOT_PATH . 'taoQtiItem/views/js/portableSharedLibraries'; $libRootUrl = ROOT_URL . 'taoQtiItem/views/js/portableSharedLibraries'; $installBasePath = ROOT_PATH . 'taoQtiItem/install/scripts/portableSharedLibraries'; $registry = new SharedLibrariesRegistry($libBasePath, $libRootUrl); //migrate from 2.6 to 2.7.0 if ($currentVersion == '2.6') { $registry->registerFromFile('IMSGlobal/jquery_2_1_1', $installBasePath . '/IMSGlobal/jquery_2_1_1.js'); $registry->registerFromFile('OAT/lodash', $installBasePath . '/OAT/lodash.js'); $registry->registerFromFile('OAT/async', $installBasePath . '/OAT/async.js'); $registry->registerFromFile('OAT/raphael', $installBasePath . '/OAT/raphael.js'); $registry->registerFromFile('OAT/scale.raphael', $installBasePath . '/OAT/scale.raphael.js'); $registry->registerFromFile('OAT/util/xml', $installBasePath . '/OAT/util/xml.js'); $registry->registerFromFile('OAT/util/math', $installBasePath . '/OAT/util/math.js'); $registry->registerFromFile('OAT/util/html', $installBasePath . '/OAT/util/html.js'); $registry->registerFromFile('OAT/util/EventMgr', $installBasePath . '/OAT/util/EventMgr.js'); $registry->registerFromFile('OAT/util/event', $installBasePath . '/OAT/util/event.js'); $currentVersion = '2.7.0'; } //migrate from 2.7.0 to 2.7.1 if ($currentVersion == '2.7.0') { $registry->registerFromFile('OAT/sts/common', $installBasePath . '/OAT/sts/common.js'); $registry->registerFromFile('OAT/interact', $installBasePath . '/OAT/interact.js'); $registry->registerFromFile('OAT/interact-rotate', $installBasePath . '/OAT/interact-rotate.js'); $currentVersion = '2.7.1'; } //migrate from 2.7.0 to 2.7.1 if ($currentVersion == '2.7.1') { $registry->registerFromFile('OAT/sts/transform-helper', $installBasePath . '/OAT/sts/transform-helper.js'); $currentVersion = '2.7.2'; } //migrate from 2.7.2 to 2.7.3 if ($currentVersion == '2.7.2') { $registry->registerFromFile('IMSGlobal/jquery_2_1_1', $installBasePath . '/IMSGlobal/jquery_2_1_1.js'); $registry->registerFromFile('OAT/lodash', $installBasePath . '/OAT/lodash.js'); $registry->registerFromFile('OAT/async', $installBasePath . '/OAT/async.js'); $registry->registerFromFile('OAT/raphael', $installBasePath . '/OAT/raphael.js'); $registry->registerFromFile('OAT/scale.raphael', $installBasePath . '/OAT/scale.raphael.js'); $registry->registerFromFile('OAT/util/xml', $installBasePath . '/OAT/util/xml.js'); $registry->registerFromFile('OAT/util/math', $installBasePath . '/OAT/util/math.js'); $registry->registerFromFile('OAT/util/html', $installBasePath . '/OAT/util/html.js'); $registry->registerFromFile('OAT/util/EventMgr', $installBasePath . '/OAT/util/EventMgr.js'); $registry->registerFromFile('OAT/util/event', $installBasePath . '/OAT/util/event.js'); $registry->registerFromFile('OAT/sts/common', $installBasePath . '/OAT/sts/common.js'); $registry->registerFromFile('OAT/interact', $installBasePath . '/OAT/interact.js'); $registry->registerFromFile('OAT/interact-rotate', $installBasePath . '/OAT/interact-rotate.js'); $registry->registerFromFile('OAT/sts/transform-helper', $installBasePath . '/OAT/sts/transform-helper.js'); $currentVersion = '2.7.3'; } //migrate from 2.7.3 to 2.7.4 if ($currentVersion == '2.7.3') { $registry->registerFromFile('OAT/handlebars', $installBasePath . '/OAT/handlebars.js'); $currentVersion = '2.7.4'; } if ($currentVersion == '2.7.4') { $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem'); $ext->setConfig('qtiCreator', array('multi-column' => false)); $currentVersion = '2.7.5'; } if ($currentVersion == '2.7.5') { $registry->registerFromFile('OAT/sts/stsEventManager', $installBasePath . '/OAT/sts/stsEventManager.js'); $currentVersion = '2.7.6'; } if ($currentVersion == '2.7.6') { $registry->registerFromFile('OAT/sts/common', $installBasePath . '/OAT/sts/common.js'); $currentVersion = '2.7.7'; } if ($currentVersion == '2.7.7') { $itemThemesDataPath = FILES_PATH . 'tao' . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR; $itemThemesDataPathFs = \tao_models_classes_FileSourceService::singleton()->addLocalSource('Theme FileSource', $itemThemesDataPath); $websource = TokenWebSource::spawnWebsource($itemThemesDataPathFs); ThemeRegistry::getRegistry()->setWebSource($websource->getId()); ThemeRegistry::getRegistry()->createTarget('items', 'taoQtiItem/views/css/qti-runner.css'); ThemeRegistry::getRegistry()->registerTheme('tao', 'TAO', 'taoQtiItem/views/css/themes/default.css', array('items')); ThemeRegistry::getRegistry()->setDefaultTheme('items', 'tao'); $currentVersion = '2.7.8'; } if ($currentVersion == '2.7.8') { $clientLibRegistry = ClientLibRegistry::getRegistry(); $clientLibRegistry->register('qtiCustomInteractionContext', '../../../taoQtiItem/views/js/runtime/qtiCustomInteractionContext'); $clientLibRegistry->register('qtiInfoControlContext', '../../../taoQtiItem/views/js/runtime/qtiInfoControlContext'); $currentVersion = '2.7.9'; } if ($currentVersion == '2.7.9') { $currentVersion = '2.8.0'; } if ($currentVersion == '2.8.0') { $currentVersion = '2.8.1'; $registry->registerFromFile('OAT/sts/common', $installBasePath . '/OAT/sts/common.js'); } if ($currentVersion == '2.8.1') { $qtiItem = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem'); $qtiItem->setConfig('userScripts', array()); $currentVersion = '2.9.0'; } if ($currentVersion === '2.9.0') { $registry->registerFromFile('OAT/waitForMedia', $installBasePath . '/OAT/waitForMedia.js'); $currentVersion = '2.9.1'; } if ($currentVersion === '2.9.1') { $currentVersion = '2.10.0'; } if ($currentVersion === '2.10.0') { $currentVersion = '2.11.0'; } return $currentVersion; }
/** * * @param string $initialVersion * @return string */ public function update($initialVersion) { $currentVersion = $initialVersion; //add portable shared libraries: $libBasePath = ROOT_PATH . 'taoQtiItem/views/js/portableSharedLibraries'; $libRootUrl = ROOT_URL . 'taoQtiItem/views/js/portableSharedLibraries'; $installBasePath = ROOT_PATH . 'taoQtiItem/install/scripts/portableSharedLibraries'; $sharedLibRegistry = new SharedLibrariesRegistry($libBasePath, $libRootUrl); //migrate from 2.6 to 2.7.0 if ($currentVersion == '2.6') { $sharedLibRegistry->registerFromFile('IMSGlobal/jquery_2_1_1', $installBasePath . '/IMSGlobal/jquery_2_1_1.js'); $sharedLibRegistry->registerFromFile('OAT/lodash', $installBasePath . '/OAT/lodash.js'); $sharedLibRegistry->registerFromFile('OAT/async', $installBasePath . '/OAT/async.js'); $sharedLibRegistry->registerFromFile('OAT/raphael', $installBasePath . '/OAT/raphael.js'); $sharedLibRegistry->registerFromFile('OAT/scale.raphael', $installBasePath . '/OAT/scale.raphael.js'); $sharedLibRegistry->registerFromFile('OAT/util/xml', $installBasePath . '/OAT/util/xml.js'); $sharedLibRegistry->registerFromFile('OAT/util/math', $installBasePath . '/OAT/util/math.js'); $sharedLibRegistry->registerFromFile('OAT/util/html', $installBasePath . '/OAT/util/html.js'); $sharedLibRegistry->registerFromFile('OAT/util/EventMgr', $installBasePath . '/OAT/util/EventMgr.js'); $sharedLibRegistry->registerFromFile('OAT/util/event', $installBasePath . '/OAT/util/event.js'); $currentVersion = '2.7.0'; } //migrate from 2.7.0 to 2.7.1 if ($currentVersion == '2.7.0') { $sharedLibRegistry->registerFromFile('OAT/sts/common', $installBasePath . '/OAT/sts/common.js'); $sharedLibRegistry->registerFromFile('OAT/interact', $installBasePath . '/OAT/interact.js'); $sharedLibRegistry->registerFromFile('OAT/interact-rotate', $installBasePath . '/OAT/interact-rotate.js'); $currentVersion = '2.7.1'; } //migrate from 2.7.0 to 2.7.1 if ($currentVersion == '2.7.1') { $sharedLibRegistry->registerFromFile('OAT/sts/transform-helper', $installBasePath . '/OAT/sts/transform-helper.js'); $currentVersion = '2.7.2'; } //migrate from 2.7.2 to 2.7.3 if ($currentVersion == '2.7.2') { $sharedLibRegistry->registerFromFile('IMSGlobal/jquery_2_1_1', $installBasePath . '/IMSGlobal/jquery_2_1_1.js'); $sharedLibRegistry->registerFromFile('OAT/lodash', $installBasePath . '/OAT/lodash.js'); $sharedLibRegistry->registerFromFile('OAT/async', $installBasePath . '/OAT/async.js'); $sharedLibRegistry->registerFromFile('OAT/raphael', $installBasePath . '/OAT/raphael.js'); $sharedLibRegistry->registerFromFile('OAT/scale.raphael', $installBasePath . '/OAT/scale.raphael.js'); $sharedLibRegistry->registerFromFile('OAT/util/xml', $installBasePath . '/OAT/util/xml.js'); $sharedLibRegistry->registerFromFile('OAT/util/math', $installBasePath . '/OAT/util/math.js'); $sharedLibRegistry->registerFromFile('OAT/util/html', $installBasePath . '/OAT/util/html.js'); $sharedLibRegistry->registerFromFile('OAT/util/EventMgr', $installBasePath . '/OAT/util/EventMgr.js'); $sharedLibRegistry->registerFromFile('OAT/util/event', $installBasePath . '/OAT/util/event.js'); $sharedLibRegistry->registerFromFile('OAT/sts/common', $installBasePath . '/OAT/sts/common.js'); $sharedLibRegistry->registerFromFile('OAT/interact', $installBasePath . '/OAT/interact.js'); $sharedLibRegistry->registerFromFile('OAT/interact-rotate', $installBasePath . '/OAT/interact-rotate.js'); $sharedLibRegistry->registerFromFile('OAT/sts/transform-helper', $installBasePath . '/OAT/sts/transform-helper.js'); $currentVersion = '2.7.3'; } //migrate from 2.7.3 to 2.7.4 if ($currentVersion == '2.7.3') { $sharedLibRegistry->registerFromFile('OAT/handlebars', $installBasePath . '/OAT/handlebars.js'); $currentVersion = '2.7.4'; } if ($currentVersion == '2.7.4') { $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem'); $ext->setConfig('qtiCreator', array('multi-column' => false)); $currentVersion = '2.7.5'; } if ($currentVersion == '2.7.5') { $sharedLibRegistry->registerFromFile('OAT/sts/stsEventManager', $installBasePath . '/OAT/sts/stsEventManager.js'); $currentVersion = '2.7.6'; } if ($currentVersion == '2.7.6') { $sharedLibRegistry->registerFromFile('OAT/sts/common', $installBasePath . '/OAT/sts/common.js'); $currentVersion = '2.7.7'; } if ($currentVersion == '2.7.7') { $itemThemesDataPath = FILES_PATH . 'tao' . DIRECTORY_SEPARATOR . 'themes' . DIRECTORY_SEPARATOR; $itemThemesDataPathFs = \tao_models_classes_FileSourceService::singleton()->addLocalSource('Theme FileSource', $itemThemesDataPath); $websource = TokenWebSource::spawnWebsource($itemThemesDataPathFs); ThemeRegistry::getRegistry()->setWebSource($websource->getId()); ThemeRegistry::getRegistry()->createTarget('items', 'taoQtiItem/views/css/qti-runner.css'); ThemeRegistry::getRegistry()->registerTheme('tao', 'TAO', 'taoQtiItem/views/css/themes/default.css', array('items')); ThemeRegistry::getRegistry()->setDefaultTheme('items', 'tao'); $currentVersion = '2.7.8'; } if ($currentVersion == '2.7.8') { $clientLibRegistry = ClientLibRegistry::getRegistry(); $clientLibRegistry->register('qtiCustomInteractionContext', '../../../taoQtiItem/views/js/runtime/qtiCustomInteractionContext'); $clientLibRegistry->register('qtiInfoControlContext', '../../../taoQtiItem/views/js/runtime/qtiInfoControlContext'); $currentVersion = '2.7.9'; } if ($currentVersion == '2.7.9') { $currentVersion = '2.8.0'; } if ($currentVersion == '2.8.0') { $currentVersion = '2.8.1'; $sharedLibRegistry->registerFromFile('OAT/sts/common', $installBasePath . '/OAT/sts/common.js'); } if ($currentVersion == '2.8.1') { $qtiItem = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem'); $qtiItem->setConfig('userScripts', array()); $currentVersion = '2.9.0'; } if ($currentVersion === '2.9.0') { $sharedLibRegistry->registerFromFile('OAT/waitForMedia', $installBasePath . '/OAT/waitForMedia.js'); $currentVersion = '2.9.1'; } if ($currentVersion === '2.9.1') { $currentVersion = '2.10.0'; } if ($currentVersion === '2.10.0') { $currentVersion = '2.11.0'; } if ($currentVersion === '2.11.0') { $sharedLibRegistry->registerFromFile('OAT/util/asset', $installBasePath . '/OAT/util/asset.js'); $sharedLibRegistry->registerFromFile('OAT/util/tpl', $installBasePath . '/OAT/util/tpl.js'); $currentVersion = '2.12.0'; } $this->setVersion($currentVersion); if ($this->isBetween('2.12.0', '2.13.0')) { $itemQtiExt = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem'); $compilerClassConfig = 'oat\\taoQtiItem\\model\\QtiItemCompiler'; $itemQtiExt->setConfig('compilerClass', $compilerClassConfig); $this->setVersion('2.13.0'); } if ($this->isVersion('2.13.0')) { \oat\tao\model\ClientLibConfigRegistry::getRegistry()->register('taoQtiItem/qtiRunner/core/QtiRunner', array('inlineModalFeedback' => false)); $fs = \taoItems_models_classes_ItemsService::singleton()->getDefaultFileSource(); $itemUpdater = new ItemUpdateInlineFeedback($fs->getPath()); $itemUpdater->update(true); $this->setVersion('2.14.0'); } $this->skip('2.14.0', '2.15.1'); if ($this->isVersion('2.15.1')) { $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem'); $validation = array('default' => array(__DIR__ . '/../../model/qti/data/imscp_v1p1.xsd', __DIR__ . '/../../model/qti/data/apipv1p0/Core_Level/Package/apipv1p0_imscpv1p2_v1p0.xsd')); $ext->setConfig('manifestValidation', $validation); $this->setVersion('2.16.0'); } if ($this->isVersion('2.16.0')) { $ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem'); $validation = array('http://www.imsglobal.org/xsd/imsqti_v2p0' => array(__DIR__ . '/../../model/qti/data/qtiv2p0/imsqti_v2p0.xsd'), 'http://www.imsglobal.org/xsd/apip/apipv1p0/qtiitem/imsqti_v2p1' => array(__DIR__ . '/../../model/qti/data/apipv1p0/Core_Level/Package/apipv1p0_qtiitemv2p1_v1p0.xsd'), 'default' => array(__DIR__ . '/../../model/qti/data/qtiv2p1/imsqti_v2p1.xsd')); $ext->setConfig('contentValidation', $validation); $this->setVersion('2.17.0'); } if ($this->isVersion('2.17.0')) { $this->setVersion('2.17.1'); } if ($this->isVersion('2.17.1')) { $service = new addValidationSettings(); $service([]); $this->setVersion('2.17.2'); } $this->skip('2.17.2', '2.19.0'); if ($this->isVersion('2.19.0')) { if (!$this->getServiceManager()->has(SimpleExporter::SERVICE_ID)) { $service = new ItemExporter(array('fileSystem' => 'taoQtiItem', 'fileLocation' => 'export' . DIRECTORY_SEPARATOR . 'export.csv', 'extractors' => array('OntologyExtractor' => new OntologyExtractor(), 'QtiExtractor' => new QtiExtractor()), 'columns' => array('label' => array('extractor' => 'OntologyExtractor', 'parameters' => array('property' => RDFS_LABEL)), 'type' => array('extractor' => 'QtiExtractor', 'parameters' => array('callback' => 'getInteractionType')), 'nb choice' => array('extractor' => 'QtiExtractor', 'parameters' => array('callback' => 'getNumberOfChoices')), 'BR' => array('extractor' => 'QtiExtractor', 'parameters' => array('callback' => 'getRightAnswer', 'callbackParameters' => array('delimiter' => '|'))), 'choiceInteraction' => array('extractor' => 'QtiExtractor', 'parameters' => array('callback' => 'getChoices', 'valuesAsColumns' => true))))); $service->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(SimpleExporter::SERVICE_ID, $service); $createExportDirectoryScript = new createExportDirectory(); $createExportDirectoryScript([]); } $this->setVersion('2.20.0'); } $this->skip('2.20.0', '2.22.0'); if ($this->isVersion('2.22.0')) { $simpleExporter = $this->getServiceManager()->get(SimpleExporter::SERVICE_ID); $columns = $simpleExporter->getOption('columns'); $responseIdentifier['responseIdentifier'] = array('extractor' => 'QtiExtractor', 'parameters' => array('callback' => 'getResponseIdentifier')); $offset = array_search('BR', array_keys($columns)); $columns = array_slice($columns, 0, $offset, true) + $responseIdentifier + array_slice($columns, $offset, NULL, true); $simpleExporter->setOption('columns', $columns); $simpleExporter->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(SimpleExporter::SERVICE_ID, $simpleExporter); $this->setVersion('2.23.0'); } if ($this->isVersion('2.23.0')) { $simpleExporter = $this->getServiceManager()->get(SimpleExporter::SERVICE_ID); $columns = $simpleExporter->getOption('columns'); $columns['BR'] = array('extractor' => 'QtiExtractor', 'parameters' => array('callback' => 'getRightAnswer', 'callbackParameters' => array('delimiter' => '|'), 'valuesAsColumns' => true)); $simpleExporter->setOption('columns', $columns); $simpleExporter->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(SimpleExporter::SERVICE_ID, $simpleExporter); $this->setVersion('2.24.0'); } $this->skip('2.24.0', '2.25.0'); if ($this->isVersion('2.25.0')) { QtiCreatorClientConfigRegistry::getRegistry()->registerPlugin('back', 'taoQtiItem/qtiCreator/plugins/navigation/back', 'navigation'); $this->setVersion('2.26.0'); } if ($this->isVersion('2.26.0')) { AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAOItem.rdf#AbstractItemAuthor', QtiPreview::class)); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAOItem.rdf#AbstractItemAuthor', QtiCreator::class)); AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAOItem.rdf#AbstractItemAuthor', QtiCssAuthoring::class)); $this->setVersion('2.27.0'); } $this->skip('2.27.0', '2.28.2'); if ($this->isVersion('2.28.2')) { $setDragAndDropConfig = new SetDragAndDropConfig(); $setDragAndDropConfig([]); $this->setVersion('2.29.0'); } $this->skip('2.29.0', '2.30.1'); if ($this->isVersion('2.30.1')) { $setDragAndDropConfig = new SetDragAndDropConfig(); $setDragAndDropConfig([]); $this->setVersion('2.31.0'); } $this->skip('2.31.0', '5.1.2'); if ($this->isVersion('5.1.2')) { $sharedLibRegistry->registerFromFile('OAT/jquery.qtip', $installBasePath . '/OAT/jquery.qtip.js'); $this->setVersion('5.2.0'); } $this->skip('5.2.0', '5.3.0'); if ($this->isVersion('5.3.0')) { $sharedLibRegistry->registerFromFile('OAT/customEvent', $installBasePath . '/OAT/customEvent.js'); $this->setVersion('5.4.0'); } $this->skip('5.4.0', '5.7.0'); if ($this->isVersion('5.7.0')) { $eventManager = $this->getServiceManager()->get(\oat\oatbox\event\EventManager::CONFIG_ID); $eventManager->attach(\oat\taoItems\model\event\ItemRdfUpdatedEvent::class, array(\oat\taoQtiItem\model\Listener\ItemUpdater::class, 'catchItemRdfUpdatedEvent')); $this->getServiceManager()->register(\oat\oatbox\event\EventManager::CONFIG_ID, $eventManager); $this->setVersion('5.7.1'); } $this->skip('5.7.1', '5.7.3'); if ($this->isVersion('5.7.3')) { $categoriesService = new ItemCategoriesService(array('properties' => array())); $categoriesService->setServiceManager($this->getServiceManager()); $this->getServiceManager()->register(ItemCategoriesService::SERVICE_ID, $categoriesService); $this->setVersion('5.8.0'); } $this->skip('5.8.0', '6.3.0'); }
/** * Register the libraries referenced by an item at location $path. All <pci:lib> elements will be parsed * and then registered through the registery. * * If a library cannot be found at the locations listed by the referenced by the <pci:resources>->location attribute, * the registry will try to find these libraries on the file system, using the location of the item file as a base path. * * @param string $path The path to the XML file. * @throws SharedLibraryNotFoundException If a library referenced by a <pci:lib> element in the item cannot be found. */ public function registerFromItem($path) { $dom = new DOMDocument('1.0', 'UTF-8'); $dom->load($path); $basePath = pathinfo($dom->documentURI, PATHINFO_DIRNAME); $basePath = preg_replace('/^file:\\//', '', $basePath); $xpath = new DOMXPath($dom); $xpath->registerNamespace('pci', 'http://www.imsglobal.org/xsd/portableCustomInteraction'); $libElts = $xpath->query('//pci:lib'); for ($i = 0; $i < $libElts->length; $i++) { $libElt = $libElts->item($i); if (($name = $libElt->getAttribute('name')) !== '') { // Is the library already registered? if (ClientLibRegistry::getRegistry()->isRegistered($name) === false) { // So we consider to find the library at item's $basePath . $name $expectedLibLocation = "{$basePath}/" . str_replace(array('tpl!', 'css!'), '', $name); // Might throw a SharedLibraryNotFoundException, let it go... $this->registerFromFile($name, $expectedLibLocation); } } } }