xref: /template/strap/ComboStrap/FetcherSystem.php (revision 997da5972fe7174e36e252b9bc916d648326c198)
104fd306cSNickeau<?php
204fd306cSNickeau
304fd306cSNickeaunamespace ComboStrap;
404fd306cSNickeau
504fd306cSNickeauuse ComboStrap\Web\Url;
604fd306cSNickeau
704fd306cSNickeau/**
804fd306cSNickeau * Static class of the fetcher system
904fd306cSNickeau */
1004fd306cSNickeauclass FetcherSystem
1104fd306cSNickeau{
1204fd306cSNickeau
1304fd306cSNickeau    /**
1404fd306cSNickeau     *
1504fd306cSNickeau     * @param Url $fetchUrl
1604fd306cSNickeau     * @return IFetcherPath
1704fd306cSNickeau     * @throws ExceptionBadArgument
1804fd306cSNickeau     * @throws ExceptionNotFound
1904fd306cSNickeau     * @throws ExceptionInternal
2004fd306cSNickeau     */
2104fd306cSNickeau    public static function createPathFetcherFromUrl(Url $fetchUrl): IFetcherPath
2204fd306cSNickeau    {
2304fd306cSNickeau
2404fd306cSNickeau        try {
2504fd306cSNickeau            $fetcherName = $fetchUrl->getQueryPropertyValue(IFetcher::FETCHER_KEY);
2604fd306cSNickeau            try {
2704fd306cSNickeau                $fetchers = ClassUtility::getObjectImplementingInterface(IFetcherPath::class);
2804fd306cSNickeau            } catch (\ReflectionException $e) {
2904fd306cSNickeau                throw new ExceptionInternal("We could read fetch classes via reflection Error: {$e->getMessage()}");
3004fd306cSNickeau            }
3104fd306cSNickeau            foreach ($fetchers as $fetcher) {
3204fd306cSNickeau                /**
3304fd306cSNickeau                 * @var IFetcherPath $fetcher
3404fd306cSNickeau                 */
3504fd306cSNickeau                if ($fetcher->getFetcherName() === $fetcherName) {
3604fd306cSNickeau                    $fetcher->buildFromUrl($fetchUrl);
3704fd306cSNickeau                    return $fetcher;
3804fd306cSNickeau                }
3904fd306cSNickeau            }
4004fd306cSNickeau        } catch (ExceptionNotFound $e) {
4104fd306cSNickeau            // no fetcher property
4204fd306cSNickeau        }
4304fd306cSNickeau
4404fd306cSNickeau
4504fd306cSNickeau        try {
4604fd306cSNickeau            $fetchDoku = FetcherRawLocalPath::createLocalFromFetchUrl($fetchUrl);
4704fd306cSNickeau            $dokuPath = $fetchDoku->getSourcePath();
4804fd306cSNickeau        } catch (ExceptionBadArgument $e) {
4904fd306cSNickeau            throw new ExceptionNotFound("No fetcher could be matched to the url ($fetchUrl)");
5004fd306cSNickeau        }
5104fd306cSNickeau        try {
5204fd306cSNickeau            $mime = FileSystems::getMime($dokuPath);
5304fd306cSNickeau        } catch (ExceptionNotFound $e) {
5439c00e7eSNico            LogUtility::warning("Warning: The mime is unknown for the path ($dokuPath).", LogUtility::SUPPORT_CANONICAL, $e);
55*997da597SNico            $mime = new Mime(Mime::BINARY_MIME);
5604fd306cSNickeau        }
5704fd306cSNickeau        switch ($mime->toString()) {
5804fd306cSNickeau            case Mime::SVG:
5904fd306cSNickeau                return FetcherSvg::createSvgFromFetchUrl($fetchUrl);
6004fd306cSNickeau            default:
6104fd306cSNickeau                if ($mime->isImage()) {
6204fd306cSNickeau                    return FetcherRaster::createRasterFromFetchUrl($fetchUrl);
6304fd306cSNickeau                } else {
6404fd306cSNickeau                    return $fetchDoku;
6504fd306cSNickeau                }
6604fd306cSNickeau        }
6704fd306cSNickeau
6804fd306cSNickeau    }
6904fd306cSNickeau
7004fd306cSNickeau    /**
7104fd306cSNickeau     * @throws ExceptionInternal - if we can't reflect the class
7204fd306cSNickeau     * @throws ExceptionNotFound - if the fetcher is unknown
7304fd306cSNickeau     * @throws ExceptionBadArgument - if the fetcher is not set
7404fd306cSNickeau     */
7504fd306cSNickeau    public static function createFetcherStringFromUrl(Url $fetchUrl): IFetcherString
7604fd306cSNickeau    {
7704fd306cSNickeau
7804fd306cSNickeau        try {
7904fd306cSNickeau            $fetcherName = $fetchUrl->getQueryPropertyValue(IFetcher::FETCHER_KEY);
8004fd306cSNickeau        } catch (ExceptionNotFound $e) {
8104fd306cSNickeau            throw new ExceptionBadArgument("No fetcher name found");
8204fd306cSNickeau        }
8304fd306cSNickeau        try {
8404fd306cSNickeau            $fetchers = ClassUtility::getObjectImplementingInterface(IFetcherString::class);
8504fd306cSNickeau        } catch (\ReflectionException $e) {
8604fd306cSNickeau            throw new ExceptionInternal("We could read fetch classes via reflection Error: {$e->getMessage()}");
8704fd306cSNickeau        }
8804fd306cSNickeau        foreach ($fetchers as $fetcher) {
8904fd306cSNickeau            /**
9004fd306cSNickeau             * @var IFetcherString $fetcher
9104fd306cSNickeau             */
9204fd306cSNickeau            if ($fetcher->getFetcherName() === $fetcherName) {
9304fd306cSNickeau                $fetcher->buildFromUrl($fetchUrl);
9404fd306cSNickeau                return $fetcher;
9504fd306cSNickeau            }
9604fd306cSNickeau        }
9704fd306cSNickeau        throw new ExceptionNotFound("No fetcher found with the name ($fetcherName)");
9804fd306cSNickeau
9904fd306cSNickeau    }
10004fd306cSNickeau
10104fd306cSNickeau}
102