Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
85.00% covered (warning)
85.00%
17 / 20
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
Base64fileEncoder
85.00% covered (warning)
85.00%
17 / 20
50.00% covered (danger)
50.00%
1 / 2
8.22
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 encode
84.21% covered (warning)
84.21%
16 / 19
0.00% covered (danger)
0.00%
0 / 1
7.19
1<?php
2
3/**
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; under version 2
7 * of the License (non-upgradable).
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17 *
18 * Copyright (c) 2015-2020 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
19 *
20 * @author Mikhail Kamarouski, <kamarouski@1pt.com>
21 */
22
23namespace oat\taoItems\model\pack\encoders;
24
25use oat\tao\helpers\Base64;
26use oat\tao\model\media\MediaAsset;
27use core_kernel_persistence_Exception;
28use oat\taoMediaManager\model\MediaSource;
29use tao_models_classes_FileNotFoundException;
30use tao_models_classes_service_StorageDirectory;
31use oat\taoItems\model\pack\ExceptionMissingAsset;
32use oat\tao\model\media\sourceStrategy\HttpSource;
33
34/**
35 * Class Base64fileEncoder
36 * Helper, encode file by uri for embedding  using base64 algorithm
37 *
38 * @package oat\taoItems\model\pack\encoders
39 */
40class Base64fileEncoder implements Encoding
41{
42    /** @var tao_models_classes_service_StorageDirectory */
43    private $directory;
44
45    /** Applied data-uri format placeholder */
46    public const DATA_PREFIX = 'data:%s;base64,%s';
47
48    /**
49     * Base64fileEncoder constructor.
50     *
51     * @param tao_models_classes_service_StorageDirectory $directory
52     */
53    public function __construct(tao_models_classes_service_StorageDirectory $directory)
54    {
55        $this->directory = $directory;
56    }
57
58    /**
59     * @param string|MediaAsset $data name of the assert
60     *
61     * @throws ExceptionMissingAsset
62     * @throws core_kernel_persistence_Exception
63     * @throws tao_models_classes_FileNotFoundException
64     *
65     * @return mixed|string
66     */
67    public function encode($data)
68    {
69        // Skip  if external resource
70        if (filter_var($data, FILTER_VALIDATE_URL)) {
71            return $data;
72        }
73
74        if ($data instanceof MediaAsset) {
75            $mediaSource = $data->getMediaSource();
76            $data = $data->getMediaIdentifier();
77
78            if ($mediaSource instanceof HttpSource || Base64::isEncodedImage($data)) {
79                return $data;
80            }
81
82            if ($mediaSource instanceof MediaSource) {
83                $fileInfo = $mediaSource->getFileInfo($data);
84                $stream = $mediaSource->getFileStream($data);
85
86                return sprintf(self::DATA_PREFIX, $fileInfo['mime'], base64_encode($stream->getContents()));
87            }
88        }
89
90        $file = $this->directory->getFile($data);
91
92        if ($file->exists()) {
93            return sprintf(self::DATA_PREFIX, $file->getMimeType(), base64_encode($file->read()));
94        }
95
96        throw new ExceptionMissingAsset(sprintf(
97            'Assets %s not found at %s',
98            $data,
99            $file->getPrefix()
100        ));
101    }
102}