From 6686ca9b2a222bc972252d86e39c7a0ced62f158 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 24 Jul 2018 17:30:39 +0200 Subject: [PATCH] cache isCached state for scss resources Signed-off-by: Robin Appelman --- lib/private/Server.php | 3 +- lib/private/Template/SCSSCacher.php | 48 ++++++++++++++----- tests/lib/Template/CSSResourceLocatorTest.php | 7 ++- tests/lib/Template/SCSSCacherTest.php | 7 ++- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/lib/private/Server.php b/lib/private/Server.php index 0f406ebe9b..5962012604 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -965,7 +965,8 @@ class Server extends ServerContainer implements IServerContainer { $c->getThemingDefaults(), \OC::$SERVERROOT, $this->getMemCacheFactory(), - $c->query(IconsCacher::class) + $c->query(IconsCacher::class), + new TimeFactory() ); }); $this->registerService(JSCombiner::class, function (Server $c) { diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php index 9dcedb94da..6a41c4db8b 100644 --- a/lib/private/Template/SCSSCacher.php +++ b/lib/private/Template/SCSSCacher.php @@ -32,6 +32,7 @@ use Leafo\ScssPhp\Compiler; use Leafo\ScssPhp\Exception\ParserException; use Leafo\ScssPhp\Formatter\Crunched; use Leafo\ScssPhp\Formatter\Expanded; +use OCP\AppFramework\Utility\ITimeFactory; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; @@ -77,6 +78,12 @@ class SCSSCacher { /** @var IconsCacher */ private $iconsCacher; + /** @var ICache */ + private $isCachedCache; + + /** @var ITimeFactory */ + private $timeFactory; + /** * @param ILogger $logger * @param Factory $appDataFactory @@ -86,6 +93,7 @@ class SCSSCacher { * @param string $serverRoot * @param ICacheFactory $cacheFactory * @param IconsCacher $iconsCacher + * @param ITimeFactory $timeFactory */ public function __construct(ILogger $logger, Factory $appDataFactory, @@ -94,7 +102,8 @@ class SCSSCacher { \OC_Defaults $defaults, $serverRoot, ICacheFactory $cacheFactory, - IconsCacher $iconsCacher) { + IconsCacher $iconsCacher, + ITimeFactory $timeFactory) { $this->logger = $logger; $this->appData = $appDataFactory->get('css'); $this->urlGenerator = $urlGenerator; @@ -103,7 +112,9 @@ class SCSSCacher { $this->serverRoot = $serverRoot; $this->cacheFactory = $cacheFactory; $this->depsCache = $cacheFactory->createDistributed('SCSS-' . md5($this->urlGenerator->getBaseUrl())); + $this->isCachedCache = $cacheFactory->createLocal('SCSS-cached-' . md5($this->urlGenerator->getBaseUrl())); $this->iconsCacher = $iconsCacher; + $this->timeFactory = $timeFactory; } /** @@ -124,14 +135,7 @@ class SCSSCacher { $path = implode('/', $path); $webDir = $this->getWebDir($path, $app, $this->serverRoot, \OC::$WEBROOT); - try { - $folder = $this->appData->getFolder($app); - } catch (NotFoundException $e) { - // creating css appdata folder - $folder = $this->appData->newFolder($app); - } - - if (!$this->variablesChanged() && $this->isCached($fileNameCSS, $folder)) { + if (!$this->variablesChanged() && $this->isCached($fileNameCSS, $app)) { // Inject icons vars css if any if ($this->iconsCacher->getCachedCSS() && $this->iconsCacher->getCachedCSS()->getSize() > 0) { $this->iconsCacher->injectCss(); @@ -139,6 +143,13 @@ class SCSSCacher { return true; } + try { + $folder = $this->appData->getFolder($app); + } catch (NotFoundException $e) { + // creating css appdata folder + $folder = $this->appData->newFolder($app); + } + $cached = $this->cache($path, $fileNameCSS, $fileNameSCSS, $folder, $webDir); // Inject icons vars css if any @@ -164,10 +175,24 @@ class SCSSCacher { /** * Check if the file is cached or not * @param string $fileNameCSS - * @param ISimpleFolder $folder + * @param string $app * @return boolean */ - private function isCached(string $fileNameCSS, ISimpleFolder $folder) { + private function isCached(string $fileNameCSS, string $app) { + $key = $this->config->getSystemValue('version') . '/' . $app . '/' . $fileNameCSS; + if (!$this->config->getSystemValue('debug') && $cacheValue = $this->isCachedCache->get($key)) { + if ($cacheValue > $this->timeFactory->getTime()) { + return true; + } + } + + try { + $folder = $this->appData->getFolder($app); + } catch (NotFoundException $e) { + // creating css appdata folder + $folder = $this->appData->newFolder($app); + } + try { $cachedFile = $folder->getFile($fileNameCSS); if ($cachedFile->getSize() > 0) { @@ -187,6 +212,7 @@ class SCSSCacher { } } + $this->isCachedCache->set($key, $this->timeFactory->getTime() + 5 * 60); return true; } diff --git a/tests/lib/Template/CSSResourceLocatorTest.php b/tests/lib/Template/CSSResourceLocatorTest.php index 3fb7972b21..a928f043ed 100644 --- a/tests/lib/Template/CSSResourceLocatorTest.php +++ b/tests/lib/Template/CSSResourceLocatorTest.php @@ -25,6 +25,7 @@ namespace Test\Template; use OC\Files\AppData\AppData; use OC\Files\AppData\Factory; +use OCP\AppFramework\Utility\ITimeFactory; use OCP\Files\IAppData; use OCP\ICacheFactory; use OCP\ILogger; @@ -50,6 +51,8 @@ class CSSResourceLocatorTest extends \Test\TestCase { protected $logger; /** @var IconsCacher|\PHPUnit_Framework_MockObject_MockObject */ protected $iconsCacher; + /** @var ITimeFactory|\PHPUnit_Framework_MockObject_MockObject */ + private $timeFactory; protected function setUp() { parent::setUp(); @@ -61,6 +64,7 @@ class CSSResourceLocatorTest extends \Test\TestCase { $this->cacheFactory = $this->createMock(ICacheFactory::class); $this->themingDefaults = $this->createMock(ThemingDefaults::class); $this->iconsCacher = $this->createMock(IconsCacher::class); + $this->timeFactory = $this->createMock(ITimeFactory::class); } private function cssResourceLocator() { @@ -75,7 +79,8 @@ class CSSResourceLocatorTest extends \Test\TestCase { $this->themingDefaults, \OC::$SERVERROOT, $this->cacheFactory, - $this->iconsCacher + $this->iconsCacher, + $this->timeFactory ); return new CSSResourceLocator( $this->logger, diff --git a/tests/lib/Template/SCSSCacherTest.php b/tests/lib/Template/SCSSCacherTest.php index f32b87edcb..149222f6b8 100644 --- a/tests/lib/Template/SCSSCacherTest.php +++ b/tests/lib/Template/SCSSCacherTest.php @@ -28,6 +28,7 @@ use OC\Files\AppData\Factory; use OC\Template\SCSSCacher; use OC\Template\IconsCacher; use OCA\Theming\ThemingDefaults; +use OCP\AppFramework\Utility\ITimeFactory; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\SimpleFS\ISimpleFile; @@ -58,12 +59,15 @@ class SCSSCacherTest extends \Test\TestCase { protected $cacheFactory; /** @var IconsCacher|\PHPUnit_Framework_MockObject_MockObject */ protected $iconsCacher; + /** @var ITimeFactory|\PHPUnit_Framework_MockObject_MockObject */ + protected $timeFactory; protected function setUp() { parent::setUp(); $this->logger = $this->createMock(ILogger::class); $this->appData = $this->createMock(AppData::class); $this->iconsCacher = $this->createMock(IconsCacher::class); + $this->timeFactory = $this->createMock(ITimeFactory::class); /** @var Factory|\PHPUnit_Framework_MockObject_MockObject $factory */ $factory = $this->createMock(Factory::class); @@ -97,7 +101,8 @@ class SCSSCacherTest extends \Test\TestCase { $this->themingDefaults, \OC::$SERVERROOT, $this->cacheFactory, - $this->iconsCacher + $this->iconsCacher, + $this->timeFactory ); }