applicationFactory = $applicationFactory; } /** * Runs at the earliest possible event to initialize functions or hooks that * are otherwise too late for the hook system to be recognized. * * @since 3.0 */ public static function initExtension( &$vars ) { /** * @see https://www.mediawiki.org/wiki/Localisation#Localising_namespaces_and_special_page_aliases */ $vars['wgMessagesDirs']['SemanticMediaWiki'] = $vars['smwgIP'] . 'i18n'; $vars['wgExtensionMessagesFiles']['SemanticMediaWikiAlias'] = $vars['smwgIP'] . 'i18n/extra/SemanticMediaWiki.alias.php'; $vars['wgExtensionMessagesFiles']['SemanticMediaWikiMagic'] = $vars['smwgIP'] . 'i18n/extra/SemanticMediaWiki.magic.php'; HookRegistry::initExtension( $vars ); } /** * @see HookRegistry::initExtension */ public static function getAPIModules() { if ( !ApplicationFactory::getInstance()->getSettings()->get( 'smwgSemanticsEnabled' ) ) { return []; } return [ 'smwinfo' => '\SMW\MediaWiki\Api\Info', 'smwtask' => '\SMW\MediaWiki\Api\Task', 'smwbrowse' => '\SMW\MediaWiki\Api\Browse', 'ask' => '\SMW\MediaWiki\Api\Ask', 'askargs' => '\SMW\MediaWiki\Api\AskArgs', 'browsebysubject' => '\SMW\MediaWiki\Api\BrowseBySubject', 'browsebyproperty' => '\SMW\MediaWiki\Api\BrowseByProperty' ]; } /** * @see HookRegistry::initExtension */ public static function initSpecialPageList( array &$specialPages ) { if ( !ApplicationFactory::getInstance()->getSettings()->get( 'smwgSemanticsEnabled' ) ) { return; } $specials = [ 'Ask' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialAsk' ], 'Browse' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialBrowse' ], 'PageProperty' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialPageProperty' ], 'SearchByProperty' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialSearchByProperty' ], 'ProcessingErrorList' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialProcessingErrorList' ], 'PropertyLabelSimilarity' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialPropertyLabelSimilarity' ], 'SMWAdmin' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialAdmin' ], 'Concepts' => [ 'page' => 'SMW\SpecialConcepts' ], 'ExportRDF' => [ 'page' => 'SMWSpecialOWLExport' ], 'Types' => [ 'page' => 'SMWSpecialTypes' ], 'URIResolver' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialURIResolver' ], 'Properties' => [ 'page' => 'SMW\SpecialProperties' ], 'UnusedProperties' => [ 'page' => 'SMW\SpecialUnusedProperties' ], 'WantedProperties' => [ 'page' => 'SMW\SpecialWantedProperties' ], 'DeferredRequestDispatcher' => [ 'page' => 'SMW\MediaWiki\Specials\SpecialDeferredRequestDispatcher' ], ]; // Register data foreach ( $specials as $special => $page ) { $specialPages[$special] = $page['page']; } } /** * @since 3.0 */ public static function isEnabled() { return defined( 'SMW_VERSION' ) && $GLOBALS['smwgSemanticsEnabled']; } /** * @since 3.0 */ public static function isValid( $isCli = false ) { return Installer::isGoodSchema( $isCli ); } /** * @since 3.0 * * @param array &$vars */ public function loadSchema( &$vars ) { Installer::loadSchema( $vars ); } /** * @since 1.9 * * @param array &$vars * @param string $directory */ public function init( &$vars, $directory ) { $this->initMessageCallbackHandler(); if ( $this->isValid() === false ) { smwfAbort( Message::get( [ 'smw-upgrade-error', $vars['smwgUpgradeKey'] ], Message::PARSE ) . '

' . Message::get( 'smw-upgrade-error-why-title' ) . '

' . Message::get( 'smw-upgrade-error-why-explain', Message::PARSE ) . '

' . Message::get( 'smw-upgrade-error-how-title' ) . '

' . Message::get( 'smw-upgrade-error-how-explain', Message::PARSE ) ); } $this->addDefaultConfigurations( $vars ); if ( CompatibilityMode::extensionNotEnabled() ) { CompatibilityMode::disableSemantics(); } $this->initConnectionProviders( ); $this->registerJobClasses( $vars ); $this->registerPermissions( $vars ); $this->registerParamDefinitions( $vars ); $this->registerFooterIcon( $vars, $directory ); $this->registerHooks( $vars, $directory ); Hooks::run( 'SMW::Setup::AfterInitializationComplete', [ &$vars ] ); } private function addDefaultConfigurations( &$vars ) { $vars['wgLogTypes'][] = 'smw'; $vars['wgFilterLogTypes']['smw'] = true; $vars['smwgMasterStore'] = null; $vars['smwgIQRunningNumber'] = 0; if ( !isset( $vars['smwgNamespace'] ) ) { $vars['smwgNamespace'] = parse_url( $vars['wgServer'], PHP_URL_HOST ); } foreach ( $vars['smwgResourceLoaderDefFiles'] as $key => $file ) { if ( is_readable( $file ) ) { $vars['wgResourceModules'] = array_merge( $vars['wgResourceModules'], include ( $file ) ); } } } private function initConnectionProviders() { $mwCollaboratorFactory = $this->applicationFactory->newMwCollaboratorFactory(); $connectionManager = $this->applicationFactory->getConnectionManager(); $connectionManager->registerConnectionProvider( DB_MASTER, $mwCollaboratorFactory->newLoadBalancerConnectionProvider( DB_MASTER ) ); $connectionManager->registerConnectionProvider( DB_SLAVE, $mwCollaboratorFactory->newLoadBalancerConnectionProvider( DB_SLAVE ) ); $connectionManager->registerConnectionProvider( 'mw.db', $mwCollaboratorFactory->newConnectionProvider( 'mw.db' ) ); // Connection can be used to redirect queries to another DB cluster $connectionManager->registerConnectionProvider( 'mw.db.queryengine', $mwCollaboratorFactory->newConnectionProvider( 'mw.db.queryengine' ) ); $connectionManager->registerConnectionProvider( 'elastic', $this->applicationFactory->singleton( 'ElasticFactory' )->newConnectionProvider() ); } private function initMessageCallbackHandler() { Message::registerCallbackHandler( Message::TEXT, function( $arguments, $language ) { if ( $language === Message::CONTENT_LANGUAGE ) { $language = Localizer::getInstance()->getContentLanguage(); } if ( $language === Message::USER_LANGUAGE ) { $language = Localizer::getInstance()->getUserLanguage(); } return call_user_func_array( 'wfMessage', $arguments )->inLanguage( $language )->text(); } ); Message::registerCallbackHandler( Message::ESCAPED, function( $arguments, $language ) { if ( $language === Message::CONTENT_LANGUAGE ) { $language = Localizer::getInstance()->getContentLanguage(); } if ( $language === Message::USER_LANGUAGE ) { $language = Localizer::getInstance()->getUserLanguage(); } return call_user_func_array( 'wfMessage', $arguments )->inLanguage( $language )->escaped(); } ); Message::registerCallbackHandler( Message::PARSE, function( $arguments, $language ) { if ( $language === Message::CONTENT_LANGUAGE ) { $language = Localizer::getInstance()->getContentLanguage(); } if ( $language === Message::USER_LANGUAGE ) { $language = Localizer::getInstance()->getUserLanguage(); } $message = call_user_func_array( 'wfMessage', $arguments )->inLanguage( $language ); // 1.27+ // [GlobalTitleFail] MessageCache::parse called by ... // Message::parseText/MessageCache::parse with no title set. // // Message::setInterfaceMessageFlag "... used to restore the flag // after setting a language" return $message->setInterfaceMessageFlag( true )->title( $GLOBALS['wgTitle'] )->parse(); } ); } /** * @see https://www.mediawiki.org/wiki/Manual:$wgJobClasses */ private function registerJobClasses( &$vars ) { $jobClasses = [ 'smw.update' => 'SMW\MediaWiki\Jobs\UpdateJob', 'smw.refresh' => 'SMW\MediaWiki\Jobs\RefreshJob', 'smw.updateDispatcher' => 'SMW\MediaWiki\Jobs\UpdateDispatcherJob', 'smw.parserCachePurge' => 'SMW\MediaWiki\Jobs\ParserCachePurgeJob', 'smw.fulltextSearchTableUpdate' => 'SMW\MediaWiki\Jobs\FulltextSearchTableUpdateJob', 'smw.entityIdDisposer' => 'SMW\MediaWiki\Jobs\EntityIdDisposerJob', 'smw.propertyStatisticsRebuild' => 'SMW\MediaWiki\Jobs\PropertyStatisticsRebuildJob', 'smw.fulltextSearchTableRebuild' => 'SMW\MediaWiki\Jobs\FulltextSearchTableRebuildJob', 'smw.changePropagationDispatch' => 'SMW\MediaWiki\Jobs\ChangePropagationDispatchJob', 'smw.changePropagationUpdate' => 'SMW\MediaWiki\Jobs\ChangePropagationUpdateJob', 'smw.changePropagationClassUpdate' => 'SMW\MediaWiki\Jobs\ChangePropagationClassUpdateJob', 'smw.elasticIndexerRecovery' => 'SMW\Elastic\Indexer\IndexerRecoveryJob', 'smw.elasticFileIngest' => 'SMW\Elastic\Indexer\FileIngestJob', // Legacy 3.0- 'SMW\UpdateJob' => 'SMW\MediaWiki\Jobs\UpdateJob', 'SMW\RefreshJob' => 'SMW\MediaWiki\Jobs\RefreshJob', 'SMW\UpdateDispatcherJob' => 'SMW\MediaWiki\Jobs\UpdateDispatcherJob', 'SMW\ParserCachePurgeJob' => 'SMW\MediaWiki\Jobs\ParserCachePurgeJob', 'SMW\FulltextSearchTableUpdateJob' => 'SMW\MediaWiki\Jobs\FulltextSearchTableUpdateJob', 'SMW\EntityIdDisposerJob' => 'SMW\MediaWiki\Jobs\EntityIdDisposerJob', 'SMW\PropertyStatisticsRebuildJob' => 'SMW\MediaWiki\Jobs\PropertyStatisticsRebuildJob', 'SMW\FulltextSearchTableRebuildJob' => 'SMW\MediaWiki\Jobs\FulltextSearchTableRebuildJob', 'SMW\ChangePropagationDispatchJob' => 'SMW\MediaWiki\Jobs\ChangePropagationDispatchJob', 'SMW\ChangePropagationUpdateJob' => 'SMW\MediaWiki\Jobs\ChangePropagationUpdateJob', 'SMW\ChangePropagationClassUpdateJob' => 'SMW\MediaWiki\Jobs\ChangePropagationClassUpdateJob', // Legacy 2.0- 'SMWUpdateJob' => 'SMW\MediaWiki\Jobs\UpdateJob', 'SMWRefreshJob' => 'SMW\MediaWiki\Jobs\RefreshJob' ]; foreach ( $jobClasses as $job => $class ) { $vars['wgJobClasses'][$job] = $class; } } /** * @see https://www.mediawiki.org/wiki/Manual:$wgAvailableRights * @see https://www.mediawiki.org/wiki/Manual:$wgGroupPermissions */ private function registerPermissions( &$vars ) { if ( !$this->applicationFactory->getSettings()->get( 'smwgSemanticsEnabled' ) ) { return; } $rights = [ 'smw-admin' => [ 'sysop', 'smwadministrator' ], 'smw-patternedit' => [ 'smwcurator' ], 'smw-schemaedit' => [ 'smwcurator' ], 'smw-pageedit' => [ 'smwcurator' ], // 'smw-watchlist' => [ // 'smwcurator' // ], ]; foreach ( $rights as $right => $roles ) { // Rights $vars['wgAvailableRights'][] = $right; // User group rights foreach ( $roles as $role ) { if ( !isset( $vars['wgGroupPermissions'][$role][$right] ) ) { $vars['wgGroupPermissions'][$role][$right] = true; } } } // Add an additional protection level restricting edit/move/etc if ( ( $editProtectionRight = $this->applicationFactory->getSettings()->get( 'smwgEditProtectionRight' ) ) !== false ) { $vars['wgRestrictionLevels'][] = $editProtectionRight; } } private function registerParamDefinitions( &$vars ) { $vars['wgParamDefinitions']['smwformat'] = [ 'definition'=> 'SMWParamFormat', ]; } /** * @see https://www.mediawiki.org/wiki/Manual:$wgFooterIcons */ private function registerFooterIcon( &$vars, $path ) { if ( !$this->applicationFactory->getSettings()->get( 'smwgSemanticsEnabled' ) ) { return; } if( isset( $vars['wgFooterIcons']['poweredby']['semanticmediawiki'] ) ) { return; } $src = ''; if ( is_file( $path . '/res/DataURI.php' ) && ( $dataURI = include $path . '/res/DataURI.php' ) !== [] ) { $src = $dataURI['footer']; } $vars['wgFooterIcons']['poweredby']['semanticmediawiki'] = [ 'src' => $src, 'url' => 'https://www.semantic-mediawiki.org/wiki/Semantic_MediaWiki', 'alt' => 'Powered by Semantic MediaWiki' ]; } /** * @see https://www.mediawiki.org/wiki/Manual:$wgHooks * * @note $wgHooks contains a list of hooks which specifies for every event an * array of functions to be called. */ private function registerHooks( &$vars, $directory ) { $hookRegistry = new HookRegistry( $vars, $directory ); $hookRegistry->register(); if ( !$this->applicationFactory->getSettings()->get( 'smwgSemanticsEnabled' ) ) { return; } // Old-style registration $vars['wgHooks']['AdminLinks'][] = 'SMWExternalHooks::addToAdminLinks'; $vars['wgHooks']['PageSchemasRegisterHandlers'][] = 'SMWExternalHooks::onPageSchemasRegistration'; } }