Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
40.91% |
27 / 66 |
|
0.00% |
0 / 3 |
CRAP | |
0.00% |
0 / 1 |
MapServices | |
40.91% |
27 / 66 |
|
0.00% |
0 / 3 |
111.99 | |
0.00% |
0 / 1 |
getServiceInstance | |
49.09% |
27 / 55 |
|
0.00% |
0 / 1 |
35.30 | |||
getServicesList | |
0.00% |
0 / 10 |
|
0.00% |
0 / 1 |
56 | |||
getDefaultService | |
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | namespace MultiMaps; |
3 | |
4 | use MediaWiki\MediaWikiServices; |
5 | |
6 | /** |
7 | * This class allows you to work with a collection of defined services |
8 | * |
9 | * @file MapServices.php |
10 | * @ingroup MultiMaps |
11 | * @author Pavel Astakhov <pastakhov@yandex.ru> |
12 | * @license GPL-2.0-or-later |
13 | */ |
14 | |
15 | class MapServices { |
16 | |
17 | private static $servicesCache = []; |
18 | |
19 | /** |
20 | * Returns the instance of a map service class. |
21 | * If the map service is not specified or is not available, returns the default service |
22 | * On error returns string with error message |
23 | * @global array $egMultiMaps_MapServices |
24 | * @param string|null $serviceName |
25 | * @return BaseMapService|array Returns class extends \MultiMaps\BaseService or array of error messages |
26 | */ |
27 | public static function getServiceInstance( $serviceName = null ) { |
28 | $services = self::getServicesList(); |
29 | if ( is_string( $services ) ) { |
30 | return (array)$services; |
31 | } |
32 | |
33 | $errorMessages = []; |
34 | $lang = MediaWikiServices::getInstance()->getContentLanguage(); |
35 | if ( $serviceName ) { |
36 | $lcServiceName = $lang->lc( $serviceName ); |
37 | if ( isset( $services[$lcServiceName] ) ) { |
38 | $srv = $services[$lcServiceName]; |
39 | } else { |
40 | $srv = self::getDefaultService( $services ); |
41 | $errorMessages[] = wfMessage( |
42 | 'multimaps-passed-unavailable-service', |
43 | $serviceName, |
44 | implode( ', ', array_keys( $services ) ), |
45 | is_string( $srv ) ? $srv : $srv['originName'] |
46 | )->escaped(); |
47 | } |
48 | } else { |
49 | $srv = self::getDefaultService( $services ); |
50 | } |
51 | |
52 | if ( is_array( $srv ) ) { |
53 | if ( !isset( $srv['service'] ) ) { |
54 | $errorMessages[] = wfMessage( |
55 | 'multimaps-undefined-service-for-layout', |
56 | $serviceName |
57 | )->escaped(); |
58 | return $errorMessages; |
59 | } |
60 | |
61 | $lcServiceName = $lang->lc( $srv['service'] ); |
62 | if ( !isset( $services[$lcServiceName] ) ) { |
63 | $errorMessages[] = wfMessage( |
64 | 'multimaps-wrong-service-for-layout', |
65 | $serviceName, |
66 | $srv['service'] |
67 | )->escaped(); |
68 | return $errorMessages; |
69 | } |
70 | if ( is_array( $services[$lcServiceName] ) ) { |
71 | $errorMessages[] = wfMessage( |
72 | 'multimaps-layout-defined-for-layout', |
73 | $serviceName, |
74 | $srv['service'] |
75 | )->escaped(); |
76 | return $errorMessages; |
77 | } |
78 | $className = $services[$lcServiceName]; |
79 | $layerKey = $srv['originName']; |
80 | } else { |
81 | $className = $srv; |
82 | $layerKey = null; |
83 | } |
84 | |
85 | $newClassName = "MultiMaps\\$className"; |
86 | if ( !class_exists( $newClassName ) ) { |
87 | $errorMessages[] = wfMessage( 'multimaps-unknown-class-for-service', $newClassName )->escaped(); |
88 | return $errorMessages; |
89 | } |
90 | |
91 | $returnService = new $newClassName( $layerKey ); |
92 | if ( !( $returnService instanceof BaseMapService ) ) { |
93 | $errorMessages[] = wfMessage( 'multimaps-error-incorrect-class-for-service', $newClassName )->escaped(); |
94 | return $errorMessages; |
95 | } |
96 | |
97 | if ( $errorMessages ) { |
98 | foreach ( $errorMessages as $msg ) { |
99 | $returnService->pushErrorMessage( $msg ); |
100 | } |
101 | } |
102 | |
103 | return $returnService; |
104 | } |
105 | |
106 | private static function getServicesList() { |
107 | global $egMultiMaps_MapServices; |
108 | |
109 | if ( !self::$servicesCache ) { |
110 | if ( !is_array( $egMultiMaps_MapServices ) || count( $egMultiMaps_MapServices ) == 0 ) { |
111 | return wfMessage( 'multimaps-mapservices-must-not-empty-array', '$egMultiMaps_MapServices' )->escaped(); |
112 | } |
113 | |
114 | $lang = MediaWikiServices::getInstance()->getContentLanguage(); |
115 | foreach ( $egMultiMaps_MapServices as $key => $value ) { |
116 | if ( is_int( $key ) ) { |
117 | self::$servicesCache[$lang->lc( $value )] = $value; |
118 | } elseif ( is_array( $value ) ) { |
119 | self::$servicesCache[$lang->lc( $key )] = $value + [ 'originName' => $key ]; |
120 | } |
121 | } |
122 | } |
123 | |
124 | return self::$servicesCache; |
125 | } |
126 | |
127 | private static function getDefaultService( $services ) { |
128 | return array_shift( $services ); |
129 | } |
130 | |
131 | } |