store = $store;
$this->propertySpecificationReqExaminer = $propertySpecificationReqExaminer;
}
/**
* @since 2.5
*
* @param SemanticData|null $semanticData
*/
public function setSemanticData( SemanticData $semanticData = null ) {
$this->semanticData = $semanticData;
$this->propertySpecificationReqExaminer->setSemanticData(
$semanticData
);
}
/**
* @since 3.0
*
* @param array $propertyReservedNameList
*/
public function setPropertyReservedNameList( array $propertyReservedNameList ) {
foreach ( $propertyReservedNameList as $name ) {
if ( strpos( $name, 'smw-property-reserved' ) !== false ) {
$name = Message::get( $name, Message::TEXT, Message::CONTENT_LANGUAGE );
}
$this->propertyReservedNameList[$name] = true;
}
}
/**
* @since 3.0
*
* @param boolean
*/
public function reqLock() {
return $this->propertySpecificationReqExaminer->reqLock();
}
/**
* @since 3.0
*
* @param string
*/
public function getMessage() {
return $this->message;
}
/**
* @since 2.5
*
* @param DIProperty $property
*/
public function check( DIProperty $property ) {
$subject = $property->getCanonicalDiWikiPage();
$dataValue = DataValueFactory::getInstance()->newDataValueByItem(
$property
);
$propertyName = $dataValue->getFormattedLabel();
$this->message = $this->checkUniqueness( $property, $propertyName );
if ( isset( $this->propertyReservedNameList[$propertyName] ) ) {
$this->message .= $this->createMessage(
[
'error',
'smw-property-name-reserved',
$propertyName
]
);
}
$this->message .= $this->createMessage(
$this->propertySpecificationReqExaminer->check( $property )
);
if ( $this->propertySpecificationReqExaminer->reqLock() === false && ChangePropagationDispatchJob::hasPendingJobs( $subject ) ) {
$this->message .= $this->createMessage(
[
'warning',
'smw-property-req-violation-change-propagation-pending',
ChangePropagationDispatchJob::getPendingJobsCount( $subject )
]
);
}
if ( $this->semanticData !== null && $this->semanticData->hasProperty( new DIProperty( '_ERRC' ) ) ) {
$this->message .= $this->findErrorMessages();
}
if ( $this->semanticData !== null && ( $props = $this->semanticData->getPropertyValues( new DIProperty( '_TYPE' ) ) ) && count( $props ) > 1 ) {
$this->message .= $this->createMessage(
[
'warning',
'smw-property-req-violation-type'
]
);
}
if ( $property->isUserDefined() && wfMessage( 'smw-property-introductory-message-user' )->exists() ) {
$this->message .= $this->createIntroductoryMessage( 'smw-property-introductory-message-user', $propertyName );
}
if ( !$property->isUserDefined() && wfMessage( 'smw-property-introductory-message-special' )->exists() ) {
$this->message .= $this->createIntroductoryMessage( 'smw-property-introductory-message-special', $propertyName );
}
if ( wfMessage( 'smw-property-introductory-message' )->exists() ) {
$this->message .= $this->createIntroductoryMessage( 'smw-property-introductory-message', $propertyName );
}
if ( $property->isUserDefined() && $this->store->getPropertyTableInfoFetcher()->isFixedTableProperty( $property ) ) {
$this->message .= $this->createFixedTableMessage( $propertyName );
}
if ( !$property->isUserDefined() ) {
$this->message .= $this->createPredefinedPropertyMessage( $property, $propertyName );
}
$label = mb_strtolower( str_replace( ' ', '-', $propertyName ) );
if ( wfMessage( "smw-property-message-$label" )->exists() ) {
$this->message .= $this->createIntroductoryMessage( "smw-property-message-$label", $propertyName, false );
}
}
private function createMessage( $messsage ) {
if ( !is_array( $messsage ) ) {
return '';
}
$type = array_shift( $messsage );
return Html::rawElement(
'div',
[
'id' => $messsage[0],
'class' => 'plainlinks ' . ( $type !== '' ? 'smw-callout smw-callout-'. $type : '' )
],
Message::get( $messsage, Message::PARSE, Message::USER_LANGUAGE )
);
}
private function createIntroductoryMessage( $msgKey, $propertyName, $class = true ) {
$message = wfMessage( $msgKey, $propertyName )->parse();
if ( $message === '' ) {
return '';
}
if ( $class === true ) {
$class = 'smw-callout smw-callout-info';
}
return Html::rawElement(
'div',
[
'id' => "$msgKey",
'class' => "plainlinks $msgKey " . $class
],
$message
);
}
private function createFixedTableMessage( $propertyName ) {
return Html::rawElement(
'div',
[
'id' => 'smw-property-content-fixedtable-message',
'class' => 'plainlinks smw-callout smw-callout-info'
],
wfMessage( 'smw-property-userdefined-fixedtable', $propertyName )->parse()
);
}
/**
* Returns an introductory text for a predefined property
*
* @note In order to enable a more detailed description for a specific
* predefined property a concatenated message key can be used (e.g
* 'smw-property-predefined' + => '_asksi' ) but
* because translatewiki.net doesn't handle `_` well, convert `_` to `-`
* resulting in 'smw-property-predefined-asksi' as translatable key
*/
private function createPredefinedPropertyMessage( $property, $propertyName ) {
$key = $property->getKey();
$message = '';
if ( $property->isUserDefined() ) {
return $message;
}
if ( ( $messageKey = PropertyRegistry::getInstance()->findPropertyDescriptionMsgKeyById( $key ) ) !== '' ) {
$messageKeyLong = $messageKey . '-long';
} else {
$messageKey = 'smw-property-predefined' . str_replace( '_', '-', strtolower( $key ) );
$messageKeyLong = 'smw-property-predefined-long' . str_replace( '_', '-', strtolower( $key ) );
}
if ( wfMessage( $messageKey )->exists() ) {
$message .= wfMessage( $messageKey, $propertyName )->parse();
} else {
$message .= wfMessage( 'smw-property-predefined-default', $propertyName )->parse();
}
if ( wfMessage( $messageKeyLong )->exists() ) {
$message .= ' ' . wfMessage( $messageKeyLong )->parse();
}
$message .= ' ' . wfMessage( 'smw-property-predefined-common' )->parse();
return Html::rawElement(
'div',
[
'id' => 'smw-property-content-predefined-message',
'class' => 'smw-property-predefined-intro plainlinks'
],
$message
);
}
private function findErrorMessages() {
$pv = $this->semanticData->getPropertyValues( new DIProperty( '_ERRC' ) );
$errors = [];
foreach ( $pv as $v ) {
$subSemanticData = $this->semanticData->findSubSemanticData(
$v->getSubobjectName()
);
foreach ( $subSemanticData->getPropertyValues( new DIProperty( '_ERRT' ) ) as $error ) {
$errors[] = Message::decode( $error->getString(), Message::PARSE, Message::USER_LANGUAGE );
}
}
if ( $errors === [] ) {
return '';
}
return Html::rawElement(
'div',
[
'id' => 'smw-property-error-list',
'class' => 'plainlinks smw-callout smw-callout-error'
],
count( $errors ) > 1 ? '- ' . implode( '
- ', $errors ) . '
' : implode( '', $errors )
);
}
private function checkUniqueness( DIProperty $property, $propertyName ) {
if ( $this->store->getObjectIds()->isUnique( $property ) ) {
return '';
}
return Html::rawElement(
'div',
[
'id' => 'smw-property-uniqueness',
'class' => 'smw-callout smw-callout-error plainlinks'
],
Message::get( [ 'smw-property-label-uniqueness', $propertyName ], Message::PARSE, Message::USER_LANGUAGE )
);
}
}