Code Duplication    Length = 251-253 lines in 2 locations

src/Gaufrette/Adapter/Local.php 1 location

@@ 18-268 (lines=251) @@
15
 * @author Antoine Hérault <[email protected]>
16
 * @author Leszek Prabucki <[email protected]>
17
 */
18
class Local implements Adapter,
19
                       StreamFactory,
20
                       ChecksumCalculator,
21
                       SizeCalculator,
22
                       MimeTypeProvider
23
{
24
    protected $directory;
25
    private $create;
26
    private $mode;
27
28
    /**
29
     * @param string $directory Directory where the filesystem is located
30
     * @param bool   $create    Whether to create the directory if it does not
31
     *                          exist (default FALSE)
32
     * @param int    $mode      Mode for mkdir
33
     *
34
     * @throws RuntimeException if the specified directory does not exist and
35
     *                          could not be created
36
     */
37
    public function __construct($directory, $create = false, $mode = 0777)
38
    {
39
        $this->directory = Util\Path::normalize($directory);
40
41
        if (is_link($this->directory)) {
42
            $this->directory = realpath($this->directory);
43
        }
44
45
        $this->create = $create;
46
        $this->mode = $mode;
47
    }
48
49
    /**
50
     * {@inheritdoc}
51
     */
52
    public function read($key)
53
    {
54
        return file_get_contents($this->computePath($key));
55
    }
56
57
    /**
58
     * {@inheritdoc}
59
     */
60
    public function write($key, $content)
61
    {
62
        $path = $this->computePath($key);
63
        $this->ensureDirectoryExists(\Gaufrette\Util\Path::dirname($path), true);
64
65
        return file_put_contents($path, $content);
66
    }
67
68
    /**
69
     * {@inheritdoc}
70
     */
71
    public function rename($sourceKey, $targetKey)
72
    {
73
        $targetPath = $this->computePath($targetKey);
74
        $this->ensureDirectoryExists(\Gaufrette\Util\Path::dirname($targetPath), true);
75
76
        return rename($this->computePath($sourceKey), $targetPath);
77
    }
78
79
    /**
80
     * {@inheritdoc}
81
     */
82
    public function exists($key)
83
    {
84
        return file_exists($this->computePath($key));
85
    }
86
87
    /**
88
     * {@inheritdoc}
89
     */
90
    public function keys()
91
    {
92
        $this->ensureDirectoryExists($this->directory, $this->create);
93
94
        try {
95
            $files = new \RecursiveIteratorIterator(
96
                new \RecursiveDirectoryIterator(
97
                    $this->directory,
98
                    \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS
99
                ),
100
                \RecursiveIteratorIterator::CHILD_FIRST
101
            );
102
        } catch (\Exception $e) {
103
            $files = new \EmptyIterator();
104
        }
105
106
        $keys = array();
107
        foreach ($files as $file) {
108
            $keys[] = $this->computeKey($file);
109
        }
110
        sort($keys);
111
112
        return $keys;
113
    }
114
115
    /**
116
     * {@inheritdoc}
117
     */
118
    public function mtime($key)
119
    {
120
        return filemtime($this->computePath($key));
121
    }
122
123
    /**
124
     * {@inheritdoc}
125
     */
126
    public function delete($key)
127
    {
128
        if ($this->isDirectory($key)) {
129
            return rmdir($this->computePath($key));
130
        }
131
132
        return unlink($this->computePath($key));
133
    }
134
135
    /**
136
     * @param string $key
137
     *
138
     * @return bool
139
     */
140
    public function isDirectory($key)
141
    {
142
        return is_dir($this->computePath($key));
143
    }
144
145
    /**
146
     * {@inheritdoc}
147
     */
148
    public function createStream($key)
149
    {
150
        return new Stream\Local($this->computePath($key));
151
    }
152
153
    /**
154
     * {@inheritdoc}
155
     */
156
    public function checksum($key)
157
    {
158
        return Util\Checksum::fromFile($this->computePath($key));
159
    }
160
161
    /**
162
     * {@inheritdoc}
163
     */
164
    public function size($key)
165
    {
166
        return Util\Size::fromFile($this->computePath($key));
167
    }
168
169
    /**
170
     * {@inheritdoc}
171
     */
172
    public function mimeType($key)
173
    {
174
        $fileInfo = new \finfo(FILEINFO_MIME_TYPE);
175
176
        return $fileInfo->file($this->computePath($key));
177
    }
178
179
    /**
180
     * Computes the key from the specified path.
181
     *
182
     * @param string $path
183
     *
184
     * return string
185
     */
186
    public function computeKey($path)
187
    {
188
        $path = $this->normalizePath($path);
189
190
        return ltrim(substr($path, strlen($this->directory)), '/');
191
    }
192
193
    /**
194
     * Computes the path from the specified key.
195
     *
196
     * @param string $key The key which for to compute the path
197
     *
198
     * @return string A path
199
     *
200
     * @throws OutOfBoundsException If the computed path is out of the
201
     *                              directory
202
     * @throws RuntimeException     If directory does not exists and cannot be created
203
     */
204
    protected function computePath($key)
205
    {
206
        $this->ensureDirectoryExists($this->directory, $this->create);
207
208
        return $this->normalizePath($this->directory.'/'.$key);
209
    }
210
211
    /**
212
     * Normalizes the given path.
213
     *
214
     * @param string $path
215
     *
216
     * @return string
217
     */
218
    protected function normalizePath($path)
219
    {
220
        $path = Util\Path::normalize($path);
221
222
        if (0 !== strpos($path, $this->directory)) {
223
            throw new \OutOfBoundsException(sprintf('The path "%s" is out of the filesystem.', $path));
224
        }
225
226
        return $path;
227
    }
228
229
    /**
230
     * Ensures the specified directory exists, creates it if it does not.
231
     *
232
     * @param string $directory Path of the directory to test
233
     * @param bool   $create    Whether to create the directory if it does
234
     *                          not exist
235
     *
236
     * @throws RuntimeException if the directory does not exists and could not
237
     *                          be created
238
     */
239
    protected function ensureDirectoryExists($directory, $create = false)
240
    {
241
        if (!is_dir($directory)) {
242
            if (!$create) {
243
                throw new \RuntimeException(sprintf('The directory "%s" does not exist.', $directory));
244
            }
245
246
            $this->createDirectory($directory);
247
        }
248
    }
249
250
    /**
251
     * Creates the specified directory and its parents.
252
     *
253
     * @param string $directory Path of the directory to create
254
     *
255
     * @throws InvalidArgumentException if the directory already exists
256
     * @throws RuntimeException         if the directory could not be created
257
     */
258
    protected function createDirectory($directory)
259
    {
260
        $created = mkdir($directory, $this->mode, true);
261
262
        if (!$created) {
263
            if (!is_dir($directory)) {
264
                throw new \RuntimeException(sprintf('The directory \'%s\' could not be created.', $directory));
265
            }
266
        }
267
    }
268
}
269

src/Gaufrette/Adapter/Local/src/Local.php 1 location

@@ 15-267 (lines=253) @@
12
 * @author Antoine Hérault <[email protected]>
13
 * @author Leszek Prabucki <[email protected]>
14
 */
15
class Local implements Adapter,
16
                       Adapter\StreamFactory,
17
                       Adapter\ChecksumCalculator,
18
                       Adapter\SizeCalculator,
19
                       Adapter\MimeTypeProvider
20
{
21
    protected $directory;
22
    private $create;
23
    private $mode;
24
25
    /**
26
     * @param string $directory Directory where the filesystem is located
27
     * @param bool   $create    Whether to create the directory if it does not
28
     *                          exist (default FALSE)
29
     * @param int    $mode      Mode for mkdir
30
     *
31
     * @throws \RuntimeException if the specified directory does not exist and
32
     *                           could not be created
33
     */
34
    public function __construct($directory, $create = false, $mode = 0777)
35
    {
36
        // var_dump($directory);
37
        $this->directory = Util\Path::normalize($directory);
38
        // var_dump($this->directory);
39
40
        if (is_link($this->directory)) {
41
            $this->directory = realpath($this->directory);
42
        }
43
44
        $this->create = $create;
45
        $this->mode = $mode;
46
    }
47
48
    /**
49
     * {@inheritdoc}
50
     */
51
    public function read($key)
52
    {
53
        return file_get_contents($this->computePath($key));
54
    }
55
56
    /**
57
     * {@inheritdoc}
58
     */
59
    public function write($key, $content)
60
    {
61
        $path = $this->computePath($key);
62
        $this->ensureDirectoryExists(\Gaufrette\Util\Path::dirname($path), true);
63
64
        return file_put_contents($path, $content);
65
    }
66
67
    /**
68
     * {@inheritdoc}
69
     */
70
    public function rename($sourceKey, $targetKey)
71
    {
72
        $targetPath = $this->computePath($targetKey);
73
        $this->ensureDirectoryExists(\Gaufrette\Util\Path::dirname($targetPath), true);
74
75
        return rename($this->computePath($sourceKey), $targetPath);
76
    }
77
78
    /**
79
     * {@inheritdoc}
80
     */
81
    public function exists($key)
82
    {
83
        return file_exists($this->computePath($key));
84
    }
85
86
    /**
87
     * {@inheritdoc}
88
     */
89
    public function keys()
90
    {
91
        $this->ensureDirectoryExists($this->directory, $this->create);
92
93
        try {
94
            $files = new \RecursiveIteratorIterator(
95
                new \RecursiveDirectoryIterator(
96
                    $this->directory,
97
                    \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS
98
                ),
99
                \RecursiveIteratorIterator::CHILD_FIRST
100
            );
101
        } catch (\Exception $e) {
102
            $files = new \EmptyIterator();
103
        }
104
105
        $keys = array();
106
        foreach ($files as $file) {
107
            $keys[] = $this->computeKey($file);
108
        }
109
        sort($keys);
110
111
        return $keys;
112
    }
113
114
    /**
115
     * {@inheritdoc}
116
     */
117
    public function mtime($key)
118
    {
119
        return filemtime($this->computePath($key));
120
    }
121
122
    /**
123
     * {@inheritdoc}
124
     */
125
    public function delete($key)
126
    {
127
        if ($this->isDirectory($key)) {
128
            return rmdir($this->computePath($key));
129
        }
130
131
        return unlink($this->computePath($key));
132
    }
133
134
    /**
135
     * @param string $key
136
     *
137
     * @return bool
138
     */
139
    public function isDirectory($key)
140
    {
141
        return is_dir($this->computePath($key));
142
    }
143
144
    /**
145
     * {@inheritdoc}
146
     */
147
    public function createStream($key)
148
    {
149
        return new LocalStream($this->computePath($key));
150
    }
151
152
    /**
153
     * {@inheritdoc}
154
     */
155
    public function checksum($key)
156
    {
157
        return Util\Checksum::fromFile($this->computePath($key));
158
    }
159
160
    /**
161
     * {@inheritdoc}
162
     */
163
    public function size($key)
164
    {
165
        return Util\Size::fromFile($this->computePath($key));
166
    }
167
168
    /**
169
     * {@inheritdoc}
170
     */
171
    public function mimeType($key)
172
    {
173
        $fileInfo = new \finfo(FILEINFO_MIME_TYPE);
174
175
        return $fileInfo->file($this->computePath($key));
176
    }
177
178
    /**
179
     * Computes the key from the specified path.
180
     *
181
     * @param string $path
182
     *
183
     * @return string
184
     */
185
    public function computeKey($path)
186
    {
187
        $path = $this->normalizePath($path);
188
189
        return ltrim(substr($path, strlen($this->directory)), '/');
190
    }
191
192
    /**
193
     * Computes the path from the specified key.
194
     *
195
     * @param string $key The key which for to compute the path
196
     *
197
     * @return string A path
198
     *
199
     * @throws \OutOfBoundsException If the computed path is out of the
200
     *                               directory
201
     * @throws \RuntimeException     If directory does not exists and cannot be created
202
     */
203
    protected function computePath($key)
204
    {
205
        $this->ensureDirectoryExists($this->directory, $this->create);
206
207
        return $this->normalizePath($this->directory.'/'.$key);
208
    }
209
210
    /**
211
     * Normalizes the given path.
212
     *
213
     * @param string $path
214
     *
215
     * @return string
216
     */
217
    protected function normalizePath($path)
218
    {
219
        $path = Util\Path::normalize($path);
220
221
        if (0 !== strpos($path, $this->directory)) {
222
            throw new \OutOfBoundsException(sprintf('The path "%s" is out of the filesystem.', $path));
223
        }
224
225
        return $path;
226
    }
227
228
    /**
229
     * Ensures the specified directory exists, creates it if it does not.
230
     *
231
     * @param string $directory Path of the directory to test
232
     * @param bool   $create    Whether to create the directory if it does
233
     *                          not exist
234
     *
235
     * @throws \RuntimeException if the directory does not exists and could not
236
     *                           be created
237
     */
238
    protected function ensureDirectoryExists($directory, $create = false)
239
    {
240
        if (!is_dir($directory)) {
241
            if (!$create) {
242
                throw new \RuntimeException(sprintf('The directory "%s" does not exist.', $directory));
243
            }
244
245
            $this->createDirectory($directory);
246
        }
247
    }
248
249
    /**
250
     * Creates the specified directory and its parents.
251
     *
252
     * @param string $directory Path of the directory to create
253
     *
254
     * @throws \InvalidArgumentException if the directory already exists
255
     * @throws \RuntimeException         if the directory could not be created
256
     */
257
    protected function createDirectory($directory)
258
    {
259
        $created = mkdir($directory, $this->mode, true);
260
261
        if (!$created) {
262
            if (!is_dir($directory)) {
263
                throw new \RuntimeException(sprintf('The directory \'%s\' could not be created.', $directory));
264
            }
265
        }
266
    }
267
}
268