From 1caaa7f4cd05e45a02ead069adf8625d7b192dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?= Date: Wed, 9 Nov 2016 13:39:08 +0100 Subject: [PATCH] Appdata integration 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: John Molakvoæ (skjnldsv) --- core/Controller/CssController.php | 83 +++++++++++++++++++ core/routes.php | 1 + .../DependencyInjection/DIContainer.php | 5 ++ lib/private/CssManager.php | 63 ++++++++++++++ lib/private/Server.php | 15 ++++ lib/private/Template/CSSResourceLocator.php | 7 ++ lib/private/Template/ResourceLocator.php | 1 + lib/private/Template/SCSSCacher.php | 41 +++++++-- lib/public/ICssManager.php | 38 +++++++++ 9 files changed, 248 insertions(+), 6 deletions(-) create mode 100644 core/Controller/CssController.php create mode 100644 lib/private/CssManager.php create mode 100644 lib/public/ICssManager.php diff --git a/core/Controller/CssController.php b/core/Controller/CssController.php new file mode 100644 index 0000000000..45a188adba --- /dev/null +++ b/core/Controller/CssController.php @@ -0,0 +1,83 @@ +. + * + */ + +namespace OC\Core\Controller; + +use OC\AppFramework\Utility\TimeFactory; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\NotFoundResponse; +use OCP\AppFramework\Http\FileDisplayResponse; +use OCP\ICssManager; +use OCP\IRequest; + + +class CssController extends Controller { + + /** @var ICssManager */ + protected $cssManager; + + /** @var TimeFactory */ + protected $timeFactory; + + + + /** + * @param string $appName + * @param IRequest $request + * @param ICssManager $cssManager + * @param TimeFactory $timeFactory + */ + public function __construct($appName, IRequest $request, ICssManager $cssManager, TimeFactory $timeFactory) { + parent::__construct($appName, $request); + + $this->cssManager = $cssManager; + $this->timeFactory = $timeFactory; + } + + /** + * @NoAdminRequired + * @NoCSRFRequired + * + * @param string $fileName css filename with extension + * @return text/css + */ + public function getCss($fileName) { + try { + $cssFile = $this->cssManager->getCss($fileName); + } catch(NotFoundException $e) { + return new NotFoundResponse(); + } + + if ($cssFile !== false) { + $response = new FileDisplayResponse($cssFile, Http::STATUS_OK, ['Content-Type' => 'text/css']); + $response->cacheFor(86400); + $expires = new \DateTime(); + $expires->setTimestamp($this->timeFactory->getTime()); + $expires->add(new \DateInterval('PT24H')); + $response->addHeader('Expires', $expires->format(\DateTime::RFC2822)); + $response->addHeader('Pragma', 'cache'); + return $response; + } else { + return new NotFoundResponse(); + } + } +} diff --git a/core/routes.php b/core/routes.php index 2b8080a3b7..dec979c8ce 100644 --- a/core/routes.php +++ b/core/routes.php @@ -55,6 +55,7 @@ $application->registerRoutes($this, [ ['name' => 'OCJS#getConfig', 'url' => '/core/js/oc.js', 'verb' => 'GET'], ['name' => 'Preview#getPreview', 'url' => '/core/preview', 'verb' => 'GET'], ['name' => 'Preview#getPreview', 'url' => '/core/preview.png', 'verb' => 'GET'], + ['name' => 'Css#getCss', 'url' => '/css/{fileName}', 'verb' => 'GET'], ], 'ocs' => [ ['root' => '/cloud', 'name' => 'OCS#getCapabilities', 'url' => '/capabilities', 'verb' => 'GET'], diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php index ac42960f54..57e7749ca8 100644 --- a/lib/private/AppFramework/DependencyInjection/DIContainer.php +++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php @@ -95,6 +95,11 @@ class DIContainer extends SimpleContainer implements IAppContainer { return $this->getServer()->getAvatarManager(); }); + + $this->registerService('OCP\\ICssManager', function($c) { + return $this->getServer()->getCssManager(); + }); + $this->registerService('OCP\\Activity\\IManager', function($c) { return $this->getServer()->getActivityManager(); }); diff --git a/lib/private/CssManager.php b/lib/private/CssManager.php new file mode 100644 index 0000000000..016227b9c3 --- /dev/null +++ b/lib/private/CssManager.php @@ -0,0 +1,63 @@ +. + * + */ + +namespace OC; + +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\ICssManager; + +/** + * This class implements methods to access SCSS cached files + */ +class CssManager implements ICssManager { + + /** @var IAppData */ + private $appData; + + /** + * CssManager constructor. + * + * @param IAppData $appData + */ + public function __construct(IAppData $appData) { + $this->appData = $appData; + } + + /** + * Get the css file and return ISimpleFile + * + * @param string $fileName css filename with extension + * @return ISimpleFile + */ + public function getCss($fileName) { + try { + $folder = $this->appData->getFolder('css'); + } catch(NotFoundException $e) { + throw new NotFoundException(); + } + try { + return $folder->getFile($fileName); + } catch(NotFoundException $e) { + throw new NotFoundException(); + } + } +} diff --git a/lib/private/Server.php b/lib/private/Server.php index 5bc72e3614..2dbf827844 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -417,6 +417,11 @@ class Server extends ServerContainer implements IServerContainer { $c->getConfig() ); }); + $this->registerService('CssManager', function (Server $c) { + return new CssManager( + $c->getAppDataDir('server') + ); + }); $this->registerService('Logger', function (Server $c) { $logClass = $c->query('AllConfig')->getSystemValue('log_type', 'file'); // TODO: Drop backwards compatibility for config in the future @@ -908,6 +913,16 @@ class Server extends ServerContainer implements IServerContainer { return $this->query('AvatarManager'); } + + /** + * Returns the css manager + * + * @return \OCP\ICssManager + */ + public function getCssManager() { + return $this->query('CssManager'); + } + /** * Returns the root folder of ownCloud's data directory * diff --git a/lib/private/Template/CSSResourceLocator.php b/lib/private/Template/CSSResourceLocator.php index 2e1db9a675..0d190959ea 100755 --- a/lib/private/Template/CSSResourceLocator.php +++ b/lib/private/Template/CSSResourceLocator.php @@ -29,6 +29,13 @@ class CSSResourceLocator extends ResourceLocator { protected $appData; + /** + * @param \OCP\ILogger $logger + * @param string $theme + * @param array $core_map + * @param array $party_map + * @param IAppData $appData + */ public function __construct(\OCP\ILogger $logger, $theme, $core_map, $party_map, $appData) { $this->appData = $appData; parent::__construct($logger, $theme, $core_map, $party_map); diff --git a/lib/private/Template/ResourceLocator.php b/lib/private/Template/ResourceLocator.php index 89a3a1b025..21a4ce927e 100755 --- a/lib/private/Template/ResourceLocator.php +++ b/lib/private/Template/ResourceLocator.php @@ -111,6 +111,7 @@ abstract class ResourceLocator { * * @param string $root path to check * @param string $file the filename + * @param IAppData $appData the appData folder * @param string|null $webRoot base for path, default map $root to $webRoot * @return bool True if the resource was found and cached, false otherwise */ diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php index 43160a9c16..def9ecd276 100755 --- a/lib/private/Template/SCSSCacher.php +++ b/lib/private/Template/SCSSCacher.php @@ -30,19 +30,21 @@ class SCSSCacher { protected $root; protected $folder; protected $file; - protected $fileName; + protected $fileNameSCSS; + protected $fileNameCSS; protected $fileLoc; - protected $fileCache; protected $rootCssLoc; /** @var \OCP\ILogger */ protected $logger; + /** @var \OCP\Files\IAppData */ protected $appData; /** * @param \OCP\ILogger $logger * @param string $root * @param string $file + * @param \OCP\Files\IAppData $appData */ public function __construct(\OCP\ILogger $logger, $root, $file, $appData) { $this->logger = $logger; @@ -50,8 +52,10 @@ class SCSSCacher { $this->root = $root; $this->file = explode('/', $root.'/'.$file); + /* filenames */ $this->fileNameSCSS = array_pop($this->file); $this->fileNameCSS = str_replace('.scss', '.css', $this->fileNameSCSS); + $this->fileLoc = implode('/', $this->file); // base uri to css file @@ -67,6 +71,10 @@ class SCSSCacher { } } + /** + * Process the caching process if needed + * @return boolean + */ public function process() { if($this->is_cached()) { @@ -77,6 +85,10 @@ class SCSSCacher { return false; } + /** + * Check if the file is cached or not + * @return boolean + */ private function is_cached() { try{ $cachedfile = $this->folder->getFile($this->fileNameCSS); @@ -90,6 +102,10 @@ class SCSSCacher { return false; } + /** + * Cache the file with AppData + * @return boolean + */ private function cache() { $scss = new Compiler(); $scss->setImportPaths($this->fileLoc); @@ -108,6 +124,7 @@ class SCSSCacher { $cachedfile = $this->folder->newFile($this->fileNameCSS); } + // Compile try { $compiledScss = $scss->compile('@import "'.$this->fileNameSCSS.'";'); } catch(ParserException $e) { @@ -115,20 +132,32 @@ class SCSSCacher { return false; } - if($cachedfile->putContent($this->rebaseUrls($compiledScss))) { - $this->logger->debug($root.'/'.$file.' compiled and successfully cached', ['app' => 'SCSSPHP']); + try { + $cachedfile->putContent($this->rebaseUrls($compiledScss)); + $this->logger->debug($this->rootCssLoc.'/'.$this->fileNameSCSS.' compiled and successfully cached', ['app' => 'SCSSPHP']); return true; + } catch(NotFoundException $e) { + return false; } return false; } + /** + * Add the correct uri prefix to make uri valid again + * @param string $css + * @return string + */ private function rebaseUrls($css) { $re = '/url\([\'"](.*)[\'"]\)/x'; - $subst = 'url(\'../'.$this->rootCssLoc.'/$1\')'; + $subst = 'url(\'../../../'.$this->rootCssLoc.'/$1\')'; return preg_replace($re, $subst, $css); } + /** + * Return the cached css file uri + * @return string + */ public function getCachedSCSS() { - return $this->fileCache; + return "index.php/css/".$this->fileNameCSS; } } diff --git a/lib/public/ICssManager.php b/lib/public/ICssManager.php new file mode 100644 index 0000000000..0af1472b5c --- /dev/null +++ b/lib/public/ICssManager.php @@ -0,0 +1,38 @@ +. + * + */ + +namespace OCP; + +/** + * This class provides scss functionality + * @since 11.0.0 + */ + +interface ICssManager { + + /** + * Get the css file and return ISimpleFile + * + * @param string $fileName css filename with extension + * @return ISimpleFile + */ + public function getCss($fileName); +}