cswId = null; $this->operation = null; $this->result = null; $this->operationSuccessful = false; } public function doRequest($cswId, $operationName, $recordId=false, $record=false, $recordtype=false, $maxrecords=false, $startposition=false, $additionalFilter=false, $datasetId=false, $cswObject=false) { if ($cswId != false) { $this->cswId = $cswId; $csw = new csw(); $csw->createCatObjFromDB($this->cswId); } else { $csw = $cswObject; } //$e = new mb_exception("csw_client: cat_op_values: ".$csw->cat_op_values['getrecords']['post']['dflt']); $operationNameCsw = $operationName; //$e = new mb_exception($csw->cat_op_values[$operationName]['post']); //check for operation support switch (strtolower($operationName)) { case "getrecords": if (isset($csw->cat_op_values[$operationName]['get']) || isset($csw->cat_op_values[$operationName]['post'])) { //all ok } else { $e = new mb_exception("classes/class_cswClient.php: Operation not supported by catalogue!"); return false; } break; case "getrecordbyid": if (isset($csw->cat_op_values[$operationName]['get']) || isset($csw->cat_op_values[$operationName]['post'])) { //all ok } else { $e = new mb_exception("classes/class_cswClient.php: Operation not supported by catalogue!"); return false; } break; case "transactionupdate": if (isset($csw->cat_op_values["transaction"]['get']) || isset($csw->cat_op_values["transaction"]['post'])) { //all ok } else { $e = new mb_exception("classes/class_cswClient.php: Operation not supported by catalogue!"); return false; } break; case "transactioninsert": if (isset($csw->cat_op_values["transaction"]['get']) || isset($csw->cat_op_values["transaction"]['post'])) { //all ok } else { $e = new mb_exception("classes/class_cswClient.php: Operation not supported by catalogue!"); return false; } break; //wrapped operations for internal usage case "counthits": if (isset($csw->cat_op_values['getrecords']['post'])) { //all ok } else { $e = new mb_exception("classes/class_cswClient.php: Needed operation not supported by catalogue!"); return false; } break; case "getrecordsresolvecoupling": if (isset($csw->cat_op_values['getrecords']['post'])) { //all ok } else { $e = new mb_exception("classes/class_cswClient.php: Needed operation not supported by catalogue!"); return false; } break; case "getrecordspaging": if (isset($csw->cat_op_values['getrecords']['post'])) { //all ok } else { $e = new mb_exception("classes/class_cswClient.php: Needed operation not supported by catalogue!"); return false; } break; default: break; } /*if () { }*/ $metadataRecordArray = explode("\n", $record->metadata, 2); $metadataRecordString = $metadataRecordArray[1]; switch (strtolower($operationName)) { case "getrecordbyid": //define standard xml request //maybe from xsd? $postRequest = ''; $postRequest .= ''; $postRequest .= ''.$recordId.''; $postRequest .= ''; break; case "getrecords": break; case "getrecordsresolvecoupling": $postRequest = ''; //TODO check the following: - resultType="hits" seems to be default behaviour $postRequest .= ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= 'OperatesOn'; $postRequest .= ''.$recordId.''; $postRequest .= ''; /*$postRequest .= ''; $postRequest .= 'OperatesOnIdentifier'; $postRequest .= ''.$datasetId.''; $postRequest .= '';*/ /*$postRequest .= ''; $postRequest .= 'OperatesOnIdentifier'; $postRequest .= ''.$recordId.''; $postRequest .= '';*/ $postRequest .= ''; if ($additionalFilter !== false) { $postRequest .= $additionalFilter; } if ($additionalFilter !== false) { $postRequest .= ''; } $postRequest .= ''; $postRequest .= ''; } else { if ($additionalFilter !== false) { $postRequest .= ''; $postRequest .= ''; $postRequest .= $additionalFilter; $postRequest .= ''; $postRequest .= ''; } } $postRequest .= ''; $postRequest .= ''; //alter operationName $operationNameCsw = 'getrecords'; break; case "transactionupdate": $postRequest = ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= $metadataRecordString; $postRequest .= ' '; $postRequest .= ''; break; case "transactioninsert": $postRequest = ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= $metadataRecordString; $postRequest .= ' '; $postRequest .= ''; break; case "transactiondelete": $postRequest = ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= ' apiso:Identifier'; $postRequest .= ''.$recordId.''; $postRequest .= ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= ''; $postRequest .= ''; break; //wrapped operations for internal usage case "counthits": $postRequest = ''; //TODO check the following: - resultType="hits" seems to be default behaviour $postRequest .= ''; $postRequest .= ''; } $postRequest .= ''; } else { $postRequest .= ''; $postRequest .= 'Type'; $postRequest .= ''.$recordtype.''; $postRequest .= ''; } if ($additionalFilter !== false) { $postRequest .= $additionalFilter; } if ($additionalFilter !== false) { $postRequest .= ''; } $postRequest .= ''; $postRequest .= ''; } else { if ($additionalFilter !== false) { $postRequest .= ''; $postRequest .= ''; $postRequest .= $additionalFilter; $postRequest .= ''; $postRequest .= ''; } } $postRequest .= ''; $postRequest .= ''; //alter operationName $operationNameCsw = 'getrecords'; break; case "getrecordspaging": if ($recordtype !== false && $maxrecords !== false && $startposition !== false) { $postRequest = ''; $postRequest .= ''; $postRequest .= ''; } $postRequest .= ''; } else { $postRequest .= ''; $postRequest .= 'Type'; $postRequest .= ''.$recordtype.''; $postRequest .= ''; } if ($additionalFilter !== false) { $postRequest .= $additionalFilter; } if ($additionalFilter !== false) { $postRequest .= ''; } $postRequest .= ''; $postRequest .= ''; } else { if ($additionalFilter !== false) { $postRequest .= ''; $postRequest .= ''; $postRequest .= $additionalFilter; $postRequest .= ''; $postRequest .= ''; } } $postRequest .= ''; $postRequest .= ''; //alter operationName $operationNameCsw = 'getrecords'; } else { $e = new mb_exception("classes/class_cswClient.php: Operation getrecordspaging needs more parameters!"); } break; default: break; } //$e = new mb_exception("postdata: ".$postRequest); //do request and return result //$e = new mb_exception($csw->cat_op_values[$operationName]['post']); if (strpos($operationNameCsw, "transaction") === false) { //$e = new mb_exception("test: ".$csw->cat_op_values[$operationNameCsw]['post']); if ($cswId != false) { $this->operationResult = $this->getResult($csw->cat_op_values[$operationNameCsw]['post'], $postRequest); //csw not from database but from capabilities! } else { $e = new mb_exception(json_encode($csw->cat_op_values[$operationNameCsw])); $this->operationResult = $this->getResult($csw->cat_op_values[$operationNameCsw]['post']['dflt'], $postRequest); } //Also give back url of operation if ($cswId != false) { $this->operationUrl = $csw->cat_op_values[$operationNameCsw]['post']; } else { $this->operationUrl = $csw->cat_op_values[$operationNameCsw]['post']['dflt']; } $e = new mb_exception($this->operationUrl); } else { $this->operationResult = $this->getResult($csw->cat_op_values["transaction"]['post'], $postRequest); //$this->operationUrl = $csw->cat_op_values[$operationNameCsw]['post']; } //$e = new mb_exception($this->operationResult); // //if (strpos($operationNameCsw, "getrecords") !== false) { // $this->operationUrl = $csw->cat_op_values[$operationNameCsw]['get']; //} //$e = new mb_exception("testresponse: ".$this->operationResult); //parse response libxml_use_internal_errors(true); try { $cswResponseObject = simplexml_load_string($this->operationResult); if ($cswResponseObject === false) { foreach(libxml_get_errors() as $error) { $err = new mb_exception("class_cswClient:".$error->message); } throw new Exception("class_cswClient:".'Cannot parse CSW Response XML!'); $this->operationResult = "Cannot parse CSW Response XML!"; return false; } } catch (Exception $e) { $err = new mb_exception("class_cswClient:".$e->getMessage()); $this->operationResult = $e->getMessage(); return false; } if ($cswResponseObject !== false) { //$e = new mb_exception("classes/class_cswClient.php: parsing results was successfull!"); $cswResponseObject->registerXPathNamespace("ows", "http://www.opengis.net/ows"); $cswResponseObject->registerXPathNamespace("gml", "http://www.opengis.net/gml"); $cswResponseObject->registerXPathNamespace("gmd", "http://www.isotc211.org/2005/gmd"); $cswResponseObject->registerXPathNamespace("csw", "http://www.opengis.net/cat/csw/2.0.2"); $cswResponseObject->registerXPathNamespace("ogc", "http://www.opengis.net/ogc"); $cswResponseObject->registerXPathNamespace("gco", "http://www.isotc211.org/2005/gco"); $cswResponseObject->registerXPathNamespace("srv", "http://www.isotc211.org/2005/srv"); //$iso19139Xml->registerXPathNamespace("ogc", "http://www.opengis.net/ogc"); $cswResponseObject->registerXPathNamespace("xlink", "http://www.w3.org/1999/xlink"); $cswResponseObject->registerXPathNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); //$cswResponseObject->registerXPathNamespace("default", ""); $this->operationException = $cswResponseObject->xpath('/ows:ExceptionReport'); if (is_array($this->operationException) && count($this->operationException) > 0 || !is_array($this->operationException)) { $err = new mb_exception("class_cswClient first exception that occured: ".$this->operationException[0]->asXML()); $this->operationResult = "An ows exception occured!"; } else { switch (strtolower($operationName)) { case "getrecordbyid": //try to handle metadata - count the returned records $metadataRecord = $cswResponseObject->xpath('/csw:GetRecordByIdResponse/gmd:MD_Metadata'); if (is_array($metadataRecord) && count($metadataRecord) <> 1 || !is_array($metadataRecord)) { //$err = new mb_exception(count($metadataRecord)); //$err = new mb_exception($metadataRecord[0]->asXml()); //$err = new mb_exception("class_cswClient.php: More or less than one metadata returned for a getrecordby id response!"); $this->operationResult = "More or less than one metadata returned for a getrecordby id response!"; return false; } else { $this->operationSuccessful = true; //return $metadataRecord[0]->asXML(); //return "One metadata record with id ".$recordId." found in catalogue"; $this->operationResult = $cswResponseObject; //$e = new mb_exception($cswResponseObject->asXML()); return true; } break; case "getrecords": $metadataRecord = $cswResponseObject->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata'); //$e = new mb_exception(json_encode($metadataRecord)); if (is_array($metadataRecord) && count($metadataRecord) <> 1 || !is_array($metadataRecord)) { $this->operationResult = "No result for counting metadata records via csw query!"; return false; } else { $this->operationSuccessful = true; $this->operationResult = $metadataRecord[0]; return true; } break; case "counthits": //$e = new mb_exception('count hits'); $metadataRecord = $cswResponseObject->xpath('/csw:GetRecordsResponse/csw:SearchResults/@numberOfRecordsMatched'); //$e = new mb_exception(json_encode($metadataRecord)); if (is_array($metadataRecord) && count($metadataRecord) <> 1 || !is_array($metadataRecord)) { $this->operationResult = "No result for counting metadata records via csw query!"; return false; } else { $this->operationSuccessful = true; $this->operationResult = $metadataRecord[0]; return true; } case "getrecordsresolvecoupling": //$e = new mb_exception("classes/class_cswClient.php: operation was getrecordsresolvecoupling"); $metadataRecord = $cswResponseObject->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata'); //$e = new mb_exception(json_encode($metadataRecord)); //$e = new mb_exception("classes/class_cswClient.php: type of metadataRecord: ".gettype($metadataRecord)); if (is_array($metadataRecord) && count($metadataRecord) < 1 || !is_array($metadataRecord)) { //$e = new mb_exception("classes/class_cswClient.php: no array found!"); $this->operationResult = "No result for getrecordsresolvecoupling for metadata records via csw query!"; $this->operationSuccessful = false; return false; } else { //$e = new mb_exception("classes/class_cswClient.php: metadata array found!"); $this->operationSuccessful = true; $this->operationResult = $cswResponseObject; return true; } break; case "getrecordspaging": $metadataRecord = $cswResponseObject->xpath('/csw:GetRecordsResponse/csw:SearchResults/gmd:MD_Metadata'); if (is_array($metadataRecord) && count($metadataRecord) < 1 || !is_array($metadataRecord)) { $this->operationResult = "No result for getrecordspaging for metadata records via csw query!"; $this->operationSuccessful = false; return false; } else { $this->operationSuccessful = true; //give back all records in json $this->operationResult = $cswResponseObject; //$e = new mb_exception("class_cswClient.php: returned xml result from csw operation getrecordspaging: ".$cswResponseObject->asXML()); return true; } break; } } //handle expections if occur //count objects in response - if no object available } return $cswResponseObject->asXML(); } public function pushRecord($isoMetadataObject, $auth=false) { //check if metadata already in catalogue if ($this->doRequest($this->cswId, 'getrecordbyid', $isoMetadataObject->fileIdentifier)) { //$err = new mb_exception("class_cswClient.php: do a transaction update"); $response = $this->doRequest($this->cswId, 'transactionupdate', false, $isoMetadataObject); } else { //$err = new mb_exception("class_cswClient.php: do a transaction insert"); $response = $this->doRequest($this->cswId, 'transactioninsert', false, $isoMetadataObject); } return $response; } private function getResult($url, $postData, $auth=false) { $cswInterfaceObject = new connector(); $cswInterfaceObject->set('httpType','POST'); $postData = stripslashes($postData); //$e = new mb_exception("classes/class_cswClient.php: post xml: ".$postData); $dataXMLObject = new SimpleXMLElement($postData); $postData = $dataXMLObject->asXML(); $cswInterfaceObject->set('curlSendCustomHeaders',true); $cswInterfaceObject->set('httpPostData', $postData); $cswInterfaceObject->set('httpContentType','text/xml'); $cswInterfaceObject->load($url); //$e = new mb_exception("classes/class_cswClient.php: result xml: ".$cswInterfaceObject->file); return $cswInterfaceObject->file; } //insert or update - depends if record with same fileidentifier already exists in catalog and if timestamp is not newer than the timestamp of the new record public function deleteRecord($fileIdentifier, $auth=false) { //check if exists before! if ($this->doRequest($this->cswId, 'getrecordbyid', $fileIdentifier, false)) { //$err = new mb_exception("class_cswClient.php: do a transaction delete"); $response = $this->doRequest($this->cswId, 'transactiondelete', $fileIdentifier, false); } else { //$err = new mb_exception("class_cswClient.php: Don't delete object - cause it doen't exists!"); $response = "Don't delete record ".$fileIdentifier." - cause it doen't exists!"; } return $response; } private function getRecordsPage($catalogId, $page, $filter=false) { } } ?>