1<?php
2
3/*
4 * This file is part of the Assetic package, an OpenSky project.
5 *
6 * (c) 2010-2014 OpenSky Project Inc
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Assetic\Asset;
13
14use Assetic\Filter\FilterInterface;
15use Assetic\Util\VarUtils;
16
17/**
18 * Represents an asset loaded from a file.
19 *
20 * @author Kris Wallsmith <kris.wallsmith@gmail.com>
21 */
22class FileAsset extends BaseAsset
23{
24    private $source;
25
26    /**
27     * Constructor.
28     *
29     * @param string $source     An absolute path
30     * @param array  $filters    An array of filters
31     * @param string $sourceRoot The source asset root directory
32     * @param string $sourcePath The source asset path
33     * @param array  $vars
34     *
35     * @throws \InvalidArgumentException If the supplied root doesn't match the source when guessing the path
36     */
37    public function __construct($source, $filters = array(), $sourceRoot = null, $sourcePath = null, array $vars = array())
38    {
39        if (null === $sourceRoot) {
40            $sourceRoot = dirname($source);
41            if (null === $sourcePath) {
42                $sourcePath = basename($source);
43            }
44        } elseif (null === $sourcePath) {
45            if (0 !== strpos($source, $sourceRoot)) {
46                throw new \InvalidArgumentException(sprintf('The source "%s" is not in the root directory "%s"', $source, $sourceRoot));
47            }
48
49            $sourcePath = substr($source, strlen($sourceRoot) + 1);
50        }
51
52        $this->source = $source;
53
54        parent::__construct($filters, $sourceRoot, $sourcePath, $vars);
55    }
56
57    public function load(FilterInterface $additionalFilter = null)
58    {
59        $source = VarUtils::resolve($this->source, $this->getVars(), $this->getValues());
60
61        if (!is_file($source)) {
62            throw new \RuntimeException(sprintf('The source file "%s" does not exist.', $source));
63        }
64
65        $this->doLoad(file_get_contents($source), $additionalFilter);
66    }
67
68    public function getLastModified()
69    {
70        $source = VarUtils::resolve($this->source, $this->getVars(), $this->getValues());
71
72        if (!is_file($source)) {
73            throw new \RuntimeException(sprintf('The source file "%s" does not exist.', $source));
74        }
75
76        return filemtime($source);
77    }
78}
79