xref: /template/strap/ComboStrap/CacheManager.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeau
4*37748cd8SNickeaunamespace ComboStrap;
5*37748cd8SNickeau
6*37748cd8SNickeau
7*37748cd8SNickeauuse dokuwiki\Cache\CacheParser;
8*37748cd8SNickeau
9*37748cd8SNickeauclass CacheManager
10*37748cd8SNickeau{
11*37748cd8SNickeau
12*37748cd8SNickeau    /**
13*37748cd8SNickeau     * The meta key that has the expiration date
14*37748cd8SNickeau     */
15*37748cd8SNickeau    const DATE_CACHE_EXPIRATION_META_KEY = "date_cache_expiration";
16*37748cd8SNickeau    const RESULT_STATUS = 'result';
17*37748cd8SNickeau    const DATE_MODIFIED = 'ftime';
18*37748cd8SNickeau
19*37748cd8SNickeau    /**
20*37748cd8SNickeau     * Just an utility variable to tracks the slot processed
21*37748cd8SNickeau     * @var array the processed slot
22*37748cd8SNickeau     */
23*37748cd8SNickeau    private $cacheDataBySlots = array();
24*37748cd8SNickeau
25*37748cd8SNickeau
26*37748cd8SNickeau    /**
27*37748cd8SNickeau     * @return CacheManager
28*37748cd8SNickeau     */
29*37748cd8SNickeau    public static function get()
30*37748cd8SNickeau    {
31*37748cd8SNickeau        global $comboCacheManagerScript;
32*37748cd8SNickeau        if (empty($comboCacheManagerScript)) {
33*37748cd8SNickeau            self::init();
34*37748cd8SNickeau        }
35*37748cd8SNickeau        return $comboCacheManagerScript;
36*37748cd8SNickeau    }
37*37748cd8SNickeau
38*37748cd8SNickeau    public static function init()
39*37748cd8SNickeau    {
40*37748cd8SNickeau        global $comboCacheManagerScript;
41*37748cd8SNickeau        $comboCacheManagerScript = new CacheManager();
42*37748cd8SNickeau
43*37748cd8SNickeau    }
44*37748cd8SNickeau
45*37748cd8SNickeau    /**
46*37748cd8SNickeau     * In test, we may run more than once
47*37748cd8SNickeau     * This function delete the cache manager
48*37748cd8SNickeau     * and is called when Dokuwiki close (ie {@link \action_plugin_combo_cache::close()})
49*37748cd8SNickeau     */
50*37748cd8SNickeau    public static function close()
51*37748cd8SNickeau    {
52*37748cd8SNickeau
53*37748cd8SNickeau        global $comboCacheManagerScript;
54*37748cd8SNickeau        unset($comboCacheManagerScript);
55*37748cd8SNickeau
56*37748cd8SNickeau    }
57*37748cd8SNickeau
58*37748cd8SNickeau    /**
59*37748cd8SNickeau     * Keep track of the parsed bar (ie page in page)
60*37748cd8SNickeau     * @param $pageId
61*37748cd8SNickeau     * @param $result
62*37748cd8SNickeau     * @param CacheParser $cacheParser
63*37748cd8SNickeau     */
64*37748cd8SNickeau    public function addSlot($pageId, $result, $cacheParser)
65*37748cd8SNickeau    {
66*37748cd8SNickeau        if (!isset($this->cacheDataBySlots[$pageId])) {
67*37748cd8SNickeau            $this->cacheDataBySlots[$pageId] = [];
68*37748cd8SNickeau        }
69*37748cd8SNickeau        /**
70*37748cd8SNickeau         * Metadata and other rendering may occurs
71*37748cd8SNickeau         * recursively in one request
72*37748cd8SNickeau         *
73*37748cd8SNickeau         * We record only the first one because the second call one will use the first
74*37748cd8SNickeau         * one
75*37748cd8SNickeau         */
76*37748cd8SNickeau        if (!isset($this->cacheDataBySlots[$pageId][$cacheParser->mode])) {
77*37748cd8SNickeau            $date = null;
78*37748cd8SNickeau            if(file_exists($cacheParser->cache)){
79*37748cd8SNickeau                $date = Iso8601Date::createFromTimestamp(filemtime($cacheParser->cache))->getDateTime();
80*37748cd8SNickeau            }
81*37748cd8SNickeau            $this->cacheDataBySlots[$pageId][$cacheParser->mode] = [
82*37748cd8SNickeau                self::RESULT_STATUS => $result,
83*37748cd8SNickeau                self::DATE_MODIFIED => $date
84*37748cd8SNickeau            ];
85*37748cd8SNickeau        }
86*37748cd8SNickeau
87*37748cd8SNickeau    }
88*37748cd8SNickeau
89*37748cd8SNickeau    public function getXhtmlRenderCacheSlotResults()
90*37748cd8SNickeau    {
91*37748cd8SNickeau        $xhtmlRenderResult = [];
92*37748cd8SNickeau        foreach ($this->cacheDataBySlots as $pageId => $modes) {
93*37748cd8SNickeau            foreach($modes as $mode => $values) {
94*37748cd8SNickeau                if ($mode === "xhtml") {
95*37748cd8SNickeau                    $xhtmlRenderResult[$pageId] = $this->cacheDataBySlots[$pageId][$mode][self::RESULT_STATUS];
96*37748cd8SNickeau                }
97*37748cd8SNickeau            }
98*37748cd8SNickeau        }
99*37748cd8SNickeau        return $xhtmlRenderResult;
100*37748cd8SNickeau    }
101*37748cd8SNickeau
102*37748cd8SNickeau    public function getCacheSlotResults()
103*37748cd8SNickeau    {
104*37748cd8SNickeau
105*37748cd8SNickeau        return $this->cacheDataBySlots;
106*37748cd8SNickeau    }
107*37748cd8SNickeau
108*37748cd8SNickeau    public function isCacheLogPresent($pageId, $mode)
109*37748cd8SNickeau    {
110*37748cd8SNickeau        return isset($this->cacheDataBySlots[$pageId][$mode]);
111*37748cd8SNickeau    }
112*37748cd8SNickeau
113*37748cd8SNickeau
114*37748cd8SNickeau}
115