Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
40.91% covered (danger)
40.91%
27 / 66
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
MapServices
40.91% covered (danger)
40.91%
27 / 66
0.00% covered (danger)
0.00%
0 / 3
111.99
0.00% covered (danger)
0.00%
0 / 1
 getServiceInstance
49.09% covered (danger)
49.09%
27 / 55
0.00% covered (danger)
0.00%
0 / 1
35.30
 getServicesList
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
56
 getDefaultService
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2namespace MultiMaps;
3
4use 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
15class 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}