containerBuilder = $containerBuilder; } /** * @since 2.5 * * @param DataValue $dataValue * * @return InfoLinksProvider */ public function newInfoLinksProvider( DataValue $dataValue ) { return new InfoLinksProvider( $dataValue, $this->getPropertySpecificationLookup() ); } /** * @since 3.0 * * @return DataValueFactory */ public function getDataValueFactory() { return DataValueFactory::getInstance(); } /** * Imported functions registered with DataTypeRegistry::registerExtraneousFunction * * @since 2.5 * * @param array $extraneousFunctions */ public function importExtraneousFunctions( array $extraneousFunctions ) { foreach ( $extraneousFunctions as $serviceName => $calllback ) { $this->containerBuilder->registerCallback( self::TYPE_EXT_FUNCTION . $serviceName, $calllback ); } } /** * @since 2.5 * * @param string $serviceName * * @return mixed */ public function newExtraneousFunctionByName( $serviceName ) { return $this->containerBuilder->create( self::TYPE_EXT_FUNCTION . $serviceName ); } /** * @since 2.5 * * @param string $typeId * @param string $class * * @return DataValue */ public function newDataValueByType( $typeId, $class ) { if ( $this->containerBuilder->isRegistered( self::TYPE_INSTANCE . $typeId ) ) { return $this->containerBuilder->create( self::TYPE_INSTANCE . $typeId ); } // Legacy invocation, for those that have not been defined yet!s return new $class( $typeId ); } /** * @since 2.5 * * @param DataValue $dataValue * * @return ValueParser */ public function getValueParser( DataValue $dataValue ) { return $this->containerBuilder->singleton( self::TYPE_PARSER . $dataValue->getTypeID() ); } /** * @since 2.5 * * @param DataValue $dataValue * * @return ValueFormatter */ public function getValueFormatter( DataValue $dataValue ) { $id = self::TYPE_FORMATTER . $dataValue->getTypeID(); if ( $this->containerBuilder->isRegistered( $id ) ) { $dataValueFormatter = $this->containerBuilder->singleton( $id ); } else { $dataValueFormatter = $this->getDispatchableValueFormatter( $dataValue ); } $dataValueFormatter->setDataValue( $dataValue ); return $dataValueFormatter; } /** * @since 2.5 * * @return ConstraintValueValidator */ public function getConstraintValueValidator() { return $this->containerBuilder->singleton( self::TYPE_VALIDATOR . 'CompoundConstraintValueValidator' ); } /** * @since 2.5 * * @return PropertySpecificationLookup */ public function getPropertySpecificationLookup() { return $this->containerBuilder->singleton( 'PropertySpecificationLookup' ); } /** * @since 3.0 * * @return PropertyRestrictionExaminer */ public function getPropertyRestrictionExaminer() { $propertyRestrictionExaminer = $this->containerBuilder->singleton( 'PropertyRestrictionExaminer' ); $propertyRestrictionExaminer->setUser( $GLOBALS['wgUser'] ); return $propertyRestrictionExaminer; } private function getDispatchableValueFormatter( $dataValue ) { if ( $this->dispatchingDataValueFormatter === null ) { $this->dispatchingDataValueFormatter = $this->newDispatchingDataValueFormatter(); } return $this->dispatchingDataValueFormatter->getDataValueFormatterFor( $dataValue ); } private function newDispatchingDataValueFormatter() { $dispatchingDataValueFormatter = new DispatchingDataValueFormatter(); // To be checked only after DispatchingDataValueFormatter::addDataValueFormatter did // not match any previous registered DataValueFormatters $dispatchingDataValueFormatter->addDefaultDataValueFormatter( $this->containerBuilder->singleton( self::TYPE_FORMATTER . StringValue::TYPE_ID ) ); $dispatchingDataValueFormatter->addDefaultDataValueFormatter( $this->containerBuilder->singleton( self::TYPE_FORMATTER . NumberValue::TYPE_ID ) ); $dispatchingDataValueFormatter->addDefaultDataValueFormatter( $this->containerBuilder->singleton( self::TYPE_FORMATTER . TimeValue::TYPE_ID ) ); $dispatchingDataValueFormatter->addDefaultDataValueFormatter( new NoValueFormatter() ); return $dispatchingDataValueFormatter; } }