/** * Validate if value is writable by current writer * Validation is handle by property validators * * @param $data * @return bool * @throws MetadataWriterException */ public function validate($data) { try { /** @var \tao_helpers_form_Validator[] $validators */ $validators = ValidationRuleRegistry::getRegistry()->getValidators($this->getPropertyToWrite()); } catch (\common_exception_NotFound $e) { throw new MetadataWriterException($e->getMessage()); } $validated = true; foreach ($validators as $validator) { if (!$validator->evaluate($data)) { $validated = false; \common_Logger::d('Unable to validate value for property "' . $this->getPropertyToWrite()->getUri() . '"' . ' against validator "' . $validator->getName() . '" : "' . $validator->getMessage() . '".'); } } return $validated; }
/** * Enable you to map an rdf property to a form element using the Widget * * @access public * @author Bertrand Chevrier, <*****@*****.**> * @param core_kernel_classes_Property $property * @return tao_helpers_form_FormElement */ public static function elementMap(core_kernel_classes_Property $property) { $returnValue = null; //create the element from the right widget $property->feed(); $widgetResource = $property->getWidget(); if (is_null($widgetResource)) { return null; } //authoring widget is not used in standalone mode if ($widgetResource->getUri() === 'http://www.tao.lu/datatypes/WidgetDefinitions.rdf#Authoring' && tao_helpers_Context::check('STANDALONE_MODE')) { return null; } // horrible hack to fix file widget if ($widgetResource->getUri() === 'http://www.tao.lu/datatypes/WidgetDefinitions.rdf#AsyncFile') { $widgetResource = new core_kernel_classes_Resource('http://www.tao.lu/datatypes/WidgetDefinitions.rdf#GenerisAsyncFile'); } $element = tao_helpers_form_FormFactory::getElementByWidget(tao_helpers_Uri::encode($property->getUri()), $widgetResource); if (!is_null($element)) { if ($element->getWidget() !== $widgetResource->getUri()) { common_Logger::w('Widget definition differs from implementation: ' . $element->getWidget() . ' != ' . $widgetResource->getUri()); return null; } //use the property label as element description $propDesc = strlen(trim($property->getLabel())) > 0 ? $property->getLabel() : str_replace(LOCAL_NAMESPACE, '', $property->getUri()); $element->setDescription($propDesc); //multi elements use the property range as options if (method_exists($element, 'setOptions')) { $range = $property->getRange(); if ($range !== null) { $options = array(); if ($element instanceof TreeAware) { $sortedOptions = $element->rangeToTree($property->getUri() === RDFS_RANGE ? new core_kernel_classes_Class(RDFS_RESOURCE) : $range); } else { /** @var core_kernel_classes_Resource $rangeInstance */ foreach ($range->getInstances(true) as $rangeInstance) { $level = $rangeInstance->getOnePropertyValue(new core_kernel_classes_Property(TAO_LIST_LEVEL_PROP)); if (is_null($level)) { $options[tao_helpers_Uri::encode($rangeInstance->getUri())] = array(tao_helpers_Uri::encode($rangeInstance->getUri()), $rangeInstance->getLabel()); } else { $level = $level instanceof core_kernel_classes_Resource ? $level->getUri() : (string) $level; $options[$level] = array(tao_helpers_Uri::encode($rangeInstance->getUri()), $rangeInstance->getLabel()); } } ksort($options); $sortedOptions = array(); foreach ($options as $id => $values) { $sortedOptions[$values[0]] = $values[1]; } //set the default value to an empty space if (method_exists($element, 'setEmptyOption')) { $element->setEmptyOption(' '); } } //complete the options listing $element->setOptions($sortedOptions); } } foreach (ValidationRuleRegistry::getRegistry()->getValidators($property) as $validator) { $element->addValidator($validator); } $returnValue = $element; } return $returnValue; }
public function __invoke($params) { ValidationRuleRegistry::getRegistry()->set('notEmpty', new \tao_helpers_form_validators_NotEmpty()); return new \common_report_Report(\common_report_Report::TYPE_SUCCESS, 'validator registered'); }
/** * * @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'); }