Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
MediaHandlerFactory
0.00% covered (danger)
0.00%
0 / 21
0.00% covered (danger)
0.00%
0 / 3
42
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getHandlerClass
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getHandler
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
20
1<?php
2/**
3 * Media-handling base classes and generic functionality.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * http://www.gnu.org/copyleft/gpl.html
19 *
20 * @file
21 * @ingroup Media
22 */
23
24use Psr\Log\LoggerInterface;
25
26/**
27 * Class to construct MediaHandler objects
28 *
29 * @since 1.28
30 */
31class MediaHandlerFactory {
32
33    /**
34     * Default, MediaWiki core media handlers
35     */
36    private const CORE_HANDLERS = [
37        'image/jpeg' => JpegHandler::class,
38        'image/png' => PNGHandler::class,
39        'image/gif' => GIFHandler::class,
40        'image/tiff' => TiffHandler::class,
41        'image/webp' => WebPHandler::class,
42        'image/x-ms-bmp' => BmpHandler::class,
43        'image/x-bmp' => BmpHandler::class,
44        'image/x-xcf' => XCFHandler::class,
45        'image/svg+xml' => SvgHandler::class, // official
46        'image/svg' => SvgHandler::class, // compat
47        'image/vnd.djvu' => DjVuHandler::class, // official
48        'image/x.djvu' => DjVuHandler::class, // compat
49        'image/x-djvu' => DjVuHandler::class, // compat
50        'image/jp2' => Jpeg2000Handler::class,
51        'image/jpx' => Jpeg2000Handler::class,
52    ];
53
54    /** @var LoggerInterface */
55    private $logger;
56
57    /** @var array */
58    private $registry;
59
60    /**
61     * Instance cache of MediaHandler objects by mimetype
62     *
63     * @var MediaHandler[]
64     */
65    private $handlers;
66
67    /**
68     * @param LoggerInterface $logger
69     * @param array $registry
70     */
71    public function __construct(
72        LoggerInterface $logger,
73        array $registry
74    ) {
75        $this->logger = $logger;
76        $this->registry = $registry + self::CORE_HANDLERS;
77    }
78
79    protected function getHandlerClass( $type ) {
80        return $this->registry[$type] ?? false;
81    }
82
83    /**
84     * @param string $type mimetype
85     * @return MediaHandler|false
86     */
87    public function getHandler( $type ) {
88        if ( isset( $this->handlers[$type] ) ) {
89            return $this->handlers[$type];
90        }
91
92        $class = $this->getHandlerClass( $type );
93        if ( $class !== false ) {
94            /** @var MediaHandler $handler */
95            $handler = new $class;
96            if ( !$handler->isEnabled() ) {
97                $this->logger->debug(
98                    '{class} is not enabled.',
99                    [ 'class' => $class ]
100                );
101                $handler = false;
102            }
103        } else {
104            $this->logger->debug(
105                'no handler found for {type}.',
106                [ 'type' => $type ]
107            );
108            $handler = false;
109        }
110
111        $this->handlers[$type] = $handler;
112        return $handler;
113    }
114}