fedoraUser = $connectionHelper->getUser(); //$this->fedoraPass = $connectionHelper->getPassword(); } /** * Grabs a stream from fedora sets the mimetype and returns it. $dsID is the * datastream id. If $forceSoap is set, the function will always buffer the datastream from fedora. Otherwise, it will * try and use a redirect if possible. * @param $pid String * @param $dsID String */ function makeObject($pid, $dsID, $asAttachment = FALSE, $label = NULL, $filePath=FALSE, $version=NULL, $forceSoap = FALSE) { global $user; module_load_include('inc','fedora_repository','ContentModel'); if ($pid == NULL || $dsID == NULL) { drupal_set_message(t("no pid or dsid given to create an object with"), 'error'); return ' '; } $headers = module_invoke_all('file_download', "/fedora/repository/$pid/$dsID"); if (in_array(-1, $headers)) { drupal_set_message('hello'); drupal_access_denied(); return ' '; } if (!fedora_repository_access(OBJECTHELPER :: $OBJECT_HELPER_VIEW_FEDORA, $pid, $user)) { drupal_set_message(t("You do not have access Fedora objects within the attempted namespace."), 'error'); drupal_access_denied(); return ' '; } if (($cm = ContentModel::loadFromObject($pid)) == FALSE) { drupal_set_message(t("You do not have access to objects without an Islandora Content Model."), 'error'); drupal_access_denied(); return ' '; } $cmDatastreams = $cm->listDatastreams(); if ( !((isset($user) && in_array('administrator',$user->roles)) || in_array($dsID,$cmDatastreams))) { drupal_set_message(t("You do not have access to the specified datastream."), 'error'); drupal_access_denied(); return ' '; } module_load_include('inc', 'fedora_repository', 'api/fedora_item'); $item = new Fedora_Item($pid); if (isset($item->datastreams[$dsID])) { $mimeType=$item->datastreams[$dsID]['MIMEType']; if ($label == NULL) { $label = $item->datastreams[$dsID]['label']; } } else { drupal_not_found(); exit(); } if ((!isset($user)) || $user->uid == 0) { $fedoraUser = 'anonymous'; $fedoraPass = 'anonymous'; $contentSize= 0; } else { $fedoraUser = $user->name; $fedoraPass = $user->pass; $dataStreamInfo = $item->get_datastream_info($dsID); $contentSize = $dataStreamInfo->datastream->size; } if (function_exists("curl_init")) { if (!isset($mimeType)) { $pid = variable_get('fedora_default_display_pid', 'demo:10'); $dsID = variable_get('fedora_default_display_dsid', 'TN'); $mimeType = 'image/jpeg'; } $url = variable_get('fedora_base_url', 'http://localhost:8080/fedora') . '/get/' . $pid . '/' . $dsID; if ($version) { $url .= '/' . $version; //drupal_urlencode($version); } $ch = curl_init(); $user_agent = "Mozilla/4.0 pp(compatible; MSIE 5.01; Windows NT 5.0)"; curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_FAILONERROR, 1); // Fail on errors curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects //curl_setopt($ch, CURLOPT_TIMEOUT, 15); // times out after 15s curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERPWD, "$fedoraUser:$fedoraPass"); // There seems to be a bug in Fedora 3.1's REST authentication, removing this line fixes the authorization denied error. // curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); // return into a variable curl_setopt($ch, CURLOPT_URL, $url); if ($filePath !== FALSE) { $fp = fopen($filePath, 'w'); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_exec($ch); fclose($fp); } else { header("Content-type: $mimeType"); if ($contentSize > 0) { header("Content-length: $contentSize"); } if ($asAttachment) { $suggestedFileName = "$label"; $pos = strpos($suggestedFileName, '.'); /** * Here we used to take an object of, say, type application/pdf with label, say, "My Document" * and we assemble the output filename extension based on the post-slash portion of the mimetype. * (If the label has a period anywhere in it, we leave it alone.) * * This is great for simple mimetypes like application/pdf, text/html, image/jpeg, etc. * but it's terrible for, say, application/vnd.oasis.opendocument.text (.odt). * * Instead we'll use the get_extension function in MimeClass.inc to discover a valid extension * for the mimetype in question. */ if ($pos === FALSE) { module_load_include('inc', 'fedora_repository', 'MimeClass'); $mimeclass = new MimeClass(); $ext = $mimeclass->get_extension($mimeType); $suggestedFileName = "$label.$ext"; } header('Content-Disposition: attachment; filename="' . $suggestedFileName . '"'); } if ( (isset($user) && $user->uid != 0) || $forceSoap || isset($_SERVER['HTTPS'])) { curl_exec($ch); } else { header('Location: '.$url); } } curl_close($ch); } else { drupal_set_message(t('No curl support.'), 'error'); } } //Gets collection objects t function getCollectionInfo($pid, $query = NULL) { module_load_include('inc', 'fedora_repository', 'CollectionClass'); $collectionClass = new CollectionClass(); $results = $collectionClass->getRelatedItems($pid, $query); return $results; } /** * returns the mime type */ function getMimeType($pid, $dsID) { global $user; if (empty($pid) || empty($dsID)) { drupal_set_message(t('You must specify an object pid and datastream ID.'), 'error'); return ''; } if (!fedora_repository_access(ObjectHelper :: $OBJECT_HELPER_VIEW_FEDORA, $pid, $user)) { drupal_set_message(t('You do not have the appropriate permissions'), 'error'); return; } module_load_include('inc', 'fedora_repository', 'api/fedora_item'); $item = new fedora_item($pid); $datastream_list = $item->get_datastreams_list_as_SimpleXML(); if (!isset($datastream_list)) { //drupal_set_message( t("No datastreams available."), 'status' ); return ' '; } foreach ($datastream_list as $datastream) { foreach ($datastream as $datastreamValue) { if ($datastreamValue->ID == $dsID) { return $datastreamValue->MIMEType; } } } return ''; } function getDatastreamInfo($pid, $dsID) { global $user; if (empty($pid) || empty($dsID)) { drupal_set_message(t('You must specify an object pid and datastream ID.'), 'error'); return ''; } if (!fedora_repository_access(ObjectHelper :: $OBJECT_HELPER_VIEW_FEDORA, $pid, $user)) { drupal_set_message(t('You do not have the appropriate permissions'), 'error'); return; } module_load_include('inc', 'fedora_repository', 'api/fedora_item'); $item = new fedora_item($pid); $datastream_list = $item->get_datastreams_list_as_SimpleXML(); if (!isset($datastream_list)) { //drupal_set_message( t("No datastreams available."), 'status' ); return ' '; } foreach ($datastream_list as $datastream) { foreach ($datastream as $datastreamValue) { if ($datastreamValue->ID == $dsID) { return $datastreamValue; } } } return ''; } /** * internal function * @param $pid String * @param $dataStreamValue Object */ function create_link_for_ds($pid, $dataStreamValue) { global $base_url; $path = drupal_get_path('module', 'fedora_repository'); require_once($path . '/api/fedora_item.inc'); $item = new Fedora_Item($pid); if (user_access(ObjectHelper :: $PURGE_FEDORA_OBJECTSANDSTREAMS)) { $allow=TRUE; if (module_exists('fedora_fesl')) { $allow= fedora_fesl_check_roles($pid,'write'); } if ($allow) { $purgeImage = 'purge datastream'; } } else { $purgeImage = ' '; } $fullPath = base_path() . $path; // Add an icon to replace a datastream // @TODO Note: using l(theme_image(..), ...); for these image links (and other links) may remove the need to have clean urls enabled. $replaceImage= ' '; if (user_access(ObjectHelper :: $ADD_FEDORA_STREAMS)) { $allow=TRUE; if (module_exists('fedora_fesl')) { $allow= fedora_fesl_check_roles($pid,'write'); } if ($allow) { $replaceImage = 'label . '" href="' . $base_url . '/fedora/repository/replaceStream/' . $pid . '/' . $dataStreamValue->ID . '/' . $dataStreamValue->label . '">replace datastream'; } } $content = ''; $id = $dataStreamValue->ID; $label = $dataStreamValue->label; $label = str_replace("_", " ", $label); $mimeType = $dataStreamValue->MIMEType; $view = '' . t('View') . ''; $action = "$base_url/fedora/repository/object_download/" . drupal_urlencode($pid) . '/' . $id . '/' . drupal_urlencode(preg_replace('/\//i', '${1}_', $label)); // Necessary to handle the case of Datastream labels that contain slashes. Ugh. $downloadVersion = '
'; if (user_access(ObjectHelper :: $EDIT_FEDORA_METADATA)) { $versions = $item->get_datastream_history($id); if (is_array($versions)) { $downloadVersion = '
'; $downloadVersion .= '
'; } } $content .= "$label $view $downloadVersion $mimeType $replaceImage $purgeImage\n"; //$content .= "Mime Type :$mimeType\n"; return $content; } /** * Queries fedora for what we call the qualified dublin core. Currently only dc.coverage has * any qualified fields * Transforms the returned xml to html * This is the default metadata view. With icons for searching a dublin core field * @param $pid String * @return String */ function getQDC($pid) { global $base_url; $path = drupal_get_path('module', 'fedora_repository'); module_load_include('inc', 'fedora_repository', 'ConnectionHelper'); $soapHelper = new ConnectionHelper(); $client = $soapHelper->getSoapClient(variable_get('fedora_soap_url', 'http://localhost:8080/fedora/services/access?wsdl')); $dsId = 'QDC'; $params = array( 'pid' => "$pid", 'dsID' => "$dsId", 'asOfDateTime' => "" ); try { $object = $client->__soapCAll('getDatastreamDissemination', array( 'parameters' => $params )); } catch (Exception $e) { try { //probably no QDC so we will try for the DC stream. $dsId = 'DC'; $params = array( 'pid' => "$pid", 'dsID' => "$dsId", 'asOfDateTime' => "" ); $object = $client->__soapCAll('getDatastreamDissemination', array( 'parameters' => $params )); } catch (exception $e2) { drupal_set_message($e2->getMessage(), 'error'); return; } } $xmlstr = $object->dissemination->stream; try { $proc = new XsltProcessor(); } catch (Exception $e) { drupal_set_message($e->getMessage(), 'error'); return; } $proc->setParameter('', 'baseUrl', $base_url); $proc->setParameter('', 'path', $base_url . '/' . $path); $input = NULL; $xsl = new DomDocument(); try { $xsl->load($path . '/xsl/convertQDC.xsl'); $input = new DomDocument(); $input->loadXML(trim($xmlstr)); } catch (exception $e) { watchdog(t("Fedora_Repository"), t("Problem loading XSL file: !e", array('!e' => $e)), NULL, WATCHDOG_ERROR); } $xsl = $proc->importStylesheet($xsl); $newdom = $proc->transformToDoc($input); $output = $newdom->saveXML(); $baseUrl = base_path(); //$baseUrl=substr($baseUrl, 0, (strpos($baseUrl, "/")-1)); if (user_access(ObjectHelper :: $EDIT_FEDORA_METADATA)) { $allow=TRUE; if (module_exists('fedora_fesl')) { $allow= fedora_fesl_check_roles($pid,'write'); } if ($allow) { $output .= '
' . t('Edit Meta Data') . ''; } } return $output; } /** * Gets a list of datastreams from an object using its pid * * We make some assumptions here. We have implemented a policy that * we ingest in our repository will have TN (thumbnail) datastream. Even audio * will have a picture of a speaker or something. This is not critical * but makes searches etc. look better if there is a TN stream. * This diplays all the streams in a collapsed fieldset at the bottom of the object page. * you can implement a content model if you would like certain streams displayed in certain ways. * @param $object_pid String * @return String * */ function get_formatted_datastream_list($object_pid, $contentModels, &$fedoraItem) { global $fedoraUser, $fedoraPass, $base_url; module_load_include('inc', 'fedora_repository', 'ConnectionHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'api/fedora_item'); $path = drupal_get_path('module', 'fedora_repository'); $dataStreamBody = ''; $fedoraItem = new Fedora_Item($object_pid); if (user_access(ObjectHelper :: $VIEW_DETAILED_CONTENT_LIST)) { $availableDataStreamsText = 'Detailed List of Content'; //$metaDataText='Description'; $mainStreamLabel = NULL; $object = $fedoraItem->get_datastreams_list_as_SimpleXML(); if (!isset($object)) { drupal_set_message(t("No datastreams available")); return ' '; } $hasOBJStream = NULL; $hasTNStream = FALSE; $dataStreamBody = "
\n"; $dataStreamBody .= $this->get_parent_objects_asHTML($object_pid); $dataStreamBody .= ''; foreach ($object as $datastream) { foreach ($datastream as $datastreamValue) { if ($datastreamValue->ID == 'OBJ') { $hasOBJStream = '1'; $mainStreamLabel = $datastreamValue->label; $mainStreamLabel = str_replace("_", " ", $mainStreamLabel); } if ($datastreamValue->ID == 'TN') { $hasTNStream = TRUE; } //create the links to each datastream $dataStreamBody .= $this->create_link_for_ds($object_pid, $datastreamValue); //"\n"; } } $dataStreamBody .= "

' . t("!text", array('!text' => $availableDataStreamsText)) . '

$key :$value
\n"; //if they have access let them add a datastream if (user_access(ObjectHelper :: $ADD_FEDORA_STREAMS)) { $allow=TRUE; if (module_exists('fedora_fesl')) { $allow= fedora_fesl_check_roles($object_pid,'write'); } if ($allow) { $dataStreamBody .= drupal_get_form('add_stream_form', $object_pid); } } $fieldset = array( '#title' => t("!text", array('!text' => $availableDataStreamsText)), '#collapsible' => TRUE, '#collapsed' => TRUE, '#value' => $dataStreamBody ); $dataStreamBody = '
' . theme('fieldset', $fieldset) . '
'; } $content = ''; if (empty($contentModels)) { //only show this stuff if there are no contentmodels if (isset($hasOBJStream)) { $content .= ''; $content .= 'Thumbnail'; $content .= ''; } else { //don't use thumbnail as link, we don't know which datastream to link to $content .= '' . $object_pid . ''; } } foreach ($contentModels as $contentModel) { $content .= $this->createExtraFieldsets($object_pid, $contentModel); } $content .= $dataStreamBody; if (user_access(ObjectHelper :: $PURGE_FEDORA_OBJECTSANDSTREAMS)) { $allow=TRUE; if (module_exists('fedora_fesl')) { $allow= fedora_fesl_check_roles($object_pid,'write'); } if ($allow) { $purgeObject = '' . t('Purge Object') . '' . t('Purge Object') . ''; } } else { $purgeObject = ' '; } $content .= $purgeObject; $addObject = " "; if (user_access(ObjectHelper :: $OBJECT_HELPER_VIEW_FEDORA)) { $addObject = theme('add_to_basket_link', $object_pid); } $content .= $addObject; return '
' . $content . '
'; } /** * Queries a collection object for an xslt to format how the * collection of objects is displayed. */ function getXslContent($pid, $path, $canUseDefault = TRUE) { module_load_include('inc', 'fedora_repository', 'CollectionClass'); $collectionClass = new CollectionClass(); $xslContent = $collectionClass->getCollectionViewStream($pid); if (!$xslContent && $canUseDefault) { //no xslt so we will use the default sent with the module $xslContent = file_get_contents($path . '/xsl/sparql_to_html.xsl'); } return $xslContent; } /** * returns a stream from a fedora object given a pid and dsid * */ 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; } /* * gets the name of the content models for the specified object * this now returns an array of pids as in Fedora 3 we can have more then one Cmodel for an object */ function get_content_models_list($pid, $include_fedora_system_content_models = FALSE) { module_load_include('inc', 'fedora_repository', 'CollectionClass'); $collectionHelper = new CollectionClass(); $pids = array(); $query = 'select $object from <#ri> where $object and $object '; $content_models = $collectionHelper->getRelatedItems($pid, $query); if (empty($content_models)) { return $pids; } try { $sxml = new SimpleXMLElement($content_models); } catch (exception $e) { watchdog(t("Fedora_Repository"), t("Could not find a parent object for %s", $pid), NULL, WATCHDOG_ERROR); return $pids; } if (!isset($sxml)) { return $pids; } foreach ($sxml->xpath('//@uri') as $uri) { if (strpos($uri, 'fedora-system') != FALSE && $include_fedora_system_content_models == FALSE) { continue; } $pids[] = substr(strstr($uri, '/'), 1); } return $pids; } /* * determines whether we can see the object or not */ function fedora_repository_access($op, $pid) { global $user; $returnValue = FALSE; if ($pid == NULL) { $pid = variable_get('fedora_repository_pid', 'islandora:top'); } $nameSpaceAllowed = explode(" ", variable_get('fedora_pids_allowed', 'default: demo: changeme: Islandora: ilives: ')); $pos = NULL; foreach ($nameSpaceAllowed as $nameSpace) { $pos = stripos($pid, $nameSpace); if ($pos === 0) { $returnValue = TRUE; } } if ($returnValue) { $user_access = user_access($op); if ($user_access == NULL) { return FALSE; } return $user_access; } else { return FALSE; } } /** * internal function * uses an xsl to parse the sparql xml returned from the ITQL query * * * @param $content String */ function parseContent($content, $pid, $dsId, $collection, $pageNumber = NULL) { $path = drupal_get_path('module', 'fedora_repository'); global $base_url; $collection_pid = $pid; //we will be changing the pid later maybe //module_load_include('php', ''Fedora_Repository'', 'ObjectHelper'); $objectHelper = $this; $parsedContent = NULL; $contentModels = $objectHelper->get_content_models_list($pid); $isCollection = FALSE; //if this is a collection object store the $pid in the session as it will come in handy //after a purge or ingest to return to the correct collection. $fedoraItem = NULL; $datastreams = $this->get_formatted_datastream_list($pid, $contentModels, $fedoraItem); if (!empty($contentModels)) { foreach ($contentModels as $contentModel) { if ($contentModel == variable_get('fedora_collection_model_pid', 'islandora:collectionCModel')) { $_SESSION['fedora_collection'] = $pid; $isCollection = TRUE; } } } if ($fedoraItem !== NULL) { $dslist = $fedoraItem->get_datastreams_list_as_array(); if (isset($dslist['COLLECTION_POLICY'])) { $isCollection = TRUE; } } //$label=$content; $collectionName = $collection; if (!$pageNumber) { $pageNumber = 1; } if (!isset($collectionName)) { $collectionName = variable_get('fedora_repository_name', 'Collection'); } $xslContent = $this->getXslContent($pid, $path); //get collection list and display using xslt------------------------------------------- if (isset($content) && $content != FALSE) { $input = new DomDocument(); $input->loadXML(trim($content)); $results = $input->getElementsByTagName('result'); if ($results->length > 0) { try { $proc = new XsltProcessor(); $proc->setParameter('', 'collectionPid', $collection_pid); $proc->setParameter('', 'collectionTitle', $collectionName); $proc->setParameter('', 'baseUrl', $base_url); $proc->setParameter('', 'path', $base_url . '/' . $path); $proc->setParameter('', 'hitPage', $pageNumber); $proc->registerPHPFunctions(); $xsl = new DomDocument(); $xsl->loadXML($xslContent); // php xsl does not seem to work with namespaces so removing it below // I may have just been being stupid here // $content = str_ireplace('xmlns="http://www.w3.org/2001/sw/DataAccess/rf1/result"', '', $content); $xsl = $proc->importStylesheet($xsl); $newdom = $proc->transformToDoc($input); $objectList = $newdom->saveXML(); //is the xml transformed to html as defined in the xslt associated with the collection object if (!$objectList) { throw new Exception("Invalid XML."); } } catch (Exception $e) { drupal_set_message(t('!e', array('!e' => $e->getMessage())), 'error'); return ''; } } } else { drupal_set_message(t("No Objects in this collection or bad query.")); } //-------------------------------------------------------------------------------- //show the collections datastreams if ($results->length > 0 || $isCollection == TRUE) { // if(strlen($objectList)>22||$contentModel=='Collection'||$contentModel=='Community')//length of empty dom still equals 22 because of etc module_load_include('inc', 'Fedora_Repository', 'CollectionPolicy'); $collectionPolicyExists = $objectHelper->getMimeType($pid, CollectionPolicy::getDefaultDSID()); if (user_access(ObjectHelper :: $INGEST_FEDORA_OBJECTS) && $collectionPolicyExists) { if (!empty($collectionPolicyExists)) { $allow=TRUE; if (module_exists('fedora_fesl')) { $allow= fedora_fesl_check_roles($pid,'write'); } if ($allow) { // $ingestObject = ' $collectionName, '!collection_pid' => $collection_pid)) . '" href="' . base_path() . 'fedora/ingestObject/' . $collection_pid . '/' . $collectionName . '">' . t('Add a New Object') . '' . t('Add to this Collection') . ''; } } } else { $ingestObject = ' '; } $datastreams .= $ingestObject; $objectListOut = ''; if (isset($objectList)) { $object_list_fieldset = array( '#title' => t('Items in this collection'), '#collapsible' => TRUE, '#collapsed' => FALSE, '#value' => (isset($objectList) ? $objectList : ''), //collection list ); $objectListOut = theme('fieldset', $object_list_fieldset); } } else { //$collectionName=''; $collection_fieldset = array( '#title' => "", '#collapsible' => TRUE, '#collapsed' => FALSE, '#value' => $datastreams, ); $objectListOut = ''; //no collection objects to show so don't show field set } $output = ''; switch (variable_get('fedora_object_display_title', ObjectHelper::$DISPLAY_ALWAYS)) { case ObjectHelper :: $DISPLAY_NEVER: break; case ObjectHelper :: $DISPLAY_NO_MODEL_OUTPUT: if (trim($datastreams) == '') { $output .= '' . $collectionName . '
'; } break; case ObjectHelper :: $DISPLAY_ALWAYS: default: $output .= '' . $collectionName . '
'; break; } $output .= $datastreams; $showDesc = FALSE; switch (variable_get('fedora_object_display_description', ObjectHelper :: $DISPLAY_NO_MODEL_OUTPUT)) { case ObjectHelper :: $DISPLAY_NEVER: break; case ObjectHelper :: $DISPLAY_NO_MODEL_OUTPUT: if (trim($datastreams) == '') { $showDesc = TRUE; } break; case ObjectHelper :: $DISPLAY_ALWAYS: default: $showDesc = TRUE; break; } if ($showDesc) { //just show default dc or qdc as we could not find a content model $metaDataText = t('Description'); $body = $this->getQDC($pid); $fieldset = array( '#title' => t("!metaDataText", array('!metaDataText' => $metaDataText)), '#collapsible' => TRUE, '#collapsed' => TRUE, '#value' => $body ); $output .= theme('fieldset', $fieldset); } switch (variable_get('fedora_collection_display_list', ObjectHelper::$DISPLAY_ALWAYS)) { case ObjectHelper :: $DISPLAY_NEVER: break; case ObjectHelper :: $DISPLAY_NO_MODEL_OUTPUT: if (trim($datastreams) == '') { $output .= $objectListOut . '
'; } break; case ObjectHelper :: $DISPLAY_ALWAYS: default: $output .= $objectListOut . '
'; break; } return $output; } /** * Gets the parent objects that this object is related to * * @param unknown_type $pid * @return unknown */ function get_parent_objects($pid) { $query_string = 'select $object $title from <#ri> where ($object $title and $object and $object ) order by $title'; $objects = $this->getCollectionInfo($pid, $query_string); return $objects; } function get_parent_objects_asHTML($pid) { global $base_url; $parent_collections = $this->get_parent_objects($pid); try { $parent_collections = new SimpleXMLElement($parent_collections); } catch (exception $e) { drupal_set_message(t('Error getting parent objects !e', array('!e' => $e->getMessage()))); return; } $parent_collections_HTML = ''; foreach ($parent_collections->results->result as $result) { $collection_label = $result->title; foreach ($result->object->attributes() as $a => $b) { if ($a == 'uri') { $uri = (string) $b; $uri = $base_url . '/fedora/repository' . substr($uri, strpos($uri, '/')) . '/-/' . $collection_label; } } $parent_collections_HTML .= '' . $collection_label . '
'; } if (!empty($parent_collections_HTML)) { $parent_collections_HTML = '
'; } return $parent_collections_HTML; } /** * gets a list of datastreams and related function that we should use to show datastreams in their own fieldsets * from the content model associated with the object */ function createExtraFieldsets($pid, $contentModel) { //$models = $collectionHelper->getContentModels($collectionPid, FALSE); // possible problem in below if the collection policy has multiple content models //with different pids but same dsid we could get wrong one, low probability and functionality // will probably change for fedora version 3. if (empty($contentModel)) { return NULL; } $output = ''; module_load_include('inc', 'fedora_repository', 'ContentModel'); if (($cm = ContentModel :: loadFromModel($contentModel)) !== FALSE && $cm->validate()) { $output .= $cm->displayExtraFieldset($pid); } return $output; } /** * Look in the content model for rules to run on the specified datastream. * * @param string $pid * @param string $dsid * @return boolean */ function get_and_do_datastream_rules($pid, $dsid, $file = '') { if (!user_access('ingest new fedora objects')) { drupal_set_message(t('You do not have permission to add datastreams.')); return FALSE; } module_load_include('inc', 'fedora_repository', 'ContentModel'); if ($dsid != NULL && $pid != NULL && ($cm = ContentModel::loadFromObject($pid)) !== FALSE) { $cm->execAddDatastreamMethods($dsid, $file); } } /** * Get a tree of related pids - for the basket functionality */ function get_all_related_pids($pid) { if (!$pid) { return FALSE; } module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); // Get title and descriptions for $pid $query_string = 'select $title $desc from <#ri> where $o $title and $o $desc and $o '; $url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch'); $url .= "?type=tuples&flush=true&format=csv&limit=1000&lang=itql&stream=on&query="; $content = do_curl($url . htmlentities(urlencode($query_string))); $rows = explode("\n", $content); $fields = explode(',', $rows[1]); $pids[$pid] = array('title' => $fields[0], 'description' => $fields[1]); // $pids += $this->get_child_pids(array($pid)); return $pids; } /** * Get children of PID - but only 2 levels deep */ function get_child_pids($pids) { // Get pid, title and description for children of object $pid $query_string = 'select $o $title from <#ri> ' . // $query_string = 'select $o $title $desc from <#ri> '. 'where $s $o ' . 'and $o $title ' . // 'and $o $desc '. 'and ( '; foreach ($pids as $pid) { $query_string .= '$s or '; } $query_string = substr($query_string, 0, -3) . ' )'; $url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch'); $url .= "?type=tuples&flush=true&format=csv&limit=1000&lang=itql&stream=on&query="; $url .= htmlentities(urlencode($query_string)); $content = $this->doCurl($url); $rows = explode("\n", $content); // Knock of the first heading row array_shift($rows); $child_pids = array(); if (count($rows)) { // iterate through each row foreach ($rows as $row) { if ($row == "") { continue; } $fields = explode(',', $row); $child_pid = substr($fields[0], 12); $child_pids[$child_pid] = array('title' => $fields[1], 'description' => $fields[2]); } if (!empty($child_pids)) { $child_pids += $this->get_child_pids(array_keys($child_pids)); } } return $child_pids; } /** * Returns XML description of the object (export). */ function getObject($pid, $context = 'archive', $format = FOXML_11) { module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); $url = variable_get('fedora_base_url', 'http://localhost:8080/fedora') . '/objects/' . $pid . '/export?context=' . $context . '&format=' . $format; $result_data = do_curl($url); return $result_data; } /** * Builds an array of drupal links for use in breadcrumbs. */ function getBreadcrumbs($pid, &$breadcrumbs, $level=10) { module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); $query_string = 'select $parentObject $title $content from <#ri> where ( $title and $parentObject $content and ( $parentObject or $parentObject or $parentObject) and $parentObject ) minus $content order by $title'; $query_string = htmlentities(urlencode($query_string)); $url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch'); $url .= "?type=tuples&flush=TRUE&format=CSV&limit=1&offset=0&lang=itql&stream=on&query=" . $query_string; $result = preg_split('/[\r\n]+/',do_curl($url)); array_shift($result); // throw away first line $matches =str_getcsv(join("\n",$result)); if ($matches !== NULL) { $parent = preg_replace('/^info:fedora\//','',$matches[0]); $breadcrumbs[] = l($matches[1], 'fedora/repository/' . $pid); if ($parent == variable_get('fedora_repository_pid', 'islandora:top')) { $breadcrumbs[] = l(t('Home'), ''); // l(t('Digital repository'), 'fedora/repository'); } elseif ($level > 0) { $this->getBreadcrumbs($parent, $breadcrumbs, $level - 1); } } } function warnIfMisconfigured($app) { $messMap = array( 'Kakadu' => 'Full installation instructions for Kakadu can be found Here', 'ImageMagick' => 'Check the path settings in the configuration of your imageapi module.
Further details can be found Here', ); $warnMess = "Creation of one or more datastreams failed.
"; $configMess = "Please ensure that %app is installed and configured for this site. "; drupal_set_message($warnMess, 'warning', false); drupal_set_message(t($configMess . "
" . $messMap[$app] . "
", array('%app' => $app)), 'warning', false); } }

' . t("Belongs to these collections: ") . '

' . $parent_collections_HTML . '