diff --git a/CollectionClass.inc b/CollectionClass.inc index 0e518b6d..e50ca224 100644 --- a/CollectionClass.inc +++ b/CollectionClass.inc @@ -2,10 +2,10 @@ /** * @file - * + * * Collection Class Class */ - + /** * This CLASS caches the streams so once you call a getstream once it will always return * the same stream as long as you are using the instance of this class. Cached to @@ -34,12 +34,12 @@ class CollectionClass { } public static function getCollectionQuery($pid) { - if ($query = self::getCollectionQueryFromStream($pid)) { - return $query; - } - else { - return self::getDefaultCollectionQuery($pid); + $query = self::getCollectionQueryFromStream($pid); + if (!$query) { + $query = self::getDefaultCollectionQuery($pid); } + drupal_alter("islandora_collection_query", $query, $pid); + return $query; } protected static function getCollectionQueryFromStream($pid) { @@ -684,17 +684,17 @@ class CollectionClass { * An array to be passed to drupal_render, containing a pager, an unordered * list of items, and another pager. */ - public static function assembleCollectionView($sparql_results) { - $per_page = 20; //XXX: Make this configurable. - $pager_name = 0; - $total = count($sparql_results); + public static function assembleCollectionView($sparql_results) { + $per_page = 20; //XXX: Make this configurable. + $pager_name = 0; + $total = count($sparql_results); $pager_page = self::hackPager($pager_name, $per_page, $total); - $max_title_length = 60; - - $results = array(); - foreach (array_slice($sparql_results, $per_page * $pager_page, $per_page) as $result) { + $max_title_length = 60; + + $results = array(); + foreach (array_slice($sparql_results, $per_page * $pager_page, $per_page) as $result) { $title = $result['title']; - $truncated_title = truncate_utf8($title, $max_title_length, TRUE, TRUE, 5); + $truncated_title = truncate_utf8($title, $max_title_length, TRUE, TRUE, 5); $obj_path = "fedora/repository/{$result['object']}"; //Get a thumbnail @@ -703,28 +703,28 @@ class CollectionClass { "$obj_path/TN"); $thumbnail = _fedora_repository_render_image($tn_path); - - $results[] = array( - 'data' => l($thumbnail, $obj_path, array( - 'html' => TRUE, - 'attributes' => array( - 'class' => 'results-image', - ), - )) . l($truncated_title, $obj_path, array('attributes' => array('class' => 'results-text'))), - ); - } - if (!$results) { - drupal_set_message(t("No objects in this collection (or bad query).")); - } - else { - $first = $per_page * $pager_page; - $last = (($total - $first) > $per_page)? - ($first + $per_page): - $total; - $results_range_text = t('Results @first to @last of @total', array( - '@first' => $first + 1, - '@last' => $last, - '@total' => $total, + + $results[] = array( + 'data' => l($thumbnail, $obj_path, array( + 'html' => TRUE, + 'attributes' => array( + 'class' => 'results-image', + ), + )) . l($truncated_title, $obj_path, array('attributes' => array('class' => 'results-text'))), + ); + } + if (!$results) { + drupal_set_message(t("No objects in this collection (or bad query).")); + } + else { + $first = $per_page * $pager_page; + $last = (($total - $first) > $per_page)? + ($first + $per_page): + $total; + $results_range_text = t('Results @first to @last of @total', array( + '@first' => $first + 1, + '@last' => $last, + '@total' => $total, )); return array( @@ -734,15 +734,15 @@ class CollectionClass { ), array( '#type' => 'markup', - '#value' => theme('item_list', $results, $result_range_text, 'ul', array( - 'class' => 'islandora-collection-results-list', + '#value' => theme('item_list', $results, $result_range_text, 'ul', array( + 'class' => 'islandora-collection-results-list', )) ), array( '#type' => 'markup', '#value' => theme('pager', array(), $per_page, $pager_name) ), - ); + ); } } diff --git a/ContentModel.inc b/ContentModel.inc index be362c70..52ebdf09 100644 --- a/ContentModel.inc +++ b/ContentModel.inc @@ -1,11 +1,11 @@ getAttribute('class'); - $methodName = ($method->getAttribute('method')); - if (!class_exists($className)) { - self::$errors[] = 'Execute Form Handler: class \'' . $className . '\' does not exist.'; - } - else { - $class = new $className($pid); - if (!method_exists($class, $methodName)) { - self::$errors[] = 'Execute Form Handler: method \'' . $className . '->' . $methodName . '\' does not exist.'; + + $file_extension = pathinfo($method->getAttribute('file'), PATHINFO_EXTENSION); + $file_path_without_extension = $method->getAttribute('file'); + /* Only in PHP. This is meant to avoid file path + * concatenation issues.*/ + $file_path_without_extension = substr($file_path_without_extension, 0, strlen($file_path_without_extension) - (strlen($file_extension) + 1)); + /* Only try to execute if the module is present, this is + * necessarybecause we go outside of the expected + * 'Drupal Way' and have dynamic dependencies.*/ + if (module_exists(!empty($module) ? $module : 'fedora_repository')) { + module_load_include($file_extension, !empty($module) ? $module : 'fedora_repository', $file_path_without_extension); + $className = $method->getAttribute('class'); + $methodName = ($method->getAttribute('method')); + if (!class_exists($className)) { + self::$errors[] = 'Execute Form Handler: class \'' . $className . '\' does not exist.'; } else { - $output = $class->$methodName($page_number); + $class = new $className($pid); + if (!method_exists($class, $methodName)) { + self::$errors[] = 'Execute Form Handler: method \'' . $className . '->' . $methodName . '\' does not exist.'; + } + else { + $output = $class->$methodName($page_number); + } } } } @@ -1527,8 +1538,8 @@ class ContentModel extends XMLDatastream { } /** - * Adds an allowed mimetype to the model. - * + * Adds an allowed mimetype to the model. + * * @param String $type * @return boolean $success */ @@ -1581,7 +1592,7 @@ class ContentModel extends XMLDatastream { /** * getDisplayMethods ?? * @param type $ds - * @return type + * @return type */ public function getDisplayMethods($ds) { $ret = FALSE; @@ -1603,7 +1614,7 @@ class ContentModel extends XMLDatastream { * addDs ?? * @param type $dsid * @param type $display_in_fieldset - * @return boolean + * @return boolean */ public function addDs($dsid, $display_in_fieldset = FALSE) { $ret = FALSE; @@ -1632,7 +1643,7 @@ class ContentModel extends XMLDatastream { /** * removeDs ?? * @param type $dsid - * @return boolean + * @return boolean */ public function removeDs($dsid) { $ret = FALSE; @@ -1648,7 +1659,7 @@ class ContentModel extends XMLDatastream { /** * displayInFieldset ?? * @param type $dsid - * @return type + * @return type */ public function displayInFieldset($dsid) { $ret = FALSE; @@ -1662,7 +1673,7 @@ class ContentModel extends XMLDatastream { * setDisplayInFieldset ?? * @param type $dsid * @param type $value - * @return boolean + * @return boolean */ public function setDisplayInFieldset($dsid, $value = TRUE) { $ret = FALSE; @@ -1686,7 +1697,7 @@ class ContentModel extends XMLDatastream { * @param type $file * @param type $class * @param type $method - * @return boolean + * @return boolean */ public function setDefaultDispMeth($dsid, $module, $file, $class, $method) { $ret = FALSE; @@ -1725,7 +1736,7 @@ class ContentModel extends XMLDatastream { * @param type $file * @param type $class * @param type $method - * @return boolean + * @return boolean */ public function removeDispMeth($dsid, $module, $file, $class, $method) { $ret = FALSE; @@ -1757,7 +1768,7 @@ class ContentModel extends XMLDatastream { * @param type $class * @param type $method * @param type $default - * @return boolean + * @return boolean */ public function addDispMeth($dsid, $module, $file, $class, $method, $default = FALSE) { $ret = FALSE; @@ -1779,7 +1790,7 @@ class ContentModel extends XMLDatastream { /** * getAddDsMethod ?? * @param type $ds - * @return type + * @return type */ public function getAddDsMethod($ds) { $ret = FALSE; @@ -1801,7 +1812,7 @@ class ContentModel extends XMLDatastream { /** * getIngestRule ?? * @param type $rule_id - * @return type + * @return type */ public function getIngestRule($rule_id) { $ret = FALSE; @@ -1817,7 +1828,7 @@ class ContentModel extends XMLDatastream { * removeAppliesTo ?? * @param type $rule_id * @param type $type - * @return boolean + * @return boolean */ public function removeAppliesTo($rule_id, $type) { $ret = FALSE; @@ -1842,7 +1853,7 @@ class ContentModel extends XMLDatastream { * addAppliesTo ?? * @param type $rule_id * @param type $type - * @return boolean + * @return boolean */ public function addAppliesTo($rule_id, $type) { $ret = FALSE; @@ -1871,7 +1882,7 @@ class ContentModel extends XMLDatastream { * @param type $method * @param type $dsid * @param type $modified_files_ext - * @return boolean + * @return boolean */ public function addIngestMethod($rule_id, $module, $file, $class, $method, $dsid, $modified_files_ext) { $ret = FALSE; @@ -1898,7 +1909,7 @@ class ContentModel extends XMLDatastream { * @param type $file * @param type $class * @param type $method - * @return boolean + * @return boolean */ public function removeIngestMethod($rule_id, $module, $file, $class, $method) { $ret = FALSE; @@ -1929,7 +1940,7 @@ class ContentModel extends XMLDatastream { * @param type $method * @param type $name * @param type $value - * @return boolean + * @return boolean */ public function addIngestMethodParam($rule_id, $module, $file, $class, $method, $name, $value) { $ret = FALSE; @@ -1981,7 +1992,7 @@ class ContentModel extends XMLDatastream { * @param type $class * @param type $method * @param type $name - * @return boolean + * @return boolean */ public function removeIngestMethodParam($rule_id, $module, $file, $class, $method, $name) { $ret = FALSE; @@ -2024,7 +2035,7 @@ class ContentModel extends XMLDatastream { /** * removeIngestRule ?? * @param type $rule_id - * @return type + * @return type */ public function removeIngestRule($rule_id) { $ret = FALSE; @@ -2043,7 +2054,7 @@ class ContentModel extends XMLDatastream { * @param type $method * @param type $dsid * @param type $modified_files_ext - * @return type + * @return type */ public function addIngestRule($applies_to, $module, $file, $class, $method, $dsid, $modified_files_ext) { $ret = FALSE; @@ -2061,7 +2072,7 @@ class ContentModel extends XMLDatastream { /** * getIngestRules ?? - * @return type + * @return type */ public function getIngestRules() { $ret = FALSE; @@ -2105,7 +2116,7 @@ class ContentModel extends XMLDatastream { /** * getIngestFormAttributes ?? - * @return type + * @return type */ public function getIngestFormAttributes() { $ret = FALSE; @@ -2125,7 +2136,7 @@ class ContentModel extends XMLDatastream { * @param type $page * @param type $hide_file_chooser * @param type $redirect - * @return boolean + * @return boolean */ public function editIngestFormAttributes($dsid, $page, $hide_file_chooser = FALSE, $redirect = TRUE) { $ret = FALSE; @@ -2152,7 +2163,7 @@ class ContentModel extends XMLDatastream { /** * getIngestFormBuilderMethod - * @return type + * @return type */ public function getIngestFormBuilderMethod() { $ret = FALSE; @@ -2174,7 +2185,7 @@ class ContentModel extends XMLDatastream { * @param type $class * @param type $method * @param type $handler - * @return boolean + * @return boolean */ public function editIngestFormBuilderMethod($module, $file, $class, $method, $handler) { $ret = FALSE; @@ -2192,7 +2203,7 @@ class ContentModel extends XMLDatastream { /** * Find the form element with name $name. - * + * * @param string $name * The name of the form element to find. * @return DOMElement @@ -2263,7 +2274,7 @@ class ContentModel extends XMLDatastream { * * @param string $name * Name of the form to remove. - * + * * @return boolean * TRUE on success, FALSE otherwise. */ diff --git a/MimeClass.inc b/MimeClass.inc index b2950f6e..dacde76c 100644 --- a/MimeClass.inc +++ b/MimeClass.inc @@ -133,6 +133,7 @@ class MimeClass { 'xht' => 'application/xhtml+xml', 'xhtml' => 'application/xhtml+xml', 'xsl' => 'text/xml', + 'xslt' => 'text/xml', 'xml' => 'text/xml', 'csv' => 'text/csv', 'tsv' => 'text/tab-separated-values', diff --git a/ObjectHelper.inc b/ObjectHelper.inc index d34e64c3..408b2604 100644 --- a/ObjectHelper.inc +++ b/ObjectHelper.inc @@ -137,9 +137,6 @@ class ObjectHelper { $fedoraPass = $user->pass; } - $dataStreamInfo = $item->get_datastream_info($dsID); - $contentSize = $dataStreamInfo->datastream->size; - if (function_exists("curl_init")) { $url = variable_get('fedora_base_url', 'http://localhost:8080/fedora') . '/objects/' . $pid . '/datastreams/' . $dsID . '/content'; $query_options = array(); diff --git a/api/fedora_item.inc b/api/fedora_item.inc index d4c8aff0..92c06c3f 100644 --- a/api/fedora_item.inc +++ b/api/fedora_item.inc @@ -347,7 +347,10 @@ RDF; $modified = FALSE; $rels = $relsextxml->getElementsByTagNameNS($namespaceURI, $relationship); if (!empty($rels)) { - foreach ($rels as $rel) { + // iterate backwards so if we delete something our pointer doesn't get out of sync + for ($i = $rels->length; $i>0; $i--) { + $rel = $rels->item($i-1); +// 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. empty($object) || (($literal_value == RELS_TYPE_URI) && $rel->getAttributeNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'resource') == $object) || @@ -986,6 +989,54 @@ RDF; return self::soap_call('modifyObject', $params, $quiet); } + /** + * Work around function, due to file_create_url not URL encoding stuff. + * + * Parses and reassembles the URL, exploding, rawurlencoding and imploding + * the path components along the way. + * + * @param $url + * A string containing an HTTP(S) URL to attempt. + * @return string + * The results of the HTTP request if successful; boolean FALSE otherwise. + */ + protected static function try_http_get_content($url) { + //Can throw a warning prior to 5.3.3 + $parsed_url = @parse_url($url); + $supported_schemes = array( + 'http', + 'https' + ); + + $content = FALSE; + + if ($parsed_url && array_key_exists('scheme', $parsed_url) && in_array($parsed_url['scheme'], $supported_schemes)) { + $components = explode('/', $parsed_url['path']); + $components = array_map('rawurlencode', $components); + $result = drupal_http_request( + url( + t('!scheme://!user:!pass@!host:!port/!path', array( + '!scheme' => $parsed_url['scheme'], + '!user' => rawurlencode($parsed_url['user']), + '!pass' => rawurlencode($parsed_url['pass']), + '!host' => $parsed_url['host'], + '!path' => implode('/', $components), + )), + array( + 'query' => $parsed_url['query'], + 'fragment' => $parsed_url['fragment'], + ) + ) + ); + + if ((int)($result->code / 100) === 2) { + $content = $result->data; + } + } + + return $content; + } + /** * Wrap modify by value and reference * @@ -1011,7 +1062,7 @@ RDF; */ function modify_datastream($filename_or_content, $dsid, $label, $mime_type, $force = FALSE, $logMessage='Modified by Islandora API', $quiet=FALSE) { $toReturn = NULL; - + //Determine if it's inline xml; if it is, modify by value if ($this->get_datastream($dsid)->controlGroup === 'X') { $content = ''; @@ -1019,7 +1070,15 @@ RDF; $content = file_get_contents($filename_or_content); } else { - $content = $filename_or_content; + //XXX: Get the contents to deal with fopen not being allowed for remote access + // in some OSs + $temp_content = self::try_http_get_content($filename_or_content); + if ($temp_content !== FALSE) { + $content = $temp_content; + } + else { + $content = $filename_or_content; + } } $toReturn = $this->modify_datastream_by_value($content, $dsid, $label, $mime_type, $force, $logMessage); @@ -1036,8 +1095,15 @@ RDF; $created_temp = ($original_path != $file); } else { + //XXX: Get the contents to deal with fopen not being allowed for remote access + // in some OSs + $temp_content = self::try_http_get_content($filename_or_content); + if ($temp_content !== FALSE) { + $filename_or_content = $temp_content; + } + //Push contents to a web-accessible file - $file = file_save_data($filename_or_content, file_directory_path()); + $file = file_save_data($filename_or_content, file_create_filename($label, file_directory_path())); $created_temp = TRUE; } diff --git a/plugins/FedoraObjectDetailedContent.inc b/plugins/FedoraObjectDetailedContent.inc index f1d7949b..593a42a2 100644 --- a/plugins/FedoraObjectDetailedContent.inc +++ b/plugins/FedoraObjectDetailedContent.inc @@ -55,14 +55,14 @@ class FedoraObjectDetailedContent { if (!isset($profile)) { // default behaviour watchdog('fedora_repository', "Error while reading the default object details display profile: @e", array("@e" => $e->getMessage()), WATCHDOG_WARNING); - $dc_html = $objectHelper->getFormattedDC($this->item); + $dc_returned = $objectHelper->getFormattedDC($this->item); } else { // invoke the requested display profile require_once(drupal_get_path('module', $profile['module']) ."/". $profile['file']); $details_function = $profile['function']; if (function_exists($details_function)) { - $dc_html = $details_function($this->item); + $dc_returned = $details_function($this->item); } else { // problem - display profile not found @@ -70,16 +70,31 @@ class FedoraObjectDetailedContent { } } + $dc_array = array(); $i = 0; - if (fedora_repository_access(OBJECTHELPER :: $VIEW_DETAILED_CONTENT_LIST, $this->pid, $user)) { - $tabset['fedora_object_details']['tabset']['view'] = array( - '#type' => 'tabpage', - '#title' => t('View'), - 'dc' => array( - '#type' => 'markup', - '#value' => $dc_html, //XXX: This could easily be done in Drupal, instead of using an XSL - '#weight' => $i++ - ), + if (is_array($dc_returned)) { + $dc_array = $dc_returned; + $dc_array['#weight'] = $i++; + } + elseif (!empty($dc_returned)) { + $dc_array = array( + '#type' => 'markup', + '#value' => $dc_returned, //XXX: This could easily be done in Drupal, instead of using an XSL + '#weight' => $i++ + ); + } + + $tabset['fedora_object_details']['tabset']['view'] = array( + '#type' => 'tabpage', + '#title' => t('View'), + ); + + if (!empty($dc_array)) { + $tabset['fedora_object_details']['tabset']['view']['dc'] = $dc_array; + } + + if (fedora_repository_access(ObjectHelper :: $VIEW_DETAILED_CONTENT_LIST, $this->pid, $user)) { + $tabset['fedora_object_details']['tabset']['view'] += array( 'list' => array( '#type' => 'fieldset', '#title' => t('Detailed List of Content'), @@ -100,6 +115,11 @@ class FedoraObjectDetailedContent { '#weight' => $i++, ), ), + ); + } + + if (fedora_repository_access(ObjectHelper :: $PURGE_FEDORA_OBJECTSANDSTREAMS, $this->pid, $user)) { + $tabset['fedora_object_details']['tabset']['view'] += array( 'purge' => array( '#type' => 'markup', '#value' => $purge_form, @@ -119,7 +139,8 @@ class FedoraObjectDetailedContent { } $ts = $tabset['fedora_object_details']['tabset']; - if (array_key_exists('view', $ts) || array_key_exists('edit', $ts)) { + if ((array_key_exists('view', $ts) && (count(element_children($ts['view'])) > 0)) || + (array_key_exists('edit', $ts) && (count(element_children($ts['edit'])) > 0 || array_key_exists('#content', $ts['edit'])))) { return $tabset; } else {