Completed
Pull Request — 1.0 (#58)
by Titouan
03:47 queued 01:10
created

GenericResource::getStack()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 2.5

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 8
rs 9.4286
ccs 1
cts 2
cp 0.5
cc 2
eloc 4
nc 2
nop 0
crap 2.5
1
<?php
2
3
/*
4
 * This file is part of the puli/repository package.
5
 *
6
 * (c) Bernhard Schussek <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace Puli\Repository\Resource;
13
14
use Puli\Repository\Api\Resource\PuliResource;
15
use Puli\Repository\Api\Resource\ResourceMetadata;
16
use Puli\Repository\Api\ResourceNotFoundException;
17
use Puli\Repository\Api\ResourceRepository;
18
use Puli\Repository\ChangeStream\ResourceStack;
19
use Puli\Repository\Resource\Collection\ArrayResourceCollection;
20
21
/**
22
 * A generic resource.
23
 *
24
 * @since  1.0
25
 *
26
 * @author Bernhard Schussek <[email protected]>
27
 */
28
class GenericResource implements PuliResource
29
{
30
    /**
31
     * @var ResourceRepository
32
     */
33
    private $repo;
34
35
    /**
36
     * @var string
37
     */
38
    private $path;
39
40
    /**
41
     * @var string
42
     */
43
    private $repoPath;
44
45
    /**
46
     * Creates a new resource.
47
     *
48
     * @param string|null $path The path of the resource.
49 683
     */
50
    public function __construct($path = null)
51 683
    {
52 683
        $this->path = $path;
53 683
        $this->repoPath = $path;
54
    }
55
56
    /**
57
     * {@inheritdoc}
58 285
     */
59
    public function getPath()
60 285
    {
61
        return $this->path;
62
    }
63
64
    /**
65
     * {@inheritdoc}
66 294
     */
67
    public function getName()
68 294
    {
69
        return $this->path ? basename($this->path) : null;
70
    }
71
72
    /**
73
     * {@inheritdoc}
74 4
     */
75 View Code Duplication
    public function getChild($relPath)
76 4
    {
77 1
        if (!$this->getRepository()) {
78
            throw ResourceNotFoundException::forPath($this->getRepositoryPath().'/'.$relPath);
79
        }
80 3
81
        return $this->getRepository()->get($this->getRepositoryPath().'/'.$relPath);
82
    }
83
84
    /**
85
     * {@inheritdoc}
86 3
     */
87
    public function hasChild($relPath)
88 3
    {
89 1
        if (!$this->getRepository()) {
90
            return false;
91
        }
92 2
93
        return $this->getRepository()->contains($this->getRepositoryPath().'/'.$relPath);
94
    }
95
96
    /**
97
     * {@inheritdoc}
98 3
     */
99
    public function hasChildren()
100 3
    {
101 1
        if (!$this->getRepository()) {
102
            return false;
103
        }
104 2
105
        return $this->getRepository()->hasChildren($this->getRepositoryPath());
106
    }
107
108
    /**
109
     * {@inheritdoc}
110 6
     */
111 View Code Duplication
    public function listChildren()
112 6
    {
113
        $children = new ArrayResourceCollection();
114 6
115 1
        if (!$this->getRepository()) {
116
            return $children;
117
        }
118 5
119 2
        foreach ($this->getRepository()->listChildren($this->getRepositoryPath()) as $child) {
120 5
            $children[$child->getName()] = $child;
121
        }
122 5
123
        return $children;
124
    }
125
126
    /**
127
     * {@inheritdoc}
128
     */
129
    public function getStack()
130
    {
131
        if (!$this->getRepository()) {
132
            return new ResourceStack(array($this));
133
        }
134
135
        return $this->getRepository()->getStack($this->getRepositoryPath());
136 406
    }
137
138 406
    /**
139
     * {@inheritdoc}
140 406
     */
141 352
    public function getMetadata()
142 352
    {
143 352
        return new ResourceMetadata();
144 406
    }
145
146
    /**
147
     * {@inheritdoc}
148
     */
149 21
    public function attachTo(ResourceRepository $repo, $path = null)
150
    {
151 21
        $this->repo = $repo;
152 21
153
        if (null !== $path) {
154
            $this->path = $path;
155
            $this->repoPath = $path;
156
        }
157 212
    }
158
159 212
    /**
160
     * {@inheritdoc}
161
     */
162
    public function detach()
163
    {
164
        $this->repo = null;
165 105
    }
166
167 105
    /**
168
     * {@inheritdoc}
169
     */
170
    public function getRepository()
171
    {
172
        return $this->repo;
173 263
    }
174
175 263
    /**
176
     * {@inheritdoc}
177
     */
178
    public function getRepositoryPath()
179
    {
180
        return $this->repoPath;
181 42
    }
182
183 42
    /**
184 42
     * {@inheritdoc}
185
     */
186 42
    public function isAttached()
187
    {
188
        return null !== $this->repo;
189
    }
190
191
    /**
192 63
     * {@inheritdoc}
193
     */
194 63
    public function createReference($path)
195
    {
196
        $ref = clone $this;
197
        $ref->path = $path;
198
199
        return $ref;
200 20
    }
201
202 20
    /**
203
     * {@inheritdoc}
204 20
     */
205
    public function isReference()
206 20
    {
207
        return $this->path !== $this->repoPath;
208
    }
209
210
    /**
211
     * {@inheritdoc}
212 20
     */
213
    public function serialize()
214 20
    {
215
        $data = array();
216 20
217 20
        $this->preSerialize($data);
218
219
        return serialize($data);
220
    }
221
222
    /**
223
     * {@inheritdoc}
224
     */
225
    public function unserialize($string)
226
    {
227 20
        $data = unserialize($string);
228
229 20
        $this->postUnserialize($data);
230 20
    }
231 20
232
    /**
233
     * Invoked before serializing a resource.
234
     *
235
     * Override this method if you want to serialize custom data in subclasses.
236
     *
237
     * @param array $data The data to serialize. Add custom data at the end of
238
     *                    the array.
239
     */
240
    protected function preSerialize(array &$data)
241
    {
242 20
        $data[] = $this->path;
243
        $data[] = $this->repoPath;
244 20
    }
245 20
246 20
    /**
247
     * Invoked after unserializing a resource.
248
     *
249
     * Override this method if you want to unserialize custom data in
250
     * subclasses.
251
     *
252
     * @param array $data The unserialized data. Pop your custom data from the
253
     *                    end of the array before calling the parent method.
254
     */
255
    protected function postUnserialize(array $data)
256
    {
257
        $this->repoPath = array_pop($data);
258
        $this->path = array_pop($data);
259
    }
260
}
261