[Mapbender-commits] r7797 - in trunk/mapbender/http: classes php plugins

svn_mapbender at osgeo.org svn_mapbender at osgeo.org
Fri May 6 07:50:54 EDT 2011


Author: armin11
Date: 2011-05-06 04:50:54 -0700 (Fri, 06 May 2011)
New Revision: 7797

Added:
   trunk/mapbender/http/php/mod_dataISOMetadata.php
Modified:
   trunk/mapbender/http/classes/class_wms.php
   trunk/mapbender/http/plugins/mb_metadata_server.php
   trunk/mapbender/http/plugins/mb_metadata_showMetadataAddon.js
Log:
Bugfixes and first - not functional version of new script which pulls the metadata from database.

Modified: trunk/mapbender/http/classes/class_wms.php
===================================================================
--- trunk/mapbender/http/classes/class_wms.php	2011-05-05 19:55:50 UTC (rev 7796)
+++ trunk/mapbender/http/classes/class_wms.php	2011-05-06 11:50:54 UTC (rev 7797)
@@ -2219,8 +2219,8 @@
 					//fees
 					//"constraints"	
 					//fill database with elements:
-					$sql = "INSERT INTO mb_metadata (link, origin, md_format, data, linktype, uuid, title, createdate, changedate, abstract, searchtext, type, tmp_reference_1, tmp_reference_2) ";
-					$sql .= "VALUES($1, 'capabilities', $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)";
+					$sql = "INSERT INTO mb_metadata (link, origin, md_format, data, linktype, uuid, title, createdate, changedate, abstract, searchtext, type, tmp_reference_1, tmp_reference_2, export2csw) ";
+					$sql .= "VALUES($1, 'capabilities', $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)";
 					$v = array($this->objLayer[$i]->layer_metadataurl[$j]->href,
 						$this->objLayer[$i]->layer_metadataurl[$j]->format,
 						$metaData,
@@ -2233,9 +2233,10 @@
 						$keywords[0],
 						$type[0],
 						$tmp_reference_1[0],
-						$tmp_reference_2[0]
+						$tmp_reference_2[0],
+						't'
 					);
-					$t = array('s','s','s','s','s','s','s','s','s','s','s','s','s');
+					$t = array('s','s','s','s','s','s','s','s','s','s','s','s','s','b');
 					$res = db_prep_query($sql,$v,$t);
 					if(!$res){
 						db_rollback();	

Added: trunk/mapbender/http/php/mod_dataISOMetadata.php
===================================================================
--- trunk/mapbender/http/php/mod_dataISOMetadata.php	                        (rev 0)
+++ trunk/mapbender/http/php/mod_dataISOMetadata.php	2011-05-06 11:50:54 UTC (rev 7797)
@@ -0,0 +1,1121 @@
+<?php
+#http://www.geoportal.rlp.de/mapbender/php/mod_dataISOMetadata.php?outputFormat=iso19139&Id=uuid
+# $Id: mod_dataISOMetadata.php 235
+# http://www.mapbender.org/index.php/Inspire_Metadata_Editor
+# Copyright (C) 2002 CCGIS 
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+
+//function to pull out information from mapbenders md_metadata table
+//the information is pulled out by uuid cause the uuid is not changed
+//there are 3 ways to access the information:
+//1. read a link out from database and give the link content back to the requesting client
+//2. read the metadata addon information and fill the rest from the wms/mb_user/mb_group/layer table
+//3. give back the harvested content of the column data - if conform?
+
+
+require_once(dirname(__FILE__) . "/../../core/globalSettings.php");
+require_once(dirname(__FILE__) . "/../classes/class_connector.php");
+require_once(dirname(__FILE__) . "/../classes/class_administration.php");
+require_once(dirname(__FILE__) . "/../classes/class_Uuid.php");
+
+$con = db_connect(DBSERVER,OWNER,PW);
+db_select_db(DB,$con);
+
+$admin = new administration();
+
+//parse request parameter
+//make all parameters available as upper case
+foreach($_REQUEST as $key => $val) {
+	$_REQUEST[strtoupper($key)] = $val;
+}
+
+//example mapbender uuid: 2494d033-ccdd-cdd7-71c6-3e3c195e1d85
+//cb567df4-57da-449a-be74-821903a59d45
+
+//validate request params
+if (isset($_REQUEST['ID']) & $_REQUEST['ID'] != "") {
+	//validate uuid
+	$testMatch = $_REQUEST["ID"];
+	$uuid = new Uuid($testMatch);
+	$isUuid = $uuid->isValid();
+	if (!$isUuid) {
+		echo 'Id: <b>'.$testMatch.'</b> is not a valid mapbender uuid.<br/>'; 
+		die(); 		
+ 	}
+	$recordId = $testMatch;
+	$testMatch = NULL;
+}
+//
+if ($_REQUEST['OUTPUTFORMAT'] == "iso19139") {
+	//Initialize XML document
+	$iso19139Doc = new DOMDocument('1.0');
+	$iso19139Doc->encoding = 'UTF-8';
+} else {
+	echo 'outputFormat: <b>'.$_REQUEST['OUTPUTFORMAT'].'</b> is not set or valid.<br/>'; 
+	die();
+}
+//if validation is requested
+//
+if (isset($_REQUEST['VALIDATE']) and $_REQUEST['VALIDATE'] != "true") {
+	//
+	echo 'validate: <b>'.$_REQUEST['VALIDATE'].'</b> is not valid.<br/>'; 
+	die();
+}
+
+
+	
+	//get record from mb_metadata and prohibit duplicates:
+	$sql = <<<SQL
+
+SELECT * FROM mb_metadata WHERE uuid = $1 ORDER BY lastchanged DESC LIMIT 1
+
+SQL;
+	$v = array($uuid);
+	$t = array('s');
+	$res = db_prep_query($sql,$v,$t);
+	if (!$res) {
+		echo "No record with uuid ".$recordId." found in mapbender database!";
+		die();
+	}
+	$row = db_fetch_assoc($res);
+	$mb_metadata = $row;
+	//check which kind of metadata was found:
+	switch ($mb_metadata['origin']) {
+		case 'metador':
+		//generate the xml on the fly - there is no need to store it as xml in the database
+		//do the things which had to be done ;-)
+		if ($_REQUEST['VALIDATE'] == "true"){
+			validateInspireMetadata($iso19139Doc, $recordId); //calls fillISO19139 to!
+		} else {
+			pushISO19139($iso19139Doc, $recordId); //throw it out!
+		}
+
+		break;
+		case 'external':
+			if ($mb_metadata['export2csw']) { //the metadata must have been harvested before!
+				if ($mb_metadata['harvestresult'] == 1) {
+					if ($_REQUEST['VALIDATE'] != "true") {
+						header("Content-type: text/xml");
+						echo $mb_metadata['data'];
+						die();
+					} else {
+						validateInspireMetadataFromData($row['data']);
+						die();
+					}
+				} else {
+					//send error report - metadata has not been harvested - maybe
+					$errMsg = "Metadata should have been harvested, but some unkown error occured";
+					$errMsg .= "<br>Please use following URL directly: <a href='".$mb_metadata['link']."'>".$row['link']."</a><br>";
+					echo $errMsg;
+					die();
+				}
+			} else {
+				//load metadata, from url and send it to requesting client
+				$metadataUrlObject = new connector($mb_metadata['link']);
+				$metadataXml = $metadataUrlObject->file;
+
+				if ($_REQUEST['VALIDATE'] != "true") {
+					header("Content-type: text/xml");
+					echo $metadataXml;
+					die();
+				} else {
+					validateInspireMetadataFromData($metadataXml);
+					die();
+				}
+				
+			}
+			
+		//if xml has been harvested - push this xml from database, if not just harvest it and push the result
+		break;
+		case 'capabilities':
+			//do the same as for the external case but all from caps should be harvested
+			if ($mb_metadata['harvestresult'] == 1) {
+				if ($_REQUEST['VALIDATE'] != "true") {
+					header("Content-type: text/xml");
+					echo $mb_metadata['data'];
+					die();
+				} else {
+					validateInspireMetadataFromData($mb_metadata['data']);
+					die();
+				}
+			} else {
+				//send error report - metadata has not been harvested - maybe
+				$errMsg = "Metadata should have been harvested, but some unkown error occured";
+				$errMsg .= "<br>Please use following URL directly: <a href='".$mb_metadata['link']."'>".$mb_metadata['link']."</a><br>";
+				echo $errMsg;
+				die();
+			}
+		default:
+		break;	
+	}
+
+//function to give away the xml data
+function pushISO19139($iso19139Doc, $recordId) {
+	//echo $recordId;
+	header("Content-type: application/xhtml+xml; charset=UTF-8");
+	$xml = fillISO19139($iso19139Doc, $recordId);
+	echo $xml;
+	die();
+}
+
+//some needfull functions to pull metadata out of the database!
+function fillISO19139($iso19139, $recordId) {
+	global $admin;
+	global $mb_metadata;
+	//read out relevant information from mapbender database:
+	//layer and service information:
+/*	$sql = <<<SQL
+SELECT layer_id, fkey_wms_id FROM layer INNER JOIN ows_relation_metadata ON 
+(ows_relation_metadata.fkey_layer_id=layer.layer_id) INNER JOIN mb_metadata ON 
+(mb_metadata.metadata_id = ows_relation_metadata.fkey_metadata_id) WHERE 
+mb_metadata. = $1 ORDER BY layer_id DESC LIMIT 1
+SQL;*/
+	$sql = <<<SQL
+SELECT layer_id, fkey_wms_id FROM layer INNER JOIN ows_relation_metadata ON 
+(ows_relation_metadata.fkey_layer_id=layer.layer_id)  WHERE ows_relation_metadata.fkey_metadata_id = $1
+SQL;
+	//TODO: Problem - the metadata may be used for more than one service - not often but sometimes - does one get the right contact data?
+	$v = array($mb_metadata['metadata_id']);
+	$t = array('i');
+	$res = db_prep_query($sql,$v,$t);
+
+	if ($wmsView != '') {
+		$sql = "SELECT * ";
+		$sql .= "FROM ".$wmsView." WHERE layer_id = $1";
+	}
+	else {
+	//next function is for normal mapbender installations and read the info directly from the wms and layer tables
+		$sql = "SELECT ";
+		$sql .= "layer.layer_id,layer.layer_name, layer.layer_title, layer.layer_abstract, layer.layer_pos, layer.layer_parent, layer.layer_minscale, layer.layer_maxscale, layer.uuid,";
+		$sql .= "wms.wms_title, wms.wms_abstract, wms.wms_id, wms.fees, wms.accessconstraints, wms.contactperson, ";
+		$sql .= "wms.contactposition, wms.contactorganization, wms.address, wms.city, wms_timestamp, wms_owner, ";
+		$sql .= "wms.stateorprovince, wms.postcode, wms.contactvoicetelephone, wms.contactfacsimiletelephone, wms.wms_owsproxy,";
+		$sql .= "wms.contactelectronicmailaddress, wms.country, wms.fkey_mb_group_id, ";
+		$sql .= "layer_epsg.minx || ',' || layer_epsg.miny || ',' || layer_epsg.maxx || ',' || layer_epsg.maxy  as bbox ";
+		$sql .= "FROM wms, layer, layer_epsg WHERE layer_id = $1 and layer.fkey_wms_id = wms.wms_id";
+		$sql .= " and layer_epsg.fkey_layer_id=layer.layer_id and layer_epsg.epsg='EPSG:4326'";
+	}
+	$v = array((integer)$recordId);
+	$t = array('i');
+	$res = db_prep_query($sql,$v,$t);
+	$mapbenderMetadata = db_fetch_array($res);
+	
+	//Get other needed information out of mapbender database (if not already defined in the view):
+	//service data
+	if ($wmsView != '') {
+		$sql = "SELECT contactorganization, contactelectronicmailaddress ";
+		$sql .= "FROM wms WHERE wms_id = $1";
+		$v = array((integer)$mapbenderMetadata['wms_id']);
+		$t = array('i');
+		$res = db_prep_query($sql,$v,$t);
+		$serviceMetadata = db_fetch_array($res);
+	}
+	//infos about the registrating department, check first if a special metadata point of contact is defined in the service table - function from mod_showMetadata - TODO: should be defined in admin class
+	if (!isset($mapbenderMetadata['fkey_mb_group_id']) or is_null($mapbenderMetadata['fkey_mb_group_id']) or $mapbenderMetadata['fkey_mb_group_id'] == 0){
+		$e = new mb_exception("mod_layerISOMetadata.php: fkey_mb_group_id not found!");
+		//Get information about owning user of the relation mb_user_mb_group - alternatively the defined fkey_mb_group_id from the service must be used!
+		$sqlDep = "SELECT mb_group_name, mb_group_title, mb_group_id, mb_group_logo_path, mb_group_address, mb_group_email, mb_group_postcode, mb_group_city, mb_group_voicetelephone, mb_group_facsimiletelephone FROM mb_group AS a, mb_user AS b, mb_user_mb_group AS c WHERE b.mb_user_id = $1  AND b.mb_user_id = c.fkey_mb_user_id AND c.fkey_mb_group_id = a.mb_group_id AND c.mb_user_mb_group_type=2 LIMIT 1";
+		$vDep = array($mapbenderMetadata['wms_owner']);
+		$tDep = array('i');
+		$resDep = db_prep_query($sqlDep, $vDep, $tDep);
+		$departmentMetadata = db_fetch_array($resDep);
+	} else {
+		$e = new mb_exception("mod_layerISOMetadata.php: fkey_mb_group_id found!");
+		$sqlDep = "SELECT mb_group_name , mb_group_title, mb_group_id, mb_group_logo_path , mb_group_address, mb_group_email, mb_group_postcode, mb_group_city, mb_group_voicetelephone, mb_group_facsimiletelephone FROM mb_group WHERE mb_group_id = $1 LIMIT 1";
+		$vDep = array($mapbenderMetadata['fkey_mb_group_id']);
+		$tDep = array('i');
+		$resDep = db_prep_query($sqlDep, $vDep, $tDep);
+		$departmentMetadata = db_fetch_array($resDep);
+	}
+	//infos about the owner of the service - he is the man who administrate the metadata - register the service
+	$sql = "SELECT mb_user_email ";
+	$sql .= "FROM mb_user WHERE mb_user_id = $1";
+	$v = array((integer)$mapbenderMetadata['wms_owner']);
+	$t = array('i');
+	$res = db_prep_query($sql,$v,$t);
+	$userMetadata = db_fetch_array($res);
+	//check if resource is freely available to anonymous user - which are all users who search thru metadata catalogues:
+	$hasPermission=$admin->getLayerPermission($mapbenderMetadata['wms_id'],$mapbenderMetadata['layer_name'],ANONYMOUS_USER);
+	//Creating the "MD_Metadata" node
+	$MD_Metadata = $iso19139->createElementNS('http://www.isotc211.org/2005/gmd', 'gmd:MD_Metadata');
+	//$MD_Metadata=$iso19139->registerNamespace('srv','http://www.iso211.org/2005/srv');
+	//$wmt_ms_capabilities->setAttribute("updateSequence", $wms_row["wms_timestamp"]);
+	$MD_Metadata = $iso19139->appendChild($MD_Metadata);
+	$MD_Metadata->setAttribute("xmlns:srv", "http://www.isotc211.org/2005/srv");
+	$MD_Metadata->setAttribute("xmlns:gml", "http://www.opengis.net/gml");
+	$MD_Metadata->setAttribute("xmlns:gco", "http://www.isotc211.org/2005/gco");
+	$MD_Metadata->setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
+	$MD_Metadata->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
+	$MD_Metadata->setAttribute("xsi:schemaLocation", "http://www.isotc211.org/2005/gmd ./xsd/gmd/gmd.xsd://www.isotc211.org/2005/srv ./xsd/srv/srv.xsd");
+	//generate identifier part 
+	$identifier = $iso19139->createElement("gmd:fileIdentifier");
+	$identifierString = $iso19139->createElement("gco:CharacterString");
+	if (isset($mapbenderMetadata['uuid'])) {
+		$identifierText = $iso19139->createTextNode($mapbenderMetadata['uuid']);//TODO: generate an uuid?
+	}
+	else {
+		$identifierText = $iso19139->createTextNode("no id found");
+	}
+	$identifierString->appendChild($identifierText);
+	$identifier->appendChild($identifierString);
+	$MD_Metadata->appendChild($identifier);
+	//generate language part B 10.3 (if available) of the inspire metadata regulation
+	$language = $iso19139->createElement("gmd:language");
+	$languagecode = $iso19139->createElement("gmd:LanguageCode");
+	$languagecode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#LanguageCode");
+	if (isset($mapbenderMetadata['metadata_language'])) {
+		$languageText = $iso19139->createTextNode($mapbenderMetadata['metadata_language']);
+		$languagecode->setAttribute("codeListValue", $mapbenderMetadata['metadata_language']);
+	}
+	else {
+		$languageText = $iso19139->createTextNode("ger");
+		$languagecode->setAttribute("codeListValue", "ger");
+	}
+	$languagecode->appendChild($languageText);
+	$language ->appendChild($languagecode);
+	$language = $MD_Metadata->appendChild($language);
+	//generate Characterset - first it should be utf8 ;-)
+	$characterSet = $iso19139->createElement("gmd:characterSet");
+	$characterSetCode = $iso19139->createElement("gmd:MD_CharacterSetCode");
+	$characterSetCode->setAttribute("codeList", "./resources/codeList.xml#MD_CharacterSetCode");
+	$characterSetCode->setAttribute("codeListValue", "utf8");
+	$characterSet->appendChild($characterSetCode);
+	$characterSet = $MD_Metadata->appendChild($characterSet);
+
+
+
+	#generate MD_Scope part B 1.3 (if available)
+	$hierarchyLevel = $iso19139->createElement("gmd:hierarchyLevel");
+	$scopecode = $iso19139->createElement("gmd:MD_ScopeCode");
+	$scopecode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_ScopeCode");
+	if (isset($mapbenderMetadata['hierarchy_level'])) {
+		$scopecode->setAttribute("codeListValue", $mapbenderMetadata['hierarchy_level']);//if such a metadata exists in the mapbender metadata view
+		$scopeText = $iso19139->createTextNode($mapbenderMetadata['hierarchy_level']);
+	}
+	else {
+		$scopecode->setAttribute("codeListValue", "service");
+		$scopeText = $iso19139->createTextNode("service");
+	}
+	$scopecode->appendChild($scopeText);
+	$hierarchyLevel->appendChild($scopecode);
+	$hierarchyLevel=$MD_Metadata->appendChild($hierarchyLevel);
+	#Part B 10.1 responsible party for the resource
+	$contact=$iso19139->createElement("gmd:contact");
+	$CI_ResponsibleParty=$iso19139->createElement("gmd:CI_ResponsibleParty");
+	$organisationName=$iso19139->createElement("gmd:organisationName");
+	$organisationName_cs=$iso19139->createElement("gco:CharacterString");
+	if (isset($departmentMetadata['mb_group_name'])) {
+		$organisationNameText = $iso19139->createTextNode($departmentMetadata['mb_group_name']); 
+	}
+	else
+	{
+		$organisationNameText=$iso19139->createTextNode('department not known');
+	}
+	$contactInfo=$iso19139->createElement("gmd:contactInfo");
+	$CI_Contact=$iso19139->createElement("gmd:CI_Contact");
+	$address=$iso19139->createElement("gmd:address");
+	$CI_Address=$iso19139->createElement("gmd:CI_Address");
+	$electronicMailAddress=$iso19139->createElement("gmd:electronicMailAddress");
+	$electronicMailAddress_cs=$iso19139->createElement("gco:CharacterString");
+	if (isset($userMetadata['mb_user_email'])) {
+		//get email address from ows service metadata out of mapbender database	
+		$electronicMailAddressText=$iso19139->createTextNode($userMetadata['mb_user_email']); 
+	}
+	else
+	{
+		$electronicMailAddressText=$iso19139->createTextNode('email not yet given');
+	}
+	$role=$iso19139->createElement("gmd:role");
+	$CI_RoleCode=$iso19139->createElement("gmd:CI_RoleCode");
+	$CI_RoleCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode");
+	$CI_RoleCode->setAttribute("codeListValue", "pointOfContact");
+	$CI_RoleCodeText=$iso19139->createTextNode("pointOfContact");
+	#create xml tree
+	$organisationName_cs->appendChild($organisationNameText);
+	$organisationName->appendChild($organisationName_cs);
+	$CI_ResponsibleParty->appendChild($organisationName);
+	$electronicMailAddress_cs->appendChild($electronicMailAddressText);
+	$electronicMailAddress->appendChild($electronicMailAddress_cs);
+	$CI_Address->appendChild($electronicMailAddress);
+	$address->appendChild($CI_Address);
+	$CI_Contact->appendChild($address);
+	$contactInfo->appendChild($CI_Contact);
+	$CI_RoleCode->appendChild($CI_RoleCodeText);
+	$role->appendChild($CI_RoleCode);
+	$CI_ResponsibleParty->appendChild($contactInfo);
+	$CI_ResponsibleParty->appendChild($role);
+	$contact->appendChild($CI_ResponsibleParty);
+	$MD_Metadata->appendChild($contact);
+	#generate dateStamp part B 10.2 (if available)
+	$dateStamp = $iso19139->createElement("gmd:dateStamp");
+	$mddate = $iso19139->createElement("gco:Date");
+	if (isset($mapbenderMetadata['wms_timestamp'])) {
+		$mddateText = $iso19139->createTextNode(date("Y-m-d",$mapbenderMetadata['wms_timestamp']));
+	}
+	else {
+		$mddateText = $iso19139->createTextNode("2000-01-01");
+	}
+	$mddate->appendChild($mddateText);
+	$dateStamp->appendChild($mddate);
+	$dateStamp=$MD_Metadata->appendChild($dateStamp);
+	//standard definition - everytime the same
+	$metadataStandardName = $iso19139->createElement("gmd:metadataStandardName");
+	$metadataStandardVersion = $iso19139->createElement("gmd:metadataStandardVersion");
+	$metadataStandardNameText = $iso19139->createElement("gco:CharacterString");
+	$metadataStandardVersionText = $iso19139->createElement("gco:CharacterString");
+	$metadataStandardNameTextString = $iso19139->createTextNode("ISO19119");
+	$metadataStandardVersionTextString = $iso19139->createTextNode("2005/PDAM 1");
+	$metadataStandardNameText->appendChild($metadataStandardNameTextString);
+	$metadataStandardVersionText->appendChild($metadataStandardVersionTextString);
+	$metadataStandardName->appendChild($metadataStandardNameText);
+	$metadataStandardVersion->appendChild($metadataStandardVersionText);
+	$MD_Metadata->appendChild($metadataStandardName);
+	$MD_Metadata->appendChild($metadataStandardVersion);
+	#do the things for identification
+	#create nodes
+	$identificationInfo=$iso19139->createElement("gmd:identificationInfo");
+	$SV_ServiceIdentification=$iso19139->createElement("srv:SV_ServiceIdentification");
+	#add attribut
+	//$SV_ServiceIdentification->setAttribute("id", "dataId");
+	$citation=$iso19139->createElement("gmd:citation");
+	$CI_Citation=$iso19139->createElement("gmd:CI_Citation");
+	#create nodes for things which are defined - howto do the multiplicities? Ask Martin!
+	#Create Resource title element B 1.1
+	$title=$iso19139->createElement("gmd:title");
+	$title_cs=$iso19139->createElement("gco:CharacterString");
+	if (isset($mapbenderMetadata['wms_title'])) {
+		$titleText = $iso19139->createTextNode($mapbenderMetadata['wms_title']);
+	}
+	else {
+		$titleText = $iso19139->createTextNode("title not given");
+	}
+	$title_cs->appendChild($titleText);
+	$title->appendChild($title_cs);
+	$CI_Citation->appendChild($title);
+	#Create date elements B5.2-5.4
+	#Do things for B 5.2 date of publication
+	if (isset($mapbenderMetadata['wms_timestamp_create'])) {
+		$date1=$iso19139->createElement("gmd:date");
+		$CI_Date=$iso19139->createElement("gmd:CI_Date");
+		$date2=$iso19139->createElement("gmd:date");
+		$gcoDate=$iso19139->createElement("gco:Date");
+		$dateType=$iso19139->createElement("gmd:dateType");
+		$dateTypeCode=$iso19139->createElement("gmd:CI_DateTypeCode");
+		$dateTypeCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode");
+		$dateTypeCode->setAttribute("codeListValue", "publication");
+		$dateTypeCodeText=$iso19139->createTextNode('publication');
+		$dateText= $iso19139->createTextNode(date('Y-m-d',$mapbenderMetadata['wms_timestamp_create']));
+		$dateTypeCode->appendChild($dateTypeCodeText);
+		$dateType->appendChild($dateTypeCode);
+		$gcoDate->appendChild($dateText);
+		$date2->appendChild($gcoDate);
+		$CI_Date->appendChild($date2);
+		$CI_Date->appendChild($dateType);
+		$date1->appendChild($CI_Date);
+		$CI_Citation->appendChild($date1);
+	}
+	#Do things for B 5.3 date of revision
+	if (isset($mapbenderMetadata['wms_timestamp'])) {
+		$date1=$iso19139->createElement("gmd:date");
+		$CI_Date=$iso19139->createElement("gmd:CI_Date");
+		$date2=$iso19139->createElement("gmd:date");
+		$gcoDate=$iso19139->createElement("gco:Date");
+		$dateType=$iso19139->createElement("gmd:dateType");
+		$dateTypeCode=$iso19139->createElement("gmd:CI_DateTypeCode");
+		$dateTypeCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode");
+		$dateTypeCode->setAttribute("codeListValue", "revision");
+		$dateTypeCodeText=$iso19139->createTextNode('revision');
+		$dateText= $iso19139->createTextNode(date('Y-m-d',$mapbenderMetadata['wms_timestamp']));
+		$dateTypeCode->appendChild($dateTypeCodeText);
+		$dateType->appendChild($dateTypeCode);
+		$gcoDate->appendChild($dateText);
+		$date2->appendChild($gcoDate);
+		$CI_Date->appendChild($date2);
+		$CI_Date->appendChild($dateType);
+		$date1->appendChild($CI_Date);
+		$CI_Citation->appendChild($date1);
+	}
+	#Do things for B 5.4 date of creation
+	if (isset($mapbenderMetadata['wms_timestamp_creation'])) {
+		$date1=$iso19139->createElement("gmd:date");
+		$CI_Date=$iso19139->createElement("gmd:CI_Date");
+		$date2=$iso19139->createElement("gmd:date");
+		$gcoDate=$iso19139->createElement("gco:Date");
+		$dateType=$iso19139->createElement("gmd:dateType");
+		$dateTypeCode=$iso19139->createElement("gmd:CI_DateTypeCode");
+		$dateTypeCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode");
+		$dateTypeCode->setAttribute("codeListValue", "creation");
+		$dateTypeCodeText=$iso19139->createTextNode('creation');
+		$dateText= $iso19139->createTextNode(date('Y-m-d',$mapbenderMetadata['wms_timestamp_creation']));
+		$dateTypeCode->appendChild($dateTypeCodeText);
+		$dateType->appendChild($dateTypeCode);
+		$gcoDate->appendChild($dateText);
+		$date2->appendChild($gcoDate);
+		$CI_Date->appendChild($date2);
+		$CI_Date->appendChild($dateType);
+		$date1->appendChild($CI_Date);
+		$CI_Citation->appendChild($date1);
+	}
+	#Do things for B 1.5 Resource unique identifier NOTE: not applicable for services
+	//$identifier=$iso19139->createElement("gmd:identifier");
+	//$rs_identifier=$iso19139->createElement("gmd:RS_Identifier");
+	//$code=$iso19139->createElement("gmd:code");
+	//$code_cs=$iso19139->createElement("gco:CharacterString");
+	//$codeText=$iso19139->createTextNode($detail_array['t01_object.obj_id']);
+	//$code_cs->appendChild($codeText);
+	//$code->appendChild($code_cs);
+	//$rs_identifier->appendChild($code);
+	//$identifier->appendChild($rs_identifier);
+	//$CI_Citation->appendChild($identifier);
+	#create tree
+	$citation->appendChild($CI_Citation);
+	$SV_ServiceIdentification->appendChild($citation);
+	#Create part for abstract B 1.2
+	$abstract=$iso19139->createElement("gmd:abstract");
+	$abstract_cs=$iso19139->createElement("gco:CharacterString");
+	if (isset($mapbenderMetadata['wms_abstract'])) {
+		$abstractText = $iso19139->createTextNode($mapbenderMetadata['wms_abstract']);
+	}
+	else {
+		$abstractText = $iso19139->createTextNode("not yet defined");
+	}
+	$abstract_cs->appendChild($abstractText);
+	$abstract->appendChild($abstract_cs);
+	$SV_ServiceIdentification->appendChild($abstract);
+	#Create part for point of contact for service identification
+	#Define relevant objects
+	$pointOfContact=$iso19139->createElement("gmd:pointOfContact");
+	$CI_ResponsibleParty=$iso19139->createElement("gmd:CI_ResponsibleParty");
+	$organisationName=$iso19139->createElement("gmd:organisationName");
+	$orgaName_cs=$iso19139->createElement("gco:CharacterString");
+	$contactInfo=$iso19139->createElement("gmd:contactInfo");
+	$CI_Contact=$iso19139->createElement("gmd:CI_Contact");
+	$address_1=$iso19139->createElement("gmd:address");
+	$CI_Address=$iso19139->createElement("gmd:CI_Address");
+	$electronicMailAddress=$iso19139->createElement("gmd:electronicMailAddress");
+	$email_cs=$iso19139->createElement("gco:CharacterString");
+	$role=$iso19139->createElement("gmd:role");
+	$CI_RoleCode=$iso19139->createElement("gmd:CI_RoleCode");
+	$CI_RoleCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode");
+	$CI_RoleCode->setAttribute("codeListValue", "publisher");
+	if (isset($mapbenderMetadata['contactorganization'])) {
+		$resOrgaText = $iso19139->createTextNode($mapbenderMetadata['contactorganization']);
+	}
+	else {
+		$resOrgaText= $iso19139->createTextNode("not yet defined");
+	}
+	if (isset($mapbenderMetadata['contactelectronicmailaddress'])) {
+		$resMailText = $iso19139->createTextNode($mapbenderMetadata['contactelectronicmailaddress']);
+	}
+	else {
+		$resMailText = $iso19139->createTextNode("kontakt at geoportal.rlp.de");
+	}
+	$resRoleText = $iso19139->createTextNode("publisher");
+	$orgaName_cs->appendChild($resOrgaText);
+	$organisationName->appendChild($orgaName_cs);
+	$CI_ResponsibleParty->appendChild($organisationName);
+	$email_cs->appendChild($resMailText);
+	$electronicMailAddress->appendChild($email_cs);
+	$CI_Address->appendChild($electronicMailAddress);
+	$address_1->appendChild($CI_Address);
+	$CI_Contact->appendChild($address_1);
+	$contactInfo->appendChild($CI_Contact);
+	$CI_ResponsibleParty->appendChild($contactInfo);
+	$CI_RoleCode->appendChild($resRoleText);
+	$role->appendChild($CI_RoleCode);
+	$CI_ResponsibleParty->appendChild($role);
+	$pointOfContact->appendChild($CI_ResponsibleParty);
+	$SV_ServiceIdentification->appendChild($pointOfContact);
+	//generate graphical overview part
+	$sql = "SELECT layer_preview.layer_map_preview_filename FROM layer_preview WHERE layer_preview.fkey_layer_id=$1";
+	$v = array((integer)$mapbenderMetadata["layer_id"]);
+	$t = array('i');
+	$res = db_prep_query($sql,$v,$t);
+	$row = db_fetch_array($res);
+	#old version 
+/*	if (isset($row['layer_map_preview_filename']) & $row['layer_map_preview_filename'] != '') {
+		$graphicOverview=$iso19139->createElement("gmd:graphicOverview");
+		$MD_BrowseGraphic=$iso19139->createElement("gmd:MD_BrowseGraphic");
+		$fileName=$iso19139->createElement("gmd:fileName");
+		$fileName_cs=$iso19139->createElement("gco:characterString");
+		$previewFilenameText = $iso19139->createTextNode("http://www.gdi-rp-dienste3.rlp.de/mapbender/x_geoportal/layer_preview/".$row['layer_map_preview_filename']);
+		$fileName_cs->appendChild($previewFilenameText);
+		$fileName->appendChild($fileName_cs);
+		$MD_BrowseGraphic->appendChild($fileName);
+		$graphicOverview->appendChild($MD_BrowseGraphic);
+		$SV_ServiceIdentification->appendChild($graphicOverview);
+	}
+*/	
+	#version of bavaria
+	if (file_exists(PREVIEW_DIR."/".$mapbenderMetadata['layer_id']."_layer_map_preview.jpg")) {	//TODO
+		$graphicOverview=$iso19139->createElement("gmd:graphicOverview");
+		$MD_BrowseGraphic=$iso19139->createElement("gmd:MD_BrowseGraphic");
+		$fileName=$iso19139->createElement("gmd:fileName");
+		$fileName_cs=$iso19139->createElement("gco:CharacterString");
+		$previewFilenameText = $iso19139->createTextNode("http://www.geoportal.rlp.de/mapbender/geoportal/preview/".$mapbenderMetadata['layer_id']."_layer_map_preview.jpg");
+		$fileName_cs->appendChild($previewFilenameText);
+		$fileName->appendChild($fileName_cs);
+
+		$fileDescription=$iso19139->createElement("gmd:fileDescription");
+		$fileDescription_cs=$iso19139->createElement("gco:CharacterString");
+		$fileDescription_text=$iso19139->createTextNode("Thumbnail");
+
+		$fileDescription_cs->appendChild($fileDescription_text);
+		$fileDescription->appendChild($fileDescription_cs);
+		
+
+		$fileType=$iso19139->createElement("gmd:fileType");
+		$fileType_cs=$iso19139->createElement("gco:CharacterString");
+		$fileType_text=$iso19139->createTextNode("JPEG");
+
+		$fileType_cs->appendChild($fileType_text);
+		$fileType->appendChild($fileType_cs);
+
+
+
+		$MD_BrowseGraphic->appendChild($fileName);
+
+		$MD_BrowseGraphic->appendChild($fileDescription);
+		$MD_BrowseGraphic->appendChild($fileType);
+
+		$graphicOverview->appendChild($MD_BrowseGraphic);
+		$SV_ServiceIdentification->appendChild($graphicOverview);
+	}
+	
+
+
+
+
+
+	/*<gmd:graphicOverview>
+  		<gmd:MD_BrowseGraphic>
+   			 <gmd:fileName>
+      				<gco:CharacterString>http://goesr.noaa.gov/browse/datasetIdentifier</gco:CharacterString>
+    			</gmd:fileName>
+  		</gmd:MD_BrowseGraphic>
+	</gmd:graphicOverview>*/
+	
+
+	//generate keyword part - for services the inspire themes are not applicable!!!
+	//read keywords for resource out of the database:
+	$sql = "SELECT keyword.keyword FROM keyword, layer_keyword WHERE layer_keyword.fkey_layer_id=$1 AND layer_keyword.fkey_keyword_id=keyword.keyword_id";
+	$v = array((integer)$recordId);
+	$t = array('i');
+	$res = db_prep_query($sql,$v,$t);
+	$descriptiveKeywords=$iso19139->createElement("gmd:descriptiveKeywords");
+	$MD_Keywords=$iso19139->createElement("gmd:MD_Keywords");
+	while ($row = db_fetch_array($res)) {
+		$keyword=$iso19139->createElement("gmd:keyword");
+		$keyword_cs=$iso19139->createElement("gco:CharacterString");
+		$keywordText = $iso19139->createTextNode($row['keyword']);
+		$keyword_cs->appendChild($keywordText);
+		$keyword->appendChild($keyword_cs);
+		$MD_Keywords->appendChild($keyword);
+	}
+	//a special keyword for service type wms ;-)
+	$keyword=$iso19139->createElement("gmd:keyword");
+	$keyword_cs=$iso19139->createElement("gco:CharacterString");
+	$keywordText = $iso19139->createTextNode("humanGeographicViewer");
+	$keyword_cs->appendChild($keywordText);
+	$keyword->appendChild($keyword_cs);
+	$MD_Keywords->appendChild($keyword);
+	$descriptiveKeywords->appendChild($MD_Keywords);
+	$SV_ServiceIdentification->appendChild($descriptiveKeywords);
+	//generate constraints part
+	//generate service type part
+	//generate extent part
+	//generate coupling part
+	//end of service identification
+	//generate distribution part
+	//generate data quality part
+	#Part B 3 INSPIRE Category
+	#do this only if an INSPIRE keyword (Annex I-III) is set
+	#Resource Constraints B 8
+	//if(isset($mapbenderMetadata['accessconstraints'])){
+		$resourceConstraints=$iso19139->createElement("gmd:resourceConstraints");
+		$MD_LegalConstraints=$iso19139->createElement("gmd:MD_Constraints");
+		$useLimitation=$iso19139->createElement("gmd:useLimitation");
+		$useLimitation_cs=$iso19139->createElement("gco:CharacterString");
+		if(isset($mapbenderMetadata['accessconstraints'])){
+			$useLimitationText=$iso19139->createTextNode($mapbenderMetadata['accessconstraints']);
+		}
+		else
+		{
+			$useLimitationText=$iso19139->createTextNode("no conditions apply");
+		}
+ 	//TODO: Mapping of constraints between OWS/registry and INSPIRE 
+		$useLimitation_cs->appendChild($useLimitationText);
+		$useLimitation->appendChild($useLimitation_cs);
+		$MD_LegalConstraints->appendChild($useLimitation);
+		$resourceConstraints->appendChild($MD_LegalConstraints);
+		$SV_ServiceIdentification->appendChild($resourceConstraints);
+	//}
+	$resourceConstraints=$iso19139->createElement("gmd:resourceConstraints");
+	$MD_LegalConstraints=$iso19139->createElement("gmd:MD_LegalConstraints");
+	$accessConstraints=$iso19139->createElement("gmd:accessConstraints");
+	$MD_RestrictionCode=$iso19139->createElement("gmd:MD_RestrictionCode");
+	$MD_RestrictionCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RetrictionCode");
+	$MD_RestrictionCode->setAttribute("codeListValue", "otherRestrictions");
+	$MD_RestrictionCodeText=$iso19139->createTextNode("otherRestrictions");
+	$otherConstraints=$iso19139->createElement("gmd:otherConstraints");
+	$otherConstraints_cs=$iso19139->createElement("gco:CharacterString");
+	if (isset($mapbenderMetadata['accessconstraints']) & strtoupper($mapbenderMetadata['accessconstraints']) != 'NONE'){
+			$otherConstraintsText=$iso19139->createTextNode($mapbenderMetadata['accessconstraints']);
+	}
+	else {
+			$otherConstraintsText=$iso19139->createTextNode("no constraints");
+	}
+	$otherConstraints_cs->appendChild($otherConstraintsText);
+	$otherConstraints->appendChild($otherConstraints_cs);
+
+	$MD_RestrictionCode->appendChild($MD_RestrictionCodeText);
+	$accessConstraints->appendChild($MD_RestrictionCode);
+		
+	$MD_LegalConstraints->appendChild($accessConstraints);
+	$MD_LegalConstraints->appendChild($otherConstraints);
+	$resourceConstraints->appendChild($MD_LegalConstraints);
+		
+	$SV_ServiceIdentification->appendChild($resourceConstraints);
+	//service type
+	//<srv:serviceType>
+    	//	<gco:LocalName>view</gco:LocalName>
+	//</srv:serviceType>
+	$serviceType=$iso19139->createElement("srv:serviceType");
+	$localName=$iso19139->createElement("gco:LocalName");
+	$serviceTypeText=$iso19139->createTextNode("view");
+	$localName->appendChild($serviceTypeText);
+	$serviceType->appendChild($localName);
+	$SV_ServiceIdentification->appendChild($serviceType);
+
+
+
+	$serviceTypeVersion=$iso19139->createElement("srv:serviceTypeVersion");
+	$serviceTypeVersion_cs=$iso19139->createElement("gco:CharacterString");
+	$serviceTypeVersionText=$iso19139->createTextNode("1.1.1");
+
+	$serviceTypeVersion_cs->appendChild($serviceTypeVersionText);
+	$serviceTypeVersion->appendChild($serviceTypeVersion_cs);
+	$SV_ServiceIdentification->appendChild($serviceTypeVersion);
+
+
+	# Part B 1.7 Dataset Language
+	#if(isset($detail_array['t01_object.data_language'])){
+		#$language=$iso19139->createElement("gmd:language");
+		#$LanguageCode=$iso19139->createElement("gmd:LanguageCode");
+		#$LanguageCodeText=$iso19139->createTextNode($detail_array['t01_object.data_language']);
+		#$LanguageCode->appendChild($LanguageCodeText);
+		#$language->appendChild($LanguageCode);
+		#$SV_ServiceIdentification->appendChild($language);
+	#}
+	#Topic Category B 2.1 - not needed for services
+	#if(isset($detail_array['t011_obj_geo_topic_cat.topic_category'])){
+		#$topicCategory=$iso19139->createElement("gmd:topicCategory");
+		#$MD_TopicCategoryCode=$iso19139->createElement("gmd:MD_TopicCategoryCode");
+		#$MD_TopicCategoryText=$iso19139->createTextNode($detail_array['t011_obj_geo_topic_cat.topic_category']);
+		#$MD_TopicCategoryCode->appendChild($MD_TopicCategoryText);
+		#$topicCategory->appendChild($MD_TopicCategoryCode);
+		#$SV_ServiceIdentification->appendChild($topicCategory);
+	#}
+	#Geographical Extent
+	$bbox = array();
+	//initialize if no extent is defined in the database
+	$bbox[0] = -180;
+	$bbox[1] = -90;
+	$bbox[2] = 180;
+	$bbox[3] = 90;
+	if (isset($mapbenderMetadata['bbox']) & ($mapbenderMetadata['bbox'] != '')) {
+		$bbox = explode(',',$mapbenderMetadata['bbox']);
+	}
+	$extent=$iso19139->createElement("srv:extent");
+	$EX_Extent=$iso19139->createElement("gmd:EX_Extent");
+	$geographicElement=$iso19139->createElement("gmd:geographicElement");
+	$EX_GeographicBoundingBox=$iso19139->createElement("gmd:EX_GeographicBoundingBox");
+
+	$westBoundLongitude=$iso19139->createElement("gmd:westBoundLongitude");
+	$wb_dec=$iso19139->createElement("gco:Decimal");
+	$wb_text=$iso19139->createTextNode($bbox[0]);
+
+	$eastBoundLongitude=$iso19139->createElement("gmd:eastBoundLongitude");
+	$eb_dec=$iso19139->createElement("gco:Decimal");
+	$eb_text=$iso19139->createTextNode($bbox[2]);
+
+	$southBoundLatitude=$iso19139->createElement("gmd:southBoundLatitude");
+	$sb_dec=$iso19139->createElement("gco:Decimal");
+	$sb_text=$iso19139->createTextNode($bbox[1]);
+
+	$northBoundLatitude=$iso19139->createElement("gmd:northBoundLatitude");
+	$nb_dec=$iso19139->createElement("gco:Decimal");
+	$nb_text=$iso19139->createTextNode($bbox[3]);
+
+	$wb_dec->appendChild($wb_text);
+	$westBoundLongitude->appendChild($wb_dec);
+	$EX_GeographicBoundingBox->appendChild($westBoundLongitude);
+
+	$eb_dec->appendChild($eb_text);
+	$eastBoundLongitude->appendChild($eb_dec);
+	$EX_GeographicBoundingBox->appendChild($eastBoundLongitude);
+
+	$sb_dec->appendChild($sb_text);
+	$southBoundLatitude->appendChild($sb_dec);
+	$EX_GeographicBoundingBox->appendChild($southBoundLatitude);
+
+	$nb_dec->appendChild($nb_text);
+	$northBoundLatitude->appendChild($nb_dec);
+	$EX_GeographicBoundingBox->appendChild($northBoundLatitude);
+
+	$geographicElement->appendChild($EX_GeographicBoundingBox);
+	$EX_Extent->appendChild($geographicElement);
+	$extent->appendChild($EX_Extent);
+
+	$SV_ServiceIdentification->appendChild($extent);
+
+
+#to the things which have to be done for integrating the service into a client like portalu ... they have defined another location to put the GetCap URL than INSPIRE does it
+
+	$containsOperation=$iso19139->createElement("srv:containsOperations");
+	$SV_OperationMetadata=$iso19139->createElement("srv:SV_OperationMetadata");
+
+
+	$operationName=$iso19139->createElement("srv:operationName");
+	$operationName_cs=$iso19139->createElement("gco:CharacterString");
+
+	$operationNameText=$iso19139->createTextNode("GetCapabilities");
+	
+	$operationName_cs->appendChild($operationNameText);
+	$operationName->appendChild($operationName_cs);
+
+//srv DCP **************************************
+	$DCP=$iso19139->createElement("srv:DCP");
+	$DCPList=$iso19139->createElement("srv:DCPList");
+	$DCPList->setAttribute("codeList", "DCPList");
+	$DCPList->setAttribute("codeListValue", "WebService");
+
+
+	$DCP->appendChild($DCPList);
+	
+//connectPoint **********************************
+	$connectPoint=$iso19139->createElement("srv:connectPoint");
+	
+	$CI_OnlineResource=$iso19139->createElement("gmd:CI_OnlineResource");
+
+	$gmd_linkage=$iso19139->createElement("gmd:linkage");
+	$gmd_URL=$iso19139->createElement("gmd:URL");
+	//Check if anonymous user has rights to access this layer - if not ? which resource should be advertised? TODO
+	if ($hasPermission) {
+		$gmd_URLText=$iso19139->createTextNode("http://".$_SERVER['HTTP_HOST']."/mapbender/php/wms.php?inspire=1&layer_id=".$mapbenderMetadata['layer_id']."");
+	}
+	else {
+		$gmd_URLText=$iso19139->createTextNode("https://".$_SERVER['HTTP_HOST']."/http_auth/".$mapbenderMetadata['layer_id']."?");
+	}
+	$gmd_URL->appendChild($gmd_URLText);
+	$gmd_linkage->appendChild($gmd_URL);
+	$CI_OnlineResource->appendChild($gmd_linkage);
+	$connectPoint->appendChild($CI_OnlineResource);
+
+	$SV_OperationMetadata->appendChild($operationName);
+	$SV_OperationMetadata->appendChild($DCP);
+	$SV_OperationMetadata->appendChild($connectPoint);
+
+	$containsOperation->appendChild($SV_OperationMetadata);
+
+	$SV_ServiceIdentification->appendChild($containsOperation);
+	
+/*
+	$serviceTypeVersion_cs->appendChild($serviceTypeVersionText);
+	$serviceTypeVersion->appendChild($serviceTypeVersion_cs);
+	$SV_ServiceIdentification->appendChild($serviceTypeVersion);
+*/
+	$identificationInfo->appendChild($SV_ServiceIdentification);
+//distributionInfo
+	$gmd_distributionInfo=$iso19139->createElement("gmd:distributionInfo");
+	$MD_Distribution=$iso19139->createElement("gmd:MD_Distribution");
+	$gmd_distributionFormat=$iso19139->createElement("gmd:distributionFormat");
+	$MD_Format=$iso19139->createElement("gmd:MD_Format");
+	$gmd_name=$iso19139->createElement("gmd:name");
+	$gmd_version=$iso19139->createElement("gmd:version");
+	$gmd_name->setAttribute("gco:nilReason", "inapplicable");
+	$gmd_version->setAttribute("gco:nilReason", "inapplicable");
+	$gmd_transferOptions=$iso19139->createElement("gmd:transferOptions");
+	$MD_DigitalTransferOptions=$iso19139->createElement("gmd:MD_DigitalTransferOptions");
+	$gmd_onLine=$iso19139->createElement("gmd:onLine");
+
+	$CI_OnlineResource=$iso19139->createElement("gmd:CI_OnlineResource");
+
+	$gmd_linkage=$iso19139->createElement("gmd:linkage");
+	$gmd_URL=$iso19139->createElement("gmd:URL");
+	//Check if anonymous user has rights to access this layer - if not ? which resource should be advertised? TODO
+	if ($hasPermission) {
+		$gmd_URLText=$iso19139->createTextNode("http://".$_SERVER['HTTP_HOST']."/mapbender/php/wms.php?inspire=1&layer_id=".$mapbenderMetadata['layer_id']."");
+	}
+	else {
+		$gmd_URLText=$iso19139->createTextNode("https://".$_SERVER['HTTP_HOST']."/http_auth/".$mapbenderMetadata['layer_id']."?");
+	}
+	$gmd_URL->appendChild($gmd_URLText);
+	$gmd_linkage->appendChild($gmd_URL);
+	$CI_OnlineResource->appendChild($gmd_linkage);
+
+	//append things which geonetwork needs to invoke service/layer or what else? - Here the name of the layer and the protocol seems to be needed?
+	//a problem will occur, if the link to get map is not the same as the link to get caps? So how can we handle this? It seems to very silly! 
+	$gmdProtocol = $iso19139->createElement("gmd:protocol");
+	$gmdProtocol_cs = $iso19139->createElement("gco:CharacterString");
+	$gmdProtocolText = $iso19139->createTextNode("OGC:WMS-1.1.1-http-get-map");//for ever 'OGC:WMS-1.1.1-http-get-map'
+
+	$gmdName=$iso19139->createElement("gmd:name");
+	$gmdName_cs=$iso19139->createElement("gco:CharacterString");
+	$gmdNameText=$iso19139->createTextNode($mapbenderMetadata['layer_name']); //Layername?
+
+	$gmdDescription = $iso19139->createElement("gmd:description");
+	$gmdDescription_cs = $iso19139->createElement("gco:CharacterString");
+	$gmdDescriptionText = $iso19139->createTextNode($mapbenderMetadata['layer_abstract']);//Layer Abstract
+
+	$gmdProtocol_cs->appendChild($gmdProtocolText);
+	$gmdProtocol->appendChild($gmdProtocol_cs);
+	$CI_OnlineResource->appendChild($gmdProtocol);
+
+
+
+	$gmdName_cs->appendChild($gmdNameText);
+	$gmdName->appendChild($gmdName_cs);
+	$CI_OnlineResource->appendChild($gmdName);
+
+	$gmdDescription_cs->appendChild($gmdDescriptionText);
+	$gmdDescription->appendChild($gmdDescription_cs);
+	$CI_OnlineResource->appendChild($gmdDescription);
+	
+//***********************************************************************************
+	$gmd_onLine->appendChild($CI_OnlineResource);
+	$MD_DigitalTransferOptions->appendChild($gmd_onLine);
+	$gmd_transferOptions->appendChild($MD_DigitalTransferOptions);
+	$MD_Format->appendChild($gmd_name);
+	$MD_Format->appendChild($gmd_version);
+	$gmd_distributionFormat->appendChild($MD_Format);
+	$MD_Distribution->appendChild($gmd_distributionFormat);
+	$MD_Distribution->appendChild($gmd_transferOptions);
+	$gmd_distributionInfo->appendChild($MD_Distribution);
+	//dataQualityInfo
+	$gmd_dataQualityInfo=$iso19139->createElement("gmd:dataQualityInfo");
+	$DQ_DataQuality=$iso19139->createElement("gmd:DQ_DataQuality");
+	$gmd_scope=$iso19139->createElement("gmd:scope");
+	$DQ_Scope=$iso19139->createElement("gmd:DQ_Scope");
+	$gmd_level=$iso19139->createElement("gmd:level");
+	$MD_ScopeCode=$iso19139->createElement("gmd:MD_ScopeCode");
+	$MD_ScopeCodeText=$iso19139->createTextNode("service");
+	$MD_ScopeCode->setAttribute("codeList", "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#MD_RetrictionCode");
+	$MD_ScopeCode->setAttribute("codeListValue", "service");
+	$MD_ScopeCode->appendChild($MD_ScopeCodeText);
+	$gmd_level->appendChild($MD_ScopeCode);
+	$DQ_Scope->appendChild($gmd_level);
+	$gmd_scope->appendChild($DQ_Scope);
+	$DQ_DataQuality->appendChild($gmd_scope);
+	//gmd:report in dataQualityInfo
+	$gmd_report=$iso19139->createElement("gmd:report");
+	$DQ_DomainConsistency=$iso19139->createElement("gmd:DQ_DomainConsistency");
+	$gmd_result=$iso19139->createElement("gmd:result");
+	$DQ_ConformanceResult=$iso19139->createElement("gmd:DQ_ConformanceResult");
+	$gmd_specification=$iso19139->createElement("gmd:specification");
+	$CI_Citation=$iso19139->createElement("gmd:CI_Citation");
+	$gmd_title=$iso19139->createElement("gmd:title");
+	$gmd_title_cs=$iso19139->createElement("gco:CharacterString");
+	$gmd_titleText=$iso19139->createTextNode("Service Abstract Suite"); //TODO put in the inspire test suites from mb database!
+	$gmd_date=$iso19139->createElement("gmd:date");
+	$CI_Date=$iso19139->createElement("gmd:CI_Date");
+	$gmd_date_2=$iso19139->createElement("gmd:date");
+	$gco_Date=$iso19139->createElement("gco:Date");
+	$gco_DateText=$iso19139->createTextNode("2010-03-10"); //TODO put in the info from database
+	
+	$gmd_dateType=$iso19139->createElement("gmd:dateType");
+	$CI_DateTypeCode=$iso19139->createElement("gmd:CI_DateTypeCode");
+	$CI_DateTypeCode->setAttribute("codeList","http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_DateTypeCode");
+	$CI_DateTypeCode->setAttribute("codeListValue","publication");
+	$CI_DateTypeCodeText=$iso19139->createTextNode("publication");
+	
+	$gmd_explanation=$iso19139->createElement("gmd:explanation");
+	$gmd_explanation_cs=$iso19139->createElement("gco:CharacterString");
+	$gmd_explanationText=$iso19139->createTextNode("No explanation available");
+		
+	$gmd_pass=$iso19139->createElement("gmd:pass");
+	$gco_Boolean=$iso19139->createElement("gco:Boolean");
+	$gco_BooleanText=$iso19139->createTextNode("true"); //TODO maybe set here a string cause it can be unevaluated!! See Implementing Rules
+	//generate XML objects
+	$gco_Date->appendChild($gco_DateText);
+	$gmd_date->appendChild($gco_Date);
+	
+	$CI_DateTypeCode->appendChild($CI_DateTypeCodeText);
+	$gmd_dateType->appendChild($CI_DateTypeCode);
+	$CI_Date->appendChild($gmd_date);
+	$CI_Date->appendChild($gmd_dateType);
+	$gmd_date_2->appendChild($CI_Date);
+	$gmd_title_cs->appendChild($gmd_titleText);
+	$gmd_title->appendChild($gmd_title_cs);
+	$CI_Citation->appendChild($gmd_title);
+	$CI_Citation->appendChild($gmd_date_2);
+	$gmd_specification->appendChild($CI_Citation);
+	$gmd_explanation_cs->appendChild($gmd_explanationText);
+	$gmd_explanation->appendChild($gmd_explanation_cs);
+	$gco_Boolean->appendChild($gco_BooleanText);
+	$gmd_pass->appendChild($gco_Boolean);
+	$DQ_ConformanceResult->appendChild($gmd_specification);
+	$DQ_ConformanceResult->appendChild($gmd_explanation);
+	$DQ_ConformanceResult->appendChild($gmd_pass);
+	$gmd_result->appendChild($DQ_ConformanceResult);
+	$DQ_DomainConsistency->appendChild($gmd_result);
+	$gmd_report->appendChild($DQ_DomainConsistency);
+	$DQ_DataQuality->appendChild($gmd_report);
+	$gmd_dataQualityInfo->appendChild($DQ_DataQuality);
+	//$MD_ScopeCode->setAttribute("codeListValue", "service");
+	$MD_Metadata->appendChild($identificationInfo);
+	$MD_Metadata->appendChild($gmd_distributionInfo);
+	$MD_Metadata->appendChild($gmd_dataQualityInfo);
+	return $iso19139->saveXML();
+}
+
+	//function to validate against the inspire validation service
+	function validateInspireMetadata($iso19139Doc, $recordId){
+		$validatorUrl = 'http://www.inspire-geoportal.eu/INSPIREValidatorService/resources/validation/inspire';
+		#$validatorUrl2 = 'http://localhost/mapbender/x_geoportal/log_requests.php';
+		//send inspire xml to validator and push the result to requesting user
+		$validatorInterfaceObject = new connector();
+		$validatorInterfaceObject->set('httpType','POST');
+		#$validatorInterfaceObject->set('httpContentType','application/xml');
+		$validatorInterfaceObject->set('httpContentType','multipart/form-data'); # maybe given automatically
+		$xml = fillISO19139($iso19139Doc, $recordId);
+		//first test with data from ram - doesn't function 
+		$fields = array(
+			'dataFile'=>urlencode($xml)
+			);
+		//generate file identifier:
+		$fileId = guid();
+		//generate temporary file under tmp
+		 if($h = fopen(TMPDIR."/".$fileId."iso19139_validate_tmp.xml","w")){
+			if(!fwrite($h,$xml)){
+				$e = new mb_exception("mod_layerISOMetadata: cannot write to file: ".TMPDIR."iso19139_validate_tmp.xml");
+			}
+		fclose($h);
+		}
+		//send file as post like described under http://www.tecbrat.com/?itemid=13&catid=1
+		$fields['dataFile']='@'.TMPDIR.'/'.$fileId.'iso19139_validate_tmp.xml';
+		#if we give a string with parameters
+		#foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } 
+		#rtrim($fields_string,'&');
+		#$postData = $fields_string;
+		$postData = $fields;
+		#$e = new mb_exception("mod_layerISOMetadata: postData: ".$postData['dataFile']);
+		//number of post fields:
+		//curl_setopt($ch,CURLOPT_POST,count($fields));
+		$validatorInterfaceObject->set('httpPostFieldsNumber',count($postData));
+		$validatorInterfaceObject->set('curlSendCustomHeaders',false);
+		//$validatorInterfaceObject->set('httpPostData', $postData);
+		$validatorInterfaceObject->set('httpPostData', $postData); #give an array
+		$validatorInterfaceObject->load($validatorUrl);
+		header("Content-type: text/html; charset=UTF-8");
+		echo $validatorInterfaceObject->file;
+		//delete file in tmp 
+		//TODO - this normally done by a cronjob
+		die();
+	}
+
+	//function to validate against the inspire validation service
+	function validateInspireMetadataFromData($iso19139Xml){
+		$validatorUrl = 'http://www.inspire-geoportal.eu/INSPIREValidatorService/resources/validation/inspire';
+		#$validatorUrl2 = 'http://localhost/mapbender/x_geoportal/log_requests.php';
+		//send inspire xml to validator and push the result to requesting user
+		$validatorInterfaceObject = new connector();
+		$validatorInterfaceObject->set('httpType','POST');
+		#$validatorInterfaceObject->set('httpContentType','application/xml');
+		$validatorInterfaceObject->set('httpContentType','multipart/form-data'); # maybe given automatically
+		//first test with data from ram - doesn't function 
+		$fields = array(
+			'dataFile'=>urlencode($iso19139Xml)
+			);
+		//generate file identifier:
+		$fileId = guid();
+		//generate temporary file under tmp
+		 if($h = fopen(TMPDIR."/".$fileId."iso19139_validate_tmp.xml","w")){
+			if(!fwrite($h,$iso19139Xml)){
+				$e = new mb_exception("mod_layerISOMetadata: cannot write to file: ".TMPDIR."iso19139_validate_tmp.xml");
+			}
+		fclose($h);
+		}
+		//send file as post like described under http://www.tecbrat.com/?itemid=13&catid=1
+		$fields['dataFile']='@'.TMPDIR.'/'.$fileId.'iso19139_validate_tmp.xml';
+		#if we give a string with parameters
+		#foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } 
+		#rtrim($fields_string,'&');
+		#$postData = $fields_string;
+		$postData = $fields;
+		#$e = new mb_exception("mod_layerISOMetadata: postData: ".$postData['dataFile']);
+		//number of post fields:
+		//curl_setopt($ch,CURLOPT_POST,count($fields));
+		$validatorInterfaceObject->set('httpPostFieldsNumber',count($postData));
+		$validatorInterfaceObject->set('curlSendCustomHeaders',false);
+		//$validatorInterfaceObject->set('httpPostData', $postData);
+		$validatorInterfaceObject->set('httpPostData', $postData); #give an array
+		$validatorInterfaceObject->load($validatorUrl);
+		header("Content-type: text/html; charset=UTF-8");
+		echo $validatorInterfaceObject->file;
+		//delete file in tmp 
+		//TODO - this normally done by a cronjob
+		die();
+	}
+
+function getEpsgByLayerId ($layer_id) { // from merge_layer.php
+	$epsg_list = "";
+	$sql = "SELECT DISTINCT epsg FROM layer_epsg WHERE fkey_layer_id = $1";
+	$v = array($layer_id);
+	$t = array('i');
+	$res = db_prep_query($sql, $v, $t);
+	while($row = db_fetch_array($res)){
+		$epsg_list .= $row['epsg'] . " ";
+	}
+	return trim($epsg_list);
+}
+function getEpsgArrayByLayerId ($layer_id) { // from merge_layer.php
+	//$epsg_list = "";
+	$epsg_array=array();
+	$sql = "SELECT DISTINCT epsg FROM layer_epsg WHERE fkey_layer_id = $1";
+	$v = array($layer_id);
+	$t = array('i');
+	$res = db_prep_query($sql, $v, $t);
+	$cnt=0;
+	while($row = db_fetch_array($res)){
+		$epsg_array[$cnt] = $row['epsg'];
+		$cnt++;
+	}
+	return $epsg_array;
+}
+
+function guid(){
+    if (function_exists('com_create_guid')){
+        return com_create_guid();
+    }else{
+        mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
+        $charid = strtoupper(md5(uniqid(rand(), true)));
+        $hyphen = chr(45);// "-"
+        $uuid = chr(123)// "{"
+                .substr($charid, 0, 8).$hyphen
+                .substr($charid, 8, 4).$hyphen
+                .substr($charid,12, 4).$hyphen
+                .substr($charid,16, 4).$hyphen
+                .substr($charid,20,12)
+                .chr(125);// "}"
+        return $uuid;
+    }
+}
+
+
+?>
+

Modified: trunk/mapbender/http/plugins/mb_metadata_server.php
===================================================================
--- trunk/mapbender/http/plugins/mb_metadata_server.php	2011-05-05 19:55:50 UTC (rev 7796)
+++ trunk/mapbender/http/plugins/mb_metadata_server.php	2011-05-06 11:50:54 UTC (rev 7797)
@@ -710,10 +710,15 @@
 		if (isset($data->tmp_reference_1)) {
 			$tmp_reference_1 = $data->tmp_reference_1;
 		}
-
+		if ($tmp_reference_1 == "") {
+			$tmp_reference_1 = "2000-01-01";
+		}
 		if (isset($data->tmp_reference_2)) {
 			$tmp_reference_2 = $data->tmp_reference_2;
 		}
+		if ($tmp_reference_2 == "") {
+			$tmp_reference_2 = "2000-01-01";
+		}
 		if (isset($data->lineage)) {
 			$lineage = $data->lineage;
 		}

Modified: trunk/mapbender/http/plugins/mb_metadata_showMetadataAddon.js
===================================================================
--- trunk/mapbender/http/plugins/mb_metadata_showMetadataAddon.js	2011-05-05 19:55:50 UTC (rev 7796)
+++ trunk/mapbender/http/plugins/mb_metadata_showMetadataAddon.js	2011-05-06 11:50:54 UTC (rev 7797)
@@ -186,10 +186,17 @@
 				},
 				"save": function() {
 					//get data from form
-					//validate form before send it!
-					if ($metadataAddonForm.valid() != true) {
-						alert("Form not valid - please check your input!"); //TODO use translations and make a php file from this
-						return;
+					//supress validation for the link only way
+					//example $("#myform").validate().element( "#myselect" );
+					//$("#myform").validate({
+					// ignore: ".ignore"
+					//})
+					if ($("#simple_metadata_editor").css("display") == "block") {
+						//validate form before send it!
+						if ($metadataAddonForm.valid() != true) {
+							alert("Form not valid - please check your input!"); //TODO use translations and make a php file from this
+							return;
+						}
 					}
 					var formData = $metadataAddonForm.easyform("serialize");
 					if (!isNew) {



More information about the Mapbender_commits mailing list