Completed
Push — master ( c6502b...156fba )
by Joschi
03:14
created

BinaryPayloadProcessor::persist()   B

Complexity

Conditions 4
Paths 4

Size

Total Lines 22
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4.0961

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 22
cc 4
eloc 10
nc 4
nop 0
ccs 9
cts 11
cp 0.8182
crap 4.0961
rs 8.9197
1
<?php
2
3
/**
4
 * apparat-object
5
 *
6
 * @category    Apparat
7
 * @package     Apparat\Object
8
 * @subpackage  Apparat\Object\Infrastructure
9
 * @author      Joschi Kuphal <[email protected]> / @jkphl
10
 * @copyright   Copyright © 2016 Joschi Kuphal <[email protected]> / @jkphl
11
 * @license     http://opensource.org/licenses/MIT The MIT License (MIT)
12
 */
13
14
/***********************************************************************************
15
 *  The MIT License (MIT)
16
 *
17
 *  Copyright © 2016 Joschi Kuphal <[email protected]> / @jkphl
18
 *
19
 *  Permission is hereby granted, free of charge, to any person obtaining a copy of
20
 *  this software and associated documentation files (the "Software"), to deal in
21
 *  the Software without restriction, including without limitation the rights to
22
 *  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
23
 *  the Software, and to permit persons to whom the Software is furnished to do so,
24
 *  subject to the following conditions:
25
 *
26
 *  The above copyright notice and this permission notice shall be included in all
27
 *  copies or substantial portions of the Software.
28
 *
29
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
31
 *  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
32
 *  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
33
 *  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
34
 *  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35
 ***********************************************************************************/
36
37
namespace Apparat\Object\Infrastructure\Utilities;
38
39
use Apparat\Object\Application\Contract\BinaryPayloadProcessorInterface;
40
use Apparat\Object\Application\Model\Object\AbstractBinaryObject;
41
use Apparat\Object\Ports\InvalidArgumentException;
42
use Apparat\Object\Ports\RuntimeException;
43
44
/**
45
 * Binary payload processor
46
 *
47
 * @package Apparat\Object
48
 * @subpackage Apparat\Object\Infrastructure
49
 */
50
class BinaryPayloadProcessor extends AbstractPayloadProcessor implements BinaryPayloadProcessorInterface
51
{
52
    /**
53
     * Owning binary object
54
     *
55
     * @var AbstractBinaryObject
56
     */
57
    protected $object;
58
    /**
59
     * Persistence queue
60
     *
61
     * @var array
62
     */
63
    protected $persistQueue = [];
64
65
    /**
66
     * Process the payload of an object
67
     *
68
     * @param string $payload Payload
69
     * @return string Processed payload
70
     * @throws InvalidArgumentException If the payload is not a valid file
71
     * @throws RuntimeException If the payload resource cannot be imported
72
     */
73 1
    public function processPayload($payload)
74
    {
75
        // If the payload is not a valid file
76 1
        if (!strlen($payload) || !is_file($payload)) {
77
            throw new InvalidArgumentException(
78
                sprintf('Invalid binary payload source "%s"', $payload),
79
                InvalidArgumentException::INVALID_BINARY_PAYLOAD_SOURCE
80
            );
81
        }
82
83 1
        $adapterStrategy = $this->object->getRepositoryPath()->getRepository()->getAdapterStrategy();
84 1
        $currentPayload = $this->object->getPayload();
85 1
        $currentPayloadHash = strlen($currentPayload) ? $adapterStrategy->getResourceHash($currentPayload) : null;
86 1
        $payloadHash = File::hash($payload);
87
88
        // If there is no payload yet or if it's different from the current one
89 1
        if (($currentPayloadHash === null) || ($currentPayloadHash !== $payloadHash)) {
90 1
            $payloadFileExt = pathinfo($payload, PATHINFO_EXTENSION);
91 1
            $currentPayload = $this->object->getId()->getId().'.'.$payloadHash;
92 1
            $currentPayload .= strlen($payloadFileExt) ? '.'.$payloadFileExt : '';
93
94
            // Register the resource in the persistence queue
95 1
            $this->persistQueue[$payload] = $currentPayload;
96
        }
97
98 1
        return $currentPayload;
99
    }
100
101
    /**
102
     * Post persistence callback
103
     *
104
     * @return void
105
     */
106 1
    public function persist()
107
    {
108
        // If there are entries in the persistence queue
109 1
        if (count($this->persistQueue)) {
110 1
            $adapterStrategy = $this->object->getRepositoryPath()->getRepository()->getAdapterStrategy();
111 1
            $containerPath = dirname(strval($this->object->getRepositoryPath())).DIRECTORY_SEPARATOR;
112
113
            // Run through all resources in the persistence queue
114 1
            foreach ($this->persistQueue as $source => $target) {
115
                // If the payload resource cannot be imported
116 1
                if (!$adapterStrategy->importResource($source, $containerPath.$target)) {
117
                    throw new RuntimeException(
118
                        sprintf('Cannot import binary resource "%s"', $source),
119 1
                        RuntimeException::CANNOT_IMPORT_BINARY_RESOURCE
120
                    );
121
                }
122
            }
123
124
            // Reset the persistence queue
125 1
            $this->persistQueue = [];
126
        }
127 1
    }
128
}
129