00001 <?php
00002
00005
00026 class DatasetRead extends WebService
00027 {
00029 private $db;
00030
00032 private $conneg;
00033
00035 private $dtdURL;
00036
00038 private $requester_ip = "";
00039
00041 private $registered_ip = "";
00042
00044 private $datasetUri = "";
00045
00047 private $datasetsDescription = array();
00048
00050 private $addMeta = "false";
00051
00053 private $namespaces =
00054 array ("http://www.w3.org/2002/07/owl#" => "owl", "http://www.w3.org/1999/02/22-rdf-syntax-ns#" => "rdf",
00055 "http://www.w3.org/2000/01/rdf-schema#" => "rdfs", "http://purl.org/ontology/wsf#" => "wsf");
00056
00057
00059 public static $supportedSerializations =
00060 array ("application/json", "application/rdf+xml", "application/rdf+n3", "application/*", "text/xml", "text/*",
00061 "*/*");
00062
00064 private $errorMessenger =
00065 '{
00066 "ws": "/ws/dataset/read/",
00067 "_200": {
00068 "id": "WS-DATASET-READ-200",
00069 "level": "Warning",
00070 "name": "No unique identifier specified for this dataset",
00071 "description": "No URI defined for this new dataset"
00072 },
00073 "_300": {
00074 "id": "WS-DATASET-READ-300",
00075 "level": "Fatal",
00076 "name": "Can\'t get the description of any dataset",
00077 "description": "An error occured when we tried to get information about all datasets"
00078 },
00079 "_301": {
00080 "id": "WS-DATASET-READ-301",
00081 "level": "Fatal",
00082 "name": "Can\'t get the description of the target dataset",
00083 "description": "An error occured when we tried to get information about the target dataset"
00084 },
00085 "_302": {
00086 "id": "WS-DATASET-READ-302",
00087 "level": "Fatal",
00088 "name": "Can\'t get meta-information about the dataset(s)",
00089 "description": "An error occured when we tried to get meta-information about the dataset(s)"
00090 },
00091 "_303": {
00092 "id": "WS-DATASET-READ-303",
00093 "level": "Fatal",
00094 "name": "Can\'t get information about the contributors",
00095 "description": "An error occured when we tried to get information about the contributors of this dataset"
00096 },
00097 "_304": {
00098 "id": "WS-DATASET-READ-304",
00099 "level": "Warning",
00100 "name": "This dataset doesn\'t exist in this WSF",
00101 "description": "The target dataset doesn\'t exist in this web service framework"
00102 },
00103 "_305": {
00104 "id": "WS-DATASET-READ-305",
00105 "level": "Fatal",
00106 "name": "Can\'t get meta-information about the dataset(s)",
00107 "description": "An error occured when we tried to get meta-information about the dataset(s)"
00108 }
00109 }';
00110
00111
00128 function __construct($uri, $meta, $registered_ip, $requester_ip)
00129 {
00130 parent::__construct();
00131
00132 $this->db = new DB_Virtuoso($this->db_username, $this->db_password, $this->db_dsn, $this->db_host);
00133
00134 $this->datasetUri = $uri;
00135 $this->requester_ip = $requester_ip;
00136 $this->addMeta = strtolower($meta);
00137
00138 if($registered_ip == "")
00139 {
00140 $this->registered_ip = $requester_ip;
00141 }
00142 else
00143 {
00144 $this->registered_ip = $registered_ip;
00145 }
00146
00147 if(strtolower(substr($this->registered_ip, 0, 4)) == "self")
00148 {
00149 $pos = strpos($this->registered_ip, "::");
00150
00151 if($pos !== FALSE)
00152 {
00153 $account = substr($this->registered_ip, $pos + 2, strlen($this->registered_ip) - ($pos + 2));
00154
00155 $this->registered_ip = $requester_ip . "::" . $account;
00156 }
00157 else
00158 {
00159 $this->registered_ip = $requester_ip;
00160 }
00161 }
00162
00163 $this->uri = $this->wsf_base_url . "/wsf/ws/dataset/read/";
00164 $this->title = "Dataset Read Web Service";
00165 $this->crud_usage = new CrudUsage(FALSE, TRUE, FALSE, FALSE);
00166 $this->endpoint = $this->wsf_base_url . "/ws/dataset/read/";
00167
00168 $this->dtdURL = "dataset/datasetRead.dtd";
00169
00170 $this->errorMessenger = json_decode($this->errorMessenger);
00171 }
00172
00173 function __destruct()
00174 {
00175 parent::__destruct();
00176
00177 if(isset($this->db))
00178 {
00179 @$this->db->close();
00180 }
00181 }
00182
00204 protected function validateQuery()
00205 {
00206
00207 $ws_av = new AuthValidator($this->requester_ip, $this->wsf_graph . "datasets/", $this->uri);
00208
00209 $ws_av->pipeline_conneg($this->conneg->getAccept(), $this->conneg->getAcceptCharset(),
00210 $this->conneg->getAcceptEncoding(), $this->conneg->getAcceptLanguage());
00211
00212 $ws_av->process();
00213
00214 if($ws_av->pipeline_getResponseHeaderStatus() != 200)
00215 {
00216
00217 $ws_av2 = new AuthValidator($this->requester_ip, $this->datasetUri, $this->uri);
00218
00219 $ws_av2->pipeline_conneg($this->conneg->getAccept(), $this->conneg->getAcceptCharset(),
00220 $this->conneg->getAcceptEncoding(), $this->conneg->getAcceptLanguage());
00221
00222 $ws_av2->process();
00223
00224 if($ws_av2->pipeline_getResponseHeaderStatus() != 200)
00225 {
00226 $this->conneg->setStatus($ws_av2->pipeline_getResponseHeaderStatus());
00227 $this->conneg->setStatusMsg($ws_av2->pipeline_getResponseHeaderStatusMsg());
00228 $this->conneg->setStatusMsgExt($ws_av2->pipeline_getResponseHeaderStatusMsgExt());
00229 $this->conneg->setError($ws_av2->pipeline_getError()->id, $ws_av2->pipeline_getError()->webservice,
00230 $ws_av2->pipeline_getError()->name, $ws_av2->pipeline_getError()->description,
00231 $ws_av2->pipeline_getError()->debugInfo, $ws_av2->pipeline_getError()->level);
00232
00233 return;
00234 }
00235 }
00236 }
00237
00250 private function uriEncode($uri)
00251 {
00252 $uri = preg_replace("|[^a-zA-z0-9]|", " ", $uri);
00253 $uri = preg_replace("/\s+/", " ", $uri);
00254 $uri = str_replace(" ", "_", $uri);
00255
00256 return ($uri);
00257 }
00258
00269 public function pipeline_getError() { return ($this->conneg->error); }
00270
00271
00282 public function pipeline_getResultset()
00283 {
00284 $xml = new ProcessorXML();
00285
00286
00287 $resultset = $xml->createResultset();
00288
00289
00290 $wsf = $xml->createPrefix("wsf", "http://purl.org/ontology/wsf#");
00291 $resultset->appendChild($wsf);
00292 $void = $xml->createPrefix("void", "http://rdfs.org/ns/void#");
00293 $resultset->appendChild($void);
00294 $rdf = $xml->createPrefix("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
00295 $resultset->appendChild($rdf);
00296 $sioc = $xml->createPrefix("sioc", "http://rdfs.org/sioc/ns#");
00297 $resultset->appendChild($sioc);
00298 $dcterms = $xml->createPrefix("dcterms", "http://purl.org/dc/terms/");
00299 $resultset->appendChild($dcterms);
00300 $dcterms = $xml->createPrefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#");
00301 $resultset->appendChild($dcterms);
00302
00303
00304 foreach($this->datasetsDescription as $dd)
00305 {
00306 if($dd->uri != "")
00307 {
00308 $subject = $xml->createSubject("void:Dataset", $dd->uri);
00309
00310 if($dd->title != "")
00311 {
00312 $pred = $xml->createPredicate("dcterms:title");
00313 $object = $xml->createObjectContent($this->xmlEncode($dd->title));
00314 $pred->appendChild($object);
00315 $subject->appendChild($pred);
00316 }
00317
00318 if($dd->description != "")
00319 {
00320 $pred = $xml->createPredicate("dcterms:description");
00321 $object = $xml->createObjectContent($this->xmlEncode($dd->description));
00322 $pred->appendChild($object);
00323 $subject->appendChild($pred);
00324 }
00325
00326 $pred = $xml->createPredicate("dcterms:created");
00327 $object = $xml->createObjectContent($this->xmlEncode($dd->created));
00328 $pred->appendChild($object);
00329 $subject->appendChild($pred);
00330
00331 if($dd->modified != "")
00332 {
00333 $pred = $xml->createPredicate("dcterms:modified");
00334 $object = $xml->createObjectContent($this->xmlEncode($dd->modified));
00335 $pred->appendChild($object);
00336 $subject->appendChild($pred);
00337 }
00338
00339 if($dd->creator != "")
00340 {
00341 $pred = $xml->createPredicate("dcterms:creator");
00342 $object = $xml->createObject("sioc:User", $dd->creator);
00343 $pred->appendChild($object);
00344 $subject->appendChild($pred);
00345 }
00346
00347 if($dd->meta != "" && $this->addMeta == "true")
00348 {
00349 $pred = $xml->createPredicate("wsf:meta");
00350 $object = $xml->createObject("", $dd->meta);
00351 $pred->appendChild($object);
00352 $subject->appendChild($pred);
00353 }
00354
00355 if(count($dd->metaDescription) > 0 && $this->addMeta == "true")
00356 {
00357 $subjectMeta = $xml->createSubject("void:Dataset", $dd->meta);
00358
00359 foreach($dd->metaDescription as $predicate => $values)
00360 {
00361 foreach($values as $key => $value)
00362 {
00363 if(gettype($key) == "integer" && $value != "")
00364 {
00365 if($dd->metaDescription[$predicate]["type"] != NULL)
00366 {
00367
00368
00369
00370
00371 $pred = $xml->createPredicate($predicate);
00372 $object = $xml->createObjectContent($this->xmlEncode($value));
00373 $pred->appendChild($object);
00374 $subjectMeta->appendChild($pred);
00375 }
00376 else
00377 {
00378 $pred = $xml->createPredicate($predicate);
00379 $object = $xml->createObject("", $value);
00380
00381
00382 $query = " select ?s ?p ?o
00383 from <" . $this->datasetUri . "reification/>
00384 where
00385 {
00386 ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#subject> <" . $dd->meta . ">.
00387 ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#predicate> <" . $predicate . ">.
00388 ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#object> <" . $value . ">.
00389 ?s ?p ?o.
00390 }";
00391
00392 $rset =
00393 @$this->db->query($this->db->build_sparql_query(str_replace(array ("\n", "\r", "\t"), " ", $query),
00394 array ("s", "p", "o"), FALSE));
00395
00396 if(!odbc_error())
00397 {
00398 while(odbc_fetch_row($rset))
00399 {
00400 $s = odbc_result($rset, 1);
00401 $p = odbc_result($rset, 2);
00402 $o = odbc_result($rset, 3);
00403
00404 if($p == "http://purl.org/ontology/bibo/uri"
00405 || $p == "http://www.w3.org/2000/01/rdf-schema#label")
00406 {
00407 $reify = $xml->createReificationStatement($p, $o);
00408 $object->appendChild($reify);
00409 }
00410 }
00411 }
00412
00413 $pred->appendChild($object);
00414 $subjectMeta->appendChild($pred);
00415 }
00416 }
00417 }
00418 }
00419
00420 $resultset->appendChild($subjectMeta);
00421 }
00422
00423 foreach($dd->contributors as $contributor)
00424 {
00425 if($contributor != "")
00426 {
00427 $pred = $xml->createPredicate("dcterms:contributor");
00428 $object = $xml->createObject("sioc:User", $contributor);
00429 $pred->appendChild($object);
00430 $subject->appendChild($pred);
00431 }
00432 }
00433
00434 $resultset->appendChild($subject);
00435 }
00436 }
00437
00438 return ($this->injectDoctype($xml->saveXML($resultset)));
00439 }
00440
00453 public function injectDoctype($xmlDoc)
00454 {
00455 $posHeader = strpos($xmlDoc, '"?>') + 3;
00456 $xmlDoc = substr($xmlDoc, 0, $posHeader)
00457 . "\n<!DOCTYPE resultset PUBLIC \"-//Structured Dynamics LLC//Dataset Read DTD 0.1//EN\" \"" . $this->dtdBaseURL
00458 . $this->dtdURL . "\">" . substr($xmlDoc, $posHeader, strlen($xmlDoc) - $posHeader);
00459
00460 return ($xmlDoc);
00461 }
00462
00481 public function ws_conneg($accept, $accept_charset, $accept_encoding, $accept_language)
00482 {
00483 $this->conneg =
00484 new Conneg($accept, $accept_charset, $accept_encoding, $accept_language, DatasetRead::$supportedSerializations);
00485
00486
00487 $this->validateQuery();
00488
00489
00490 if($this->conneg->getStatus() == 200)
00491 {
00492
00493 if($this->uri == "")
00494 {
00495 $this->conneg->setStatus(400);
00496 $this->conneg->setStatusMsg("Bad Request");
00497 $this->conneg->setStatusMsgExt("No URI specified for any dataset");
00498 $this->conneg->setStatusMsgExt($this->errorMessenger->_200->name);
00499 $this->conneg->setError($this->errorMessenger->_200->id, $this->errorMessenger->ws,
00500 $this->errorMessenger->_200->name, $this->errorMessenger->_200->description, "",
00501 $this->errorMessenger->_200->level);
00502
00503 return;
00504 }
00505 }
00506 }
00507
00526 public function pipeline_conneg($accept, $accept_charset, $accept_encoding, $accept_language)
00527 { $this->ws_conneg($accept, $accept_charset, $accept_encoding, $accept_language); }
00528
00539 public function pipeline_getResponseHeaderStatus() { return $this->conneg->getStatus(); }
00540
00551 public function pipeline_getResponseHeaderStatusMsg() { return $this->conneg->getStatusMsg(); }
00552
00565 public function pipeline_getResponseHeaderStatusMsgExt() { return $this->conneg->getStatusMsgExt(); }
00566
00579 private function getNamespace($uri)
00580 {
00581 $pos = strrpos($uri, "#");
00582
00583 if($pos !== FALSE)
00584 {
00585 return array (substr($uri, 0, $pos) . "#", substr($uri, $pos + 1, strlen($uri) - ($pos + 1)));
00586 }
00587 else
00588 {
00589 $pos = strrpos($uri, "/");
00590
00591 if($pos !== FALSE)
00592 {
00593 return array (substr($uri, 0, $pos) . "/", substr($uri, $pos + 1, strlen($uri) - ($pos + 1)));
00594 }
00595 else
00596 {
00597 $pos = strpos($uri, ":");
00598
00599 if($pos !== FALSE)
00600 {
00601 $nsUri = explode(":", $uri, 2);
00602
00603 foreach($this->namespaces as $uri2 => $prefix2)
00604 {
00605 $uri2 = urldecode($uri2);
00606
00607 if($prefix2 == $nsUri[0])
00608 {
00609 return (array ($uri2, $nsUri[1]));
00610 }
00611 }
00612
00613 return explode(":", $uri, 2);
00614 }
00615 }
00616 }
00617
00618 return (FALSE);
00619 }
00630 public function pipeline_serialize()
00631 {
00632 $rdf_part = "";
00633
00634 switch($this->conneg->getMime())
00635 {
00636 case "application/json":
00637 $json_part = "";
00638 $xml = new ProcessorXML();
00639 $xml->loadXML($this->pipeline_getResultset());
00640
00641 $subjects = $xml->getSubjects();
00642
00643 foreach($subjects as $subject)
00644 {
00645 $subjectURI = $xml->getURI($subject);
00646 $subjectType = $xml->getType($subject);
00647
00648 $json_part .= " { \n";
00649 $json_part .= " \"uri\": \"" . parent::jsonEncode($subjectURI) . "\", \n";
00650 $json_part .= " \"type\": \"" . parent::jsonEncode($subjectType) . "\", \n";
00651
00652 $predicates = $xml->getPredicates($subject);
00653
00654 $nbPredicates = 0;
00655
00656 foreach($predicates as $predicate)
00657 {
00658 $objects = $xml->getObjects($predicate);
00659
00660 foreach($objects as $object)
00661 {
00662 $nbPredicates++;
00663
00664 if($nbPredicates == 1)
00665 {
00666 $json_part .= " \"predicate\": [ \n";
00667 }
00668
00669 $objectType = $xml->getType($object);
00670 $predicateType = $xml->getType($predicate);
00671
00672 if($objectType == "rdfs:Literal")
00673 {
00674 $objectValue = $xml->getContent($object);
00675
00676 $json_part .= " { \n";
00677 $json_part .= " \"" . parent::jsonEncode($predicateType) . "\": \""
00678 . parent::jsonEncode($objectValue) . "\" \n";
00679 $json_part .= " },\n";
00680 }
00681 else
00682 {
00683 $objectURI = $xml->getURI($object);
00684 $rdf_part .= " <$predicateType> <$objectURI> ;\n";
00685
00686 $json_part .= " { \n";
00687 $json_part .= " \"" . parent::jsonEncode($predicateType) . "\": { \n";
00688 $json_part .= " \"uri\": \"" . parent::jsonEncode($objectURI) . "\" \n";
00689 $json_part .= " } \n";
00690 $json_part .= " },\n";
00691 }
00692 }
00693 }
00694
00695 if(strlen($json_part) > 0)
00696 {
00697 $json_part = substr($json_part, 0, strlen($json_part) - 2) . "\n";
00698 }
00699
00700 if($nbPredicates > 0)
00701 {
00702 $json_part .= " ]\n";
00703 }
00704
00705 $json_part .= " },\n";
00706 }
00707
00708 if(strlen($json_part) > 0)
00709 {
00710 $json_part = substr($json_part, 0, strlen($json_part) - 2) . "\n";
00711 }
00712
00713 return ($json_part);
00714 break;
00715
00716 case "application/rdf+n3":
00717 $xml = new ProcessorXML();
00718 $xml->loadXML($this->pipeline_getResultset());
00719
00720 $dataset = $xml->getSubjectsByType("void:Dataset");
00721
00722 $dataset_uri = $xml->getURI($dataset->item(0));
00723
00724 $rdf_part .= "<$dataset_uri> a void:Dataset ;\n";
00725
00726
00727 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:title");
00728
00729 if($predicates->item(0))
00730 {
00731 $objects = $xml->getObjectsByType($predicates->item(0), "rdfs:Literal");
00732 $rdf_part .= "dcterms:title \"\"\"" . $xml->getContent($objects->item(0)) . "\"\"\" ;\n";
00733 }
00734
00735
00736 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:description");
00737
00738 if($predicates->item(0))
00739 {
00740 $objects = $xml->getObjectsByType($predicates->item(0), "rdfs:Literal");
00741 $rdf_part .= "dcterms:description \"\"\"" . $xml->getContent($objects->item(0)) . "\"\"\" ;\n";
00742 }
00743
00744
00745 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:created");
00746
00747 if($predicates->item(0))
00748 {
00749 $objects = $xml->getObjectsByType($predicates->item(0), "rdfs:Literal");
00750 $rdf_part .= "dcterms:created \"\"\"" . $xml->getContent($objects->item(0)) . "\"\"\" ;\n";
00751 }
00752
00753
00754 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:modified");
00755
00756 if($predicates->item(0))
00757 {
00758 $objects = $xml->getObjectsByType($predicates->item(0), "rdfs:Literal");
00759 $rdf_part .= "dcterms:modified \"\"\"" . $xml->getContent($objects->item(0)) . "\"\"\" ;\n";
00760 }
00761
00762
00763 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:creator");
00764
00765 foreach($predicates as $predicate)
00766 {
00767 $objects = $xml->getObjectsByType($predicate, "sioc:User");
00768 $rdf_part .= "dcterms:creator <" . $xml->getURI($objects->item(0)) . "> ;\n";
00769 }
00770
00771
00772 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:contributor");
00773
00774 foreach($predicates as $predicate)
00775 {
00776 $objects = $xml->getObjectsByType($predicate, "sioc:User");
00777 $rdf_part .= "dcterms:contributor <" . $xml->getURI($objects->item(0)) . "> ;\n";
00778 }
00779
00780 return ($rdf_part);
00781
00782 break;
00783
00784 case "application/rdf+xml":
00785
00786 $xml = new ProcessorXML();
00787 $xml->loadXML($this->pipeline_getResultset());
00788
00789
00793
00794
00795
00796
00797 $dataset = $xml->getSubjectsByType("void:Dataset");
00798
00799 $dataset_uri = $xml->getURI($dataset->item(0));
00800
00801 $rdf_part .= "<void:Dataset rdf:about=\"$dataset_uri\">\n";
00802
00803
00804 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:title");
00805
00806 if($predicates->item(0))
00807 {
00808 $objects = $xml->getObjectsByType($predicates->item(0), "rdfs:Literal");
00809 $rdf_part .= "<dcterms:title>" . $xml->getContent($objects->item(0)) . "</dcterms:title>\n";
00810 }
00811
00812
00813 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:description");
00814
00815 if($predicates->item(0))
00816 {
00817 $objects = $xml->getObjectsByType($predicates->item(0), "rdfs:Literal");
00818 $rdf_part .= "<dcterms:description>" . $xml->getContent($objects->item(0)) . "</dcterms:description>\n";
00819 }
00820
00821
00822 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:created");
00823
00824 if($predicates->item(0))
00825 {
00826 $objects = $xml->getObjectsByType($predicates->item(0), "rdfs:Literal");
00827 $rdf_part .= "<dcterms:created>" . $xml->getContent($objects->item(0)) . "</dcterms:created>\n";
00828 }
00829
00830
00831 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:modified");
00832
00833 if($predicates->item(0))
00834 {
00835 $objects = $xml->getObjectsByType($predicates->item(0), "rdfs:Literal");
00836 $rdf_part .= "<dcterms:modified>" . $xml->getContent($objects->item(0)) . "</dcterms:modified>\n";
00837 }
00838
00839
00840 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:creator");
00841
00842 foreach($predicates as $predicate)
00843 {
00844 $objects = $xml->getObjectsByType($predicate, "sioc:User");
00845 $rdf_part .= "<dcterms:creator rdf:resource=\"" . $xml->getURI($objects->item(0)) . "\" />\n";
00846 }
00847
00848
00849 $predicates = $xml->getPredicatesByType($dataset->item(0), "dcterms:contributor");
00850
00851 foreach($predicates as $predicate)
00852 {
00853 $objects = $xml->getObjectsByType($predicate, "sioc:User");
00854 $rdf_part .= "<dcterms:contributor rdf:resource=\"" . $xml->getURI($objects->item(0)) . "\" />\n";
00855 }
00856
00857 $rdf_part .= "</void:Dataset>\n";
00858
00859 return ($rdf_part);
00860 break;
00861 }
00862 }
00863
00872 public function pipeline_serialize_reification() { return ""; }
00873
00884 public function ws_serialize()
00885 {
00886 switch($this->conneg->getMime())
00887 {
00888 case "application/rdf+n3":
00889 $rdf_document = "";
00890 $rdf_document .= "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n";
00891 $rdf_document .= "@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .\n";
00892 $rdf_document .= "@prefix void: <http://rdfs.org/ns/void#> .\n";
00893 $rdf_document .= "@prefix dcterms: <http://purl.org/dc/terms/> .\n";
00894 $rdf_document .= "@prefix wsf: <http://purl.org/ontology/wsf#> .\n";
00895
00896 $rdf_document .= $this->pipeline_serialize();
00897
00898 $rdf_document = substr($rdf_document, 0, strlen($rdf_document) - 2) . ".\n";
00899
00900 return $rdf_document;
00901 break;
00902
00903 case "application/rdf+xml":
00904 $rdf_document = "";
00905 $rdf_document .= "<?xml version=\"1.0\"?>\n";
00906 $rdf_document
00907 .= "<rdf:RDF xmlns:wsf=\"http://purl.org/ontology/wsf#\" xmlns:void=\"http://rdfs.org/ns/void#\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n\n";
00908
00909 $rdf_document .= $this->pipeline_serialize();
00910
00911 $rdf_document .= "</rdf:RDF>";
00912
00913 return $rdf_document;
00914 break;
00915
00916 case "text/xml":
00917 return $this->pipeline_getResultset();
00918 break;
00919
00920 case "application/json":
00921 $json_document = "";
00922 $json_document .= "{\n";
00923 $json_document .= " \"prefixes\": [ \n";
00924 $json_document .= " {\n";
00925 $json_document .= " \"rdf\": \"http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns#\",\n";
00926 $json_document .= " \"rdfs\": \"http://www.w3.org/2000/01/rdf-schema#\",\n";
00927 $json_document .= " \"void\": \"http://rdfs.org/ns/void#\",\n";
00928 $json_document .= " \"dcterms\": \"http://purl.org/dc/terms/\"\n";
00929 $json_document .= " } \n";
00930 $json_document .= " ],\n";
00931 $json_document .= " \"resultset\": {\n";
00932 $json_document .= " \"subject\": [\n";
00933 $json_document .= $this->pipeline_serialize();
00934 $json_document .= " ]\n";
00935 $json_document .= " }\n";
00936 $json_document .= "}";
00937
00938 return ($json_document);
00939 break;
00940 }
00941 }
00942
00955 public function ws_respond($content)
00956 {
00957
00958 $this->conneg->respond();
00959
00960
00961
00962
00963 if($this->conneg->getStatus() == 200)
00964 {
00965 echo $content;
00966 }
00967
00968 $this->__destruct();
00969 }
00970
00971
00980 public function process()
00981 {
00982
00983 if($this->conneg->getStatus() == 200)
00984 {
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016 $query = "";
01017 $datasets = array();
01018
01019 if($this->datasetUri == "all")
01020 {
01021 $query = " select distinct ?dataset ?title ?description ?creator ?created ?modified ?contributor ?meta
01022 from named <" . $this->wsf_graph . ">
01023 from named <" . $this->wsf_graph . "datasets/>
01024 where
01025 {
01026 graph <" . $this->wsf_graph . ">
01027 {
01028 ?access <http://purl.org/ontology/wsf#registeredIP> ?ip ;
01029 <http://purl.org/ontology/wsf#read> \"True\" ;
01030 <http://purl.org/ontology/wsf#datasetAccess> ?dataset .
01031 filter( str(?ip) = \"$this->registered_ip\" or str(?ip) = \"0.0.0.0\") .
01032 }
01033
01034 graph <"
01035 . $this->wsf_graph
01036 . "datasets/>
01037 {
01038 ?dataset a <http://rdfs.org/ns/void#Dataset> ;
01039 <http://purl.org/dc/terms/created> ?created.
01040
01041 OPTIONAL{?dataset <http://purl.org/ontology/wsf#meta> ?meta.}
01042 OPTIONAL{?dataset <http://purl.org/dc/terms/title> ?title.}
01043 OPTIONAL{?dataset <http://purl.org/dc/terms/description> ?description.}
01044 OPTIONAL{?dataset <http://purl.org/dc/terms/modified> ?modified.}
01045 OPTIONAL{?dataset <http://purl.org/dc/terms/contributor> ?contributor.}
01046 OPTIONAL{?dataset <http://purl.org/dc/terms/creator> ?creator.}
01047 }
01048 }";
01049
01050 $resultset = @$this->db->query($this->db->build_sparql_query(str_replace(array ("\n", "\r", "\t"), " ", $query),
01051 array ("dataset", "title", "description", "creator", "created", "modified", "contributor", "meta"), FALSE));
01052
01053 if(odbc_error())
01054 {
01055 $this->conneg->setStatus(500);
01056 $this->conneg->setStatusMsg("Internal Error");
01057 $this->conneg->setStatusMsgExt($this->errorMessenger->_300->name);
01058 $this->conneg->setError($this->errorMessenger->_300->id, $this->errorMessenger->ws,
01059 $this->errorMessenger->_300->name, $this->errorMessenger->_300->description, odbc_errormsg(),
01060 $this->errorMessenger->_300->level);
01061
01062 return;
01063 }
01064 else
01065 {
01066 $dataset = "";
01067 $title = "";
01068 $description = "";
01069 $creator = "";
01070 $created = "";
01071 $modified = "";
01072 $contributors = array();
01073 $meta = "";
01074
01075 while(odbc_fetch_row($resultset))
01076 {
01077 $dataset2 = odbc_result($resultset, 1);
01078
01079 if($dataset2 != $dataset && $dataset != "")
01080 {
01081 array_push($this->datasetsDescription,
01082 new DatasetDescription($dataset, $title, $description, $creator, $created, $modified, $contributors));
01083 $contributors = array();
01084 }
01085
01086 $dataset = $dataset2;
01087
01088 $title = odbc_result($resultset, 2);
01089 $description = odbc_result($resultset, 3);
01090 $creator = odbc_result($resultset, 4);
01091 $created = odbc_result($resultset, 5);
01092 $modified = odbc_result($resultset, 6);
01093 array_push($contributors, odbc_result($resultset, 7));
01094 $meta = odbc_result($resultset, 8);
01095 }
01096
01097 $metaDescription = array();
01098
01099
01100 if($meta != "" && $this->addMeta == "true")
01101 {
01102 $query = "select ?p ?o (str(DATATYPE(?o))) as ?otype (LANG(?o)) as ?olang
01103 from <" . $this->wsf_graph . "datasets/>
01104 where
01105 {
01106 <$meta> ?p ?o.
01107 }";
01108
01109 $resultset =
01110 @$this->db->query($this->db->build_sparql_query(str_replace(array ("\n", "\r", "\t"), " ", $query),
01111 array ('p', 'o', 'otype', 'olang'), FALSE));
01112
01113 $contributors = array();
01114
01115 if(odbc_error())
01116 {
01117 $this->conneg->setStatus(500);
01118 $this->conneg->setStatusMsg("Internal Error");
01119 $this->conneg->setStatusMsgExt($this->errorMessenger->_305->name);
01120 $this->conneg->setError($this->errorMessenger->_305->id, $this->errorMessenger->ws,
01121 $this->errorMessenger->_305->name, $this->errorMessenger->_305->description, odbc_errormsg(),
01122 $this->errorMessenger->_305->level);
01123
01124 return;
01125 }
01126 else
01127 {
01128 while(odbc_fetch_row($resultset))
01129 {
01130 $predicate = odbc_result($resultset, 1);
01131 $object = odbc_result($resultset, 2);
01132 $otype = odbc_result($resultset, 3);
01133 $olang = odbc_result($resultset, 4);
01134
01135 if(isset($metaDescription[$predicate]))
01136 {
01137 array_push($metaDescription[$predicate], $object);
01138 }
01139 else
01140 {
01141 $metaDescription[$predicate] = array( $object );
01142
01143 if($olang && $olang != "")
01144 {
01145
01146 $metaDescription[$predicate]["type"] = "http://www.w3.org/2001/XMLSchema#string";
01147 }
01148 else
01149 {
01150 $metaDescription[$predicate]["type"] = $otype;
01151 }
01152 }
01153 }
01154 }
01155
01156 unset($resultset);
01157 }
01158
01159 if($dataset != "")
01160 {
01161 array_push($this->datasetsDescription,
01162 new DatasetDescription($dataset, $title, $description, $creator, $created, $modified, $contributors,
01163 $meta, $metaDescription));
01164 }
01165
01166 unset($resultset);
01167 }
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209 }
01210 else
01211 {
01212 $dataset = $this->datasetUri;
01213
01214 $query =
01215 "select ?title ?description ?creator ?created ?modified ?meta
01216 from named <" . $this->wsf_graph . "datasets/>
01217 where
01218 {
01219 graph <" . $this->wsf_graph
01220 . "datasets/>
01221 {
01222 <$dataset> a <http://rdfs.org/ns/void#Dataset> ;
01223 <http://purl.org/dc/terms/created> ?created.
01224
01225 OPTIONAL{<$dataset> <http://purl.org/dc/terms/title> ?title.} .
01226 OPTIONAL{<$dataset> <http://purl.org/dc/terms/description> ?description.} .
01227 OPTIONAL{<$dataset> <http://purl.org/dc/terms/creator> ?creator.} .
01228 OPTIONAL{<$dataset> <http://purl.org/dc/terms/modified> ?modified.} .
01229 OPTIONAL{<$dataset> <http://purl.org/ontology/wsf#meta> ?meta.} .
01230 }
01231 }";
01232
01233 $resultset = @$this->db->query($this->db->build_sparql_query(str_replace(array ("\n", "\r", "\t"), " ", $query),
01234 array ('title', 'description', 'creator', 'created', 'modified', 'meta'), FALSE));
01235
01236 if(odbc_error())
01237 {
01238 $this->conneg->setStatus(500);
01239 $this->conneg->setStatusMsg("Internal Error");
01240 $this->conneg->setStatusMsgExt($this->errorMessenger->_301->name);
01241 $this->conneg->setError($this->errorMessenger->_301->id, $this->errorMessenger->ws,
01242 $this->errorMessenger->_301->name, $this->errorMessenger->_301->description, odbc_errormsg(),
01243 $this->errorMessenger->_301->level);
01244
01245 return;
01246 }
01247 else
01248 {
01249 if(odbc_fetch_row($resultset))
01250 {
01251 $title = odbc_result($resultset, 1);
01252 $description = odbc_result($resultset, 2);
01253 $creator = odbc_result($resultset, 3);
01254 $created = odbc_result($resultset, 4);
01255 $modified = odbc_result($resultset, 5);
01256 $meta = odbc_result($resultset, 6);
01257
01258 unset($resultset);
01259
01260 $metaDescription = array();
01261
01262
01263 if($meta != "" && $this->addMeta == "true")
01264 {
01265 $query = "select ?p ?o (str(DATATYPE(?o))) as ?otype (LANG(?o)) as ?olang
01266 from <" . $this->wsf_graph . "datasets/>
01267 where
01268 {
01269 <$meta> ?p ?o.
01270 }";
01271
01272 $resultset =
01273 @$this->db->query($this->db->build_sparql_query(str_replace(array ("\n", "\r", "\t"), " ", $query),
01274 array ('p', 'o', 'otype', 'olang'), FALSE));
01275
01276 $contributors = array();
01277
01278 if(odbc_error())
01279 {
01280 $this->conneg->setStatus(500);
01281 $this->conneg->setStatusMsg("Internal Error");
01282 $this->conneg->setStatusMsgExt($this->errorMessenger->_302->name);
01283 $this->conneg->setError($this->errorMessenger->_302->id, $this->errorMessenger->ws,
01284 $this->errorMessenger->_302->name, $this->errorMessenger->_302->description, odbc_errormsg(),
01285 $this->errorMessenger->_302->level);
01286
01287 return;
01288 }
01289 else
01290 {
01291 while(odbc_fetch_row($resultset))
01292 {
01293 $predicate = odbc_result($resultset, 1);
01294 $object = odbc_result($resultset, 2);
01295 $otype = odbc_result($resultset, 3);
01296 $olang = odbc_result($resultset, 4);
01297
01298 if(isset($metaDescription[$predicate]))
01299 {
01300 array_push($metaDescription[$predicate], $object);
01301 }
01302 else
01303 {
01304 $metaDescription[$predicate] = array( $object );
01305
01306 if($olang && $olang != "")
01307 {
01308
01309 $metaDescription[$predicate]["type"] = "http://www.w3.org/2001/XMLSchema#string";
01310 }
01311 else
01312 {
01313 $metaDescription[$predicate]["type"] = $otype;
01314 }
01315 }
01316 }
01317 }
01318
01319 unset($resultset);
01320 }
01321
01322
01323
01324 $query =
01325 "select ?contributor
01326 from <" . $this->wsf_graph
01327 . "datasets/>
01328 where
01329 {
01330 <$dataset> a <http://rdfs.org/ns/void#Dataset> ;
01331 <http://purl.org/dc/terms/contributor> ?contributor.
01332 }";
01333
01334 $resultset =
01335 @$this->db->query($this->db->build_sparql_query(str_replace(array ("\n", "\r", "\t"), " ", $query),
01336 array( 'contributor' ), FALSE));
01337
01338 $contributors = array();
01339
01340 if(odbc_error())
01341 {
01342 $this->conneg->setStatus(500);
01343 $this->conneg->setStatusMsg("Internal Error");
01344 $this->conneg->setStatusMsgExt($this->errorMessenger->_303->name);
01345 $this->conneg->setError($this->errorMessenger->_303->id, $this->errorMessenger->ws,
01346 $this->errorMessenger->_303->name, $this->errorMessenger->_303->description, odbc_errormsg(),
01347 $this->errorMessenger->_303->level);
01348
01349 return;
01350 }
01351 elseif(odbc_fetch_row($resultset))
01352 {
01353 array_push($contributors, odbc_result($resultset, 1));
01354 }
01355
01356 array_push($this->datasetsDescription,
01357 new DatasetDescription($dataset, $title, $description, $creator, $created, $modified, $contributors,
01358 $meta, $metaDescription));
01359 }
01360 }
01361 }
01362
01363 if(count($this->datasetsDescription) == 0 && $this->datasetUri != "all")
01364 {
01365 $this->conneg->setStatus(400);
01366 $this->conneg->setStatusMsg("Bad Request");
01367 $this->conneg->setStatusMsgExt("This dataset doesn't exist in this WSF");
01368 $this->conneg->setStatusMsgExt($this->errorMessenger->_304->name);
01369 $this->conneg->setError($this->errorMessenger->_304->id, $this->errorMessenger->ws,
01370 $this->errorMessenger->_304->name, $this->errorMessenger->_304->description, "",
01371 $this->errorMessenger->_304->level);
01372 }
01373 }
01374 }
01375 }
01376
01386 class DatasetDescription
01387 {
01389 public $uri = "";
01390
01392 public $title = "";
01393
01395 public $description = "";
01396
01398 public $creator = "";
01399
01401 public $created = "";
01402
01404 public $modified = "";
01405
01407 public $contributors = array();
01408
01410 public $meta = "";
01411
01413 public $metaDescription = "";
01414
01415 function __construct($uri, $title, $description, $creator, $created, $modified, $contributors, $meta = "",
01416 $metaDescription = array())
01417 {
01418 $this->uri = $uri;
01419 $this->title = $title;
01420 $this->description = $description;
01421 $this->creator = $creator;
01422 $this->created = $created;
01423 $this->modified = $modified;
01424 $this->contributors = $contributors;
01425 $this->meta = $meta;
01426 $this->metaDescription = $metaDescription;
01427 }
01428 }
01429
01431
01432 ?>