Passed
Push — langAssertions ( 0e6369...680829 )
by no
27:39 queued 24:23
created

TermList   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 168
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 24
c 3
b 0
f 0
lcom 1
cbo 1
dl 0
loc 168
rs 10

13 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 3
A count() 0 3 1
A toTextArray() 0 9 2
A getIterator() 0 3 1
A getByLanguage() 0 7 2
A getWithLanguages() 0 3 1
A removeByLanguage() 0 3 1
A hasTermForLanguage() 0 3 1
A setTerm() 0 8 2
A setTextForLanguage() 0 3 1
B equals() 0 19 6
A isEmpty() 0 3 1
A hasTerm() 0 4 2
1
<?php
2
3
namespace Wikibase\DataModel\Term;
4
5
use ArrayIterator;
6
use Comparable;
7
use Countable;
8
use InvalidArgumentException;
9
use IteratorAggregate;
10
use OutOfBoundsException;
11
use Traversable;
12
13
/**
14
 * Unordered list of Term objects.
15
 * If multiple terms with the same language code are provided, only the last one will be retained.
16
 * Empty terms are skipped and treated as non-existing.
17
 *
18
 * @since 0.7.3
19
 *
20
 * @licence GNU GPL v2+
21
 * @author Jeroen De Dauw < [email protected] >
22
 */
23
class TermList implements Countable, IteratorAggregate, Comparable {
24
25
	/**
26
	 * @var Term[]
27
	 */
28
	private $terms = array();
29
30
	/**
31
	 * @param Term[] $terms
32
	 * @throws InvalidArgumentException
33
	 */
34
	public function __construct( array $terms = array() ) {
35
		foreach ( $terms as $term ) {
36
			if ( !( $term instanceof Term ) ) {
37
				throw new InvalidArgumentException( 'Every element in $terms must be an instance of Term' );
38
			}
39
40
			$this->setTerm( $term );
41
		}
42
	}
43
44
	/**
45
	 * @see Countable::count
46
	 * @return int
47
	 */
48
	public function count() {
49
		return count( $this->terms );
50
	}
51
52
	/**
53
	 * Returns an array with language codes as keys and the term text as values.
54
	 *
55
	 * @return string[]
56
	 */
57
	public function toTextArray() {
58
		$array = array();
59
60
		foreach ( $this->terms as $term ) {
61
			$array[$term->getLanguageCode()] = $term->getText();
62
		}
63
64
		return $array;
65
	}
66
67
	/**
68
	 * @see IteratorAggregate::getIterator
69
	 * @return Traversable|Term[]
70
	 */
71
	public function getIterator() {
72
		return new ArrayIterator( $this->terms );
73
	}
74
75
	/**
76
	 * @param string $languageCode
77
	 *
78
	 * @return Term
79
	 * @throws OutOfBoundsException
80
	 */
81
	public function getByLanguage( $languageCode ) {
82
		if ( !array_key_exists( $languageCode, $this->terms ) ) {
83
			throw new OutOfBoundsException( 'Term with languageCode "' . $languageCode . '" not found' );
84
		}
85
86
		return $this->terms[$languageCode];
87
	}
88
89
	/**
90
	 * @since 2.5
91
	 *
92
	 * @param string[] $languageCodes
93
	 *
94
	 * @return self
95
	 */
96
	public function getWithLanguages( array $languageCodes ) {
97
		return new self( array_intersect_key( $this->terms, array_flip( $languageCodes ) ) );
98
	}
99
100
	/**
101
	 * @param string $languageCode
102
	 */
103
	public function removeByLanguage( $languageCode ) {
104
		unset( $this->terms[$languageCode] );
105
	}
106
107
	/**
108
	 * @param string $languageCode
109
	 *
110
	 * @return bool
111
	 */
112
	public function hasTermForLanguage( $languageCode ) {
113
		return array_key_exists( $languageCode, $this->terms );
114
	}
115
116
	/**
117
	 * Replaces non-empty or removes empty terms.
118
	 *
119
	 * @param Term $term
120
	 */
121
	public function setTerm( Term $term ) {
122
		if ( $term->getText() === '' ) {
123
			unset( $this->terms[$term->getLanguageCode()] );
124
		}
125
		else {
126
			$this->terms[$term->getLanguageCode()] = $term;
127
		}
128
	}
129
130
	/**
131
	 * @since 0.8
132
	 *
133
	 * @param string $languageCode
134
	 * @param string $termText
135
	 */
136
	public function setTextForLanguage( $languageCode, $termText ) {
137
		$this->setTerm( new Term( $languageCode, $termText ) );
138
	}
139
140
	/**
141
	 * @see Comparable::equals
142
	 *
143
	 * @since 0.7.4
144
	 *
145
	 * @param mixed $target
146
	 *
147
	 * @return bool
148
	 */
149
	public function equals( $target ) {
150
		if ( $this === $target ) {
151
			return true;
152
		}
153
154
		if ( !( $target instanceof self )
155
			|| $this->count() !== $target->count()
156
		) {
157
			return false;
158
		}
159
160
		foreach ( $this->terms as $term ) {
161
			if ( !$target->hasTerm( $term ) ) {
162
				return false;
163
			}
164
		}
165
166
		return true;
167
	}
168
169
	/**
170
	 * @since 2.4.0
171
	 *
172
	 * @return bool
173
	 */
174
	public function isEmpty() {
175
		return empty( $this->terms );
176
	}
177
178
	/**
179
	 * @since 0.7.4
180
	 *
181
	 * @param Term $term
182
	 *
183
	 * @return boolean
184
	 */
185
	public function hasTerm( Term $term ) {
186
		return array_key_exists( $term->getLanguageCode(), $this->terms )
187
			&& $this->terms[$term->getLanguageCode()]->equals( $term );
188
	}
189
190
}
191