1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Mediawiki\DataModel; |
4
|
|
|
|
5
|
|
|
use InvalidArgumentException; |
6
|
|
|
use JsonSerializable; |
7
|
|
|
use RuntimeException; |
8
|
|
|
|
9
|
|
|
/** |
10
|
|
|
* Represents a collection of Log classes |
11
|
|
|
* |
12
|
|
|
* @author Addshore |
13
|
|
|
*/ |
14
|
|
|
class LogList implements JsonSerializable { |
15
|
|
|
|
16
|
|
|
/** |
17
|
|
|
* @var Log[] |
18
|
|
|
*/ |
19
|
|
|
private $logs; |
20
|
|
|
|
21
|
|
|
/** |
22
|
|
|
* @param Log[] $logs |
23
|
1 |
|
*/ |
24
|
1 |
|
public function __construct( $logs = [] ) { |
25
|
1 |
|
$this->logs = []; |
26
|
1 |
|
$this->addLogs( $logs ); |
27
|
|
|
} |
28
|
|
|
|
29
|
|
|
/** |
30
|
|
|
* @param Log[]|LogList $logs |
31
|
|
|
* |
32
|
|
|
* @throws InvalidArgumentException |
33
|
1 |
|
*/ |
34
|
1 |
View Code Duplication |
public function addLogs( $logs ) { |
|
|
|
|
35
|
|
|
if ( !is_array( $logs ) && !$logs instanceof LogList ) { |
36
|
|
|
throw new InvalidArgumentException( '$logs needs to either be an array or a LogList object' ); |
37
|
1 |
|
} |
38
|
|
|
if ( $logs instanceof LogList ) { |
39
|
|
|
$logs = $logs->toArray(); |
40
|
1 |
|
} |
41
|
1 |
|
foreach ( $logs as $log ) { |
42
|
1 |
|
$this->addLog( $log ); |
43
|
1 |
|
} |
44
|
|
|
} |
45
|
|
|
|
46
|
|
|
/** |
47
|
|
|
* @param Log $log |
48
|
1 |
|
*/ |
49
|
1 |
|
public function addLog( Log $log ) { |
50
|
1 |
|
$this->logs[$log->getId()] = $log; |
51
|
|
|
} |
52
|
|
|
|
53
|
|
|
/** |
54
|
|
|
* @param int $id |
55
|
|
|
* |
56
|
|
|
* @return bool |
57
|
|
|
*/ |
58
|
|
|
public function hasLogWithId( $id ) { |
59
|
|
|
return array_key_exists( $id, $this->logs ); |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
/** |
63
|
|
|
* @param Log $log |
64
|
|
|
* |
65
|
|
|
* @return bool |
66
|
|
|
*/ |
67
|
|
|
public function hasLog( Log $log ) { |
68
|
|
|
return array_key_exists( $log->getId(), $this->logs ); |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
/** |
72
|
|
|
* @return Log|null Log or null if there is no log |
73
|
|
|
*/ |
74
|
|
|
public function getLatest() { |
75
|
|
|
if ( empty( $this->logs ) ) { |
76
|
|
|
return null; |
77
|
|
|
} |
78
|
|
|
return $this->logs[ max( array_keys( $this->logs ) ) ]; |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
/** |
82
|
|
|
* @since 0.6 |
83
|
|
|
* @return Log|null Log or null if there is no log |
84
|
|
|
*/ |
85
|
|
|
public function getOldest() { |
86
|
|
|
if ( empty( $this->logs ) ) { |
87
|
|
|
return null; |
88
|
|
|
} |
89
|
|
|
return $this->logs[ min( array_keys( $this->logs ) ) ]; |
90
|
|
|
} |
91
|
|
|
|
92
|
|
|
/** |
93
|
|
|
* @since 0.6 |
94
|
|
|
* @return bool |
95
|
|
|
*/ |
96
|
|
|
public function isEmpty() { |
97
|
|
|
return empty( $this->logs ); |
98
|
|
|
} |
99
|
|
|
|
100
|
|
|
/** |
101
|
|
|
* @param int $id |
102
|
|
|
* |
103
|
|
|
* @throws RuntimeException |
104
|
|
|
* @return Log |
105
|
|
|
*/ |
106
|
|
|
public function get( $id ) { |
107
|
|
|
if ( $this->hasLogWithId( $id ) ) { |
108
|
|
|
return $this->logs[$id]; |
109
|
|
|
} |
110
|
|
|
throw new RuntimeException( 'No such Log loaded in LogList object' ); |
111
|
|
|
} |
112
|
|
|
|
113
|
|
|
/** |
114
|
|
|
* @return Log[] |
115
|
1 |
|
*/ |
116
|
1 |
|
public function toArray() { |
117
|
|
|
return $this->logs; |
118
|
|
|
} |
119
|
|
|
|
120
|
|
|
/** |
121
|
|
|
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php |
122
|
1 |
|
*/ |
123
|
1 |
|
public function jsonSerialize() { |
124
|
|
|
return $this->toArray(); |
125
|
|
|
} |
126
|
|
|
|
127
|
|
|
/** |
128
|
|
|
* @param array $json |
129
|
|
|
* |
130
|
|
|
* @return self |
131
|
1 |
|
*/ |
132
|
1 |
|
public static function jsonDeserialize( $json ) { |
133
|
1 |
|
$self = new LogList(); |
134
|
1 |
|
foreach ( $json as $logJson ) { |
135
|
1 |
|
$self->addLog( Log::jsonDeserialize( $logJson ) ); |
136
|
1 |
|
} |
137
|
|
|
return $self; |
138
|
|
|
} |
139
|
|
|
} |
140
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.