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) {
}
}
?>