vendor/bundles/Symfony/Bundle/AsseticBundle/Controller/AsseticController.php
changeset 0 7f95f8617b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/bundles/Symfony/Bundle/AsseticBundle/Controller/AsseticController.php	Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,95 @@
+<?php
+
+/*
+ * This file is part of the Symfony framework.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Symfony\Bundle\AsseticBundle\Controller;
+
+use Assetic\Asset\AssetCache;
+use Assetic\Asset\AssetInterface;
+use Assetic\Factory\LazyAssetManager;
+use Assetic\Cache\CacheInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+
+/**
+ * Serves assets.
+ *
+ * @author Kris Wallsmith <kris@symfony.com>
+ */
+class AsseticController
+{
+    protected $request;
+    protected $am;
+    protected $cache;
+
+    public function __construct(Request $request, LazyAssetManager $am, CacheInterface $cache)
+    {
+        $this->request = $request;
+        $this->am = $am;
+        $this->cache = $cache;
+    }
+
+    public function render($name, $pos = null)
+    {
+        if (!$this->am->has($name)) {
+            throw new NotFoundHttpException(sprintf('The "%s" asset could not be found.', $name));
+        }
+
+        $asset = $this->am->get($name);
+        if (null !== $pos && !$asset = $this->findAssetLeaf($asset, $pos)) {
+            throw new NotFoundHttpException(sprintf('The "%s" asset does not include a leaf at position %d.', $name, $pos));
+        }
+
+        $response = $this->createResponse();
+
+        // last-modified
+        if (null !== $lastModified = $asset->getLastModified()) {
+            $date = new \DateTime();
+            $date->setTimestamp($lastModified);
+            $response->setLastModified($date);
+        }
+
+        // etag
+        if ($this->am->hasFormula($name)) {
+            $formula = $this->am->getFormula($name);
+            $formula['last_modified'] = $lastModified;
+            $response->setETag(md5(serialize($formula)));
+        }
+
+        if ($response->isNotModified($this->request)) {
+            return $response;
+        }
+
+        $response->setContent($this->cachifyAsset($asset)->dump());
+
+        return $response;
+    }
+
+    protected function createResponse()
+    {
+        return new Response();
+    }
+
+    protected function cachifyAsset(AssetInterface $asset)
+    {
+        return new AssetCache($asset, $this->cache);
+    }
+
+    private function findAssetLeaf(\Traversable $asset, $pos)
+    {
+        $i = 0;
+        foreach ($asset as $leaf) {
+            if ($pos == $i++) {
+                return $leaf;
+            }
+        }
+    }
+}