diff --git a/ObjectDetails.inc b/ObjectDetails.inc index 96349868..38409615 100644 --- a/ObjectDetails.inc +++ b/ObjectDetails.inc @@ -1,5 +1,17 @@ array( @@ -29,11 +41,25 @@ function fedora_repository_islandora_object_details_display() { return $profiles; } +/** + * The renderer for the "hidden" display mode. In this mode, no data is + * displayed. This is supplied so you can disable the object details metadata + * display without disabling the tab entirely. + * @param item The item with the metadata to display. + * @return The fully composed object details metadata display. + */ function fedora_repository_object_details_hidden($item) { // do nothing return ""; } +/** + * The renderer for the "xslt" display mode. In this mode, an xslt is applied + * to the selected datastream to produce a user defined look and feel to the + * output data. + * @param item The item with the metadata to display. + * @return The fully composed object details metadata display. + */ function fedora_repository_object_details_XSLT($item) { global $base_url; $path = drupal_get_path('module', 'fedora_repository'); @@ -47,39 +73,48 @@ function fedora_repository_object_details_XSLT($item) { $xmlstr = $item->get_datastream_dissemination($dsid); if (empty($xmlstr)) { - return ''; + return t('Error - could not find datastream @dsid on object @pid
Please contact the site administrator.', + array('@dsid' => $dsid, '@pid' => $item->pid)); } try { $proc = new XsltProcessor(); } catch (Exception $e) { - drupal_set_message($e->getMessage(), 'error'); watchdog('fedora_repository', "Error while creating XSLT processor: @e", array('@e' => $e->getMessage()), WATCHDOG_ERROR); return; } $proc->setParameter('', 'baseUrl', $base_url); - $proc->setParameter('', 'path', $base_url . '/' . $path); + $proc->setParameter('', 'path', $path); $input = NULL; - - $xsl_file = './'. $path .'/'. variable_get('islandora_object_details_xslt_sheet', 'xsl/convertQDC.xsl'); + + $xsl_file = variable_get('islandora_object_details_xslt_sheet', 'sites/all/modules/islandora/object_details_xslts/convertQDC.xsl'); + // set an error message in case xslt parsing fails + $output = t("Failed to parse xslt file at @xsltFile", array('@xsltFile' => $xsl_file)); if (is_readable($xsl_file)) { - $xsl = new DOMDocument(); - $xsl->load($xsl_file); - $input = new DOMDocument(); - $input->loadXML(trim($xmlstr)); - $xsl = $proc->importStylesheet($xsl); - $newdom = $proc->transformToDoc($input); - $output = $newdom->saveHTML(); - return $output; - } - else { - watchdog('fedora_repository', 'The XSLT file @xslt_name is not readable.', array( - '@xslt_name' => $xsl_file, - )); + $xsl = new DomDocument(); + $input = new DomDocument(); + try { + $xsl->load($xsl_file); + + $input->loadXML(trim($xmlstr)); + } catch (Exception $e) { + watchdog('fedora_repository', "Problem loading XSL file: @e", array('@e' => $e->getMessage()), NULL, WATCHDOG_ERROR); + } + $xsl = $proc->importStylesheet($xsl); + $newdom = $proc->transformToDoc($input); + $output = $newdom->saveHTML(); } + return $output; } +/** + * The renderer for the "table" display mode. In this mode, the requested + * datastream is rendered using a simple table with keys(tags) on the left and + * values on the right. + * @param item The item with the metadata to display. + * @return The fully composed object details metadata display. + */ function fedora_repository_object_details_table($item) { global $base_url; $path = drupal_get_path('module', 'fedora_repository'); @@ -93,7 +128,8 @@ function fedora_repository_object_details_table($item) { $xmlstr = $item->get_datastream_dissemination($dsid); if (empty($xmlstr)) { - return ''; + return t('Error - could not find datastream @dsid on object @pid
Please contact the site administrator.', + array('@dsid' => $dsid, '@pid' => $item->pid)); } $simplexml = new SimpleXMLElement($xmlstr); @@ -123,7 +159,15 @@ function fedora_repository_object_details_table($item) { return theme('table', $headers, $rows, array('class' => 'dc-table')); } -// configuration pages +/** + * Configuration page for the xslt display mode. + * + * This mode requires two parameters: the datastream to render, and the xslt to + * apply to it. + * + * @return + * The configuration page. + */ function fedora_repository_object_details_XSLT_config() { $form = array(); $form['config'] = array( @@ -131,10 +175,14 @@ function fedora_repository_object_details_XSLT_config() { '#title' => t("XSLT display options"), ); + $options = module_invoke_all("object_details_get_available_xslts"); + $form['config']['xslt'] = array( - '#type' => 'textfield', + '#type' => 'select', '#title' => t("XSL transform to use"), - '#default_value' => variable_get('islandora_object_details_xslt_sheet', 'xsl/convertQDC.xsl'), + '#default_value' => variable_get('islandora_object_details_xslt_sheet', 'sites/all/modules/islandora/object_details_xslts/convertQDC.xsl'), + '#options' => $options, + '#key_type' => 'associative', '#required' => TRUE, ); $form['config']['dsid'] = array( @@ -151,7 +199,47 @@ function fedora_repository_object_details_XSLT_config() { return $form; } +/** + * Custom submit handler for the xslt configuration page. + * + * @param $form + * @param &$form_state + * The user supplied values for the form. + */ +function fedora_repository_object_details_XSLT_config_submit($form, &$form_state) { + variable_set('islandora_object_details_display_table', 'xslt'); + variable_set('islandora_object_details_xslt_sheet', $form_state['values']['xslt']); + variable_set('islandora_object_details_xslt_datastream', $form_state['values']['dsid']); + drupal_set_message('Object Details view has been set to XSLT and your configuration has been saved'); +} +/** + * Base function to supply the available xslt files. + * + * Modules implementing this hook need to return an array describing where the + * XSLT is. The array key is the path to the XSLT (paths start with sites/) and + * the value in the array is the display name. In the simplest form you can use + * file_scan_directory like we do here - this puts the filename as the display + * name and will automatically detect new files as they are added. + */ +function fedora_repository_object_details_get_available_xslts() { + $folder = drupal_get_path("module", "fedora_repository") ."/object_details_xslts/"; + // retrieve the filenames from the system + $xslts = file_scan_directory($folder, ".xsl"); + $options = array(); + foreach ($xslts as $xsl) { + $options[$xsl->filename] = $xsl->basename; + } + return $options; +} + +/** + * Configuration page for the table display mode. This mode requires only one + * parameter: the datastream to render. + * + * @return + * The configuration page. + */ function fedora_repository_object_details_table_config() { $form = array(); $form['config'] = array( @@ -174,11 +262,15 @@ function fedora_repository_object_details_table_config() { return $form; } -function fedora_repository_object_details_XSLT_config_submit($form, &$form_state) { - variable_set('islandora_object_details_xslt_sheet', $form_state['values']['xslt']); - variable_set('islandora_object_details_xslt_datastream', $form_state['values']['dsid']); -} - +/** + * Custom submit handler for the table configuration page. + * + * @param $form + * @param &$form_state + * The user supplied values for the form. + */ function fedora_repository_object_details_table_config_submit($form, &$form_state) { + variable_set('islandora_object_details_display_table', 'table'); variable_set('islandora_object_details_table_datastream', $form_state['values']['dsid']); + drupal_set_message('Object Details view has been set to Table and your configuration has been saved'); } diff --git a/ObjectHelper.inc b/ObjectHelper.inc index 564c451e..9e842c33 100644 --- a/ObjectHelper.inc +++ b/ObjectHelper.inc @@ -233,8 +233,8 @@ class ObjectHelper { elseif ((isset($user) && $user->uid != 0) || $forceSoap || isset($_SERVER['HTTPS'])) { //If not anonymous, soap is force or we're using HTTPS //Have the webserver mediate the transfer (download and restream) - if (($contentSize = self::getDatastreamSize($pid, $dsID, TRUE)) > 0) { - drupal_set_header("Content-Length: $contentSize"); + if (($contentSize = self::getDatastreamSize($pid, $dsID, TRUE)) > 0) { + drupal_set_header("Content-Length: $contentSize"); } $opts = array( @@ -624,30 +624,9 @@ class ObjectHelper { * */ function getStream($pid, $dsid, $showError = FALSE) { - module_load_include('inc', 'fedora_repository', 'ConnectionHelper'); - $soapHelper = new ConnectionHelper(); - try { - $client = $soapHelper->getSoapClient(variable_get('fedora_soap_url', 'http://localhost:8080/fedora/services/access?wsdl')); - $params = array( - 'pid' => "$pid", - 'dsID' => "$dsid", - 'asOfDateTime' => "" - ); - - if (!isset($client)) { - drupal_set_message(t('Error connection to Fedora using soap client.')); - return NULL; - } - $object = $client->__soapCall('getDatastreamDissemination', array('parameters' => $params)); - } catch (Exception $e) { - if ($showError) { - drupal_set_message(t('Error getting Datastream for %pid and %datastream
', array('%pid' => $pid, '%datastream' => $dsid)), 'error'); - } - return NULL; - } - $content = $object->dissemination->stream; - $content = trim($content); - return $content; + module_load_include('inc', 'fedora_repository', 'api/fedora_item'); + $item = new fedora_item($pid); + return $item->get_datastream_dissemination($dsid); } /** diff --git a/api/fedora_export.inc b/api/fedora_export.inc index f3c82160..32d7b49d 100644 --- a/api/fedora_export.inc +++ b/api/fedora_export.inc @@ -57,7 +57,6 @@ function export_objects_for_pid($pid, $dir, &$log) { $file = $dir . '/' . $ds->label . '.' . get_file_extension($ds->MIMEType); $paths[$ds->ID] = $file; - //$content = $ob_helper->getDatastreamDissemination($pid, $ds->ID); if ($content = $ob_helper->getStream($pid, $ds->ID, FALSE)) { if (!$fp = @fopen($file, 'w')) { $log[] = log_line(t("Failed to open file %file to write datastream %dsid for pid %pid", array('%file' => $file, '%dsid' => $ds->ID, '%pid' => $pid)), 'error'); diff --git a/api/fedora_item.inc b/api/fedora_item.inc index d9a1202d..d4c8aff0 100644 --- a/api/fedora_item.inc +++ b/api/fedora_item.inc @@ -10,9 +10,9 @@ define("ISLANDORA_PAGE_URI", 'info:islandora/islandora-system:def/pageinfo#'); define("ISLANDORA_RELS_EXT_URI", 'http://islandora.ca/ontology/relsext#'); define("ISLANDORA_RELS_INT_URI", "http://islandora.ca/ontology/relsint#"); -define("RELS_TYPE_URI", 0); -define("RELS_TYPE_PLAIN_LITERAL", 1); -define("RELS_TYPE_STRING", 2); +define("RELS_TYPE_URI", 0); +define("RELS_TYPE_PLAIN_LITERAL", 1); +define("RELS_TYPE_STRING", 2); define("RELS_TYPE_INT", 3); define("RELS_TYPE_DATETIME", 4); @@ -130,6 +130,7 @@ class Fedora_Item { $datastream_url = drupal_urlencode($datastream_file); $url = file_create_url($datastream_url); + // add_datastream_from_url forces a re-sync of the datastream list $return_value = $this->add_datastream_from_url($url, $datastream_id, $datastream_label, $datastream_mimetype, $controlGroup, $logMessage); if ($original_path != $datastream_file) { @@ -177,8 +178,10 @@ class Fedora_Item { 'logMessage' => ($logMessage != NULL) ? $logMessage : 'Ingested object ' . $datastream_id ); - - return $this->soap_call('addDataStream', $params); + $soap_result = $this->soap_call('addDataStream', $params); + // make sure to refresh the datastream list after adding so this item stays in sync with the repository + $this->datastreams = $this->get_datastreams_list_as_array(); + return $soap_result; } /** @@ -197,6 +200,7 @@ class Fedora_Item { $tmpfile = fopen($tmpfilename, 'w'); fwrite($tmpfile, $str, strlen($str)); fclose($tmpfile); + // add_datastream_from_file forces a re-sync of the datastream list $returnvalue = $this->add_datastream_from_file($tmpfilename, $datastream_id, $datastream_label, $datastream_mimetype, $controlGroup, $logMessage); unlink($tmpfilename); return $returnvalue; @@ -513,6 +517,10 @@ RDF; * @return null */ function get_datastream_dissemination($dsid, $as_of_date_time = "", $quiet=TRUE) { + if (!array_key_exists($dsid, $this->datastreams)) { + return NULL; + } + $params = array( 'pid' => $this->pid, 'dsID' => $dsid, @@ -538,6 +546,9 @@ RDF; * @return type */ function get_datastream($dsid, $as_of_date_time = '', $quiet = TRUE) { + if (!array_key_exists($dsid, $this->datastreams)) { + return NULL; + } $params = array( 'pid' => $this->pid, 'dsID' => $dsid, @@ -859,7 +870,10 @@ RDF; 'logMessage' => $log_message, 'force' => $force, ); - return $this->soap_call('purgeDatastream', $params); + $soap_result = $this->soap_call('purgeDatastream', $params); + // make sure to refresh the datastream list after adding so this item stays in sync with the repository + $this->datastreams = $this->get_datastreams_list_as_array(); + return $soap_result; } /** diff --git a/api/tuque.inc b/api/tuque.inc new file mode 100644 index 00000000..553c4fe6 --- /dev/null +++ b/api/tuque.inc @@ -0,0 +1,115 @@ +uid == 0){ + $user_string = 'anonymous'; + $pass_string = 'anonymous'; + } else { + $user_string = $user->name; + $pass_string = $user->pass; + } + + if (!isset($url)) { + $url = variable_get('islandora_base_url', 'http://localhost:8080/fedora'); + } + + if(self::exists()) { + $this->connection = new RepositoryConnection($url, $user_string, $pass_string); + $this->connection->reuseConnection = TRUE; + $this->api = new FedoraApi($this->connection); + $this->cache = new SimpleCache(); + $this->repository = new FedoraRepository($this->api, $this->cache); + } + } + + static function exists() { + return class_exists('RepositoryConnection'); + } + + static function getError() { + $islandora_doc_link = l(t('Islandora documentation'), 'https://wiki.duraspace.org/display/ISLANDORA/Islandora'); + $tuque_link = l(t('Tuque Fedora API'), 'http://github.com/islandora/tuque'); + $message = t('Islandora requires the !tuque_url. Please install in /sites/all/libraries/tuque before continuing. See the !islandora_url.', array( '!tuque_url' => $tuque_link, '!islandora_url' => $islandora_doc_link)); + drupal_set_message($message, 'error', FALSE); + } +} + +function islandora_object_load($object_id) { + static $islandora_tuque = NULL; + + if(!$islandora_tuque) { + $islandora_tuque = new IslandoraTuque(); + } + + if(IslandoraTuque::exists()) { + try { + $fedora_object = $islandora_tuque->repository->getObject($object_id); + } catch (Exception $e) { + return NULL; + } + return $fedora_object; + } + else { + IslandoraTuque::getError(); + return NULL; + } + } + + diff --git a/formClass.inc b/formClass.inc index c7d57843..06d840de 100644 --- a/formClass.inc +++ b/formClass.inc @@ -317,11 +317,19 @@ class formClass { $profiles = module_invoke_all("islandora_object_details_display"); $display_options = array(); - foreach ($profiles as $machine_name => $profile) { - $display_options[$machine_name] = $profile['name']; - $config_path = $profile['config']; - if (isset($config_path) && $config_path != ""){ - $display_options[$machine_name] .= " (". l("config", $config_path, array()) .")"; + // suppress php warnings from empty lists + if ($profiles) { + foreach ($profiles as $machine_name => $profile) { + // make sure the name exists (the bare minimum) + if (array_key_exists('name', $profile)) { + $display_options[$machine_name] = $profile['name']; + if (array_key_exists('config', $profile)) { + $config_path = $profile['config']; + if (isset($config_path) && $config_path != "") { + $display_options[$machine_name] .= " (". l("config", $config_path, array()) .")"; + } + } + } } } $form['tabs']['islandora_object_details_display_table'] = array( @@ -362,10 +370,10 @@ class formClass { '#description' => t('When enabled, restricts access to fedora object datastreams that are not listed in the Islandora Content Model for the object (unless the user is an administrator).'), ); - $form['advanced']['fedora_repository_use_imagecache_external_in_collection_view'] = array( - '#type' => 'checkbox', - '#title' => t('Allow imagecache_external use for thumbnails in collection view'), - '#default_value' => variable_get('fedora_repository_use_imagecache_external_in_collection_view', FALSE), + $form['advanced']['fedora_repository_use_imagecache_external_in_collection_view'] = array( + '#type' => 'checkbox', + '#title' => t('Allow imagecache_external use for thumbnails in collection view'), + '#default_value' => variable_get('fedora_repository_use_imagecache_external_in_collection_view', FALSE), '#description' => t('If enabled, the default collection list view (or ' . 'anywhere the function "@function" is used) will try to use ' . 'imagecache_external, defaulting to the "@preset" preset. XSLTs may ' . @@ -374,7 +382,7 @@ class formClass { '@function' => '_fedora_repository_render_image()', '@preset' => 'fedora_repository_collection_thumbnail', '@xsl' => 'sparql_to_html.xsl', - )), + )), ); $form['advanced']['fedora_collection_display_list'] = array( @@ -809,15 +817,12 @@ class formClass { * @return string */ function createQDCEditForm($pid, $dsid, $client, &$form_state) { + module_load_include('inc', 'fedora_repository', 'api/fedora_item'); $dsid = empty($dsid) ? 'QDC' : $dsid; - try { - $params = array('pid' => "$pid", 'dsID' => "$dsid", 'asOfDateTime' => ""); - $object = $client->__soapCall('getDatastreamDissemination', array('parameters' => $params)); - } catch (Exception $e) { - return array(); - } - $content = $object->dissemination->stream; - $content = trim($content); + + $item = new fedora_item($pid); + $content = trim($item->get_datastream_dissemination($dsid)); + $doc = new DOMDocument(); if (!$doc->loadXML($content)) { echo "error loading xml"; diff --git a/object_details_xslts/convertQDC.xsl b/object_details_xslts/convertQDC.xsl new file mode 100644 index 00000000..5d881e35 --- /dev/null +++ b/object_details_xslts/convertQDC.xsl @@ -0,0 +1,33 @@ + + + + + + + + + + +
+ + + + + + + + + + +

MetaData

+ +
+ = +
+
+
+ +
+ + +
\ No newline at end of file diff --git a/xsl/mods2html.xsl b/object_details_xslts/mods2html.xsl similarity index 94% rename from xsl/mods2html.xsl rename to object_details_xslts/mods2html.xsl index 194fcec2..3f794523 100644 --- a/xsl/mods2html.xsl +++ b/object_details_xslts/mods2html.xsl @@ -3,11 +3,36 @@ - + @@ -16,8 +41,8 @@ - + + @@ -38,7 +63,7 @@ - + : diff --git a/plugins/FedoraObjectDetailedContent.inc b/plugins/FedoraObjectDetailedContent.inc index c193c588..f1d7949b 100644 --- a/plugins/FedoraObjectDetailedContent.inc +++ b/plugins/FedoraObjectDetailedContent.inc @@ -65,7 +65,8 @@ class FedoraObjectDetailedContent { $dc_html = $details_function($this->item); } else { - // problem + // problem - display profile not found + watchdog('fedora_repository', "Error - could not find object details display function @function", array('@function' => $details_function), WATCHDOG_WARNING); } } diff --git a/xsl/sparql_to_html.xsl b/xsl/sparql_to_html.xsl index 0c9c5bcc..79cc438e 100644 --- a/xsl/sparql_to_html.xsl +++ b/xsl/sparql_to_html.xsl @@ -1,6 +1,7 @@ - + +