diff options
author | Yaco <franco@reevo.org> | 2020-06-04 11:01:00 -0300 |
---|---|---|
committer | Yaco <franco@reevo.org> | 2020-06-04 11:01:00 -0300 |
commit | fc7369835258467bf97eb64f184b93691f9a9fd5 (patch) | |
tree | daabd60089d2dd76d9f5fb416b005fbe159c799d /www/wiki/extensions/Maps/src/DataAccess/JsonFileParser.php |
first commit
Diffstat (limited to 'www/wiki/extensions/Maps/src/DataAccess/JsonFileParser.php')
-rw-r--r-- | www/wiki/extensions/Maps/src/DataAccess/JsonFileParser.php | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/www/wiki/extensions/Maps/src/DataAccess/JsonFileParser.php b/www/wiki/extensions/Maps/src/DataAccess/JsonFileParser.php new file mode 100644 index 00000000..81d6cfa0 --- /dev/null +++ b/www/wiki/extensions/Maps/src/DataAccess/JsonFileParser.php @@ -0,0 +1,79 @@ +<?php + +declare( strict_types = 1 ); + +namespace Maps\DataAccess; + +use FileFetcher\FileFetcher; +use FileFetcher\FileFetchingException; +use Maps\MapsFactory; +use ValueParsers\ParseException; +use ValueParsers\ValueParser; + +/** + * Returns the content of the JSON file at the specified location as array. + * Empty array is returned on failure. + * + * @licence GNU GPL v2+ + * @author Jeroen De Dauw < jeroendedauw@gmail.com > + */ +class JsonFileParser implements ValueParser { + + private $fileFetcher; + private $pageContentFetcher; + private $defaultNamespace; + + public function __construct( $fileFetcher = null, PageContentFetcher $pageContentFetcher = null ) { + $this->fileFetcher = $fileFetcher instanceof FileFetcher + ? $fileFetcher : MapsFactory::newDefault()->getGeoJsonFileFetcher(); + + $this->pageContentFetcher = $pageContentFetcher instanceof PageContentFetcher + ? $pageContentFetcher : MapsFactory::newDefault()->getPageContentFetcher(); + + $this->defaultNamespace = NS_GEO_JSON; + } + + /** + * @param string $fileLocation + * + * @return array + * @throws ParseException + */ + public function parse( $fileLocation ) { + $jsonString = $this->getJsonString( $fileLocation ); + + if ( $jsonString === null ) { + return []; + } + + $json = json_decode( $jsonString, true ); + + if ( $json === null ) { + return []; + } + + return $json; + } + + private function getJsonString( string $fileLocation ): ?string { + $content = $this->pageContentFetcher->getPageContent( $fileLocation, $this->defaultNamespace ); + + if ( $content instanceof \JsonContent ) { + return $content->getNativeData(); + } + + // Prevent reading JSON files on the server + if( !filter_var( $fileLocation, FILTER_VALIDATE_URL) ) { + return null; + } + + try { + return $this->fileFetcher->fetchFile( $fileLocation ); + } + catch ( FileFetchingException $ex ) { + return null; + } + } + + +} |