Browse Source

updated get_ref_relationships to accomodate new namespaces

pull/155/head
Alan Stanley 12 years ago
parent
commit
1bb2f4805f
  1. 137
      api/fedora_item.inc

137
api/fedora_item.inc

@ -118,7 +118,7 @@ class Fedora_Item {
drupal_set_message(t('The datastream file %datastream_file could not be read! (likely due to permissions...)', array('%datastream_file' => $datastream_file)), 'warning'); drupal_set_message(t('The datastream file %datastream_file could not be read! (likely due to permissions...)', array('%datastream_file' => $datastream_file)), 'warning');
return; return;
} }
if (empty($datastream_mimetype)) { if (empty($datastream_mimetype)) {
// Get mime type from the file extension. // Get mime type from the file extension.
$mimetype_helper = new MimeClass(); $mimetype_helper = new MimeClass();
@ -158,7 +158,7 @@ class Fedora_Item {
// Fedora has some problems getting files from HTTPS connections sometimes, so if we are getting a file // Fedora has some problems getting files from HTTPS connections sometimes, so if we are getting a file
// from the local drupal, we try to pass a HTTP url instead of a HTTPS one. // from the local drupal, we try to pass a HTTP url instead of a HTTPS one.
if(stripos($datastream_url, 'https://') !== FALSE && stripos($datastream_url, $base_url) !== FALSE) { if (stripos($datastream_url, 'https://') !== FALSE && stripos($datastream_url, $base_url) !== FALSE) {
$datastream_url = str_ireplace('https://', 'http://', $datastream_url); $datastream_url = str_ireplace('https://', 'http://', $datastream_url);
} }
@ -255,7 +255,7 @@ class Fedora_Item {
if ($relsextxml === NULL) { if ($relsextxml === NULL) {
$relsextxml = new DOMDocument(); //Avoid new instantiations in long-running processes $relsextxml = new DOMDocument(); //Avoid new instantiations in long-running processes
} }
$ds_list = $this->get_datastreams_list_as_array(); $ds_list = $this->get_datastreams_list_as_array();
$f_prefix = 'info:fedora/'; $f_prefix = 'info:fedora/';
if (!array_key_exists('RELS-EXT', $ds_list)) { if (!array_key_exists('RELS-EXT', $ds_list)) {
@ -269,7 +269,7 @@ RDF;
} }
$relsext = $this->get_datastream_dissemination('RELS-EXT'); $relsext = $this->get_datastream_dissemination('RELS-EXT');
if ($literal_value == REL_TYPE_URI && strpos($object, $f_prefix) !== 0) { if ($literal_value == REL_TYPE_URI && strpos($object, $f_prefix) !== 0) {
$object = $f_prefix . $object; $object = $f_prefix . $object;
} }
@ -308,7 +308,7 @@ RDF;
} }
$description->appendChild($newrel); $description->appendChild($newrel);
return $this->modify_datastream($relsextxml->saveXML(), 'RELS-EXT', "Fedora Object-to-Object Relationship Metadata", 'application/rdf+xml'); return $this->modify_datastream($relsextxml->saveXML(), 'RELS-EXT', "Fedora Object-to-Object Relationship Metadata", 'application/rdf+xml');
//print ($description->dump_node()); //print ($description->dump_node());
/* /*
@ -341,37 +341,37 @@ RDF;
*/ */
function purge_relationships($relationship, $object, $namespaceURI = RELS_EXT_URI, $literal_value = FALSE) { function purge_relationships($relationship, $object, $namespaceURI = RELS_EXT_URI, $literal_value = FALSE) {
$relsext = $this->get_datastream_dissemination('RELS-EXT'); $relsext = $this->get_datastream_dissemination('RELS-EXT');
$relsextxml = new DomDocument(); $relsextxml = new DomDocument();
$relsextxml->loadXML($relsext); $relsextxml->loadXML($relsext);
$modified = FALSE; $modified = FALSE;
$rels = $relsextxml->getElementsByTagNameNS($namespaceURI, $relationship); $rels = $relsextxml->getElementsByTagNameNS($namespaceURI, $relationship);
if (!empty($rels)) { if (!empty($rels)) {
// iterate backwards so if we delete something our pointer doesn't get out of sync // iterate backwards so if we delete something our pointer doesn't get out of sync
for ($i = $rels->length; $i>0; $i--) { for ($i = $rels->length; $i > 0; $i--) {
$rel = $rels->item($i-1); $rel = $rels->item($i - 1);
// foreach ($rels as $rel) { // moving forward like this caused iteration errors when something was deleted // foreach ($rels as $rel) { // moving forward like this caused iteration errors when something was deleted
if ( //If either no object is specified, or the object matches (in either the literal or URI case), remove this node from it's parent, and mark as changed. if (//If either no object is specified, or the object matches (in either the literal or URI case), remove this node from it's parent, and mark as changed.
empty($object) || empty($object) ||
(($literal_value == RELS_TYPE_URI) && $rel->getAttributeNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'resource') == $object) || (($literal_value == RELS_TYPE_URI) && $rel->getAttributeNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'resource') == $object) ||
(($literal_value == RELS_TYPE_PLAIN_LITERAL) && $rel->textContent == $object) || (($literal_value == RELS_TYPE_PLAIN_LITERAL) && $rel->textContent == $object) ||
(($literal_value == RELS_TYPE_STRING) && $rel->getAttribute('rdf:datatype') == 'http://www.w3.org/2001/XMLSchema#string' && $rel->textContent == $object) || (($literal_value == RELS_TYPE_STRING) && $rel->getAttribute('rdf:datatype') == 'http://www.w3.org/2001/XMLSchema#string' && $rel->textContent == $object) ||
(($literal_value == RELS_TYPE_INT) && $rel->getAttribute('rdf:datatype') == 'http://www.w3.org/2001/XMLSchema#int' && intval($rel->textContent) == $object)) { (($literal_value == RELS_TYPE_INT) && $rel->getAttribute('rdf:datatype') == 'http://www.w3.org/2001/XMLSchema#int' && intval($rel->textContent) == $object)) {
$rel->parentNode->removeChild($rel); $rel->parentNode->removeChild($rel);
$modified = TRUE; $modified = TRUE;
} }
} }
} }
//Save changes. //Save changes.
if ($modified) { if ($modified) {
$this->modify_datastream($relsextxml->saveXML(), 'RELS-EXT', "Fedora Object-to-Object Relationship Metadata", 'text/xml'); $this->modify_datastream($relsextxml->saveXML(), 'RELS-EXT', "Fedora Object-to-Object Relationship Metadata", 'text/xml');
} }
//Return whether or not we've introduced any changes. //Return whether or not we've introduced any changes.
return $modified; return $modified;
} }
/** /**
* Removes the given relationship from the item's RELS-EXT and re-saves it. * Removes the given relationship from the item's RELS-EXT and re-saves it.
* *
@ -529,7 +529,7 @@ RDF;
'dsID' => $dsid, 'dsID' => $dsid,
'asOfDateTime' => $as_of_date_time, 'asOfDateTime' => $as_of_date_time,
); );
// Make soap call with quite // Make soap call with quite
$object = self::soap_call('getDataStreamDissemination', $params, $quiet); $object = self::soap_call('getDataStreamDissemination', $params, $quiet);
if (!empty($object)) { if (!empty($object)) {
@ -684,7 +684,7 @@ RDF;
if (!is_array($this->datastreams_list->datastreamDef)) { if (!is_array($this->datastreams_list->datastreamDef)) {
$xml_list = array($xml_list); $xml_list = array($xml_list);
} }
foreach ($xml_list as $ds) { foreach ($xml_list as $ds) {
if (!is_object($ds)) { if (!is_object($ds)) {
print_r($ds); print_r($ds);
@ -752,8 +752,26 @@ RDF;
return $relationships; return $relationships;
} }
function get_rdf_relationships() { /**
* Retrieves RELS-EXT values from item
*
* @param array $namespaces
* @return array
*/
function get_rdf_relationships($namespaces = null) {
if ($namespaces == NULL) {
$namespaces = array(
RELS_EXT_URI,
FEDORA_MODEL_URI,
ISLANDORA_PAGE_URI,
ISLANDORA_RELS_EXT_URI,
ISLANDORA_RELS_INT_URI,
);
}
if (!is_array($namespaces)) {
$namespaces = array($namespaces);
}
$relationships = array(); $relationships = array();
try { try {
$relsext = $this->get_datastream_dissemination('RELS-EXT'); $relsext = $this->get_datastream_dissemination('RELS-EXT');
@ -767,13 +785,16 @@ RDF;
$relsextxml->loadXML($relsext); $relsextxml->loadXML($relsext);
$relsextxml->normalizeDocument(); $relsextxml->normalizeDocument();
$allTags = array(); $allTags = array();
$allTags[] = $relsextxml->getElementsByTagNameNS(RELS_EXT_URI, '*'); foreach ($namespaces as $namespace) {
$allTags[] = $relsextxml->getElementsByTagNameNS(FEDORA_MODEL_URI, '*'); $allTags[] = $relsextxml->getElementsByTagNameNS($namespace, '*');
$allTags[] = $relsextxml->getElementsByTagNameNS(ISLANDORA_PAGE_URI, '*'); }
foreach ($allTags as $tags) { foreach ($allTags as $tags) {
foreach ($tags as $child) { foreach ($tags as $child) {
$value = preg_replace('/info:fedora\//','',$child->getAttributeNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'resource')); $value = preg_replace('/info:fedora\//', '', $child->getAttributeNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'resource'));
if (!$value) {
$value = $child->textContent;
}
$relationships[$child->tagName][] = $value; $relationships[$child->tagName][] = $value;
} }
} }
@ -980,9 +1001,9 @@ RDF;
$params = array( $params = array(
'pid' => $this->pid, 'pid' => $this->pid,
'ownerId' => (($ownerId !== NULL)? //Default to the current owner if none is provided. 'ownerId' => (($ownerId !== NULL) ? //Default to the current owner if none is provided.
$ownerId: $ownerId :
$this->objectProfile->objOwnerId), $this->objectProfile->objOwnerId),
'state' => $state, 'state' => $state,
'label' => $label, 'label' => $label,
'logMessage' => $logMessage 'logMessage' => $logMessage
@ -1016,32 +1037,32 @@ RDF;
$components = explode('/', $parsed_url['path']); $components = explode('/', $parsed_url['path']);
$components = array_map('rawurlencode', $components); $components = array_map('rawurlencode', $components);
$fixed_url = url( $fixed_url = url(
t( t(
'!scheme://!user:!pass@!host:!port/!path', '!scheme://!user:!pass@!host:!port/!path',
array( array(
'!scheme' => $parsed_url['scheme'], '!scheme' => $parsed_url['scheme'],
'!user' => rawurlencode($parsed_url['user']), '!user' => rawurlencode($parsed_url['user']),
'!pass' => rawurlencode($parsed_url['pass']), '!pass' => rawurlencode($parsed_url['pass']),
'!host' => $parsed_url['host'], '!host' => $parsed_url['host'],
'!port' => $parsed_url['port'], '!port' => $parsed_url['port'],
'!path' => implode('/', $components), '!path' => implode('/', $components),
) )
), ),
array( array(
'query' => $parsed_url['query'], 'query' => $parsed_url['query'],
'fragment' => $parsed_url['fragment'], 'fragment' => $parsed_url['fragment'],
) )
); );
$result = drupal_http_request($fixed_url); $result = drupal_http_request($fixed_url);
if ((int)($result->code / 100) === 2) { if ((int) ($result->code / 100) === 2) {
$content = $result->data; $content = $result->data;
} }
else { else {
watchdog('fedora_repository', 'Failed making HTTP request to @URL. Info: @info', array( watchdog('fedora_repository', 'Failed making HTTP request to @URL. Info: @info', array(
'@URL' => $fixed_url, '@URL' => $fixed_url,
'@info' => print_r($result, TRUE), '@info' => print_r($result, TRUE),
), 'warning'); ), 'warning');
} }
} }
@ -1091,7 +1112,7 @@ RDF;
$content = $filename_or_content; $content = $filename_or_content;
} }
} }
$toReturn = $this->modify_datastream_by_value($content, $dsid, $label, $mime_type, $force, $logMessage); $toReturn = $this->modify_datastream_by_value($content, $dsid, $label, $mime_type, $force, $logMessage);
} }
//Otherwise, write to web-accessible temp file and modify by reference. //Otherwise, write to web-accessible temp file and modify by reference.
@ -1099,7 +1120,7 @@ RDF;
$file = ''; $file = '';
$created_temp = FALSE; $created_temp = FALSE;
if (is_file($filename_or_content) && is_readable($filename_or_content)) { if (is_file($filename_or_content) && is_readable($filename_or_content)) {
$file = $filename_or_content; $file = $filename_or_content;
$original_path = $file; $original_path = $file;
// Temporarily move file to a web-accessible location. // Temporarily move file to a web-accessible location.
file_copy($file, file_directory_path()); file_copy($file, file_directory_path());
@ -1117,21 +1138,21 @@ RDF;
$file = file_save_data($filename_or_content, file_create_filename($label, file_directory_path())); $file = file_save_data($filename_or_content, file_create_filename($label, file_directory_path()));
$created_temp = TRUE; $created_temp = TRUE;
} }
$parts = explode(DIRECTORY_SEPARATOR, $file); $parts = explode(DIRECTORY_SEPARATOR, $file);
$parts = array_map('rawurlencode', $parts); $parts = array_map('rawurlencode', $parts);
$file_url = file_create_url(implode(DIRECTORY_SEPARATOR, $parts)); $file_url = file_create_url(implode(DIRECTORY_SEPARATOR, $parts));
$toReturn = $this->modify_datastream_by_reference($file_url, $dsid, $label, $mime_type, $force, $logMessage); $toReturn = $this->modify_datastream_by_reference($file_url, $dsid, $label, $mime_type, $force, $logMessage);
if ($created_temp && is_file($file) && is_writable($file)) { if ($created_temp && is_file($file) && is_writable($file)) {
file_delete($file); file_delete($file);
} }
} }
return $toReturn; return $toReturn;
} }
/** /**
* Modify datastream by reference * Modify datastream by reference
* @param type $external_url * @param type $external_url
@ -1148,10 +1169,10 @@ RDF;
// Fedora has some problems getting files from HTTPS connections sometimes, so if we are getting a file // Fedora has some problems getting files from HTTPS connections sometimes, so if we are getting a file
// from the local drupal, we try to pass a HTTP url instead of a HTTPS one. // from the local drupal, we try to pass a HTTP url instead of a HTTPS one.
if(stripos($external_url, 'https://') !== FALSE && stripos($external_url, $base_url) !== FALSE) { if (stripos($external_url, 'https://') !== FALSE && stripos($external_url, $base_url) !== FALSE) {
$external_url = str_ireplace('https://', 'http://', $external_url); $external_url = str_ireplace('https://', 'http://', $external_url);
} }
$params = array( $params = array(
'pid' => $this->pid, 'pid' => $this->pid,
'dsID' => $dsid, 'dsID' => $dsid,
@ -1228,10 +1249,10 @@ RDF;
self::$connection_helper = new ConnectionHelper(); self::$connection_helper = new ConnectionHelper();
} }
$url = ( $url = (
in_array($function, self::$SoapManagedFunctions)? in_array($function, self::$SoapManagedFunctions) ?
variable_get('fedora_soap_manage_url', 'http://localhost:8080/fedora/wsdl?api=API-M') : variable_get('fedora_soap_manage_url', 'http://localhost:8080/fedora/wsdl?api=API-M') :
variable_get('fedora_soap_url', 'http://localhost:8080/fedora/services/access?wsdl') variable_get('fedora_soap_url', 'http://localhost:8080/fedora/services/access?wsdl')
); );
try { try {
$soap_client = self::$connection_helper->getSoapClient($url); $soap_client = self::$connection_helper->getSoapClient($url);
if (isset($soap_client)) { if (isset($soap_client)) {

Loading…
Cancel
Save