xref: /plugin/combo/ComboStrap/CacheReportHtmlDataBlockArray.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
14cadd4f8SNickeau<?php
24cadd4f8SNickeau
34cadd4f8SNickeau
44cadd4f8SNickeaunamespace ComboStrap;
54cadd4f8SNickeau
64cadd4f8SNickeau
7*04fd306cSNickeauuse ComboStrap\Xml\XmlDocument;
8*04fd306cSNickeau
94cadd4f8SNickeauclass CacheReportHtmlDataBlockArray
104cadd4f8SNickeau{
114cadd4f8SNickeau
124cadd4f8SNickeau    const RESULT_STATUS = 'result';
134cadd4f8SNickeau    const DATE_MODIFIED = 'mtime';
144cadd4f8SNickeau    const CACHE_FILE = "file";
154cadd4f8SNickeau
164cadd4f8SNickeau    /**
174cadd4f8SNickeau     * Used when the cache data report
184cadd4f8SNickeau     * are injected in the page in a json format
194cadd4f8SNickeau     */
204cadd4f8SNickeau    public const APPLICATION_COMBO_CACHE_JSON = "application/combo+cache+json";
214cadd4f8SNickeau    const DEPENDENCY_ATT = "dependency";
224cadd4f8SNickeau
234cadd4f8SNickeau
244cadd4f8SNickeau    /**
254cadd4f8SNickeau     * @return array - a array that will be transformed as json HTML data block
264cadd4f8SNickeau     * to be included in a HTML page in order to insert cache results in the html page
274cadd4f8SNickeau     */
28*04fd306cSNickeau    public static function getFromContext(): array
294cadd4f8SNickeau    {
30*04fd306cSNickeau        $cacheManager = ExecutionContext::getActualOrCreateFromEnv()
31*04fd306cSNickeau            ->getCacheManager();
324cadd4f8SNickeau        $cacheReporters = $cacheManager->getCacheResults();
334cadd4f8SNickeau        $htmlDataBlock = [];
344cadd4f8SNickeau        foreach ($cacheReporters as $cacheReporter) {
354cadd4f8SNickeau
36*04fd306cSNickeau            $cacheResults = $cacheReporter->getResults();
37*04fd306cSNickeau            foreach ($cacheResults as $result) {
384cadd4f8SNickeau
394cadd4f8SNickeau                $modifiedDate = "";
404cadd4f8SNickeau                if ($result->getPath() !== null) {
41*04fd306cSNickeau                    try {
424cadd4f8SNickeau                        $modifiedTime = FileSystems::getModifiedTime($result->getPath());
434cadd4f8SNickeau                        $modifiedDate = $modifiedTime->format(Iso8601Date::getFormat());
44*04fd306cSNickeau                    } catch (ExceptionNotFound $e) {
45*04fd306cSNickeau                        // the file exists
464cadd4f8SNickeau                    }
474cadd4f8SNickeau                }
484cadd4f8SNickeau                $mode = $result->getMode();
49*04fd306cSNickeau                $sourcePath = $result->getMarkupPath()->getPathObject();
50*04fd306cSNickeau                /**
51*04fd306cSNickeau                 * If this is not a wiki path, we try to transform it as wiki path
52*04fd306cSNickeau                 * to get a shorter path (ie id) in the report
53*04fd306cSNickeau                 */
54*04fd306cSNickeau                if (!($sourcePath instanceof WikiPath)) {
554cadd4f8SNickeau                    try {
56*04fd306cSNickeau                        $sourcePath = WikiPath::createFromPathObject($sourcePath);
57*04fd306cSNickeau                    } catch (ExceptionBadArgument $e) {
58*04fd306cSNickeau                        // could not be transformed as wiki path (missing a drive)
594cadd4f8SNickeau                    }
60*04fd306cSNickeau                }
61*04fd306cSNickeau                $cacheFile = $result->getPath();
62*04fd306cSNickeau                try {
63*04fd306cSNickeau                    $cacheFile = $cacheFile->toWikiPath();
64*04fd306cSNickeau                } catch (ExceptionBadArgument $e) {
65*04fd306cSNickeau                    LogUtility::error("Cache reporter: The cache file could not be transformed as a wiki path. Error: " . $e->getMessage());
66*04fd306cSNickeau                }
67*04fd306cSNickeau
68*04fd306cSNickeau
694cadd4f8SNickeau                $data = [
704cadd4f8SNickeau                    self::RESULT_STATUS => $result->getResult(),
714cadd4f8SNickeau                    self::DATE_MODIFIED => $modifiedDate,
72*04fd306cSNickeau                    self::CACHE_FILE => $cacheFile->toAbsoluteId()
734cadd4f8SNickeau                ];
744cadd4f8SNickeau
75*04fd306cSNickeau                if ($mode === FetcherMarkup::XHTML_MODE) {
76*04fd306cSNickeau                    try {
77*04fd306cSNickeau                        $dependencies = FetcherMarkup::createXhtmlMarkupFetcherFromPath($sourcePath, $sourcePath)
78*04fd306cSNickeau                            ->getOutputCacheDependencies()
794cadd4f8SNickeau                            ->getDependencies();
80*04fd306cSNickeau                    } catch (ExceptionNotExists $e) {
81*04fd306cSNickeau                        continue;
82*04fd306cSNickeau                    }
834cadd4f8SNickeau                    $data[self::DEPENDENCY_ATT] = $dependencies;
844cadd4f8SNickeau                }
854cadd4f8SNickeau
86*04fd306cSNickeau                $htmlDataBlock[$sourcePath->toAbsoluteId()][$mode] = $data;
874cadd4f8SNickeau
884cadd4f8SNickeau            }
894cadd4f8SNickeau
904cadd4f8SNickeau        }
914cadd4f8SNickeau        return $htmlDataBlock;
924cadd4f8SNickeau    }
934cadd4f8SNickeau
944cadd4f8SNickeau
954cadd4f8SNickeau    /**
964cadd4f8SNickeau     * An utility function to extract the cache data block from test responses
97*04fd306cSNickeau     * @param XmlDocument $xmlDom
984cadd4f8SNickeau     * @return mixed
99*04fd306cSNickeau     * @throws ExceptionCompile
1004cadd4f8SNickeau     */
101*04fd306cSNickeau    public static function extractFromHtmlDom(XmlDocument $xmlDom)
1024cadd4f8SNickeau    {
103*04fd306cSNickeau        $metaCacheMain = $xmlDom->querySelector('script[type="' . CacheReportHtmlDataBlockArray::APPLICATION_COMBO_CACHE_JSON . '"]');
104*04fd306cSNickeau        $cacheJsonTextValue = $metaCacheMain->getNodeValueWithoutCdata();
105*04fd306cSNickeau        return json_decode($cacheJsonTextValue, true);
1064cadd4f8SNickeau    }
1074cadd4f8SNickeau}
108