summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Maps/src/DataAccess/JsonFileParser.php
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
committerYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
commitfc7369835258467bf97eb64f184b93691f9a9fd5 (patch)
treedaabd60089d2dd76d9f5fb416b005fbe159c799d /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.php79
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;
+ }
+ }
+
+
+}