xref: /template/strap/ComboStrap/FetcherSystem.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap;
4*04fd306cSNickeau
5*04fd306cSNickeauuse ComboStrap\Web\Url;
6*04fd306cSNickeau
7*04fd306cSNickeau/**
8*04fd306cSNickeau * Static class of the fetcher system
9*04fd306cSNickeau */
10*04fd306cSNickeauclass FetcherSystem
11*04fd306cSNickeau{
12*04fd306cSNickeau
13*04fd306cSNickeau    /**
14*04fd306cSNickeau     *
15*04fd306cSNickeau     * @param Url $fetchUrl
16*04fd306cSNickeau     * @return IFetcherPath
17*04fd306cSNickeau     * @throws ExceptionBadArgument
18*04fd306cSNickeau     * @throws ExceptionNotFound
19*04fd306cSNickeau     * @throws ExceptionInternal
20*04fd306cSNickeau     */
21*04fd306cSNickeau    public static function createPathFetcherFromUrl(Url $fetchUrl): IFetcherPath
22*04fd306cSNickeau    {
23*04fd306cSNickeau
24*04fd306cSNickeau        try {
25*04fd306cSNickeau            $fetcherName = $fetchUrl->getQueryPropertyValue(IFetcher::FETCHER_KEY);
26*04fd306cSNickeau            try {
27*04fd306cSNickeau                $fetchers = ClassUtility::getObjectImplementingInterface(IFetcherPath::class);
28*04fd306cSNickeau            } catch (\ReflectionException $e) {
29*04fd306cSNickeau                throw new ExceptionInternal("We could read fetch classes via reflection Error: {$e->getMessage()}");
30*04fd306cSNickeau            }
31*04fd306cSNickeau            foreach ($fetchers as $fetcher) {
32*04fd306cSNickeau                /**
33*04fd306cSNickeau                 * @var IFetcherPath $fetcher
34*04fd306cSNickeau                 */
35*04fd306cSNickeau                if ($fetcher->getFetcherName() === $fetcherName) {
36*04fd306cSNickeau                    $fetcher->buildFromUrl($fetchUrl);
37*04fd306cSNickeau                    return $fetcher;
38*04fd306cSNickeau                }
39*04fd306cSNickeau            }
40*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
41*04fd306cSNickeau            // no fetcher property
42*04fd306cSNickeau        }
43*04fd306cSNickeau
44*04fd306cSNickeau
45*04fd306cSNickeau        try {
46*04fd306cSNickeau            $fetchDoku = FetcherRawLocalPath::createLocalFromFetchUrl($fetchUrl);
47*04fd306cSNickeau            $dokuPath = $fetchDoku->getSourcePath();
48*04fd306cSNickeau        } catch (ExceptionBadArgument $e) {
49*04fd306cSNickeau            throw new ExceptionNotFound("No fetcher could be matched to the url ($fetchUrl)");
50*04fd306cSNickeau        }
51*04fd306cSNickeau        try {
52*04fd306cSNickeau            $mime = FileSystems::getMime($dokuPath);
53*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
54*04fd306cSNickeau            throw new ExceptionNotFound("No fetcher could be created. The mime is unknown for the path ($dokuPath). Error: {$e->getMessage()}");
55*04fd306cSNickeau        }
56*04fd306cSNickeau        switch ($mime->toString()) {
57*04fd306cSNickeau            case Mime::SVG:
58*04fd306cSNickeau                return FetcherSvg::createSvgFromFetchUrl($fetchUrl);
59*04fd306cSNickeau            default:
60*04fd306cSNickeau                if ($mime->isImage()) {
61*04fd306cSNickeau                    return FetcherRaster::createRasterFromFetchUrl($fetchUrl);
62*04fd306cSNickeau                } else {
63*04fd306cSNickeau                    return $fetchDoku;
64*04fd306cSNickeau                }
65*04fd306cSNickeau        }
66*04fd306cSNickeau
67*04fd306cSNickeau    }
68*04fd306cSNickeau
69*04fd306cSNickeau    /**
70*04fd306cSNickeau     * @throws ExceptionInternal - if we can't reflect the class
71*04fd306cSNickeau     * @throws ExceptionNotFound - if the fetcher is unknown
72*04fd306cSNickeau     * @throws ExceptionBadArgument - if the fetcher is not set
73*04fd306cSNickeau     */
74*04fd306cSNickeau    public static function createFetcherStringFromUrl(Url $fetchUrl): IFetcherString
75*04fd306cSNickeau    {
76*04fd306cSNickeau
77*04fd306cSNickeau        try {
78*04fd306cSNickeau            $fetcherName = $fetchUrl->getQueryPropertyValue(IFetcher::FETCHER_KEY);
79*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
80*04fd306cSNickeau            throw new ExceptionBadArgument("No fetcher name found");
81*04fd306cSNickeau        }
82*04fd306cSNickeau        try {
83*04fd306cSNickeau            $fetchers = ClassUtility::getObjectImplementingInterface(IFetcherString::class);
84*04fd306cSNickeau        } catch (\ReflectionException $e) {
85*04fd306cSNickeau            throw new ExceptionInternal("We could read fetch classes via reflection Error: {$e->getMessage()}");
86*04fd306cSNickeau        }
87*04fd306cSNickeau        foreach ($fetchers as $fetcher) {
88*04fd306cSNickeau            /**
89*04fd306cSNickeau             * @var IFetcherString $fetcher
90*04fd306cSNickeau             */
91*04fd306cSNickeau            if ($fetcher->getFetcherName() === $fetcherName) {
92*04fd306cSNickeau                $fetcher->buildFromUrl($fetchUrl);
93*04fd306cSNickeau                return $fetcher;
94*04fd306cSNickeau            }
95*04fd306cSNickeau        }
96*04fd306cSNickeau        throw new ExceptionNotFound("No fetcher found with the name ($fetcherName)");
97*04fd306cSNickeau
98*04fd306cSNickeau    }
99*04fd306cSNickeau
100*04fd306cSNickeau}
101