1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeau 4*04fd306cSNickeaunamespace ComboStrap; 5*04fd306cSNickeau 6*04fd306cSNickeauuse dokuwiki\Cache\Cache; 7*04fd306cSNickeau 8*04fd306cSNickeau/** 9*04fd306cSNickeau * Class Cache 10*04fd306cSNickeau * A wrapper around {@link \dokuwiki\Cache\Cache} 11*04fd306cSNickeau * @package ComboStrap 12*04fd306cSNickeau * that takes into account the arguments / properties of the media 13*04fd306cSNickeau * to create the cache file 14*04fd306cSNickeau */ 15*04fd306cSNickeauclass FetcherCache 16*04fd306cSNickeau{ 17*04fd306cSNickeau 18*04fd306cSNickeau const CANONICAL = "fetcher:cache"; 19*04fd306cSNickeau 20*04fd306cSNickeau 21*04fd306cSNickeau /** 22*04fd306cSNickeau * @var Cache 23*04fd306cSNickeau */ 24*04fd306cSNickeau private Cache $fileCache; 25*04fd306cSNickeau 26*04fd306cSNickeau 27*04fd306cSNickeau private array $fileDependencies = []; 28*04fd306cSNickeau private IFetcher $fetcher; 29*04fd306cSNickeau 30*04fd306cSNickeau 31*04fd306cSNickeau /** 32*04fd306cSNickeau * @param IFetcher $fetcher 33*04fd306cSNickeau * @param String[] $keys - extra cache keys that are not in the url because they are retrieved from a database 34*04fd306cSNickeau * This is the case of the {@link FetcherPage::getRequestedTemplate()} as it can be changed in the database 35*04fd306cSNickeau * but we don't want to see it in the URL. 36*04fd306cSNickeau */ 37*04fd306cSNickeau public function __construct(IFetcher $fetcher, array $keys = []) 38*04fd306cSNickeau { 39*04fd306cSNickeau 40*04fd306cSNickeau $this->fetcher = $fetcher; 41*04fd306cSNickeau /** 42*04fd306cSNickeau * Cache Key Construction 43*04fd306cSNickeau */ 44*04fd306cSNickeau $cacheKey = $fetcher->getFetchUrl()->toAbsoluteUrlString(); 45*04fd306cSNickeau foreach ($keys as $key) { 46*04fd306cSNickeau $cacheKey .= $key; 47*04fd306cSNickeau } 48*04fd306cSNickeau $this->fileCache = new Cache($cacheKey, ".{$fetcher->getMime()->getExtension()}"); 49*04fd306cSNickeau 50*04fd306cSNickeau } 51*04fd306cSNickeau 52*04fd306cSNickeau /** 53*04fd306cSNickeau * @param IFetcher $fetch 54*04fd306cSNickeau * @param String[] $cacheKeys - extra cache keys that are not in the url because they are retrieved from a database 55*04fd306cSNickeau * @return FetcherCache 56*04fd306cSNickeau */ 57*04fd306cSNickeau public static function createFrom(IFetcher $fetch, array $cacheKeys = []): FetcherCache 58*04fd306cSNickeau { 59*04fd306cSNickeau return new FetcherCache($fetch, $cacheKeys); 60*04fd306cSNickeau } 61*04fd306cSNickeau 62*04fd306cSNickeau 63*04fd306cSNickeau /** 64*04fd306cSNickeau * Cache file depends on code version and configuration 65*04fd306cSNickeau * @return bool 66*04fd306cSNickeau */ 67*04fd306cSNickeau public function isCacheUsable(): bool 68*04fd306cSNickeau { 69*04fd306cSNickeau 70*04fd306cSNickeau $this->addFileDependency(DirectoryLayout::getPluginInfoPath()); 71*04fd306cSNickeau $files = $this->fileDependencies; 72*04fd306cSNickeau $dependencies = array('files' => $files); 73*04fd306cSNickeau 74*04fd306cSNickeau /** 75*04fd306cSNickeau * Cache Attribute 76*04fd306cSNickeau */ 77*04fd306cSNickeau try { 78*04fd306cSNickeau $requestedCache = $this->fetcher->getRequestedCache(); 79*04fd306cSNickeau $maxAge = $this->fetcher->getCacheMaxAgeInSec($requestedCache); 80*04fd306cSNickeau $dependencies['age'] = $maxAge; 81*04fd306cSNickeau } catch (ExceptionNotFound $e) { 82*04fd306cSNickeau // no requested cache 83*04fd306cSNickeau } 84*04fd306cSNickeau return $this->fileCache->useCache($dependencies); 85*04fd306cSNickeau 86*04fd306cSNickeau } 87*04fd306cSNickeau 88*04fd306cSNickeau 89*04fd306cSNickeau public function storeCache($content) 90*04fd306cSNickeau { 91*04fd306cSNickeau $this->fileCache->storeCache($content); 92*04fd306cSNickeau } 93*04fd306cSNickeau 94*04fd306cSNickeau public function getFile(): LocalPath 95*04fd306cSNickeau { 96*04fd306cSNickeau return LocalPath::createFromPathString($this->fileCache->cache); 97*04fd306cSNickeau } 98*04fd306cSNickeau 99*04fd306cSNickeau public function addFileDependency(Path $path): FetcherCache 100*04fd306cSNickeau { 101*04fd306cSNickeau try { 102*04fd306cSNickeau $this->fileDependencies[] = LocalPath::createFromPathObject($path)->toAbsolutePath()->toAbsoluteId(); 103*04fd306cSNickeau } catch (ExceptionCast|ExceptionBadArgument $e) { 104*04fd306cSNickeau LogUtility::internalError("The path seems to be not local, it should never happen.", self::CANONICAL, $e); 105*04fd306cSNickeau } 106*04fd306cSNickeau return $this; 107*04fd306cSNickeau } 108*04fd306cSNickeau 109*04fd306cSNickeau 110*04fd306cSNickeau} 111