ebc930c090742ec309c0ee6549e57b77ade76100
[yaffs-website] / vendor / symfony / config / Resource / DirectoryResource.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
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 Symfony\Component\Config\Resource;
13
14 /**
15  * DirectoryResource represents a resources stored in a subdirectory tree.
16  *
17  * @author Fabien Potencier <fabien@symfony.com>
18  */
19 class DirectoryResource implements SelfCheckingResourceInterface, \Serializable
20 {
21     private $resource;
22     private $pattern;
23
24     /**
25      * Constructor.
26      *
27      * @param string      $resource The file path to the resource
28      * @param string|null $pattern  A pattern to restrict monitored files
29      */
30     public function __construct($resource, $pattern = null)
31     {
32         $this->resource = $resource;
33         $this->pattern = $pattern;
34     }
35
36     /**
37      * {@inheritdoc}
38      */
39     public function __toString()
40     {
41         return md5(serialize(array($this->resource, $this->pattern)));
42     }
43
44     /**
45      * {@inheritdoc}
46      */
47     public function getResource()
48     {
49         return $this->resource;
50     }
51
52     /**
53      * Returns the pattern to restrict monitored files.
54      *
55      * @return string|null
56      */
57     public function getPattern()
58     {
59         return $this->pattern;
60     }
61
62     /**
63      * {@inheritdoc}
64      */
65     public function isFresh($timestamp)
66     {
67         if (!is_dir($this->resource)) {
68             return false;
69         }
70
71         if ($timestamp < filemtime($this->resource)) {
72             return false;
73         }
74
75         foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->resource), \RecursiveIteratorIterator::SELF_FIRST) as $file) {
76             // if regex filtering is enabled only check matching files
77             if ($this->pattern && $file->isFile() && !preg_match($this->pattern, $file->getBasename())) {
78                 continue;
79             }
80
81             // always monitor directories for changes, except the .. entries
82             // (otherwise deleted files wouldn't get detected)
83             if ($file->isDir() && '/..' === substr($file, -3)) {
84                 continue;
85             }
86
87             // for broken links
88             try {
89                 $fileMTime = $file->getMTime();
90             } catch (\RuntimeException $e) {
91                 continue;
92             }
93
94             // early return if a file's mtime exceeds the passed timestamp
95             if ($timestamp < $fileMTime) {
96                 return false;
97             }
98         }
99
100         return true;
101     }
102
103     public function serialize()
104     {
105         return serialize(array($this->resource, $this->pattern));
106     }
107
108     public function unserialize($serialized)
109     {
110         list($this->resource, $this->pattern) = unserialize($serialized);
111     }
112 }