Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 64
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
FileImporter
0.00% covered (danger)
0.00%
0 / 64
0.00% covered (danger)
0.00%
0 / 6
420
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getLabel
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getForm
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 import
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 1
240
 getTaskParameters
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getZipImporter
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
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) 2014 (original work) Open Assessment Technologies SA;
19 *
20 *
21 */
22
23namespace oat\taoMediaManager\model;
24
25use common_report_Report as Report;
26use oat\oatbox\log\LoggerAwareTrait;
27use oat\oatbox\log\TaoLoggerAwareInterface;
28use tao_helpers_form_Form as Form;
29use oat\tao\model\import\ImportHandlerHelperTrait;
30use oat\tao\model\import\TaskParameterProviderInterface;
31use Zend\ServiceManager\ServiceLocatorAwareInterface;
32
33/**
34 * Service methods to manage the Media
35 *
36 * @access  public
37 * @author  Antoine Robin, <antoine.robin@vesperiagroup.com>
38 * @package taoMediaManager
39 */
40class FileImporter implements
41    \tao_models_classes_import_ImportHandler,
42    ServiceLocatorAwareInterface,
43    TaskParameterProviderInterface,
44    TaoLoggerAwareInterface
45{
46    use ImportHandlerHelperTrait {
47        getTaskParameters as getDefaultTaskParameters;
48    }
49    use LoggerAwareTrait;
50
51    private $instanceUri;
52
53    public function __construct($instanceUri = null)
54    {
55        $this->instanceUri = $instanceUri;
56    }
57
58    /**
59     * Returns a textual description of the import format
60     *
61     * @return string
62     */
63    public function getLabel()
64    {
65        return __('File');
66    }
67
68    /**
69     * Returns a form in order to prepare the import
70     * if the import is from a file, the form should include the file element
71     *
72     * @return Form
73     */
74    public function getForm()
75    {
76        return (new FileImportForm($this->instanceUri))
77            ->getForm();
78    }
79
80    /**
81     * @param \core_kernel_classes_Class $class
82     * @param Form|array $form
83     * @param string|null $userId owner of the resource
84     * @return Report
85     * @throws \common_exception_Error
86     */
87    public function import($class, $form, $userId = null)
88    {
89        $uploadedFile = $this->fetchUploadedFile($form);
90
91        try {
92            $service = MediaService::singleton();
93            $classUri = $class->getUri();
94
95            if (!$form instanceof Form && !is_array($form)) {
96                throw new \InvalidArgumentException('Import form should be either a Form object or an array.');
97            }
98
99            $instanceUri = $form instanceof Form
100                ? $form->getValue('instanceUri')
101                : (isset($form['instanceUri']) ? $form['instanceUri'] : null);
102
103            $fileInfo = $form instanceof Form
104                ? $form->getValue('source')
105                : $form['source'];
106
107            // importing new media
108            if (!$instanceUri || $instanceUri === $classUri) {
109                //if the file is a zip do a zip import
110                if (!\helpers_File::isZipMimeType($fileInfo['type'])) {
111                    $mediaResourceUri = $service->createMediaInstance(
112                        $uploadedFile,
113                        $classUri,
114                        \tao_helpers_Uri::decode($form instanceof Form ? $form->getValue('lang') : $form['lang']),
115                        $fileInfo['name'],
116                        null,
117                        $userId
118                    );
119
120                    if (!$mediaResourceUri) {
121                        $report = Report::createFailure(__('Fail to import media'));
122                        $report->setData(['uriResource' => '']);
123                    } else {
124                        $report = Report::createSuccess(__('Media imported successfully'));
125                        $report->add(Report::createSuccess(
126                            __('Imported %s', $fileInfo['name']),
127                            // 'uriResource' key is needed by javascript in tao/views/templates/form/import.tpl
128                            ['uriResource' => $mediaResourceUri]
129                        ));
130                    }
131                } else {
132                    $report = $this->getZipImporter()->import($class, $form, $userId);
133                }
134            } else {
135                // editing existing media
136                if (!\helpers_File::isZipMimeType($fileInfo['type'])) {
137                    $service->editMediaInstance(
138                        $uploadedFile,
139                        $instanceUri,
140                        \tao_helpers_Uri::decode($form instanceof Form ? $form->getValue('lang') : $form['lang']),
141                        $userId
142                    );
143                    $report = Report::createSuccess(__('Media imported successfully'));
144                    $report->add(Report::createSuccess(
145                        __('Edited %s', $fileInfo['name']),
146                        // 'uriResource' key is needed by javascript in tao/views/templates/form/import.tpl
147                        ['uriResource' => $instanceUri]
148                    ));
149                } else {
150                    $report = Report::createFailure(__('You can\'t upload a zip file as a media'));
151                    $report->setData(['uriResource' => $instanceUri]);
152                }
153            }
154        } catch (\Exception $e) {
155            $message = $e instanceof \common_exception_UserReadableException
156                ? $e->getUserMessage()
157                : __('An error has occurred. Please contact your administrator.');
158            $report = Report::createFailure($message);
159            $this->logError($e->getMessage());
160            $report->setData(['uriResource' => '']);
161        }
162
163        $this->getUploadService()->remove($uploadedFile);
164
165        return $report;
166    }
167
168    /**
169     * Defines the task parameters to be stored for later use.
170     *
171     * @param Form $form
172     * @return array
173     */
174    public function getTaskParameters(Form $form)
175    {
176        return array_merge(
177            $form->getValues(),
178            $this->getDefaultTaskParameters($form)
179        );
180    }
181
182    /**
183     * Get the zip importer for shared stimulus
184     *
185     * @return SharedStimulusPackageImporter
186     */
187    protected function getZipImporter()
188    {
189        $zipImporter = new SharedStimulusPackageImporter();
190        $zipImporter->setServiceLocator($this->getServiceLocator());
191        return $zipImporter;
192    }
193}