00001 <?php
00002
00005
00030 class ConverterTsv extends WebService
00031 {
00033 private $db;
00034
00036 private $conneg;
00037
00039 private $dtdURL;
00040
00042 private $text;
00043
00045 private $docmime;
00046
00048 private $type;
00049
00051 private $tsvResources;
00052
00054 private $baseURI;
00055
00057 private $errorMessages = "";
00058
00060 private $requester_ip = "";
00061
00063 private $registered_ip = "";
00064
00066 private $delimiter = "";
00067
00069 public static $supportedSerializations =
00070 array ("application/rdf+xml", "application/rdf+n3", "application/*", "text/tsv", "text/csv", "text/xml", "text/*",
00071 "*/*");
00072
00074 private $errorMessenger =
00075 '{
00076 "ws": "/ws/converter/irv/",
00077 "_200": {
00078 "id": "WS-CONVERTER-IRV-200",
00079 "level": "Warning",
00080 "name": "No data to convert",
00081 "description": "No data to convert"
00082 },
00083 "_201": {
00084 "id": "WS-CONVERTER-IRV-201",
00085 "level": "Warning",
00086 "name": "Document mime not supported (supported mimes: text/tsv, text/csv and text/xml)",
00087 "description": "Document mime not supported (supported mimes: text/tsv, text/csv and text/xml)"
00088 },
00089 "_300": {
00090 "id": "WS-CONVERTER-IRV-300",
00091 "level": "Warning",
00092 "name": "Parsing Errors",
00093 "description": "Parsing Errors"
00094 },
00095 "_301": {
00096 "id": "WS-CONVERTER-IRV-301",
00097 "level": "Warning",
00098 "name": "No TSV data converted",
00099 "description": "No TSV data converted"
00100 }
00101 }';
00102
00103
00122 function __construct($document = "", $docmime = "text/tsv", $delimiter = "\t",
00123 $base_uri = "http://www.baseuri.com/resource/", $registered_ip, $requester_ip)
00124 {
00125 parent::__construct();
00126
00127 $this->text = $document;
00128 $this->baseURI = $base_uri;
00129 $this->docmime = $docmime;
00130 $this->delimiter = $delimiter;
00131
00132 $this->requester_ip = $requester_ip;
00133
00134 if($registered_ip == "")
00135 {
00136 $this->registered_ip = $requester_ip;
00137 }
00138 else
00139 {
00140 $this->registered_ip = $registered_ip;
00141 }
00142
00143 if(strtolower(substr($this->registered_ip, 0, 4)) == "self")
00144 {
00145 $pos = strpos($this->registered_ip, "::");
00146
00147 if($pos !== FALSE)
00148 {
00149 $account = substr($this->registered_ip, $pos + 2, strlen($this->registered_ip) - ($pos + 2));
00150
00151 $this->registered_ip = $requester_ip . "::" . $account;
00152 }
00153 else
00154 {
00155 $this->registered_ip = $requester_ip;
00156 }
00157 }
00158
00159 $this->tsvResources = array();
00160
00161 $this->uri = $this->wsf_base_url . "/wsf/ws/converter/tsv/";
00162 $this->title = "TSV/CSV Converter Web Service";
00163 $this->crud_usage = new CrudUsage(FALSE, TRUE, FALSE, FALSE);
00164 $this->endpoint = $this->wsf_base_url . "/ws/converter/tsv/";
00165
00166 $this->dtdURL = "converter/bitsvbtex.dtd";
00167
00168 $this->errorMessenger = json_decode($this->errorMessenger);
00169 }
00170
00171 function __destruct()
00172 {
00173 parent::__destruct();
00174
00175 if(isset($this->db))
00176 {
00177 $this->db->close();
00178 }
00179 }
00180
00191 protected function validateQuery() { return; }
00192
00203 public function pipeline_getError() { return ($this->conneg->error); }
00204
00215 public function pipeline_getResultset()
00216 {
00217 if($this->docmime == "text/xml")
00218 {
00219 return ($this->text);
00220 }
00221 else
00222 {
00223 $xml = new ProcessorXML();
00224
00225 $resultset = $xml->createResultset();
00226
00227 foreach($this->tsvResources as $uri => $properties)
00228 {
00229 $subject = $xml->createSubject("http://www.w3.org/2002/07/owl#Thing", $this->baseURI . $this->uriEncode($uri));
00230
00231 foreach($properties as $propertyValue)
00232 {
00233 $propertyValue[1] = trim($propertyValue[1]);
00234
00235
00236 if(substr($propertyValue[0], 0, 1) == "{"
00237 && substr($propertyValue[0], strlen($propertyValue[0]) - 1, 1) == "}")
00238 {
00239 $property = $this->get_domain($this->baseURI) . "/ontology#" . $this->uriEncode($propertyValue[0]);
00240 $value = $this->baseURI . $this->uriEncode($propertyValue[1]);
00241
00242 $pred = $xml->createPredicate($property);
00243 $object = $xml->createObject("http://www.w3.org/2002/07/owl#Thing", $value);
00244
00245 $pred->appendChild($object);
00246 $subject->appendChild($pred);
00247 }
00248 else
00249 {
00250 $property = $this->get_domain($this->baseURI) . "/ontology#" . $this->uriEncode($propertyValue[0]);
00251 $value = $propertyValue[1];
00252
00253 $pred = $xml->createPredicate($property);
00254 $object = $xml->createObjectContent($this->xmlEncode($value));
00255
00256 $pred->appendChild($object);
00257 $subject->appendChild($pred);
00258 }
00259 }
00260
00261 $resultset->appendChild($subject);
00262 }
00263
00264 return ($this->injectDoctype($xml->saveXML($resultset)));
00265 }
00266 }
00267
00280 private function get_domain($url)
00281 {
00282 if(strlen($url) > 8)
00283 {
00284 $pos = strpos($url, "/", 8);
00285
00286 if($pos === FALSE)
00287 {
00288 return $url;
00289 }
00290 else
00291 {
00292 return substr($url, 0, $pos);
00293 }
00294 }
00295 else
00296 {
00297 return $url;
00298 }
00299 }
00300
00313 public function injectDoctype($xmlDoc)
00314 {
00315 $posHeader = strpos($xmlDoc, '"?>') + 3;
00316 $xmlDoc = substr($xmlDoc, 0, $posHeader)
00317 . "\n<!DOCTYPE resultset PUBLIC \"-//Bibliographic Knowledge Network//Converter TSV DTD 0.1//EN\" \""
00318 . $this->dtdBaseURL . $this->dtdURL . "\">" . substr($xmlDoc, $posHeader, strlen($xmlDoc) - $posHeader);
00319
00320 return ($xmlDoc);
00321 }
00322
00323
00342 public function ws_conneg($accept, $accept_charset, $accept_encoding, $accept_language)
00343 {
00344 $this->conneg =
00345 new Conneg($accept, $accept_charset, $accept_encoding, $accept_language, ConverterTsv::$supportedSerializations);
00346
00347
00348 if($this->text == "")
00349 {
00350 $this->conneg->setStatus(400);
00351 $this->conneg->setStatusMsg("Bad Request");
00352 $this->conneg->setStatusMsgExt($this->errorMessenger->_200->name);
00353 $this->conneg->setError($this->errorMessenger->_200->id, $this->errorMessenger->ws,
00354 $this->errorMessenger->_200->name, $this->errorMessenger->_200->description, "",
00355 $this->errorMessenger->_200->level);
00356 }
00357
00358 if($this->docmime != "text/csv" && $this->docmime != "text/tsv" && $this->docmime != "text/xml")
00359 {
00360 $this->conneg->setStatus(400);
00361 $this->conneg->setStatusMsg("Bad Request");
00362 $this->conneg->setStatusMsgExt($this->errorMessenger->_201->name);
00363 $this->conneg->setError($this->errorMessenger->_201->id, $this->errorMessenger->ws,
00364 $this->errorMessenger->_201->name, $this->errorMessenger->_201->description, "",
00365 $this->errorMessenger->_201->level);
00366 }
00367 }
00368
00387 public function pipeline_conneg($accept, $accept_charset, $accept_encoding, $accept_language)
00388 { $this->ws_conneg($accept, $accept_charset, $accept_encoding, $accept_language); }
00389
00400 public function pipeline_getResponseHeaderStatus() { return $this->conneg->getStatus(); }
00401
00412 public function pipeline_getResponseHeaderStatusMsg() { return $this->conneg->getStatusMsg(); }
00413
00426 public function pipeline_getResponseHeaderStatusMsgExt() { return $this->conneg->getStatusMsgExt(); }
00427
00438 public function pipeline_serialize()
00439 {
00440 $rdf_part = "";
00441
00442 switch($this->conneg->getMime())
00443 {
00444 case "text/tsv":
00445 case "text/csv":
00446 $tsv = "";
00447 $xml = new ProcessorXML();
00448 $xml->loadXML($this->pipeline_getResultset());
00449
00450 $subjects = $xml->getSubjects();
00451
00452 foreach($subjects as $subject)
00453 {
00454 $subjectURI = $xml->getURI($subject);
00455 $subjectType = $xml->getType($subject);
00456
00457 $tsv .= str_replace($this->delimiter, urlencode($this->delimiter), $subjectURI) . $this->delimiter
00458 . "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" . $this->delimiter
00459 . str_replace($this->delimiter, urlencode($this->delimiter), $subjectType) . "\n";
00460
00461 $predicates = $xml->getPredicates($subject);
00462
00463 foreach($predicates as $predicate)
00464 {
00465 $objects = $xml->getObjects($predicate);
00466
00467 foreach($objects as $object)
00468 {
00469 $objectType = $xml->getType($object);
00470 $predicateType = $xml->getType($predicate);
00471 $objectContent = $xml->getContent($object);
00472
00473 if($objectType == "rdfs:Literal")
00474 {
00475 $objectValue = $xml->getContent($object);
00476 $tsv .= str_replace($this->delimiter, urlencode($this->delimiter), $subjectURI) . $this->delimiter
00477 . str_replace($this->delimiter, urlencode($this->delimiter), $predicateType) . $this->delimiter
00478 . str_replace($this->delimiter, urlencode($this->delimiter), $objectValue) . "\n";
00479 }
00480 else
00481 {
00482 $objectURI = $xml->getURI($object);
00483 $tsv .= str_replace($this->delimiter, urlencode($this->delimiter), $subjectURI) . $this->delimiter
00484 . str_replace($this->delimiter, urlencode($this->delimiter), $predicateType) . $this->delimiter
00485 . str_replace($this->delimiter, urlencode($this->delimiter), $objectURI) . "\n";
00486 }
00487 }
00488 }
00489 }
00490
00491 return ($tsv);
00492 break;
00493
00494 case "application/rdf+n3":
00495 $xml = new ProcessorXML();
00496 $xml->loadXML($this->pipeline_getResultset());
00497
00498 $subjects = $xml->getSubjects();
00499
00500 foreach($subjects as $subject)
00501 {
00502 $subjectURI = $xml->getURI($subject);
00503 $subjectType = $xml->getType($subject);
00504
00505 $rdf_part .= "\n <$subjectURI> a <$subjectType> ;\n";
00506
00507 $predicates = $xml->getPredicates($subject);
00508
00509 foreach($predicates as $predicate)
00510 {
00511 $objects = $xml->getObjects($predicate);
00512
00513 foreach($objects as $object)
00514 {
00515 $objectType = $xml->getType($object);
00516 $predicateType = $xml->getType($predicate);
00517 $objectContent = $xml->getContent($object);
00518
00519 if($objectType == "rdfs:Literal")
00520 {
00521 $objectValue = $xml->getContent($object);
00522 $rdf_part .= " <$predicateType> \"\"\"" . str_replace(array( "\\" ), "\\\\", $objectValue)
00523 . "\"\"\" ;\n";
00524 }
00525 else
00526 {
00527 $objectURI = $xml->getURI($object);
00528 $rdf_part .= " <$predicateType> <$objectURI> ;\n";
00529 }
00530 }
00531 }
00532
00533 if(strlen($rdf_part) > 0)
00534 {
00535 $rdf_part = substr($rdf_part, 0, strlen($rdf_part) - 2) . ".\n";
00536 }
00537 }
00538
00539 return ($rdf_part);
00540 break;
00541
00542 case "application/rdf+xml":
00543 $xml = new ProcessorXML();
00544 $xml->loadXML($this->pipeline_getResultset());
00545
00546 $subjects = $xml->getSubjects();
00547
00548 $namespaces = array();
00549
00550 $nsId = 0;
00551
00552 foreach($subjects as $subject)
00553 {
00554 $subjectURI = $xml->getURI($subject);
00555 $subjectType = $xml->getType($subject);
00556
00557 $ns = $this->getNamespace($subjectType);
00558 $stNs = $ns[0];
00559 $stExtension = $ns[1];
00560
00561 if(!isset($namespaces[$stNs]))
00562 {
00563 $namespaces[$stNs] = "ns" . $nsId;
00564 $nsId++;
00565 }
00566
00567 $rdf_part .= "\n <" . $namespaces[$stNs] . ":" . $stExtension . " rdf:about=\"$subjectURI\">\n";
00568
00569 $predicates = $xml->getPredicates($subject);
00570
00571 foreach($predicates as $predicate)
00572 {
00573 $objects = $xml->getObjects($predicate);
00574
00575 foreach($objects as $object)
00576 {
00577 $objectType = $xml->getType($object);
00578 $predicateType = $xml->getType($predicate);
00579
00580 if($objectType == "rdfs:Literal")
00581 {
00582 $objectValue = $xml->getContent($object);
00583
00584 $ns = $this->getNamespace($predicateType);
00585 $ptNs = $ns[0];
00586 $ptExtension = $ns[1];
00587
00588 if(!isset($namespaces[$ptNs]))
00589 {
00590 $namespaces[$ptNs] = "ns" . $nsId;
00591 $nsId++;
00592 }
00593
00594 $rdf_part .= " <" . $namespaces[$ptNs] . ":" . $ptExtension . ">"
00595 . $this->xmlEncode($objectValue) . "</" . $namespaces[$ptNs] . ":" . $ptExtension . ">\n";
00596 }
00597 else
00598 {
00599 $objectURI = $xml->getURI($object);
00600
00601 $ns = $this->getNamespace($predicateType);
00602 $ptNs = $ns[0];
00603 $ptExtension = $ns[1];
00604
00605 if(!isset($namespaces[$ptNs]))
00606 {
00607 $namespaces[$ptNs] = "ns" . $nsId;
00608 $nsId++;
00609 }
00610
00611 $rdf_part .= " <" . $namespaces[$ptNs] . ":" . $ptExtension
00612 . " rdf:resource=\"$objectURI\" />\n";
00613 }
00614 }
00615 }
00616
00617 $rdf_part .= " </" . $namespaces[$stNs] . ":" . $stExtension . ">\n";
00618 }
00619
00620 $rdf_header =
00621 "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:wsf=\"http://purl.org/ontology/wsf#\"";
00622
00623 foreach($namespaces as $ns => $prefix)
00624 {
00625 $rdf_header .= " xmlns:$prefix=\"$ns\"";
00626 }
00627
00628 $rdf_header .= ">\n\n";
00629
00630 $rdf_part = $rdf_header . $rdf_part;
00631
00632 return ($rdf_part);
00633 break;
00634 }
00635 }
00636
00645 public function pipeline_serialize_reification() { return ""; }
00646
00657 public function ws_serialize()
00658 {
00659
00660 if($this->tsvParsingError() === TRUE)
00661 {
00662 $this->conneg->setStatus(400);
00663 $this->conneg->setStatusMsg("Bad Request");
00664 $this->conneg->setStatusMsgExt($this->errorMessenger->_300->name);
00665 $this->conneg->setError($this->errorMessenger->_300->id, $this->errorMessenger->ws,
00666 $this->errorMessenger->_300->name, $this->errorMessenger->_300->description, $this->errorMessages,
00667 $this->errorMessenger->_300->level);
00668
00669 return;
00670 }
00671 else
00672 {
00673 switch($this->conneg->getMime())
00674 {
00675 case "text/tsv":
00676 case "text/csv":
00677 return $this->pipeline_serialize();
00678 break;
00679
00680 case "application/rdf+n3":
00681 $rdf_document = "";
00682 $rdf_document .= "@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n";
00683 $rdf_document .= "@prefix wsf: <http://purl.org/ontology/wsf#> .\n";
00684
00685 $rdf_document .= $this->pipeline_serialize();
00686
00687 $rdf_document .= $this->pipeline_serialize_reification();
00688
00689 return $rdf_document;
00690 break;
00691
00692 case "application/rdf+xml":
00693 $rdf_document = "";
00694 $rdf_document .= "<?xml version=\"1.0\"?>\n";
00695
00696 $rdf_document .= $this->pipeline_serialize();
00697
00698 $rdf_document .= $this->pipeline_serialize_reification();
00699
00700 $rdf_document .= "</rdf:RDF>";
00701
00702 return $rdf_document;
00703 break;
00704
00705 case "text/xml":
00706 return $this->pipeline_getResultset();
00707 break;
00708 }
00709 }
00710 }
00711
00724 private function getNamespace($uri)
00725 {
00726 $pos = strpos($uri, "#");
00727
00728 if($pos !== FALSE)
00729 {
00730 return array (substr($uri, 0, $pos) . "#", substr($uri, $pos + 1, strlen($uri) - ($pos + 1)));
00731 }
00732 else
00733 {
00734 $pos = strrpos($uri, "/");
00735
00736 if($pos !== FALSE)
00737 {
00738 return array (substr($uri, 0, $pos) . "/", substr($uri, $pos + 1, strlen($uri) - ($pos + 1)));
00739 }
00740 }
00741
00742 return (FALSE);
00743 }
00744
00745
00758 private function uriEncode($uri)
00759 {
00760 $uri = preg_replace("|[^a-zA-z0-9]|", " ", $uri);
00761 $uri = preg_replace("/\s+/", " ", $uri);
00762 $uri = str_replace(" ", "_", $uri);
00763
00764 return ($uri);
00765 }
00766
00767
00780 public function ws_respond($content)
00781 {
00782
00783 $this->conneg->respond();
00784
00785
00786
00787
00788 if($this->conneg->getStatus() == 200)
00789 {
00790 echo $content;
00791 }
00792
00793 $this->__destruct();
00794 }
00795
00806 private function tsvParsingError() { return FALSE;
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908 }
00909
00918 public function process()
00919 {
00920 if($this->conneg->getStatus() == 200)
00921 {
00922 switch($this->docmime)
00923 {
00924 case "text/tsv":
00925 case "text/csv":
00926 $parser = new TsvParser($this->text, $this->delimiter);
00927
00928 $this->tsvResources = $parser->resources;
00929
00930 if(count($this->tsvResources) <= 0)
00931 {
00932 $this->conneg->setStatus(400);
00933 $this->conneg->setStatusMsg("Bad Request");
00934 $this->conneg->setStatusMsgExt($this->errorMessenger->_301->name);
00935 $this->conneg->setError($this->errorMessenger->_301->id, $this->errorMessenger->ws,
00936 $this->errorMessenger->_301->name, $this->errorMessenger->_301->description, "",
00937 $this->errorMessenger->_301->level);
00938 }
00939 break;
00940
00941 case "text/xml": break;
00942 }
00943 }
00944 }
00945 }
00946
00948
00949 ?>