[Mapbender-commits] r10163 - trunk/mapbender/http/php
svn_mapbender at osgeo.org
svn_mapbender at osgeo.org
Wed Jun 26 07:54:39 PDT 2019
Author: armin11
Date: 2019-06-26 07:54:39 -0700 (Wed, 26 Jun 2019)
New Revision: 10163
Added:
trunk/mapbender/http/php/mod_getCoupledResourcesForDataset.php
Log:
New module to resolve coupled services from given csw getrecordbyid resource url
Added: trunk/mapbender/http/php/mod_getCoupledResourcesForDataset.php
===================================================================
--- trunk/mapbender/http/php/mod_getCoupledResourcesForDataset.php (rev 0)
+++ trunk/mapbender/http/php/mod_getCoupledResourcesForDataset.php 2019-06-26 14:54:39 UTC (rev 10163)
@@ -0,0 +1,189 @@
+<?php
+# License:
+# Copyright (c) 2009, Open Source Geospatial Foundation
+# This program is dual licensed under the GNU General Public License
+# and Simplified BSD license.
+# http://svn.osgeo.org/mapbender/trunk/mapbender/license/license.txt
+require_once dirname(__FILE__) . "/../../core/globalSettings.php";
+require_once dirname(__FILE__) . "/../classes/class_iso19139.php";
+require_once(dirname(__FILE__) . "/../classes/class_cswClient.php");
+require_once(dirname(__FILE__) . "/../classes/class_csw.php");
+//show html from a given url
+//default languageCode to de
+//example:
+//https://gdk.gdi-de.org/gdi-de/srv/eng/csw?request=GetRecordById&service=CSW&version=2.0.2&Id=71b31668-746b-40a2-975a-172a87318e45&ElementSetName=full&OUTPUTSCHEMA=http://www.isotc211.org/2005/gmd
+
+//localhost/mapbender/php/mod_getCoupledResourcesForDataset.php?getRecordByIdUrl=https%3A%2F%2Fgdk.gdi-de.org%2Fgdi-de%2Fsrv%2Feng%2Fcsw%3Frequest%3DGetRecordById%26service%3DCSW%26version%3D2.0.2%26Id%3D71b31668-746b-40a2-975a-172a87318e45%26ElementSetName%3Dfull%26OUTPUTSCHEMA%3Dhttp%3A%2F%2Fwww.isotc211.org%2F2005%2Fgmd
+$languageCode = "de";
+$url = urldecode($_REQUEST['getRecordByIdUrl']);
+$outputFormat = 'json';
+$catalogueId = 1;
+$resultObj['result'] = '';
+$resultObj['success'] = false;
+$resultObj['message'] = 'no message';
+//get language parameter out of mapbender session if it is set else set default language to de_DE
+$sessionLang = Mapbender::session()->get("mb_lang");
+if (isset($sessionLang) && ($sessionLang!='')) {
+ $e = new mb_notice("mod_showMetadata.php: language found in session: ".$sessionLang);
+ $language = $sessionLang;
+ $langCode = explode("_", $language);
+ $langCode = $langCode[0]; # Hopefully de or s.th. else
+ $languageCode = $langCode; #overwrite the GET Parameter with the SESSION information
+}
+if (isset($_REQUEST["languageCode"]) & $_REQUEST["languageCode"] != "") {
+ //validate to csv integer list
+ $testMatch = $_REQUEST["languageCode"];
+ if (!($testMatch == 'de' or $testMatch == 'fr' or $testMatch == 'en')){
+ //echo 'languageCode: <b>'.$testMatch.'</b> is not valid.<br/>';
+ echo 'Parameter <b>languageCode</b> is not valid (de,fr,en).<br/>';
+ die();
+ }
+ $languageCode = $testMatch;
+ $testMatch = NULL;
+}
+/*if (isset($_REQUEST["catalogueId"]) & $_REQUEST["catalogueId"] != "") {
+ //validate integer to 100 - not more
+ $testMatch = $_REQUEST["catalogueId"];
+ //
+ $pattern = '/^([0-9]{0,1})([0-9]{1})$/';
+ if (!preg_match($pattern,$testMatch)){
+ //echo 'maxResults: <b>'.$testMatch.'</b> is not valid.<br/>';
+ echo 'Parameter <b>catalogueId</b> is not valid (integer < 99).<br/>';
+ die();
+ }
+ $catalogueId = $testMatch;
+ $testMatch = NULL;
+} else {
+ echo 'Mandatory parameter <b>catalogueId</b> not set!<br/>';
+ die();
+}*/
+/*if (isset($_REQUEST["datasetId"]) & $_REQUEST["datasetId"] != "") {
+ //validate integer to 100 - not more
+ $testMatch = $_REQUEST["datasetId"];
+ //
+ $pattern = '/^([0-9]{0,1})([0-9]{1})$/';
+ if (!preg_match($pattern,$testMatch)){
+ //echo 'maxResults: <b>'.$testMatch.'</b> is not valid.<br/>';
+ echo 'Parameter <b>datasetId</b> is not valid (integer < 99).<br/>';
+ die();
+ }
+ $datasetId = $testMatch;
+ $testMatch = NULL;
+} else {
+ echo 'Mandatory parameter <b>datasetId</b> not set!<br/>';
+ die();
+}*/
+//write languageCode into session!
+$localeObj->setCurrentLocale($languageCode);
+if (isset($_REQUEST["outputFormat"]) & $_REQUEST["outputFormat"] != "") {
+ //validate to de, en, fr
+ $testMatch = $_REQUEST["outputFormat"];
+ if (!($testMatch == 'html' or $testMatch == 'json')){
+ //echo 'languageCode: <b>'.$testMatch.'</b> is not valid.<br/>';
+ echo 'Parameter <b>outputFormat</b> is not valid (json,html).<br/>';
+ die();
+ }
+ $outputFormat = $testMatch;
+ $testMatch = NULL;
+}
+//instantiate
+$mbMetadata = new Iso19139();
+//initialize if resource is based on a request to csw interface
+$cswBasedResource = false;
+//test if getrecordbyid request was used - then the service data may also be in the same catalogue
+if (strpos(strtoupper($url), "GETRECORDBYID",strtoupper($url)) !== false && strpos(strtoupper($url), "SERVICE=CSW") !== false && strpos(strtoupper($url), "VERSION=2.0.2") !== false) {
+ $cswBasedResource = true;
+} else {
+ $resultObj['message'] ='Url dont validate against a getrecordbyid url!';
+ $resultObj['result'] = null;
+ echo json_encode($resultObj);
+ die();
+}
+//build search request for services
+//TODO: test if this ok - maybe not everything is parsed by class? instead we could use $mbMetadata->readFromUrl($url);
+$mbMetadata->createFromUrl($url);
+$serviceMetadata = new stdClass();
+$serviceMetadataIndex = 0;
+if ($mbMetadata->hierarchyLevel == 'dataset' || $mbMetadata->hierarchyLevel == 'series') {
+ //get datasetidentifier to resolve coupled resources
+ //$e = new mb_exception("datasetId: ".$mbMetadata->datasetId);
+ //$e = new mb_exception("datasetIdCodeSpace: ".$mbMetadata->datasetIdCodeSpace);
+ if ($cswBasedResource == true) {
+ //$e = new mb_exception("try to resolve coupled resources");
+ //createCatObjFromXML($url);
+ $csw = new csw();
+ //$e = new mb_exception("parse csw capabilities!");
+ //parse url
+ $urlArray = parse_url($url);
+ $urlWithoutRequest = $urlArray['scheme']."://".$urlArray['host'].":".$urlArray['port']."/".$urlArray['path'];
+ $csw->createCatObjFromXML($urlWithoutRequest."?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetCapabilities");
+ $cswClient = new cswClient();
+ $operation = "getrecordsresolvecoupling";
+ $getrecordId = $mbMetadata->fileIdentifier;
+ $datasetId = $mbMetadata->datasetId;
+ $recordType = 'service';
+ $cswResponseObject = $cswClient->doRequest(false, $operation, $getrecordId, false, $recordType, false, false, false, $datasetId, $csw);
+ $serviceMetadataUrls = array();
+ if ($cswClient->operationSuccessful == true) {
+ //$e = new mb_exception("operation successfull");
+ //$e = new mb_exception(gettype($cswClient->operationResult));
+ $metadataRecord = $cswClient->operationResult->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata');
+ //$e = new mb_exception("number of records: ".count($metadataRecord));
+ //what is possible: keywords, categories?, spatial, ...
+ if (count($metadataRecord) < 1) {
+ $resultObj['message'] ='No coupled services found in csw catalogue!';
+ $resultObj['result'] = null;
+ echo json_encode($resultObj);
+ die();
+ }
+ for ($k = 1; $k <= count($metadataRecord) ; $k++) {
+ $fileIdentifier = $cswClient->operationResult->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata['.$k.']/gmd:fileIdentifier/gco:CharacterString');
+ $fileIdentifier = (string)$fileIdentifier[0];
+ //service date
+ $mdDateStamp = $cswClient->operationResult->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata['.$k.']/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:date/gmd:CI_Date/gmd:date/gco:Date');
+ $mdDateStamp = (string)$mdDateStamp[0];
+ //service title
+ $mdTitle = $cswClient->operationResult->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata['.$k.']/gmd:identificationInfo/srv:SV_ServiceIdentification/gmd:citation/gmd:CI_Citation/gmd:title/gco:CharacterString');
+ $mdTitle = (string)$mdTitle[0];
+ //service type
+ $mdServiceType = $cswClient->operationResult->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata['.$k.']/gmd:identificationInfo/srv:SV_ServiceIdentification/srv:serviceType/gco:LocalName');
+ $mdServiceType = (string)$mdServiceType[0];
+ //accessUrl
+ $mdAccessUrl = $cswClient->operationResult->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata['.$k.']/gmd:distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/gmd:linkage/gmd:URL');
+ $mdAccessUrl = (string)$mdAccessUrl[0];
+
+ //get service type - view / download
+
+ //get service title
+
+ /*$datasetIdentifier = $cswClient->operationResult->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata['.$k.']/gmd:identificationInfo/gmd:MD_DataIdentification/@uuid');
+ $datasetidentifier = (string)$datasetidentifier[0];
+ $url = $cswClient->operationResult->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata['.$k.']/gmd:distributionInfo/gmd:MD_Distribution/gmd:transferOptions/gmd:MD_DigitalTransferOptions/gmd:onLine/gmd:CI_OnlineResource/gmd:linkage/gmd:URL');
+ $url = (string)$url[0];
+ if (isset($url) && $url !=="") {
+ //$metadataArray[$numberOfMetadataRecords]['uuid'] = $datasetIdentifier;
+ $metadataArray[$numberOfMetadataRecords]['uuid'] = $fileIdentifier;
+ $metadataArray[$numberOfMetadataRecords]['changedate'] = $mdDateStamp;
+ $numberOfMetadataRecords++;
+ }*/
+ //$e = new mb_exception("found service with fileIdentifier: ".$fileIdentifier." - date - ".$mdDateStamp);
+ $serviceMetadata->service[$k]->serviceType = $mdServiceType;
+ $serviceMetadata->service[$k]->serviceTitle = $mdTitle;
+ $serviceMetadata->service[$k]->serviceDate = $mdDateStamp;
+ $serviceMetadata->service[$k]->metadataUrl = $urlWithoutRequest."?SERVICE=CSW&VERSION=2.0.2&REQUEST=GetRecordById&outputSchema=".urlencode('http://www.isotc211.org/2005/gmd')."&id=".$fileIdentifier;
+ $serviceMetadata->service[$k]->accessUrl = $mdAccessUrl;
+ }
+ }
+ $resultObj['message'] = "Coupling resolved successfully!";
+ $resultObj['success'] = true;
+ $resultObj['result'] = $serviceMetadata;
+ echo json_encode($resultObj);
+ die();
+ } else {
+ $resultObj['message'] ='No csw based resource!!';
+ $resultObj['result'] = null;
+ echo json_encode($resultObj);
+ die();
+ }
+}
+?>
More information about the Mapbender_commits
mailing list