include_once $serverRoot . '/classes/AgentManager.php'; include_once $serverRoot . '/classes/RdfUtility.php'; include_once $serverRoot . '/classes/UuidFactory.php'; // Find out what media types the client would like, in order. $accept = RdfUtility::parseHTTPAcceptHeader($_SERVER['HTTP_ACCEPT']); $force = array_key_exists("force", $_REQUEST) ? $_REQUEST["force"] : ""; $agentid = preg_replace('[^0-9]', '', array_key_exists("agentid", $_REQUEST) ? $_REQUEST["agentid"] : ""); $uuid = array_key_exists("uuid", $_REQUEST) ? $_REQUEST["uuid"] : ""; $findobjects = preg_replace('[^0-9]', '', array_key_exists("findobjects", $_REQUEST) ? $_REQUEST["findobjects"] : ""); $agent = new Agent(); $agentview = new AgentView(); if (strlen($agentid) > 0) { $agent->load($agentid); $agentview->setModel($agent); } elseif (strlen($uuid) > 0) { if (UuidFactory::is_valid($uuid)) { $agent->loadByGUID($uuid); $agentview->setModel($agent); } } $done = FALSE; if ($force == 'turtle') { deliverTurtle(); $done = TRUE; } if ($force == 'rdfxml') { deliverRdfXml(); $done = TRUE; } reset($accept); while (!$done && (list($key, $mediarange) = each($accept))) {
/** * Render the records as RDF in a rdf/xml serialization following the TDWG * DarwinCore RDF Guide. * * @return string containing rdf/xml serialization of selected dwc records. */ public function getAsRdfXml() { $debug = false; $newDoc = new DOMDocument('1.0', $this->charSetOut); $newDoc->formatOutput = true; $rootElem = $newDoc->createElement('rdf:RDF'); $rootElem->setAttribute('xmlns:rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); $rootElem->setAttribute('xmlns:rdfs', 'http://www.w3.org/2000/01/rdf-schema#'); $rootElem->setAttribute('xmlns:owl', 'http://www.w3.org/2002/07/owl#'); $rootElem->setAttribute('xmlns:foaf', 'http://xmlns.com/foaf/0.1/'); $rootElem->setAttribute('xmlns:dwc', 'http://rs.tdwg.org/dwc/terms/'); $rootElem->setAttribute('xmlns:dwciri', 'http://rs.tdwg.org/dwc/iri/'); $rootElem->setAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); $rootElem->setAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/'); $rootElem->setAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/'); $newDoc->appendChild($rootElem); $this->schemaType = 'dwc'; $arr = $this->getDwcArray(); $occurTermArr = $this->occurrenceFieldArr['terms']; foreach ($arr as $rownum => $dwcArray) { if ($debug) { print_r($dwcArray); } if (isset($dwcArray['occurrenceID']) || isset($dwcArray['catalogNumber']) && isset($dwcArray['collectionCode'])) { $occurrenceid = $dwcArray['occurrenceID']; if (UuidFactory::is_valid($occurrenceid)) { $occurrenceid = "urn:uuid:{$occurrenceid}"; } else { $catalogNumber = $dwcArray['catalogNumber']; if (strlen($occurrenceid) == 0 || $occurrenceid == $catalogNumber) { // If no occurrenceID is present, construct one with a urn:catalog: scheme. // Pathology may also exist of an occurrenceID equal to the catalog number, fix this. $institutionCode = $dwcArray['institutionCode']; $collectionCode = $dwcArray['collectionCode']; $occurrenceid = "urn:catalog:{$institutionCode}:{$collectionCode}:{$catalogNumber}"; } } $occElem = $newDoc->createElement('dwc:Occurrence'); $occElem->setAttribute("rdf:about", "{$occurrenceid}"); $sameAsElem = null; foreach ($dwcArray as $key => $value) { $flags = ENT_NOQUOTES; if (defined('ENT_XML1')) { $flags = ENT_NOQUOTES | ENT_XML1 | ENT_DISALLOWED; } $value = htmlentities($value, $flags, $this->charSetOut); // TODO: Figure out how to use mb_encode_numericentity() here. $value = str_replace("©", "©", $value); // workaround, need to fix © rendering if (strlen($value) > 0) { $elem = null; switch ($key) { case "recordId": case "occurrenceID": case "verbatimScientificName": // skip break; case "collectionID": // RDF Guide Section 2.3.3 owl:sameAs for urn:lsid and resolvable IRI. if (stripos("urn:uuid:", $value) === false && UuidFactory::is_valid($value)) { $lsid = "urn:uuid:{$value}"; } elseif (stripos("urn:lsid:biocol.org", $value) === 0) { $lsid = "http://biocol.org/{$value}"; $sameAsElem = $newDoc->createElement("rdf:Description"); $sameAsElem->setAttribute("rdf:about", "http://biocol.org/{$value}"); $sameAsElemC = $newDoc->createElement("owl:sameAs"); $sameAsElemC->setAttribute("rdf:resource", "{$value}"); $sameAsElem->appendChild($sameAsElemC); } else { $lsid = $value; } $elem = $newDoc->createElement("dwciri:inCollection"); $elem->setAttribute("rdf:resource", "{$lsid}"); break; case "basisOfRecord": if (preg_match("/(PreservedSpecimen|FossilSpecimen)/", $value) == 1) { $elem = $newDoc->createElement("rdf:type"); $elem->setAttribute("rdf:resource", "http://purl.org/dc/dcmitype/PhysicalObject"); } $elem = $newDoc->createElement("dwc:{$key}", $value); break; case "rights": // RDF Guide Section 3.3 dcterms:licence for IRI, xmpRights:UsageTerms for literal if (stripos("http://creativecommons.org/licenses/", $value) == 0) { $elem = $newDoc->createElement("dcterms:license"); $elem->setAttribute("rdf:resource", "{$value}"); } else { $elem = $newDoc->createElement("xmpRights:UsageTerms", $value); } break; case "rightsHolder": // RDF Guide Section 3.3 dcterms:rightsHolder for IRI, xmpRights:Owner for literal if (stripos("http://", $value) == 0 || stripos("urn:", $value) == 0) { $elem = $newDoc->createElement("dcterms:rightsHolder"); $elem->setAttribute("rdf:resource", "{$value}"); } else { $elem = $newDoc->createElement("xmpRights:Owner", $value); } break; case "modified": $elem = $newDoc->createElement("dcterms:{$key}", $value); break; case "day": case "month": case "year": if ($value != "0") { $elem = $newDoc->createElement("dwc:{$key}", $value); } break; case "eventDate": if ($value != "0000-00-00" || strlen($value) > 0) { $value = str_replace("-00", "", $value); $elem = $newDoc->createElement("dwc:{$key}", $value); } break; default: if (isset($occurTermArr[$key])) { $ns = RdfUtility::namespaceAbbrev($occurTermArr[$key]); $elem = $newDoc->createElement($ns); $elem->appendChild($newDoc->createTextNode($value)); } } if ($elem != null) { $occElem->appendChild($elem); } } } $node = $newDoc->importNode($occElem); $newDoc->documentElement->appendChild($node); if ($sameAsElem != null) { $node = $newDoc->importNode($sameAsElem); $newDoc->documentElement->appendChild($node); } // For many matching rows this is a point where partial serialization could occur // to prevent creation of a large DOM model in memmory. } } $returnvalue = $newDoc->saveXML(); return $returnvalue; }
public function setuuid($uuid) { if (!UuidFactory::is_valid(str_replace("urn:uuid:", "", $uuid))) { throw new Exception("Not a valid uuid [{$uuid}]."); } if (strlen($uuid) > Agent::UUID_SIZE) { throw new Exception('Value exceeds field length.'); } $this->uuid = $this->cleanInStr($uuid); $this->dirty = true; }