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 @@
-
+
+