Completed
Pull Request — 7.x (#767)
by no
05:10 queued 02:29
created

DispatchingEntityIdParser   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 67
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 8
lcom 1
cbo 2
dl 0
loc 67
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
B parse() 0 23 5
A buildId() 0 8 2
1
<?php
2
3
namespace Wikibase\DataModel\Entity;
4
5
use InvalidArgumentException;
6
7
/**
8
 * @since 4.2
9
 *
10
 * @license GPL-2.0+
11
 * @author Jeroen De Dauw < [email protected] >
12
 */
13
class DispatchingEntityIdParser implements EntityIdParser {
14
15
	/**
16
	 * @var callable[]
17
	 */
18
	private $idBuilders;
19
20
	/**
21
	 * Takes an array in which each key is a preg_match pattern.
22
	 * The first pattern the id matches against will be picked.
23
	 * The value this key points to has to be a builder function
24
	 * that takes as only required argument the id serialization
25
	 * (string) and returns an EntityId instance.
26
	 *
27
	 * @param callable[] $idBuilders
28
	 */
29
	public function __construct( array $idBuilders ) {
30
		$this->idBuilders = $idBuilders;
31
	}
32
33
	/**
34
	 * @param string $idSerialization
35
	 *
36
	 * @throws EntityIdParsingException
37
	 * @return EntityId
38
	 */
39
	public function parse( $idSerialization ) {
40
		if ( $this->idBuilders === [] ) {
41
			throw new EntityIdParsingException( 'No id builders are configured' );
42
		}
43
44
		try {
45
			list( , , $localId ) = EntityId::splitSerialization( $idSerialization );
46
		} catch ( InvalidArgumentException $ex ) {
47
			// EntityId::splitSerialization performs some sanity checks which
48
			// might result in an exception. Should this happen, re-throw the exception message
49
			throw new EntityIdParsingException( $ex->getMessage(), 0, $ex );
50
		}
51
52
		foreach ( $this->idBuilders as $idPattern => $idBuilder ) {
53
			if ( preg_match( $idPattern, $localId ) ) {
54
				return $this->buildId( $idBuilder, $idSerialization );
55
			}
56
		}
57
58
		throw new EntityIdParsingException(
59
			"The serialization \"$idSerialization\" is not recognized by the configured id builders"
60
		);
61
	}
62
63
	/**
64
	 * @param callable $idBuilder
65
	 * @param string $idSerialization
66
	 *
67
	 * @throws EntityIdParsingException
68
	 * @return EntityId
69
	 */
70
	private function buildId( $idBuilder, $idSerialization ) {
71
		try {
72
			return call_user_func( $idBuilder, $idSerialization );
73
		} catch ( InvalidArgumentException $ex ) {
74
			// Should not happen, but if it does, re-throw the original message
75
			throw new EntityIdParsingException( $ex->getMessage(), 0, $ex );
76
		}
77
	}
78
79
}
80