Completed
Push — master ( cffbb8...5e3d42 )
by Daniel
32s
created

PrefixMappingEntityIdParser::__construct()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 11
nc 2
nop 2
1
<?php
2
3
namespace Wikibase\DataModel\Services\EntityId;
4
5
use Wikimedia\Assert\Assert;
6
use Wikimedia\Assert\ParameterAssertionException;
7
use Wikibase\DataModel\Entity\EntityId;
8
use Wikibase\DataModel\Entity\EntityIdParser;
9
use Wikibase\DataModel\Entity\EntityIdParsingException;
10
11
/**
12
 * EntityIdParser that maps a prefix of id serialization to a local prefix
13
 * according to the prefix mapping, or adds a fixed prefix to the id serialization
14
 * not containing a mapped prefix, and parses resulting string as an EntityId.
15
 * This can be used to prefix IDs of entities coming from a foreign repository
16
 * with the repository name to avoid clashes with IDs of local entities.
17
 *
18
 * @see docs/foreign-entity-ids.wiki in the DataModel module
19
 *
20
 * @since 3.7
21
 *
22
 * @license GPL-2.0+
23
 */
24
class PrefixMappingEntityIdParser implements EntityIdParser {
25
26
	/**
27
	 * @var string[]
28
	 */
29
	private $prefixMapping;
30
31
	/**
32
	 * @var EntityIdParser
33
	 */
34
	private $idParser;
35
36
	/**
37
	 * @param string[] $prefixMapping Must contain an empty-string key defining prefix added to id serializations
38
	 *        that do not contain any of prefixed defined in $prefixMapping. Values should not contain colons,
39
	 *        in particular at the end of the string
40
	 * @param EntityIdParser $idParser
41
	 *
42
	 * @throws ParameterAssertionException
43
	 */
44
	public function __construct( array $prefixMapping, EntityIdParser $idParser ) {
45
		Assert::parameterElementType( 'string', $prefixMapping, '$prefixMapping' );
46
		Assert::parameterElementType( 'string', array_keys( $prefixMapping ), 'array_keys( $prefixMapping )' );
47
		Assert::parameter( isset( $prefixMapping[''] ), '$prefixMapping', 'must contain an empty-string key' );
48
		foreach ( $prefixMapping as $value ) {
49
			Assert::parameter(
50
				strpos( $value, ':') === false,
51
				'$prefixMapping',
52
				'must not contain strings containing colons'
53
			);
54
		}
55
56
		//$this->prefix = $prefix;
57
		$this->prefixMapping = $prefixMapping;
58
		$this->idParser = $idParser;
59
	}
60
61
	/**
62
	 * Maps prefix(es) of the id serialization according to the prefix mapping definition, or adds a fixed prefix
63
	 * to the id serialization if there is no relevant prefix mapping,
64
	 * Resulting id serialization is parsed as an EntityId.
65
	 *
66
	 * @see docs/foreign-entity-ids.wiki in the DataModel module
67
	 *
68
	 * @param string $idSerialization
69
	 *
70
	 * @return EntityId
71
	 * @throws EntityIdParsingException
72
	 */
73
	public function parse( $idSerialization ) {
74
		$defaultPrefix = $this->prefixMapping[''];
75
		list( $repoName, $extraPrefixes, $relativeId ) = EntityId::splitSerialization( $idSerialization );
76
		if ( $repoName !== '' && isset( $this->prefixMapping[$repoName] ) ) {
77
			$prefixedIdSerialization = EntityId::joinSerialization( [
78
				$this->prefixMapping[$repoName], $extraPrefixes, $relativeId
79
			] );
80
		} else {
81
			$prefixedIdSerialization = EntityId::joinSerialization( [ $defaultPrefix, '', $idSerialization ] );
82
		}
83
		return $this->idParser->parse( $prefixedIdSerialization );
84
	}
85
86
}
87