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