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    public function __construct(
68        LoggerInterface $logger,
69        array $registry
70    ) {
71        $this->logger = $logger;
72        $this->registry = $registry + self::CORE_HANDLERS;
73    }
74
75    protected function getHandlerClass( $type ) {
76        return $this->registry[$type] ?? false;
77    }
78
79    /**
80     * @param string $type mimetype
81     * @return MediaHandler|false
82     */
83    public function getHandler( $type ) {
84        if ( isset( $this->handlers[$type] ) ) {
85            return $this->handlers[$type];
86        }
87
88        $class = $this->getHandlerClass( $type );
89        if ( $class !== false ) {
90            /** @var MediaHandler $handler */
91            $handler = new $class;
92            if ( !$handler->isEnabled() ) {
93                $this->logger->debug(
94                    '{class} is not enabled.',
95                    [ 'class' => $class ]
96                );
97                $handler = false;
98            }
99        } else {
100            $this->logger->debug(
101                'no handler found for {type}.',
102                [ 'type' => $type ]
103            );
104            $handler = false;
105        }
106
107        $this->handlers[$type] = $handler;
108        return $handler;
109    }
110}