isValid(); } $numberOfFile = 0; if ($handle = opendir($metadataDir)) { //echo "Read files from temporary metadata folder:
"; /* This is the correct way to loop over the directory. */ while (false !== ($file = readdir($handle))) { $startTime = microtime(true); //check if file name begin with "mapbender"; $pos = strpos($file, "mapbender"); if ($pos !== false) { //delete file with unlink //unlink($metadataDir."/".$file); //echo filesize($metadataDir."/".$file)."
"; //read with class Iso19139() $h = fopen($metadataDir."/".$file, "r"); $newKeywordsIndex = 0; logMessages($metadataDir."/".$file); if (filesize($metadataDir."/".$file) != 0) { $metadataXml = fread($h, filesize($metadataDir."/".$file)); //repair https problems from komserv!!!!! $metadataXml = str_replace('https://standards.iso.org', 'http://standards.iso.org', $metadataXml); $metadataXml = str_replace('https://www.isotc211.org', 'http://www.isotc211.org', $metadataXml); $metadataXml = str_replace('https://www.w3.org', 'http://www.w3.org', $metadataXml); $metadataXml = str_replace('https://www.opengis.net', 'http://www.opengis.net', $metadataXml); $metadataXml = str_replace('https://schemas.opengis.net', 'http://schemas.opengis.net', $metadataXml); $metadataObject = $metadataClass->createMapbenderMetadataFromXML($metadataXml); logMessages("fileIdentifier: ".$metadataObject->fileIdentifier); logMessages("type: ".$metadataObject->hierarchyLevel); if (in_array('inspireidentifiziert', $metadataObject->keywords) && !in_array('Regional', $metadataObject->keywords) && $metadataObject->hierarchyLevel == 'dataset') { //echo $metadataObject->title."
"; //echo $metadataDir."/".$file." has keyword inspireidentifiziert!
"; $keywordsArray[$newKeywordsIndex]->keyword = "Regional"; $keywordsArray[$newKeywordsIndex]->thesaurusTitle = "Spatial scope"; $keywordsArray[$newKeywordsIndex]->thesaurusPubDate = "2019-05-22"; /*$newKeywordsIndex++; $keywordsArray[$newKeywordsIndex]->keyword = "Regional1"; $keywordsArray[$newKeywordsIndex]->thesaurusTitle = "Spatial scope1"; $keywordsArray[$newKeywordsIndex]->thesaurusPubDate = "2019-05-22"; $e = new mb_exception("test3");*/ } //logMessages("Actual keywords: ".json_encode($metadataObject->keywords)); if ($injectRegistryUuid && !in_array($uuid, $metadataObject->keywords)) { //add mapbender registry keyword $newKeywordsIndex++; $keywordsArray[$newKeywordsIndex]->keyword = $uuid; $keywordsArray[$newKeywordsIndex]->thesaurusTitle = "mapbender.2.registryId"; $keywordsArray[$newKeywordsIndex]->thesaurusPubDate = "2019-10-30"; } //logMessages("count keywordsArray: ".count($keywordsArray)." - count metadataObject->keywords: ".count($metadataObject->keywords)); if ($debug == true) { $metadataXml = addKeywords($metadataXml, $keywordsArray); logMessages("Keywords will be injected without test before - debug mode!"); } else { if (count($keywordsArray) > 0 && count($metadataObject->keywords) > 0) { $metadataXml = addKeywords($metadataXml, $keywordsArray); logMessages("Keywords will be injected!"); } else { //TODO inject keyword after some other element! logMessages("No keywords will be injected - file unaltered!"); } } unset($keywordsArray); //debug //header("Content-type: text/xml"); //echo $metadataXml; //die(); //save xml to file } fclose($h); //close file for read //open same file for write and insert xml into the file! $writeHandle = fopen($metadataDir."/".$file, "w+"); fwrite($writeHandle, $metadataXml); fclose($writeHandle); logMessages("Number of altered file: ".($numberOfFile + 1)); $numberOfFile++; $timeToBuild = microtime(true) - $startTime; logMessages("time to alter xml: ".$timeToBuild); //save xml to file //echo $metadataDir."/".$file." will be altered!
"; } else { //echo "$file will not be altered!
"; } } closedir($handle); $timeToBuildAll = microtime(true) - $startTimeForAll; logMessages("time to alter all xml: ".$timeToBuildAll); } function addKeywords($metadataXml, $keywordsArray) { //logMessages("function addKeywords"); //parse XML part //do parsing with dom, cause we want to alter the xml which have been parsed afterwards $metadataDomObject = new DOMDocument(); libxml_use_internal_errors(true); try { $metadataDomObject->loadXML($metadataXml); if ($metadataDomObject === false) { foreach(libxml_get_errors() as $error) { logMessages("php/mod_qualifyPersistedMetadataXml.php: ".$error->message); } throw new Exception("php/mod_qualifyPersistedMetadataXml.php:".'Cannot parse metadata with dom!'); } } catch (Exception $e) { logMessages("php/mod_qualifyPersistedMetadataXml.php: ".$e->getMessage()); } if ($metadataDomObject !== false) { //importing namespaces $xpath = new DOMXPath($metadataDomObject); $rootNamespace = $metadataDomObject->lookupNamespaceUri($metadataDomObject->namespaceURI); $xpath->registerNamespace('defaultns', $rootNamespace); //$xpath->registerNamespace('georss','http://www.georss.org/georss'); $xpath->registerNamespace("csw", "http://www.opengis.net/cat/csw/2.0.2"); $xpath->registerNamespace("gml", "http://www.opengis.net/gml"); $xpath->registerNamespace("gco", "http://www.isotc211.org/2005/gco"); $xpath->registerNamespace("gmd", "http://www.isotc211.org/2005/gmd"); $xpath->registerNamespace("gts", "http://www.isotc211.org/2005/gts"); $xpath->registerNamespace("xsi", "http://www.w3c.org/2001/XMLSchema-instance"); //$xpath->registerNamespace("srv", "http://www.isotc211.org/2005/srv"); $xpath->registerNamespace("xlink", "http://www.w3.org/1999/xlink"); //Qualify schemaLocation *********************************************************************************************************************************************** //extract attribute schemaLocation - alter it if it has only one uri entry for gmd! $MD_MetadataNodeList = $xpath->query("//gmd:MD_Metadata[@xsi:schemaLocation = 'http://www.isotc211.org/2005/gmd']"); if ($MD_MetadataNodeList->item(0) != null) { $MD_MetadataNodeList->item(0)->setAttribute('xsi:schemaLocation', 'http://www.isotc211.org/2005/gmd http://schemas.opengis.net/iso/19139/20060504/gmd/gmd.xsd'); logMessages("schemaLocation attribute extended!!!!"); } else { logMessages("schemaLocation attribute is not http://www.isotc211.org/2005/gmd. Nothing will be done!"); } //Qualify schemaLocation end ******************************************************************************************************************************************* //check for empty keyword //check for right date formats //check for empty use constraints //check for empty responsible party elements //check for wrong format description - name, version, specification //check ... - maybe include it into class_iso19139 - this will be easier! //inspire specific keywords //https://webgate.ec.europa.eu/fpfis/wikis/display/InspireMIG/Spatial+scope+code+list //problem: gmx namespace does not exists !!!!! - have to be declared before!!!!!! /*$keywordXMLSnippet = 'RegionalSpatial scope2019-05-22publication';*/ $descriptiveKeywordsNodeList = $xpath->query('//gmd:MD_Metadata/gmd:identificationInfo//gmd:descriptiveKeywords'); //data and service identification! //$arrayDescriptiveKeywordsNodeList = (array)$descriptiveKeywordsNodeList; foreach ($keywordsArray as $keyword) { $keywordXMLSnippet =' '.$keyword->keyword.' '.$keyword->thesaurusTitle.' '.$keyword->thesaurusPubDate.' publication '; //count old resourceConstraints elements //TODO - if this is empty - create a new entry //if (!empty($arrayResourceConstraintsNodeList)) { //logMessages("Count of existing descriptiveKeywordsNodeList: ".count($descriptiveKeywordsNodeList)); if (count($descriptiveKeywordsNodeList) > 0) { //$e = new mb_exception("list is not empty!"); //load xml from constraint generator $keywordDomObject = new DOMDocument(); $keywordDomObject->loadXML($keywordXMLSnippet); $xpathKeyword = new DOMXpath($keywordDomObject); $keywordNodeList = $xpathKeyword->query('/gmd:descriptiveKeywords'); //insert new keyword before first old constraints node //for ($i = ($keywordNodeList->length)-1; $i >= 0; $i--) { $descriptiveKeywordsNodeList->item(0)->parentNode->insertBefore($metadataDomObject->importNode($keywordNodeList->item(0), true), $descriptiveKeywordsNodeList->item(0)); //} //delete all resourceConstraints from original xml document /*for ($i = 0; $i < $resourceConstraintsNodeList->length; $i++) { $temp = $resourceConstraintsNodeList->item($i); //avoid calling a function twice $temp->parentNode->removeChild($temp); }*/ }//end for descriptiveKeywordsNodeList } //end - foreach keyword in array //if keyword was injected - the metadata dateStamp has to be altered - fictive 1 day will be added to mark the difference! $dateNodeList = $xpath->query('//gmd:MD_Metadata/gmd:dateStamp/gco:Date'); $dateStamp = $dateNodeList->item(0)->nodeValue; //$date = new DateTime($dateStamp); $date = new DateTime('NOW'); //add one day //$date->add(new DateInterval('P1D')); $date = new DateTime('NOW'); $dateNew = date_format($date, 'Y-m-d'); $fragment = $metadataDomObject->createElementNS('http://www.isotc211.org/2005/gco', 'gco:Date', $dateNew); $dateNodeList->item(0)->parentNode->replaceChild($fragment, $dateNodeList->item(0)); } //end for parsing xml successfully return $metadataDomObject->saveXML(); } function logMessages($message) { if (php_sapi_name() === 'cli' OR defined('STDIN')) { echo __FILE__.": ".$message."\n"; } else { $e = new mb_exception(__FILE__.": ".$message); } } ?>