Browse Source

Merge branch '6.x' of github.com:Islandora/islandora into 6.x

pull/130/merge
jonathangreen 13 years ago
parent
commit
3cc97d393c
  1. 360
      CollectionClass.inc
  2. 2
      CollectionPolicy.inc
  3. 4
      MimeClass.inc
  4. 272
      ObjectDetails.inc
  5. 800
      ObjectHelper.inc
  6. 10
      SearchClass.inc
  7. 6
      SecurityClass.inc
  8. 2
      XMLDatastream.inc
  9. 1
      api/fedora_export.inc
  10. 140
      api/fedora_item.inc
  11. 21
      api/fedora_utils.inc
  12. 43
      fedora_repository.install
  13. 434
      fedora_repository.module
  14. 194
      formClass.inc
  15. 6
      object_details_xslts/convertQDC.xsl
  16. 232
      object_details_xslts/mods2html.xsl
  17. 2
      plugins/DarwinCore.inc
  18. 43
      plugins/FedoraObjectDetailedContent.inc
  19. 2
      plugins/FlvFormBuilder.inc
  20. 8
      plugins/FormBuilder.inc
  21. 2
      plugins/ModsFormBuilder.inc
  22. 8
      plugins/PersonalCollectionClass.inc
  23. 4
      plugins/QtFormBuilder.php
  24. 6
      plugins/Refworks.inc
  25. 5
      plugins/ShowDemoStreamsInFieldSets.inc
  26. 48
      plugins/ShowStreamsInFieldSets.inc
  27. 2
      plugins/fedora_imageapi.module
  28. 4
      plugins/herbarium.inc
  29. 67
      plugins/qt_viewer.inc
  30. 6
      plugins/slide_viewer.inc
  31. 29
      plugins/tagging_form.inc
  32. 34
      xsl/convertQDC.xsl.deprecated
  33. 200
      xsl/sparql_to_html.xsl

360
CollectionClass.inc

@ -6,11 +6,6 @@
* Collection Class Class * Collection Class Class
*/ */
if (!defined('PHP_VERSION_ID')) { //XXX: This should go elsewhere
$version = explode('.', PHP_VERSION);
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}
/** /**
* This CLASS caches the streams so once you call a getstream once it will always return * 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 * the same stream as long as you are using the instance of this class. Cached to
@ -33,85 +28,114 @@ class CollectionClass {
* @return CollectionClass * @return CollectionClass
*/ */
function __construct($pid = NULL) { function __construct($pid = NULL) {
if (!empty($pid)) {
module_load_include('inc', 'fedora_repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper');
$this->collectionObject = new ObjectHelper($pid); $this->collectionObject = new ObjectHelper();
$this->pid = $pid; $this->pid = $pid;
} }
public static function getCollectionQuery($pid) {
if ($query = self::getCollectionQueryFromStream($pid)) {
return $query;
}
else {
return self::getDefaultCollectionQuery($pid);
}
}
protected static function getCollectionQueryFromStream($pid) {
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$item = new Fedora_Item($pid);
if ($item->exists() && array_key_exists('QUERY', $item->datastreams)) {
return $item->get_datastream_dissemination('QUERY');
}
else {
return FALSE;
}
}
protected static function getDefaultCollectionQuery($pid) {
return 'select $object $title $content from <#ri>
where ($object <fedora-model:label> $title
and $object <fedora-model:hasModel> $content
and ($object <fedora-rels-ext:isMemberOfCollection> <info:fedora/' . $pid . '>
or $object <fedora-rels-ext:isMemberOf> <info:fedora/' . $pid . '>)
and $object <fedora-model:state> <info:fedora/fedora-system:def/model#Active>)
minus $content <mulgara:is> <info:fedora/fedora-system:FedoraObject-3.0>
order by $title';
} }
/** /**
* gets objects related to this object. must include offset and limit * Gets objects related to this object. Must include offset and limit!
* calls getRelatedItems but enforces limit and offset *
* @param type $pid * Calls self::getRelatedItems() but requires limit and offset.
* @param type $limit *
* @param $pid string
* A string containing a Fedora PID.
* @param $limit
* An integer
* @param type $offset * @param type $offset
* @param type $itqlquery * @param type $itqlquery
* @return type * @return type
*/ */
function getRelatedObjects($pid, $limit, $offset, $itqlquery=NULL) { function getRelatedObjects($pid, $limit, $offset, $itqlquery=NULL) {
if (!isset($itqlquery)) {
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$item = new Fedora_Item($pid);
if ($item->exists() && array_key_exists('QUERY', $item->datastreams)) {
$itqlquery = $item->get_datastream_dissemination('QUERY');
}
}
return $this->getRelatedItems($pid, $itqlquery, $limit, $offset); return $this->getRelatedItems($pid, $itqlquery, $limit, $offset);
} }
/** /**
* Gets objects related to this item. It will query the object for a Query stream and use that as a itql query * Gets objects related to this item.
* or if there is no query stream it will use the default. If you pass a query to this method it will use the passed in query no matter what *
* @global type $user * Query the resource index using the provided iTQL query. If no query is
* @param type $pid * provided, one should be obtained via self::getCollectionQuery() which
* @param type $itqlquery * grabs the child objects.
* @param int $limit *
* @param $pid string
* A string containing a PID which may be substituted into the query,
* in place of the %parent_collection% placeholder.
* @param $query_string string
* An optional iTQL query.
* @param $limit int
* An optional integer to limit the number of results returned.
* @param int $offset * @param int $offset
* @return type * An optional integer used to offset the results returned. (Query should
* involve a sort to maintain consistency.
* @return string
* Sparql XML results from the resource index.
*/ */
function getRelatedItems($pid, $itqlquery = NULL, $limit = NULL, $offset = NULL) { function getRelatedItems($pid, $query_string = NULL, $limit = NULL, $offset = NULL) {
module_load_include('inc', 'fedora_repository', 'ObjectHelper');
module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); module_load_include('inc', 'fedora_repository', 'api/fedora_utils');
if (!isset($offset)) { module_load_include('inc', 'fedora_repository', 'ObjectHelper');
$offset = 0; if (!fedora_repository_access(OBJECTHELPER :: $OBJECT_HELPER_VIEW_FEDORA, $pid)) {
}
global $user;
if (!fedora_repository_access(OBJECTHELPER :: $OBJECT_HELPER_VIEW_FEDORA, $pid, $user)) {
drupal_set_message(t("You do not have access to Fedora objects within the attempted namespace or access to Fedora denied."), 'error'); drupal_set_message(t("You do not have access to Fedora objects within the attempted namespace or access to Fedora denied."), 'error');
return ' '; return ' ';
} }
$objectHelper = new ObjectHelper();
$query_string = $itqlquery; if ($query_string === NULL) {
if (!isset($query_string)) { $query_string = self::getCollectionQuery($pid);
$query_string = NULL;
$item = new Fedora_Item($pid);
if ($item->exists() && array_key_exists('QUERY', $item->datastreams)) {
$query_string = $item->get_datastream_dissemination('QUERY');
}
if ($query_string == NULL) {
$query_string = 'select $object $title $content from <#ri>
where ($object <fedora-model:label> $title
and $object <fedora-model:hasModel> $content
and ($object <fedora-rels-ext:isMemberOfCollection> <info:fedora/' . $pid . '>
or $object <fedora-rels-ext:isMemberOf> <info:fedora/' . $pid . '>)
and $object <fedora-model:state> <info:fedora/fedora-system:def/model#Active>)
minus $content <mulgara:is> <info:fedora/fedora-system:FedoraObject-3.0>
order by $title';
}
} }
else {
// Replace %parent_collection% with the actual collection PID // Replace %parent_collection% with the actual collection PID
$query_string = preg_replace("/\%parent_collection\%/", "<info:fedora/$pid>", $query_string); $query_string = preg_replace("/\%parent_collection\%/", "<info:fedora/$pid>", $query_string);
}
$query_string = htmlentities(urlencode($query_string));
$content = '';
$url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch'); $url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch');
$url .= "?type=tuples&flush=TRUE&format=Sparql&limit=$limit&offset=$offset&lang=itql&stream=on&query=" . $query_string;
$content .= do_curl($url);
$settings = array(
'type' => 'tuples',
'flush' => TRUE,
'format' => 'Sparql',
'lang' => 'itql',
'stream' => 'on',
'query' => $query_string
);
if ($limit > 0) {
$settings['limit'] = $limit;
}
if ($offset > 0) {
$settings['offset'] = $offset;
}
$url .= '?' . http_build_query($settings, NULL, '&');
$content = do_curl($url);
return $content; return $content;
} }
@ -200,7 +224,7 @@ class CollectionClass {
* @return ContentModel * @return ContentModel
*/ */
function getContentModels($collection_pid, $showError = TRUE) { function getContentModels($collection_pid, $showError = TRUE) {
module_load_include('inc', 'Fedora_Repository', 'ContentModel'); module_load_include('inc', 'fedora_repository', 'ContentModel');
$collection_stream = $this->getCollectionPolicyStream($collection_pid); $collection_stream = $this->getCollectionPolicyStream($collection_pid);
try { try {
$xml = new SimpleXMLElement($collection_stream); $xml = new SimpleXMLElement($collection_stream);
@ -227,7 +251,7 @@ class CollectionClass {
* $dsid is the datastream id of the content model. * $dsid is the datastream id of the content model.
*/ */
function getNextPid($pid, $dsid) { function getNextPid($pid, $dsid) {
module_load_include('inc', 'Fedora_Repository', 'ConnectionHelper'); module_load_include('inc', 'fedora_repository', 'ConnectionHelper');
$pidNameSpace = $this->getPidNameSpace($pid, $dsid); $pidNameSpace = $this->getPidNameSpace($pid, $dsid);
$pname = substr($pidNameSpace, 0, strpos($pidNameSpace, ":")); $pname = substr($pidNameSpace, 0, strpos($pidNameSpace, ":"));
module_load_include('inc', 'fedora_repository', 'api/fedora_item'); module_load_include('inc', 'fedora_repository', 'api/fedora_item');
@ -345,7 +369,7 @@ class CollectionClass {
$parametersArray["$name"] = $value; $parametersArray["$name"] = $value;
} }
} }
// module_load_include( $phpFile, 'Fedora_Repository', ' '); // module_load_include( $phpFile, 'fedora_repository', ' ');
require_once(drupal_get_path('module', 'fedora_repository') . '/' . $phpFile); require_once(drupal_get_path('module', 'fedora_repository') . '/' . $phpFile);
$thisClass = new $phpClass (); $thisClass = new $phpClass ();
$returnValue = $thisClass->$phpMethod($parametersArray, $dsid, $file, $file_ext); $returnValue = $thisClass->$phpMethod($parametersArray, $dsid, $file, $file_ext);
@ -422,7 +446,7 @@ class CollectionClass {
$phpClass = strip_tags($ingest_form->form_builder_method->class_name->asXML()); $phpClass = strip_tags($ingest_form->form_builder_method->class_name->asXML());
$phpMethod = strip_tags($ingest_form->form_builder_method->method_name->asXML()); $phpMethod = strip_tags($ingest_form->form_builder_method->method_name->asXML());
$dsid = strip_tags($ingest_form['dsid']); $dsid = strip_tags($ingest_form['dsid']);
// module_load_include('php', 'Fedora_Repository', $phpFile); // module_load_include('php', 'fedora_repository', $phpFile);
require_once(drupal_get_path('module', $drupal_module) . '/' . $phpFile); require_once(drupal_get_path('module', $drupal_module) . '/' . $phpFile);
$thisClass = new $phpClass (); $thisClass = new $phpClass ();
@ -490,9 +514,12 @@ class CollectionClass {
module_load_include('inc', 'fedora_repository', 'CollectionClass'); module_load_include('inc', 'fedora_repository', 'CollectionClass');
$collectionClass = new CollectionClass(); $collectionClass = new CollectionClass();
$xslContent = $collectionClass->getCollectionViewStream($pid); $xslContent = $collectionClass->getCollectionViewStream($pid);
if (!$xslContent && $canUseDefault) { //no xslt so we will use the default sent with the module
//If there's no XSLT from the object, then check if the one which used to exist, does...
if (!$xslContent && $canUseDefault && file_exists($path . '/xsl/sparql_to_html.xsl')) {
$xslContent = file_get_contents($path . '/xsl/sparql_to_html.xsl'); $xslContent = file_get_contents($path . '/xsl/sparql_to_html.xsl');
} }
return $xslContent; return $xslContent;
} }
@ -519,7 +546,6 @@ class CollectionClass {
$results = $this->getRelatedItems($this->pid, $query); $results = $this->getRelatedItems($this->pid, $query);
$collection_items = $this->renderCollection($results, $this->pid, NULL, NULL, $page_number); $collection_items = $this->renderCollection($results, $this->pid, NULL, NULL, $page_number);
//$collection_item = new Fedora_Item($this->pid); //XXX: This didn't seem to be used...
$show_batch_tab = FALSE; $show_batch_tab = FALSE;
$policy = CollectionPolicy::loadFromCollection($this->pid, TRUE); $policy = CollectionPolicy::loadFromCollection($this->pid, TRUE);
@ -555,17 +581,6 @@ class CollectionClass {
); );
} }
if ($show_batch_tab && user_access('create batch process')) { //XXX: Is this not put in by the batch module?
$tabset['batch_ingest_tab'] = array(
// #type and #title are the minimum requirements.
'#type' => 'tabpage',
'#title' => t('Batch Ingest'),
// This will be the content of the tab.
'#content' => drupal_get_form('batch_creation_form', $this->pid, $content_models),
'#tab_name' => 'batch-ingest-tab',
);
}
return $tabset; return $tabset;
} }
@ -575,10 +590,8 @@ class CollectionClass {
* @return string * @return string
*/ */
function getIngestInterface() { function getIngestInterface() {
global $base_url; module_load_include('inc', 'fedora_repository', 'CollectionPolicy');
$objectHelper = new ObjectHelper(); $collectionPolicyExists = $this->collectionObject->getMimeType($this->pid, CollectionPolicy::getDefaultDSID());
module_load_include('inc', 'Fedora_Repository', 'CollectionPolicy');
$collectionPolicyExists = $objectHelper->getMimeType($this->pid, CollectionPolicy::getDefaultDSID());
if (user_access(ObjectHelper :: $INGEST_FEDORA_OBJECTS) && $collectionPolicyExists) { if (user_access(ObjectHelper :: $INGEST_FEDORA_OBJECTS) && $collectionPolicyExists) {
if (!empty($collectionPolicyExists)) { if (!empty($collectionPolicyExists)) {
$allow = TRUE; $allow = TRUE;
@ -597,6 +610,146 @@ class CollectionClass {
return $ingestObject; return $ingestObject;
} }
/**
* Unfortunate function, I know...
*
* Does just what it says: Hacks the default Drupal pager such that it might
* be rendered, likely with: theme('pager', array(), $per_page, $pager_name)
* (I reccomend seeing the real documentation for more detail, but the first
* array can be a list of the tags to use for first, previous, next and last
* (text in the pager), I don't believe per_page is actually used in the theme
* function, and $pager_name is an integer used to identify the pager (such
* that there can be more than one--that is, tracking different lists of
* content on a single page. You can render the exact same pager multiple
* times, say if you want one at the top and bottom of a list, using the same
* ID/pager_name.
*
* @global $pager_total array
* Numerically indexed array, where keys are the $pager_names and values
* are the number of pages in the given set, based on: ceil($total_items/$per_page);
* @global $pager_page_array array
* Numerically indexed array, where keys are the $pager_names and values
* are the page selected in the relevant set.
* @param $pager_name int
* An integer to identify the pager to affect. Do note that paging in using
* this function will add the 'page' HTTP GET parameter to the URL, with
* the value containing a comma-separated list with max($pager_name + 1)
* values--that is, if you create a single pager named '10', the 'next'
* link will look something like: 0,0,0,0,0,0,0,0,0,0,1
* @param $per_page int
* An integer representing the number of items per page.
* @param $total_items int
* An integer representing the total number of items in the set.
* @return int
* An integer representing what the current page should be.
*/
protected static function hackPager($pager_name, $per_page = NULL, $total_items = NULL) {
global $pager_total, $pager_page_array;
if ($per_page !== NULL && $total_items !== NULL) {
$pager_total[$pager_name] = ceil($total_items / $per_page);
}
//XXX: Don't know that this is neccessary, to try to load all the time, or
// whether Drupal will load it automatically somewhere... Docs seems a
// a little sparse.
$page_info = explode(',', isset($_GET['page']) ? $_GET['page'] : '');
$page = $page_info[$pager_name];
if ($page < 0) {
$page = 0;
}
if (!isset($pager_page_array)) {
$pager_page_array = pager_load_array($page, $pager_name, $page_info);
}
else {
$pager_page_array = pager_load_array($page, $pager_name, $pager_page_array);
}
$page = $pager_page_array[$pager_name];
return $page;
}
/**
* Assemble results in a somewhat more logical manner...
*
* ... Compared to generating a table in XSLT to contain a list (as
* renderCollection() used to do/does by default).
*
* @param $sparql_results array
* The array of results as yielded by ObjectHelper::parseSparqlResults()
* (and those associated functions which make use of it).
* Each result must contain:
* - 'object': The PID/URI of the child object.
* - 'title': A title for the child object.
* and may contain:
* - 'thumbnail': URI to a datastream. (will default to the 'TN' stream on the child)
* @return
* 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);
$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) {
$title = $result['title'];
$truncated_title = truncate_utf8($title, $max_title_length, TRUE, TRUE, 5);
$obj_path = "fedora/repository/{$result['object']}";
//Get a thumbnail
$tn_path = ($result['thumbnail'] ?
"fedora/repository/{$result['thumbnail']}":
"$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,
));
return array(
array(
'#type' => 'markup',
'#value' => theme('pager', array(), $per_page, $pager_name),
),
array(
'#type' => 'markup',
'#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)
),
);
}
}
/** /**
* render collection * render collection
* @global type $base_url * @global type $base_url
@ -607,35 +760,35 @@ class CollectionClass {
* @param int $pageNumber * @param int $pageNumber
* @return type * @return type
*/ */
function renderCollection($content, $pid, $dsId, $collection, $pageNumber = NULL) { function renderCollection($content, $pid, $dsId, $collectionName, $pageNumber = NULL) {
$path = drupal_get_path('module', 'fedora_repository'); $path = drupal_get_path('module', 'fedora_repository');
global $base_url; global $base_url;
$collection_pid = $pid; //we will be changing the pid later maybe
$objectHelper = new ObjectHelper();
$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;
$contentModels = $this->collectionObject->get_content_models_list($pid);
if (empty($collectionName)) {
$collectionName = menu_get_active_title();
}
$collectionName = $collection; $xslContent = $this->getXslContent($pid, $path);
$objectList = '';
if (isset($content) && $content != FALSE) {
if (!$xslContent) { //Didn't find an XSLT.
return drupal_render(
self::assembleCollectionView(
$this->collectionObject->parseSparqlResults(
$content
)
)
);
}
else {
if (!$pageNumber) { if (!$pageNumber) {
$pageNumber = 1; $pageNumber = 1;
} }
if (empty($collectionName)) {
$collectionName = variable_get('fedora_repository_name', 'Collection');
}
$xslContent = $this->getXslContent($pid, $path);
//get collection list and display using xslt------------------------------------------- //get collection list and display using xslt-------------------------------------------
$objectList = '';
if (isset($content) && $content != FALSE) {
$input = new DomDocument(); $input = new DomDocument();
$input->loadXML(trim($content)); $input->loadXML(trim($content));
$results = $input->getElementsByTagName('result'); $results = $input->getElementsByTagName('result');
@ -643,33 +796,23 @@ class CollectionClass {
try { try {
$proc = new XsltProcessor(); $proc = new XsltProcessor();
$options = array( //Could make this the return of a hook? $options = array( //Could make this the return of a hook?
'collectionPid' => $collection_pid, 'collectionPid' => $pid,
'collectionTitle' => $collectionName, 'collectionTitle' => $collectionName,
'baseUrl' => $base_url, 'baseUrl' => $base_url,
'path' => "$base_url/$path", 'path' => "$base_url/$path",
'hitPage' => $pageNumber, 'hitPage' => $pageNumber,
); );
if (defined('PHP_VERSION_ID') && PHP_VERSION_ID >= 50100) {
$proc->setParameter('', $options); $proc->setParameter('', $options);
}
else {
foreach ($options as $name => $value) {
$proc->setParameter('', $name, $value);
}
}
$proc->registerPHPFunctions(); $proc->registerPHPFunctions();
$xsl = new DomDocument(); $xsl = new DomDocument();
$xsl->loadXML($xslContent); $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); $xsl = $proc->importStylesheet($xsl);
$newdom = $proc->transformToDoc($input); $newdom = $proc->transformToDoc($input);
$objectList = $newdom->saveXML(); //is the xml transformed to html as defined in the xslt associated with the collection object $objectList = $newdom->saveHTML(); //is the xml transformed to html as defined in the xslt associated with the collection object
if (!$objectList) { if (!$objectList) {
throw new Exception("Invalid XML."); throw new Exception("Invalid XML.");
@ -680,6 +823,7 @@ class CollectionClass {
} }
} }
} }
}
else { else {
drupal_set_message(t("No objects in this collection (or bad query).")); drupal_set_message(t("No objects in this collection (or bad query)."));
} }

2
CollectionPolicy.inc

@ -392,7 +392,7 @@ class CollectionPolicy extends XMLDatastream {
function getContentModels() { function getContentModels() {
$ret = FALSE; $ret = FALSE;
if ($this->validate()) { if ($this->validate()) {
module_load_include('inc', 'Fedora_Repository', 'ContentModel'); module_load_include('inc', 'fedora_repository', 'ContentModel');
$ret = array(); $ret = array();
$content_models = $this->xml->getElementsByTagName('content_models')->item(0)->getElementsByTagName('content_model'); $content_models = $this->xml->getElementsByTagName('content_models')->item(0)->getElementsByTagName('content_model');
for ($i = 0; $i < $content_models->length; $i++) { for ($i = 0; $i < $content_models->length; $i++) {

4
MimeClass.inc

@ -231,9 +231,7 @@ class MimeClass {
* @return type * @return type
*/ */
public function get_mimetype($filename, $debug = FALSE) { public function get_mimetype($filename, $debug = FALSE) {
$ext = strtolower(substr($filename, strrpos($filename, '.') + 1));
$file_name_and_extension = explode('.', $filename);
$ext = strtolower(array_pop($file_name_and_extension));
if (!empty($this->private_mime_types[$ext])) { if (!empty($this->private_mime_types[$ext])) {
if (TRUE === $debug) if (TRUE === $debug)

272
ObjectDetails.inc

@ -0,0 +1,272 @@
<?php
/**
* @file ObjectDetails.inc
* The functions required to define and respond to all the default object
* details display modes.
*/
/**
* Islandora core object details display modes. These are the default display
* modes that are always available.
* @return A list of display modes that can be used to render the object details
* page.
*/
function fedora_repository_islandora_object_details_display() {
$profiles = array(
'hidden' => array(
"name" => "Hidden",
"module" => "fedora_repository",
"file" => "ObjectDetails.inc",
"function" => "fedora_repository_object_details_hidden",
"description" => t("No object details page"),
),
'xslt' => array(
"name" => "XSLT",
"module" => "fedora_repository",
"file" => "ObjectDetails.inc",
"function" => "fedora_repository_object_details_xslt",
"description" => t("Show a datastream with an XSLT"),
"config" => "admin/settings/fedora_repository/object_details_xslt",
),
'table' => array(
"name" => "Table",
"module" => "fedora_repository",
"file" => "ObjectDetails.inc",
"function" => "fedora_repository_object_details_table",
"description" => t("Show a datastream with a table"),
"config" => "admin/settings/fedora_repository/object_details_table",
)
);
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');
module_load_include('inc', 'fedora_repository', 'ConnectionHelper');
$dsid = variable_get('islandora_object_details_xslt_datastream', 'DC');
// special case for DC+QDC for backward compatibility
if ($dsid == 'DC' || $dsid == 'QDC') {
$dsid = array_key_exists('QDC', $item->get_datastreams_list_as_array()) ? 'QDC' : 'DC';
}
$xmlstr = $item->get_datastream_dissemination($dsid);
if (empty($xmlstr)) {
return t('Error - could not find datastream @dsid on object @pid<br/>Please contact the site administrator.',
array('@dsid' => $dsid, '@pid' => $item->pid));
}
try {
$proc = new XsltProcessor();
} catch (Exception $e) {
watchdog('fedora_repository', "Error while creating XSLT processor: @e", array('@e' => $e->getMessage()), WATCHDOG_ERROR);
return;
}
$proc->setParameter('', 'baseUrl', $base_url);
$proc->setParameter('', 'path', $path);
$input = NULL;
$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();
$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');
module_load_include('inc', 'fedora_repository', 'ConnectionHelper');
$dsid = variable_get('islandora_object_details_table_datastream', 'DC');
// special case for DC+QDC for backward compatibility
if ($dsid == 'DC' || $dsid == 'QDC') {
$dsid = array_key_exists('QDC', $item->get_datastreams_list_as_array()) ? 'QDC' : 'DC';
}
$xmlstr = $item->get_datastream_dissemination($dsid);
if (empty($xmlstr)) {
return t('Error - could not find datastream @dsid on object @pid<br/>Please contact the site administrator.',
array('@dsid' => $dsid, '@pid' => $item->pid));
}
$simplexml = new SimpleXMLElement($xmlstr);
$headers = array(
array(
'data' => t('Metadata'),
'colspan' => 2,
),
);
$rows = array();
foreach ($simplexml->getNamespaces(TRUE) as $ns) {
foreach ($simplexml->children($ns) as $child) {
$rows[] = array(
array(
'data' => $child->getName(),
'class' => 'dc-tag-name',
),
array(
'data' => (string)$child,
'class' => 'dc-content',
),
);
}
}
return theme('table', $headers, $rows, array('class' => 'dc-table'));
}
/**
* 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(
'#type' => 'fieldset',
'#title' => t("XSLT display options"),
);
$options = module_invoke_all("object_details_get_available_xslts");
$form['config']['xslt'] = array(
'#type' => 'select',
'#title' => t("XSL transform to use"),
'#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(
'#type' => 'textfield',
'#title' => t("Datastream to transform"),
'#default_value' => variable_get('islandora_object_details_xslt_datastream', 'DC'),
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t("Submit"),
'#weight' => 1,
);
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_xslt_sheet', $form_state['values']['xslt']);
variable_set('islandora_object_details_xslt_datastream', $form_state['values']['dsid']);
}
/**
* 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(
'#type' => 'fieldset',
'#title' => t("Table display options"),
);
$form['config']['dsid'] = array(
'#type' => 'textfield',
'#title' => t("Datastream to transform"),
'#default_value' => variable_get('islandora_object_details_table_datastream', 'DC'),
'#required' => TRUE,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t("Submit"),
'#weight' => 1,
);
return $form;
}
/**
* 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_table_datastream', $form_state['values']['dsid']);
}

800
ObjectHelper.inc

File diff suppressed because it is too large Load Diff

10
SearchClass.inc

@ -36,7 +36,7 @@ class SearchClass {
try { try {
$implementation = new $solrClass(); $implementation = new $solrClass();
} catch (Exception $e) { } catch (Exception $e) {
watchdog(t("Fedora_Repository"), "Error getting solr search results class: !message", array('!message' => $e->getMessage()), NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), "Error getting solr search results class: !message", array('!message' => $e->getMessage()), NULL, WATCHDOG_ERROR);
return 'Error getting solr search results class. Check watchdog for more info.'; return 'Error getting solr search results class. Check watchdog for more info.';
} }
return $implementation->$solrFunction($query, $startPage, $fq, $dismax); return $implementation->$solrFunction($query, $startPage, $fq, $dismax);
@ -253,7 +253,7 @@ class SearchClass {
$objectHelper = new ObjectHelper(); $objectHelper = new ObjectHelper();
$resultData = do_curl($searchString, 1); $resultData = do_curl($searchString, 1);
$path = drupal_get_path('module', 'Fedora_Repository'); $path = drupal_get_path('module', 'fedora_repository');
$output .= $this->applySpecifiedXSLT($resultData, $path . '/xsl/browseIndexToResultPage.xslt', $displayName); $output .= $this->applySpecifiedXSLT($resultData, $path . '/xsl/browseIndexToResultPage.xslt', $displayName);
//$output .= '<br />'.$alpha_out; //$output .= '<br />'.$alpha_out;
@ -367,7 +367,7 @@ class SearchClass {
* @param <type> $query the query that was executed. May want to pass this on. * @param <type> $query the query that was executed. May want to pass this on.
*/ */
function applyLuceneXSLT($resultData, $startPage = 1, $xslt_file = '/xsl/results.xsl', $query=NULL) { function applyLuceneXSLT($resultData, $startPage = 1, $xslt_file = '/xsl/results.xsl', $query=NULL) {
$path = drupal_get_path('module', 'Fedora_Repository'); $path = drupal_get_path('module', 'fedora_repository');
$test = $xslt_file; $test = $xslt_file;
$isRestricted = variable_get('fedora_namespace_restriction_enforced', TRUE); $isRestricted = variable_get('fedora_namespace_restriction_enforced', TRUE);
if (!isRestricted && $xslt_file == NULL) { if (!isRestricted && $xslt_file == NULL) {
@ -425,7 +425,7 @@ class SearchClass {
* @return type * @return type
*/ */
function applyXSLT($resultData, $orderBy = 0) { function applyXSLT($resultData, $orderBy = 0) {
$path = drupal_get_path('module', 'Fedora_Repository'); $path = drupal_get_path('module', 'fedora_repository');
$proc = NULL; $proc = NULL;
if (!$resultData) { if (!$resultData) {
//drupal_set_message(t('No Results!')); //drupal_set_message(t('No Results!'));
@ -590,7 +590,7 @@ class SearchClass {
*/ */
function get_search_terms_array($path = NULL, $file = NULL) { function get_search_terms_array($path = NULL, $file = NULL) {
if (!isset($path)) { if (!isset($path)) {
$path = drupal_get_path('module', 'Fedora_Repository'); $path = drupal_get_path('module', 'fedora_repository');
} }
$xmlDoc = new DomDocument(); $xmlDoc = new DomDocument();
if (!isset($file)) { if (!isset($file)) {

6
SecurityClass.inc

@ -71,7 +71,7 @@ class SecurityClass {
try { try {
$xml = new SimpleXMLElement($policyStream); $xml = new SimpleXMLElement($policyStream);
} catch (Exception $e) { } catch (Exception $e) {
watchdog(t("Fedora_Repository"), "No roles found in security policy, could not parse policy stream.", NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), "No roles found in security policy, could not parse policy stream.", NULL, WATCHDOG_ERROR);
//we may not want to send this to the screen. //we may not want to send this to the screen.
drupal_set_message(t('No roles found in security policy, could not parse policy stream: !message', array('!message' => check_plain($e->getMessage()))), 'error'); drupal_set_message(t('No roles found in security policy, could not parse policy stream: !message', array('!message' => check_plain($e->getMessage()))), 'error');
return NULL; return NULL;
@ -108,9 +108,9 @@ class SecurityClass {
function createPersonalPolicy($user) { function createPersonalPolicy($user) {
$doc = new DOMDocument(); $doc = new DOMDocument();
try { try {
$doc->load(drupal_get_path('module', 'Fedora_Repository') . '/policies/noObjectEditPolicy.xml'); $doc->load(drupal_get_path('module', 'fedora_repository') . '/policies/noObjectEditPolicy.xml');
} catch (exception $e) { } catch (exception $e) {
watchdog(t("Fedora_Repository"), "Problem loading policy file.", NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), "Problem loading policy file.", NULL, WATCHDOG_ERROR);
} }
$conditions = $doc->getElementsByTagName('Condition'); $conditions = $doc->getElementsByTagName('Condition');
foreach ($conditions as $condition) { foreach ($conditions as $condition) {

2
XMLDatastream.inc

@ -227,7 +227,7 @@ abstract class XMLDatastream {
* @return boolean $success * @return boolean $success
*/ */
public function saveToFedora() { public function saveToFedora() {
module_load_include('inc', 'Fedora_Repository', 'api/fedora_item'); module_load_include('inc', 'fedora_repository', 'api/fedora_item');
if ($this->validate()) { if ($this->validate()) {
$item = new Fedora_Item($this->pid); $item = new Fedora_Item($this->pid);
$item->modify_datastream_by_value($this->dumpXml(), $this->dsid, $this->name, 'application/xml'); $item->modify_datastream_by_value($this->dumpXml(), $this->dsid, $this->name, 'application/xml');

1
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); $file = $dir . '/' . $ds->label . '.' . get_file_extension($ds->MIMEType);
$paths[$ds->ID] = $file; $paths[$ds->ID] = $file;
//$content = $ob_helper->getDatastreamDissemination($pid, $ds->ID);
if ($content = $ob_helper->getStream($pid, $ds->ID, FALSE)) { if ($content = $ob_helper->getStream($pid, $ds->ID, FALSE)) {
if (!$fp = @fopen($file, 'w')) { 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'); $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');

140
api/fedora_item.inc

@ -7,6 +7,14 @@
define('RELS_EXT_URI', 'info:fedora/fedora-system:def/relations-external#'); define('RELS_EXT_URI', 'info:fedora/fedora-system:def/relations-external#');
define("FEDORA_MODEL_URI", 'info:fedora/fedora-system:def/model#'); define("FEDORA_MODEL_URI", 'info:fedora/fedora-system:def/model#');
define("ISLANDORA_PAGE_URI", 'info:islandora/islandora-system:def/pageinfo#'); 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_INT", 3);
define("RELS_TYPE_DATETIME", 4);
/** /**
* Fedora Item Class * Fedora Item Class
@ -122,6 +130,7 @@ class Fedora_Item {
$datastream_url = drupal_urlencode($datastream_file); $datastream_url = drupal_urlencode($datastream_file);
$url = file_create_url($datastream_url); $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); $return_value = $this->add_datastream_from_url($url, $datastream_id, $datastream_label, $datastream_mimetype, $controlGroup, $logMessage);
if ($original_path != $datastream_file) { if ($original_path != $datastream_file) {
@ -157,7 +166,7 @@ class Fedora_Item {
'pid' => $this->pid, 'pid' => $this->pid,
'dsID' => $datastream_id, 'dsID' => $datastream_id,
'altIDs' => NULL, 'altIDs' => NULL,
'dsLabel' => $datastream_label, 'dsLabel' => truncate_utf8($datastream_label, 255, TRUE, TRUE),
'versionable' => TRUE, 'versionable' => TRUE,
'MIMEType' => $datastream_mimetype, 'MIMEType' => $datastream_mimetype,
'formatURI' => NULL, 'formatURI' => NULL,
@ -169,8 +178,10 @@ class Fedora_Item {
'logMessage' => ($logMessage != NULL) ? $logMessage : 'Ingested object ' . $datastream_id 'logMessage' => ($logMessage != NULL) ? $logMessage : 'Ingested object ' . $datastream_id
); );
$soap_result = $this->soap_call('addDataStream', $params);
return $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;
} }
/** /**
@ -189,6 +200,7 @@ class Fedora_Item {
$tmpfile = fopen($tmpfilename, 'w'); $tmpfile = fopen($tmpfilename, 'w');
fwrite($tmpfile, $str, strlen($str)); fwrite($tmpfile, $str, strlen($str));
fclose($tmpfile); 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); $returnvalue = $this->add_datastream_from_file($tmpfilename, $datastream_id, $datastream_label, $datastream_mimetype, $controlGroup, $logMessage);
unlink($tmpfilename); unlink($tmpfilename);
return $returnvalue; return $returnvalue;
@ -228,11 +240,22 @@ class Fedora_Item {
* The object to be related to. * The object to be related to.
* @param string $namespaceURI * @param string $namespaceURI
* The predicate namespace. * The predicate namespace.
* @param boolean $literal_value * @param int $literal_value
* Whether or not the object should be added as a URI (FALSE) or a literal (TRUE). * Used to type the value.
* - 0: URI
* - 1: plain literal
* - 2: string (explicitly typed)
* - 3: integer
* - 4: dateTime
* @return ???
* Value returned from SOAP call for modify_datastream.
*/ */
function add_relationship($relationship, $object, $namespaceURI = RELS_EXT_URI, $literal_value = FALSE) { function add_relationship($relationship, $object, $namespaceURI = RELS_EXT_URI, $literal_value = RELS_TYPE_URI) {
//dd($this, 'The Fedora_Item'); static $relsextxml = NULL;
if ($relsextxml === NULL) {
$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)) {
@ -247,12 +270,10 @@ RDF;
$relsext = $this->get_datastream_dissemination('RELS-EXT'); $relsext = $this->get_datastream_dissemination('RELS-EXT');
if (!$literal_value && strpos($object, $f_prefix) !== 0) { if ($literal_value == REL_TYPE_URI && strpos($object, $f_prefix) !== 0) {
$object = $f_prefix . $object; $object = $f_prefix . $object;
} }
$relsextxml = new DOMDocument();
$relsextxml->loadXML($relsext); $relsextxml->loadXML($relsext);
$description = $relsextxml->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'Description'); $description = $relsextxml->getElementsByTagNameNS('http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'Description');
if ($description->length == 0) { if ($description->length == 0) {
@ -267,8 +288,20 @@ RDF;
// Create the new relationship node. // Create the new relationship node.
$newrel = $relsextxml->createElementNS($namespaceURI, $relationship); $newrel = $relsextxml->createElementNS($namespaceURI, $relationship);
if ($literal_value) { if ($literal_value > 0) {
$newrel->appendChild($relsextxml->createTextNode($object)); $newrel->appendChild($relsextxml->createTextNode($object));
if ($literal_value == RELS_TYPE_STRING) {
$newrel->setAttribute('rdf:datatype', 'http://www.w3.org/2001/XMLSchema#string');
}
elseif ($literal_value == RELS_TYPE_INT) {
$newrel->setAttribute('rdf:datatype', 'http://www.w3.org/2001/XMLSchema#int');
}
elseif ($literal_value == RELS_TYPE_DATETIME) {
$newrel->setAttribute('rdf:datatype', 'http://www.w3.org/2001/XMLSchema#dateTime');
}
else {
//plain literal.
}
} }
else { else {
$newrel->setAttribute('rdf:resource', $object); $newrel->setAttribute('rdf:resource', $object);
@ -276,7 +309,7 @@ RDF;
$description->appendChild($newrel); $description->appendChild($newrel);
$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());
/* /*
$params = array( 'pid' => $this->pid, $params = array( 'pid' => $this->pid,
@ -301,8 +334,8 @@ RDF;
* The object to be related to. (NULL/value for which empty() evaluates to true will remove all relations of the given type, ignoring $literal_value) * The object to be related to. (NULL/value for which empty() evaluates to true will remove all relations of the given type, ignoring $literal_value)
* @param string $namespaceURI * @param string $namespaceURI
* The predicate namespace. * The predicate namespace.
* @param boolean $literal_value * @param int $literal_value
* Whether or not the object should be looked for as a URI (FALSE) or a literal (TRUE). * Same as add_relationship. NOTE: dateTime implemented.
* @return boolean * @return boolean
* Whether or not this operation has produced any changes in the RELS-EXT * Whether or not this operation has produced any changes in the RELS-EXT
*/ */
@ -317,8 +350,10 @@ RDF;
foreach ($rels as $rel) { foreach ($rels as $rel) {
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 && $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 && $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_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;
} }
@ -482,6 +517,12 @@ RDF;
* @return null * @return null
*/ */
function get_datastream_dissemination($dsid, $as_of_date_time = "", $quiet=TRUE) { function get_datastream_dissemination($dsid, $as_of_date_time = "", $quiet=TRUE) {
if (!array_key_exists($dsid, $this->datastreams)) {
watchdog('fedora_repository', 'Requested invalid datastream dissemination @dsid on object @pid',
array('@dsid' => $dsid, '@pid' => $pid));
return NULL;
}
$params = array( $params = array(
'pid' => $this->pid, 'pid' => $this->pid,
'dsID' => $dsid, 'dsID' => $dsid,
@ -506,13 +547,18 @@ RDF;
* @param type $as_of_date_time * @param type $as_of_date_time
* @return type * @return type
*/ */
function get_datastream($dsid, $as_of_date_time = '') { function get_datastream($dsid, $as_of_date_time = '', $quiet = TRUE) {
if (!array_key_exists($dsid, $this->datastreams)) {
watchdog('fedora_repository', 'Requested invalid datastream dissemination @dsid on object @pid',
array('@dsid' => $dsid, '@pid' => $pid));
return NULL;
}
$params = array( $params = array(
'pid' => $this->pid, 'pid' => $this->pid,
'dsID' => $dsid, 'dsID' => $dsid,
'asOfDateTime' => $as_of_date_time, 'asOfDateTime' => $as_of_date_time,
); );
$object = self::soap_call('getDatastream', $params); $object = self::soap_call('getDatastream', $params, $quiet);
return $object->datastream; return $object->datastream;
} }
@ -635,8 +681,12 @@ RDF;
// datastream, instead of returning it as an array, only // datastream, instead of returning it as an array, only
// the single item will be returned directly. We have to // the single item will be returned directly. We have to
// check for this. // check for this.
if (count($this->datastreams_list->datastreamDef) > 1) { $xml_list = $this->datastreams_list->datastreamDef;
foreach ($this->datastreams_list->datastreamDef as $ds) { if (!is_array($this->datastreams_list->datastreamDef)) {
$xml_list = array($xml_list);
}
foreach ($xml_list as $ds) {
if (!is_object($ds)) { if (!is_object($ds)) {
print_r($ds); print_r($ds);
} }
@ -645,13 +695,6 @@ RDF;
$ds_list[$ds->ID]['URL'] = $this->url() . '/' . $ds->ID . '/' . drupal_urlencode($ds->label); $ds_list[$ds->ID]['URL'] = $this->url() . '/' . $ds->ID . '/' . drupal_urlencode($ds->label);
} }
} }
else {
$ds = $this->datastreams_list->datastreamDef;
$ds_list[$ds->ID]['label'] = $ds->label;
$ds_list[$ds->ID]['MIMEType'] = $ds->MIMEType;
$ds_list[$ds->ID]['URL'] = $this->url() . '/' . $ds->ID . '/' . drupal_urlencode($ds->label);
}
}
return $ds_list; return $ds_list;
} }
@ -772,9 +815,9 @@ RDF;
/** /**
* Set the object to a deleted state * Set the object to a deleted state
*/ */
function move_to_trash($log_message = 'Flagged deleted using Islandora API.') { function move_to_trash($log_message = 'Flagged deleted using Islandora API.', $quiet = TRUE) {
// Loop through the datastreams and mark them deleted // Loop through the datastreams and mark them deleted
foreach ($this->get_datastreams_list_as_array() as $dsid) { foreach ($this->get_datastreams_list_as_array() as $dsid => $info) {
$this->set_datastream_state($dsid, 'D'); $this->set_datastream_state($dsid, 'D');
} }
@ -782,7 +825,7 @@ RDF;
$params = array( $params = array(
'pid' => $this->pid, 'pid' => $this->pid,
'state' => 'D', 'state' => 'D',
'logMessage' => $logMessage, 'logMessage' => $log_message,
'label' => $this->objectProfile->objLabel, 'label' => $this->objectProfile->objLabel,
'ownerId' => null, 'ownerId' => null,
); );
@ -831,7 +874,10 @@ RDF;
'logMessage' => $log_message, 'logMessage' => $log_message,
'force' => $force, '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;
} }
/** /**
@ -847,11 +893,10 @@ RDF;
/** /**
* Get Next PID in Namespace * Get Next PID in Namespace
* @param type $pid_namespace * @param $pid_namespace string
* @return type * @return string
*/ */
static function get_next_PID_in_namespace($pid_namespace = '') { static function get_next_PID_in_namespace($pid_namespace = '', $number_of_pids = 1) {
if (empty($pid_namespace)) { if (empty($pid_namespace)) {
// Just get the first one in the config settings. // Just get the first one in the config settings.
$allowed_namespaces = explode(" ", variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora: ilives: islandora-book: books: newspapers: ')); $allowed_namespaces = explode(" ", variable_get('fedora_pids_allowed', 'default: demo: changeme: islandora: ilives: islandora-book: books: newspapers: '));
@ -865,11 +910,12 @@ RDF;
} }
$params = array( $params = array(
'numPIDs' => '', 'numPIDs' => $number_of_pids,
'pidNamespace' => $pid_namespace, 'pidNamespace' => $pid_namespace,
); );
$result = self::soap_call('getNextPID', $params); $result = self::soap_call('getNextPID', $params);
return $result->pid; return $result->pid;
} }
@ -885,7 +931,6 @@ RDF;
'logMessage' => 'Fedora Object Ingested' 'logMessage' => 'Fedora Object Ingested'
); );
$object = self::soap_call('ingest', $params); $object = self::soap_call('ingest', $params);
//dd($object, 'Soap return');
return new Fedora_Item($object->objectPID); return new Fedora_Item($object->objectPID);
} }
@ -925,11 +970,11 @@ RDF;
/** /**
* Modify Object * Modify Object
* @param type $label * @param $label string
* @param type $state * @param $state string
* @param type $ownerId * @param $ownerId string
* @param type $logMessage * @param $logMessage string
* @param type $quiet * @param $quiet boolean
* @return type * @return type
*/ */
function modify_object($label = '', $state = NULL, $ownerId = NULL, $logMessage = 'Modified by Islandora API', $quiet=TRUE) { function modify_object($label = '', $state = NULL, $ownerId = NULL, $logMessage = 'Modified by Islandora API', $quiet=TRUE) {
@ -969,6 +1014,8 @@ RDF;
* Error suppression? Refer to soap_call for usage (just passed along here). * Error suppression? Refer to soap_call for usage (just passed along here).
*/ */
function modify_datastream($filename_or_content, $dsid, $label, $mime_type, $force = FALSE, $logMessage='Modified by Islandora API', $quiet=FALSE) { 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 //Determine if it's inline xml; if it is, modify by value
if ($this->get_datastream($dsid)->controlGroup === 'X') { if ($this->get_datastream($dsid)->controlGroup === 'X') {
$content = '<null/>'; $content = '<null/>';
@ -979,7 +1026,7 @@ RDF;
$content = $filename_or_content; $content = $filename_or_content;
} }
$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.
else { else {
@ -1000,12 +1047,14 @@ RDF;
$file_url = file_create_url($file); $file_url = file_create_url($file);
$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;
} }
/** /**
@ -1142,6 +1191,7 @@ RDF;
$pid = self::get_next_PID_in_namespace(); $pid = self::get_next_PID_in_namespace();
} }
if (empty($owner)) { if (empty($owner)) {
global $user;
if (!empty($user->uid)) { // Default to current Drupal user. if (!empty($user->uid)) { // Default to current Drupal user.
$owner = $user->uid; $owner = $user->uid;
} }
@ -1164,7 +1214,7 @@ RDF;
$label_property = $foxml->createElementNS("info:fedora/fedora-system:def/foxml#", "foxml:property"); $label_property = $foxml->createElementNS("info:fedora/fedora-system:def/foxml#", "foxml:property");
$label_property->setAttribute("NAME", "info:fedora/fedora-system:def/model#label"); $label_property->setAttribute("NAME", "info:fedora/fedora-system:def/model#label");
$label_property->setAttribute("VALUE", $label); $label_property->setAttribute("VALUE", truncate_utf8($label, 255, TRUE, TRUE));
$owner_property = $foxml->createElementNS("info:fedora/fedora-system:def/foxml#", "foxml:property"); $owner_property = $foxml->createElementNS("info:fedora/fedora-system:def/foxml#", "foxml:property");
$owner_property->setAttribute("NAME", "info:fedora/fedora-system:def/model#ownerId"); $owner_property->setAttribute("NAME", "info:fedora/fedora-system:def/model#ownerId");

21
api/fedora_utils.inc

@ -85,7 +85,7 @@ function do_curl($url, $return_to_variable = 1, $number_of_post_vars = 0, $post
* an array that consists of three value or NULL if curl is not suported: * an array that consists of three value or NULL if curl is not suported:
* - element 0: * - element 0:
* The value returned from the curl_exec function call. * The value returned from the curl_exec function call.
* This is either a TRUE or FALSE value or the actual data returned from * This is either a boolean value or the actual data returned from
* accessing the URL. * accessing the URL.
* - element 1: * - element 1:
* The error code reslting from attempting to access the URL with curl_exec * The error code reslting from attempting to access the URL with curl_exec
@ -93,7 +93,7 @@ function do_curl($url, $return_to_variable = 1, $number_of_post_vars = 0, $post
* A string representing a textual representation of the error code that * A string representing a textual representation of the error code that
* resulted from attempting to access the URL with curl_exec * resulted from attempting to access the URL with curl_exec
*/ */
function do_curl_ext($url, $return_to_variable = 1, $number_of_post_vars = 0, $post = NULL) { function do_curl_ext($url, $return_to_variable = TRUE, $number_of_post_vars = 0, $post = NULL) {
global $user; global $user;
// Check if we are inside Drupal and there is a valid user. // Check if we are inside Drupal and there is a valid user.
@ -113,7 +113,7 @@ function do_curl_ext($url, $return_to_variable = 1, $number_of_post_vars = 0, $p
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_FAILONERROR, TRUE); // Fail on errors curl_setopt($ch, CURLOPT_FAILONERROR, TRUE); // Fail on errors
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // allow redirects curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // allow redirects
curl_setopt($ch, CURLOPT_TIMEOUT, 90); // times out after 90s curl_setopt($ch, CURLOPT_TIMEOUT, 90); // times out after 90s
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, $return_to_variable); // return into a variable curl_setopt($ch, CURLOPT_RETURNTRANSFER, $return_to_variable); // return into a variable
@ -244,8 +244,19 @@ function get_collections_as_option_array() {
and $object <fedora-model:state> <info:fedora/fedora-system:def/model#Active>) and $object <fedora-model:state> <info:fedora/fedora-system:def/model#Active>)
order by $title'; order by $title';
$url = variable_get('fedora_repository_url', 'http://localhost:8080/fedora/risearch'); $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))); $options = array(
'type' => 'tuples',
'flush' => 'TRUE',
'format' => 'csv',
'limit' => '1000',
'lang' => 'itql',
'stream' => 'on',
'query' => $query,
);
//The url function will take care of URL encoding...
$content = do_curl(url($url, array('query' => $options)));
$list = explode("\n", $content); $list = explode("\n", $content);
array_shift($list); array_shift($list);
$list = preg_replace('/info:fedora\//', '', $list); $list = preg_replace('/info:fedora\//', '', $list);

43
fedora_repository.install

@ -34,71 +34,70 @@ function fedora_collections_enable() {
* @see _update_cron_notify() * @see _update_cron_notify()
*/ */
function fedora_repository_requirements($phase) { function fedora_repository_requirements($phase) {
global $base_url;
$requirements = array(); $requirements = array();
$t = get_t(); //May not have access to the regular t() function; and so Drupal provides...
if ($phase == 'install') { if ($phase == 'install') {
// Test for SOAP // Test for SOAP
$requirements['fedora-soap']['title'] = t("PHP SOAP extension library"); $requirements['fedora-soap']['title'] = $t("PHP SOAP extension library");
if (!class_exists('SoapClient')) { if (!class_exists('SoapClient')) {
$requirements['fedora-soap']['value'] = t("Not installed"); $requirements['fedora-soap']['value'] = $t("Not installed");
$requirements['fedora-soap']['severity'] = REQUIREMENT_ERROR; $requirements['fedora-soap']['severity'] = REQUIREMENT_ERROR;
$requirements['fedora-soap']['description'] = t('Ensure that the PHP SOAP extension is installed.'); $requirements['fedora-soap']['description'] = $t('Ensure that the PHP SOAP extension is installed.');
} }
else { else {
$requirements['fedora-soap']['value'] = t("Installed"); $requirements['fedora-soap']['value'] = $t("Installed");
$requirements['fedora-soap']['severity'] = REQUIREMENT_OK; $requirements['fedora-soap']['severity'] = REQUIREMENT_OK;
} }
// Test for Curl // Test for Curl
$requirements['curl']['title'] = "PHP Curl extension library"; $requirements['curl']['title'] = $t('PHP Curl extension library');
if (!function_exists('curl_init')) { if (!function_exists('curl_init')) {
$requirements['curl']['value'] = t("Not installed"); $requirements['curl']['value'] = $t("Not installed");
$requirements['curl']['severity'] = REQUIREMENT_ERROR; $requirements['curl']['severity'] = REQUIREMENT_ERROR;
$requirements['curl']['description'] = t("Ensure that the PHP Curl extension is installed."); $requirements['curl']['description'] = $t("Ensure that the PHP Curl extension is installed.");
} }
else { else {
$requirements['curl']['value'] = t("Installed"); $requirements['curl']['value'] = $t("Installed");
$requirements['curl']['severity'] = REQUIREMENT_OK; $requirements['curl']['severity'] = REQUIREMENT_OK;
} }
// Test for DOM // Test for DOM
$requirements['dom']['title'] = "PHP DOM XML extension library"; $requirements['dom']['title'] = $t("PHP DOM XML extension library");
if (!method_exists('DOMDocument', 'loadHTML')) { if (!method_exists('DOMDocument', 'loadHTML')) {
$requirements['dom']['value'] = t("Not installed"); $requirements['dom']['value'] = $t("Not installed");
$requirements['dom']['severity'] = REQUIREMENT_ERROR; $requirements['dom']['severity'] = REQUIREMENT_ERROR;
$requirements['dom']['description'] = t("Ensure that the PHP DOM XML extension is installed."); $requirements['dom']['description'] = $t("Ensure that the PHP DOM XML extension is installed.");
} }
else { else {
$requirements['dom']['value'] = t("Installed"); $requirements['dom']['value'] = $t("Installed");
$requirements['dom']['severity'] = REQUIREMENT_OK; $requirements['dom']['severity'] = REQUIREMENT_OK;
} }
// Test for XSLT // Test for XSLT
$requirements['xsl']['title'] = "PHP XSL extension library"; $requirements['xsl']['title'] = $t("PHP XSL extension library");
if (!class_exists('XSLTProcessor')) { if (!class_exists('XSLTProcessor')) {
$requirements['xslt']['value'] = t("Not installed"); $requirements['xslt']['value'] = $t("Not installed");
$requirements['xslt']['severity'] = REQUIREMENT_ERROR; $requirements['xslt']['severity'] = REQUIREMENT_ERROR;
$requirements['xslt']['description'] = t("Ensure that the PHP XSL extension is installed."); $requirements['xslt']['description'] = $t("Ensure that the PHP XSL extension is installed.");
} }
else { else {
$requirements['xslt']['value'] = t("Installed"); $requirements['xslt']['value'] = $t("Installed");
$requirements['xslt']['severity'] = REQUIREMENT_OK; $requirements['xslt']['severity'] = REQUIREMENT_OK;
} }
} }
elseif ($phase == 'runtime') { elseif ($phase == 'runtime') {
module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); module_load_include('inc', 'fedora_repository', 'api/fedora_utils');
$requirements['fedora-repository']['title'] = t("Fedora server"); $requirements['fedora-repository']['title'] = $t("Fedora server");
if (!fedora_available()) { if (!fedora_available()) {
$requirements['fedora-repository']['value'] = t("Not available"); $requirements['fedora-repository']['value'] = $t("Not available");
$requirements['fedora-repository']['severity'] = REQUIREMENT_ERROR; $requirements['fedora-repository']['severity'] = REQUIREMENT_ERROR;
$requirements['fedora-repository']['description'] = t('Ensure that Fedora is running and that the <a href="@collection-settings">collection settings</a> are correct.', array('@collection-settings' => $base_url . '/admin/settings/fedora_repository')); $requirements['fedora-repository']['description'] = $t('Ensure that Fedora is running and that the <a href="@collection-settings">collection settings</a> are correct.', array('@collection-settings' => url('admin/settings/fedora_repository')));
} }
else { else {
$requirements['fedora-repository']['value'] = t("Available"); $requirements['fedora-repository']['value'] = $t("Available");
$requirements['fedora-repository']['severity'] = REQUIREMENT_OK; $requirements['fedora-repository']['severity'] = REQUIREMENT_OK;
} }
} }

434
fedora_repository.module

@ -2,8 +2,7 @@
/** /**
* Drupal hook for admin form * Drupal hook for admin form
* fedora_repository_name is the name of the top level collection this module will query *
* fedora_repository_pid is the name of the top level pid.
* Stores this info in the drupal variables table. * Stores this info in the drupal variables table.
* the name and pid can also be passed as url parameters * the name and pid can also be passed as url parameters
*/ */
@ -378,41 +377,30 @@ function add_stream_form_submit($form, &$form_state) {
$form_state['rebuild'] = TRUE; $form_state['rebuild'] = TRUE;
return; return;
} }
module_load_include('inc', 'fedora_repository', 'MimeClass');
module_load_include('inc', 'fedora_repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper');
module_load_include('inc', 'fedora_repository', 'api/fedora_item'); module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$pathToModule = drupal_get_path('module', 'fedora_repository'); $pathToModule = drupal_get_path('module', 'fedora_repository');
$file = $form_state['values']['add-stream-file-location'];
$pid = $form_state['values']['pid']; $pid = $form_state['values']['pid'];
$dsid = $form_state['values']['stream_id']; $dsid = $form_state['values']['stream_id'];
$dsLabel = $form_state['values']['stream_label'] . substr($file, strrpos($file, '.')); // Add the file extention to the end of the label.; $dsLabel = $form_state['values']['stream_label'] . substr($form_state['storage']['stream_url'], strrpos($form_state['storage']['stream_url'], '.')); // Add the file extention to the end of the label.;
$file_basename = basename($file);
$file_directory = dirname($file);
$streamUrl = $base_url . '/' . $file_directory . '/' . drupal_urlencode($file_basename);
/* -----------------------------------------------------------------
* need a better way to get mimetypes
*/
$mimetype = new MimeClass();
$dformat = $mimetype->getType($file);
$controlGroup = "M";
if ($dformat == 'text/xml') {
$controlGroup = 'X';
}
try { try {
$item = new Fedora_Item($pid); $item = new Fedora_Item($pid);
$item->add_datastream_from_url($streamUrl, $dsid, $dsLabel, $dformat, $controlGroup); $item->add_datastream_from_url($form_state['storage']['stream_url'], $dsid, $dsLabel, $form_state['storage']['ds_mimetype'], $form_state['storage']['control_group']);
if ($file = $form_state['values']['add-stream-file-location']) {
$object_helper = new ObjectHelper(); $object_helper = new ObjectHelper();
$object_helper->get_and_do_datastream_rules($pid, $dsid, $file); $object_helper->get_and_do_datastream_rules($pid, $dsid, $file);
file_delete($file); file_delete($file);
}
} catch (exception $e) { } catch (exception $e) {
drupal_set_message(t('@message', array('@message' => check_plain($e->getMessage()))), 'error'); drupal_set_message(t('@message', array('@message' => check_plain($e->getMessage()))), 'error');
return; return;
} }
unset($form_state['storage']); //Using storage; need to unset it for forms to work properly...
$form_state['rebuild'] = TRUE; $form_state['rebuild'] = TRUE;
} }
@ -435,6 +423,7 @@ function add_stream_form(&$form_state, $pid) {
* @return type * @return type
*/ */
function add_stream_form_validate($form, &$form_state) { function add_stream_form_validate($form, &$form_state) {
module_load_include('inc', 'fedora_repository', 'MimeClass');
if ($form_state['clicked_button']['#value'] == 'OK') { if ($form_state['clicked_button']['#value'] == 'OK') {
$form_state['rebuild'] = TRUE; $form_state['rebuild'] = TRUE;
return; return;
@ -445,15 +434,15 @@ function add_stream_form_validate($form, &$form_state) {
form_set_error('', t('Data stream ID cannot be more than 64 characters.')); form_set_error('', t('Data stream ID cannot be more than 64 characters.'));
return FALSE; return FALSE;
} }
if (!(preg_match("/^[a-zA-Z]/", $dsid))) { elseif (!(preg_match("/^[a-zA-Z]/", $dsid))) {
form_set_error('', t("Data stream ID (@dsid) has to start with a letter.", array('@dsid' => check_plain($dsid)))); form_set_error('', t("Data stream ID (@dsid) has to start with a letter.", array('@dsid' => $dsid)));
return FALSE; return FALSE;
} }
if (strlen($dsLabel) > 64) { elseif (strlen($dsLabel) > 64) {
form_set_error('', t('Data stream Label cannot be more than 64 characters.')); form_set_error('', t('Data stream Label cannot be more than 64 characters.'));
return FALSE; return FALSE;
} }
if (strpos($dsLabel, '/')) { elseif (strpos($dsLabel, '/') !== FALSE) {
form_set_error('', t('Data stream Label cannot contain a "/".')); form_set_error('', t('Data stream Label cannot contain a "/".'));
return FALSE; return FALSE;
} }
@ -463,12 +452,35 @@ function add_stream_form_validate($form, &$form_state) {
// 'file_validate_size' => array(30 * 1024), // 'file_validate_size' => array(30 * 1024),
); );
$fileObject = file_save_upload('add-stream-file-location', $validators); $controlGroup = $form_state['storage']['control_group'] = $form_state['values']['control_group'];
if ((($controlGroup && in_array($controlGroup, array('X', 'M'))) || !$controlGroup) && (($fileObject = file_save_upload('add-stream-file-location', $validators)))) {
// Move the uploaded file to Drupal's files directory.
$file_path = $fileObject->filepath;
file_move($file_path, 0, FILE_EXISTS_RENAME);
$form_state['values']['add-stream-file-location'] = $file_path;
// Move the uploaded file to Drupal's files directory. $form_state['storage']['stream_url'] = file_create_url($file_path);
file_move($fileObject->filepath, 0, 'FILE_EXISTS_RENAME'); }
$form_state['values']['add-stream-file-location'] = $fileObject->filepath; elseif ($controlGroup && in_array($controlGroup, array('M', 'R', 'E')) && ($ref = $form_state['values']['ds_reference'])) {
// TODO: Add error checking here. $form_state['storage']['stream_url'] = $form_state['values']['ds_reference'];
}
else {
form_set_error('', t('No file given when "X" or "M", or no reference given when "M", "R" or "E".'));
}
$mimeClass = new MimeClass();
$mimetype = $form_state['storage']['ds_mimetype'] = $mimeClass->getType($form_state['storage']['stream_url']);
if (!$controlGroup) {
if ($mimetype == 'text/xml') {
$form_state['storage']['control_group'] = 'X';
}
else {
$form_state['storage']['control_group'] = 'M';
}
}
// TODO: Add error checking here.
$form_state['rebuild'] = FALSE; $form_state['rebuild'] = FALSE;
} }
@ -605,7 +617,44 @@ function fedora_repository_purge_stream_form_submit($form, &$form_state) {
} catch (exception $e) { } catch (exception $e) {
drupal_set_message(t('@message', array('@message' => check_plain($e->getMessage()))), 'error'); drupal_set_message(t('@message', array('@message' => check_plain($e->getMessage()))), 'error');
} }
$form_state['redirect'] = $base_url . "/fedora/repository/$pid"; $form_state['redirect'] = "fedora/repository/$pid";
}
function fedora_repository_download_datastream_form(&$form_state, $pid, $dsid, $label) {
module_load_include('inc', 'fedora_repository', 'ObjectHelper');
$form = array(
'#action' => url("fedora/repository/object_download/$pid/$dsid/$label"),
'submit' => array(
'#type' => 'submit',
'#value' => t('Download'),
),
);
if (user_access(ObjectHelper::$EDIT_FEDORA_METADATA)) {
$item = new Fedora_Item($pid);
$versions = $item->get_datastream_history($dsid);
$version_array = array();
if (is_array($versions)) {
foreach ($versions as $version) {
$version_array[] = $version->createDate;
}
}
else {
$version_array[] = $versions->createDate;
}
if (count($version_array) > 1) {
$form['#attributes'] = array(
'onsubmit' => 'this.action="' . $form['#action'] . '/" + this.version.value;'
);
$form['version'] = array(
'#type' => 'select',
'#options' => array_combine($version_array, $version_array),
);
}
}
return $form;
} }
/** /**
@ -635,7 +684,7 @@ function fedora_repository_replace_stream($pid, $dsId, $dsLabel = '', $collectio
* @return type * @return type
*/ */
function fedora_repository_replace_stream_form(&$form_state, $pid, $dsId, $dsLabel) { function fedora_repository_replace_stream_form(&$form_state, $pid, $dsId, $dsLabel) {
module_load_include('inc', 'Fedora_Repository', 'formClass'); module_load_include('inc', 'fedora_repository', 'formClass');
$replaceDataStreamForm = new formClass(); $replaceDataStreamForm = new formClass();
return $replaceDataStreamForm->createReplaceDataStreamForm($pid, $dsId, $dsLabel, $form_state); return $replaceDataStreamForm->createReplaceDataStreamForm($pid, $dsId, $dsLabel, $form_state);
} }
@ -647,29 +696,37 @@ function fedora_repository_replace_stream_form(&$form_state, $pid, $dsId, $dsLab
* @return type * @return type
*/ */
function fedora_repository_replace_stream_form_validate($form, &$form_state) { function fedora_repository_replace_stream_form_validate($form, &$form_state) {
// If a file was uploaded, process it. // If a file was uploaded, process it.
if (isset($_FILES['files']) && is_uploaded_file($_FILES['files']['tmp_name']['file'])) { if (isset($_FILES['files']) && is_uploaded_file($_FILES['files']['tmp_name']['file'])) {
// attempt to save the uploaded file // attempt to save the uploaded file
$file = file_save_upload('file', array(), file_directory_path()); $file = file_save_upload('file', array(), file_directory_path());
// set error is file was not uploaded // set error is file was not uploaded
if (!$file) { if (!$file) {
form_set_error('file', 'Error uploading file.'); form_set_error('file', 'Error uploading file.');
return; return;
} }
/* -----------------------------------------------------------------
* TODO: need a better way to get mimetypes
*/
$doc = new DOMDocument(); $doc = new DOMDocument();
module_load_include('inc', 'Fedora_Repository', 'MimeClass'); module_load_include('inc', 'fedora_repository', 'MimeClass');
$mime = new MimeClass(); $mime = new MimeClass();
if ($mime->getType($file->filepath) == 'text/xml' && !$doc->load($file->filepath)) { $mimetype = $form_state['storage']['mime_type'] = $mime->getType($file->filepath);
form_set_error('file', 'Invalid XML format.');
if ($mimetype == 'text/xml' && !DOMDocument::load($file->filepath)) {
form_set_error('file', 'Invalid XML format. (XML could not be parsed)');
return; return;
} }
// set files to form_state, to process when form is submitted // set files to form_state, to process when form is submitted
$form_state['values']['file'] = $file; $form_state['values']['file'] = $file;
} }
elseif (!$form_state['values']['ds_reference']) {
form_set_error('', 'Need either a file or a reference!');
}
} }
/** /**
@ -679,46 +736,30 @@ function fedora_repository_replace_stream_form_validate($form, &$form_state) {
* @param array $form_state * @param array $form_state
*/ */
function fedora_repository_replace_stream_form_submit($form, &$form_state) { function fedora_repository_replace_stream_form_submit($form, &$form_state) {
global $base_url;
$file = $form_state['values']['file']; $file = $form_state['values']['file'];
$pid = $form_state['values']['pid']; $pid = $form_state['values']['pid'];
$dsid = $form_state['values']['dsId']; $dsid = $form_state['values']['dsId'];
$dsLabel = $form_state['values']['dsLabel']; $dsLabel = $form_state['values']['dsLabel'];
// Remove the original file extension from the label and add the new one
$indexOfDot = strrpos($dsLabel, '.'); //use strrpos to get the last dot
if ($indexOfDot !== FALSE) {
$dsLabel = substr($dsLabel, 0, $indexOfDot);
$dsLabel .= substr($file->filename, strrpos($file->filename, '.')); // Add the file extention to the end of the label.;
}
module_load_include('inc', 'Fedora_Repository', 'MimeClass');
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$file_basename = basename($file->filepath); $streamUrl = ($file !== NULL) ?
$file_directory = dirname($file->filepath); file_create_url($file->filepath):
$streamUrl = $base_url . '/' . $file_directory . '/' . urlencode($file_basename); url($form_state['values']['reference'], array('absolute' => TRUE));
/* ----------------------------------------------------------------- // Remove the original file extension from the label and add the new one
* TODO: need a better way to get mimetypes // use strrpos to get the last dot
*/ if (($indexOfDot = strrpos($dsLabel, '.')) !== FALSE) {
$mimetype = new MimeClass(); $dsLabel = substr($dsLabel, 0, $indexOfDot) .
$dformat = $mimetype->getType($file->filepath); substr($streamUrl, strrpos($streamUrl, '.')); // Add the file extention to the end of the label.
}
$item = new Fedora_Item($pid); $dformat = $form_state['storage']['mime_type'];
$info = $item->get_datastream_info($dsid);
if($info->datastream->controlGroup == 'M') { module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$item->modify_datastream_by_reference($streamUrl, $dsid, $dsLabel, $dformat); $item = new Fedora_Item($pid);
} elseif ($info->datastream->controlGroup == 'X') { $item->modify_datastream($streamUrl, $dsid, $dsLabel, $dformat);
if($dformat == 'text/xml') {
$item->modify_datastream_by_value(file_get_contents($file->filepath), $dsid, $dsLabel, $dformat);
}
else {
drupal_set_message('File must be of mimetype text/xml in order to replace inline XML datastream.', 'error');
}
} else {
drupal_set_message('Cannot replace Redirect or Managed Datastream.', 'error');
}
unset($form_state['storage']);
$form_state['redirect'] = 'fedora/repository/' . $pid; $form_state['redirect'] = 'fedora/repository/' . $pid;
} }
@ -870,7 +911,7 @@ function fedora_repository_perm() {
* @param type $account * @param type $account
* @return type * @return type
*/ */
function fedora_repository_access($op, $node, $account) { function fedora_repository_access($op, $node = NULL, $account = NULL) {
module_load_include('inc', 'fedora_repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper');
$objectHelper = new ObjectHelper(); $objectHelper = new ObjectHelper();
return $objectHelper->fedora_repository_access($op, $node, $account); return $objectHelper->fedora_repository_access($op, $node, $account);
@ -913,17 +954,97 @@ function makeObject($pid, $dsID) {
} }
/** /**
* Sends an ITQL query to the Fedora Resource index (can only communicate with Kowari or mulgara) * Implementation of hook_islandora_tabs().
* Reads the pid and datastream id as url parameters. Queries the collection object for the query
* if there is no query datastream falls back to the query shipped with the module.
* *
* @global type $user * @param $content_models array
* @param type $pid * An array of ContentModel objects to which the current Fedora Object
* @param type $dsId * subscribes.
* @param type $collection * @param $pid string
* @param type $page_number * A string containing the Fedora PID of the current Fedora Object.
* @param type $limit * @param $page_number integer
* @return type * An integer for which page we should start on in the loaded object.
* @return array
* An array containing a tabset (an array of tabpages), renderable with
* drupal_render().
*/
function fedora_repository_islandora_tabs($content_models, $pid, $page_number) {
$cmodels_tabs = array();
foreach ($content_models as $content_model) {
$content_model_fieldset = $content_model->displayExtraFieldset($pid, $page_number);
// Each content model may return either a tabpage array or plain HTML. If
// it is HTML, stick it in a tabpage.
if (is_array($content_model_fieldset)) {
$cmodels_tabs = array_merge($cmodels_tabs, $content_model_fieldset);
}
else {
$cmodels_tabs[$content_model->pid] = array(
'#type' => 'tabpage',
'#title' => $content_model->name,
'#content' => $content_model_fieldset,
);
}
}
//can disable showing the object details tab in admin UI
if (variable_get('fedora_repository_show_object_details_tab', TRUE)) {
// Add a 'manage object' tab for all objects, where detailed list of content is shown.
// XXX: Perhaps this should be extracted into its own object?
module_load_include('inc', 'fedora_repository', 'plugins/FedoraObjectDetailedContent');
$obj = new FedoraObjectDetailedContent($pid);
$object_details = $obj->showFieldSets();
$cmodels_tabs = array_merge($cmodels_tabs, $object_details);
}
return $cmodels_tabs;
}
/**
* Implementation of hook_islandora_tabs_alter().
*
* @param &$tabs array
* The array of tabs/tabset to alter.
* @param $params array
* An associative array containing the parameters with which the original
* hook was called.
* @see fedora_repository_get_items()
*/
function fedora_repository_islandora_tabs_alter(&$tabs, $params) {
//Deselect all other tabs if the fedora_object_details tab is supposed
// to be selected.
$object_details_key = 'fedora_object_details';
if ($tabs[$object_details_key]['#selected']) {
foreach (element_children($tabs) as $key) {
if ($key != $object_details_key) {
$tabs[$key]['#selected'] = FALSE;
}
}
}
}
/**
* Menu callback for "fedora/repository".
*
* If user is allow, and we are given a PID and a sensical DSID, return the
* datastream via the makeObject() function; otherwise, call out to the PIDs'
* ContentModels and all Drupal modules for Islandora tabs.
*
* @global $user stdObject
* @param $pid string
* An optional string containing the PID of an object. (defaults to islandora:root)
* @param $dsId string
* An optional string containing the dsid of an object. ("-" will be ignored
* to allow later parameters without including one).
* @param $collection string
* The collection name... Deprecated.
* @param $page_number string/integer(?)
* A page number to start on... Seems to be going towards deprecation?
* @param $limit string/integer(?)
* Used to limit the number of results returned? Deprecated?
* @return string
* A string containing markup for the rendered tabs.
*/ */
function fedora_repository_get_items($pid = NULL, $dsId = NULL, $collection = NULL, $page_number = NULL, $limit = NULL) { function fedora_repository_get_items($pid = NULL, $dsId = NULL, $collection = NULL, $page_number = NULL, $limit = NULL) {
module_load_include('inc', 'fedora_repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper');
@ -945,7 +1066,7 @@ function fedora_repository_get_items($pid = NULL, $dsId = NULL, $collection = NU
$pid = variable_get('fedora_repository_pid', 'islandora:root'); $pid = variable_get('fedora_repository_pid', 'islandora:root');
} }
$item = new fedora_item($pid); $item = new Fedora_Item($pid);
if (!$item->exists()) { if (!$item->exists()) {
drupal_not_found(); drupal_not_found();
exit(); exit();
@ -984,56 +1105,31 @@ function fedora_repository_get_items($pid = NULL, $dsId = NULL, $collection = NU
return makeObject($pid, $dsId); return makeObject($pid, $dsId);
} }
$content = '<div id="content-fedora">';
module_load_include('inc', 'fedora_repository', 'CollectionClass');
$collectionClass = new CollectionClass();
module_load_include('inc', 'fedora_repository', 'ContentModel');
module_load_include('inc', 'fedora_repository', 'plugins/FedoraObjectDetailedContent');
$breadcrumbs = array(); $breadcrumbs = array();
$objectHelper->getBreadcrumbs($pid, $breadcrumbs); $objectHelper->getBreadcrumbs($pid, $breadcrumbs);
drupal_set_breadcrumb(array_reverse($breadcrumbs)); drupal_set_breadcrumb(array_reverse($breadcrumbs));
$offset = $limit * $page_number; drupal_set_title(truncate_utf8($item->objectProfile->objLabel, 56, TRUE, TRUE));
$content_models = $objectHelper->get_content_models_list($pid); $content_models = $objectHelper->get_content_models_list($pid);
// Each content model may return either a tabset array or plain HTML. If it's HTML, stick it in a tab.
//Get the tabs from all modules...
$hook_tabs = module_invoke_all('islandora_tabs', $content_models, $pid, $page_number);
$cmodels_tabs = array( $cmodels_tabs = array(
'#type' => 'tabset', '#type' => 'tabset',
); );
foreach ($content_models as $content_model) { $cmodels_tabs += $hook_tabs;
$content_model_fieldset = $content_model->displayExtraFieldset($pid, $page_number);
if (is_array($content_model_fieldset)) {
$cmodels_tabs = array_merge($cmodels_tabs, $content_model_fieldset);
}
else {
$cmodels_tabs[$content_model->pid] = array(
'#type' => 'tabpage',
'#title' => $content_model->name,
'#content' => $content_model_fieldset,
);
}
}
// Add a 'manage object' tab for all objects, where detailed list of content is shown.
$obj = new FedoraObjectDetailedContent($pid);
//can disable showing the object details tab in admin UI //Assemble parameters, to pass during alter
if (variable_get('fedora_repository_show_object_details_tab', TRUE)) { $params = array(
$object_details = $obj->showFieldSets(); 'content_models' => $content_models,
if ($object_details['fedora_object_details']['#selected'] == TRUE) { 'pid' => $pid,
foreach ($cmodels_tabs as &$cmodel_tab) { 'page' => $page_number,
if (is_array($cmodel_tab)) { );
$cmodel_tab['#selected'] = FALSE;
}
}
}
}
else {
$object_details = array();
}
$hook_tabs = module_invoke_all('islandora_tabs', $content_models, $pid); //Allow returned tabs to be altered, before return.
$cmodels_tabs = array_merge($cmodels_tabs, $object_details, $hook_tabs); drupal_alter('islandora_tabs', $cmodels_tabs, $params);
return tabs_render($cmodels_tabs); return tabs_render($cmodels_tabs);
} }
@ -1060,7 +1156,6 @@ function fedora_repository_urlencode_string($str) {
* @return type * @return type
*/ */
function fedora_object_as_attachment($pid, $dsId, $label=NULL, $version=NULL) { function fedora_object_as_attachment($pid, $dsId, $label=NULL, $version=NULL) {
global $user;
module_load_include('inc', 'fedora_repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper');
if ($pid == NULL || $dsId == NULL) { if ($pid == NULL || $dsId == NULL) {
@ -1069,7 +1164,7 @@ function fedora_object_as_attachment($pid, $dsId, $label=NULL, $version=NULL) {
} }
$objectHelper = new ObjectHelper(); $objectHelper = new ObjectHelper();
$objectHelper->makeObject($pid, $dsId, 1, $label, FALSE, $version); $objectHelper->makeObject($pid, $dsId, TRUE, $label, FALSE, $version);
} }
/** /**
@ -2111,19 +2206,19 @@ function theme_add_to_basket_link($pid, $type = 'object') {
$save = "export_big.png"; $save = "export_big.png";
$saved = "exported_big.png"; $saved = "exported_big.png";
// $path = drupal_get_path('module', 'Fedora_Repository').'/images/'.$save ; // $path = drupal_get_path('module', 'fedora_repository').'/images/'.$save ;
/* /*
var_dump($path); var_dump($path);
var_dump(theme('image',drupal_get_path('module', 'Fedora_Repository').'/images/'.$save)); var_dump(theme('image',drupal_get_path('module', 'fedora_repository').'/images/'.$save));
die(); die();
*/ */
if (!_is_added_to_basket($pid)) { if (!_is_added_to_basket($pid)) {
return l( return l(
theme('image', drupal_get_path('module', 'Fedora_Repository') . '/images/' . $save, t("Add to basket"), t("Add this @object to my basket", array('@object' => $object))), "fedora/repository/addToBasket/" . $path, array('html' => TRUE) theme('image', drupal_get_path('module', 'fedora_repository') . '/images/' . $save, t("Add to basket"), t("Add this @object to my basket", array('@object' => $object))), "fedora/repository/addToBasket/" . $path, array('html' => TRUE)
); );
} }
return theme('image', drupal_get_path('module', 'Fedora_Repository') . '/images/' . $saved, t("In basket"), t("This @object is already in your basket", array('@object' => $object))); return theme('image', drupal_get_path('module', 'fedora_repository') . '/images/' . $saved, t("In basket"), t("This @object is already in your basket", array('@object' => $object)));
} }
/** /**
@ -2274,9 +2369,6 @@ function theme_fedora_repository_solution_packs_list($solution_packs) {
$header = array(); $header = array();
$rows = array(); $rows = array();
drupal_add_css(drupal_get_path('module', 'update') . '/update.css'); drupal_add_css(drupal_get_path('module', 'update') . '/update.css');
return $output; return $output;
} }
@ -2295,3 +2387,87 @@ function fedora_repository_forms($form_id) {
} }
return $forms; return $forms;
} }
/**
* Implementation of hook_imagecache_default_presets().
*/
function fedora_repository_imagecache_default_presets() {
return array(
'fedora_repository_collection_thumbnail' => array(
'presetname' => 'fedora_repository_collection_thumbnail',
'actions' => array(
0 => array(
'weight' => 0,
'module' => 'imagecache',
'action' => 'imagecache_scale',
'data' => array(
'width' => 200,
'height' => 200,
'upscale' => TRUE,
),
),
),
),
);
}
/**
* Actually render an image, given an arbitrary path and preset.
*
* Note: If imagecache_external is not available, the full-sized image will be
* produced... Might want to look into restricting the display size by adding
* the width and height attributes to the theme('image') call, based on the
* selected preset? (get the presets and figure out the size from its actions?)
*
* @param $tn_path string
* @param $imagecache_preset string
* @return
* Markup for the image, making use of imagecache_external if it is available.
*/
function _fedora_repository_render_image($tn_path, $imagecache_preset = 'fedora_repository_collection_thumbnail') {
$thumbnail = NULL;
if ($thumbnail === NULL &&
module_exists('imagecache_external') &&
is_callable('theme_imagecache_external_image') &&
variable_get('fedora_repository_use_imagecache_external_in_collection_view', FALSE) &&
imagecache_external_can_fetch($tn_path, TRUE)) {
$thumbnail = theme('imagecache_external_image', $imagecache_preset, $tn_path, $truncated_title, $title);
}
if ($thumbnail === NULL) {
$thumbnail = theme('image', $tn_path, $truncated_title, $title, array(), FALSE);
}
return $thumbnail;
}
/**
* Render an image, given a PID, DSID and preset.
*
* Produces a Drupal path for the image, passes to
* _fedora_repository_render_image(), and returns the result.
*
* @see _fedora_repository_render_image()
* @param $pid string
* A string containing a Fedora PID.
* @param $dsid
* A string indicating a DSID on the object indicated by $pid.
* @param $imagecache_preset
* An imagecache preset with which to render the image; defaults to
* fedora_repository_collection_thumbnail, which is added in this module's
* implementation of hook_imagecache_default_presets().
*/
function fedora_repository_render_image($pid, $dsid, $imagecache_preset = 'fedora_repository_collection_thumbnail') {
$tn_path = "fedora/repository/$pid/$dsid";
return _fedora_repository_render_image($tn_path, $imagecache_preset);
}
/**
* Convenience function used in XSLT callback...
*
* @param $string string
* A string containing some markup to convert to a domnode.
*/
function fedora_repository_string_to_domnode($string) {
return DOMDocument::loadXML($string);
}

194
formClass.inc

@ -13,7 +13,6 @@
class formClass { class formClass {
function formClass() { function formClass() {
module_load_include('inc', 'formClass', '');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
} }
@ -70,9 +69,7 @@ class formClass {
'access arguments' => array('view fedora collection'), 'access arguments' => array('view fedora collection'),
); );
$items['fedora/repository'] = array( $items['fedora/repository'] = array(
'title' => '', 'title' => 'Digital Repository',
'title callback' => 'variable_get',
'title arguments' => array('fedora_repository_name', 'Digital Repository'),
'page callback' => 'repository_page', 'page callback' => 'repository_page',
'type' => MENU_NORMAL_ITEM, 'type' => MENU_NORMAL_ITEM,
'access arguments' => array('view fedora collection'), 'access arguments' => array('view fedora collection'),
@ -130,7 +127,7 @@ class formClass {
'title' => t('Collection view'), 'title' => t('Collection view'),
'page callback' => 'fedora_collection_view', 'page callback' => 'fedora_collection_view',
'type' => MENU_CALLBACK, 'type' => MENU_CALLBACK,
'access argruments' => array('view fedora collection') 'access argruments' => array('view fedora collection'),
); );
//new for mnpl****************************************** //new for mnpl******************************************
@ -182,29 +179,38 @@ class formClass {
'access arguments' => array('view fedora collection'), 'access arguments' => array('view fedora collection'),
); );
$items['admin/settings/fedora_repository/object_details_xslt'] = array(
'title' => "",
'type' => MENU_CALLBACK,
'page callback' => 'drupal_get_form',
'page arguments' => array('fedora_repository_object_details_XSLT_config'),
'file' => 'ObjectDetails.inc',
'access arguments' => array('administer site configuration'),
);
$items['admin/settings/fedora_repository/object_details_table'] = array(
'title' => "",
'type' => MENU_CALLBACK,
'page callback' => 'drupal_get_form',
'page arguments' => array('fedora_repository_object_details_table_config'),
'file' => 'ObjectDetails.inc',
'access arguments' => array('administer site configuration'),
);
return $items; return $items;
} }
/** /**
* Create admin form * Create admin form
* @return type * @return array
*/ */
function createAdminForm() { function createAdminForm() {
if (!user_access('administer site configuration')) { if (!user_access('administer site configuration')) {
drupal_set_message(t('You must be a site administrator to edit the Fedora collecitons list.'), 'error'); drupal_set_message(t('You must be a site administrator to edit the Fedora collections list.'), 'error');
return; return;
} }
module_load_include('inc', 'fedora_repository', 'api/fedora_utils'); module_load_include('inc', 'fedora_repository', 'api/fedora_utils');
module_load_include('inc', 'fedora_repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper');
$form = array(); $form = array();
$form['fedora_repository_name'] = array(
'#type' => 'textfield',
'#title' => t('Root Collection Name'),
'#default_value' => variable_get('fedora_repository_name', 'Islandora demos collection'),
'#description' => t('The Name of the Root Collection Object'),
'#required' => TRUE,
'#weight' => -20
);
$form['fedora_repository_pid'] = array( $form['fedora_repository_pid'] = array(
'#type' => 'textfield', '#type' => 'textfield',
'#title' => t('Root Collection PID'), '#title' => t('Root Collection PID'),
@ -239,7 +245,10 @@ class formClass {
'#description' => t('The URL to use for SOAP connections'), '#description' => t('The URL to use for SOAP connections'),
'#required' => TRUE, '#required' => TRUE,
'#weight' => -12, '#weight' => -12,
'#suffix' => '<p>' . (fedora_available() ? '<img src="' . url('misc/watchdog-ok.png') . '"/>' . t('Successfully connected to Fedora server at !fedora_soap_url', array('!fedora_soap_url' => variable_get('fedora_soap_url', ''))) : '<img src="' . url('misc/watchdog-error.png') . '"/> ' . t('Unable to connect to Fedora server at !fedora_soap_url</p>', array('!fedora_soap_url' => variable_get('fedora_soap_url', '')))), '#suffix' => '<p>' . (
fedora_available() ?
theme('image', 'misc/watchdog-ok.png') . t('Successfully connected to Fedora server at @fedora_soap_url', array('@fedora_soap_url' => variable_get('fedora_soap_url', ''))) :
theme('image', 'misc/watchdog-error.png') . t('Unable to connect to Fedora server at @fedora_soap_url', array('@fedora_soap_url' => variable_get('fedora_soap_url', '')))) . '</p>',
); );
$form['fedora_soap_manage_url'] = array( $form['fedora_soap_manage_url'] = array(
@ -285,20 +294,16 @@ class formClass {
'#weight' => 0 '#weight' => 0
); );
} }
$form['fedora_repository_title'] = array(
'#type' => 'textfield',
'#title' => t('Digital Repository Title'),
'#default_value' => variable_get('fedora_repository_name', 'Digital Repository'),
'#description' => t('The title displayed when viewing collections and objects in /fedora/repository. Leave blank to display no title. Note that the menus must be rebuilt after changing this variable.'),
);
//have tabs options (like disable) //have tabs options (like disable)
$form['tabs'] = array( $form['tabs'] = array(
'#type' => 'fieldset', '#type' => 'fieldset',
'#title' => t('Tabs Configuration'), '#title' => t('Tabs Configuration'),
'#description' => t('Configure the tabs avaialble when viewing Fedora objects.'), '#description' => t('Configure the tabs available when viewing Fedora objects.'),
'#collapsible' => TRUE, '#collapsible' => TRUE,
'#collapsed' => TRUE, '#collapsed' => TRUE,
); );
//when checked show object details tab //when checked show object details tab
$form['tabs']['fedora_repository_show_object_details_tab'] = array( $form['tabs']['fedora_repository_show_object_details_tab'] = array(
'#type' => 'checkbox', '#type' => 'checkbox',
@ -307,6 +312,34 @@ class formClass {
'#description' => t("When enabled, the 'Object Details' tab will be visible to users with the correct permissions when viewing an object in the repository"), '#description' => t("When enabled, the 'Object Details' tab will be visible to users with the correct permissions when viewing an object in the repository"),
); );
module_load_include('inc', 'fedora_repository', 'ObjectDetails');
$primary_display_mode = variable_get('islandora_object_details_display_table', 'xslt');
$profiles = module_invoke_all("islandora_object_details_display");
$display_options = 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(
'#type' => 'radios',
'#title' => t('Show object details as'),
'#options' => $display_options,
'#default_value' => $primary_display_mode,
'#description' => t("Tells Islandora how to display the object details page for each object"),
);
$form['advanced'] = array( $form['advanced'] = array(
'#type' => 'fieldset', '#type' => 'fieldset',
'#title' => t('Advanced configuration options'), '#title' => t('Advanced configuration options'),
@ -337,6 +370,21 @@ 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).'), '#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),
'#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 ' .
'be updated to use this function.',
array(
'@function' => '_fedora_repository_render_image()',
'@preset' => 'fedora_repository_collection_thumbnail',
'@xsl' => 'sparql_to_html.xsl',
)),
);
$form['advanced']['fedora_collection_display_list'] = array( $form['advanced']['fedora_collection_display_list'] = array(
'#type' => 'select', '#type' => 'select',
'#title' => t('Display Collection List Behaviour'), '#title' => t('Display Collection List Behaviour'),
@ -345,6 +393,13 @@ class formClass {
'#description' => t('Determines when to display the list of objects when viewing a collection page.'), '#description' => t('Determines when to display the list of objects when viewing a collection page.'),
); );
$form['advanced']['fedora_control_group_control_during_ingest'] = array(
'#type' => 'checkbox',
'#title' => t('Allow control groups select in datastream ingest'),
'#description' => t('Whether or not we should allow the user to select which control group to ingest a stream as, or to follow the old paradigm--to add stream IDed as XML as inline, and everything else as managed.'),
'#default_value' => variable_get('fedora_control_group_control_during_ingest', FALSE),
);
//Export functionality //Export functionality
$form['advanced']['module']['export_area'] = array( $form['advanced']['module']['export_area'] = array(
'#type' => 'textfield', '#type' => 'textfield',
@ -669,17 +724,21 @@ class formClass {
} }
} }
$form['add_datastream_label'] = array( $form['fieldset'] = array(
'#value' => t('<br /><h3>Add Datastream:</h3>'), '#type' => 'fieldset',
'#weight' => -10, '#title' => t('Add datastream'),
); );
//$form['add_datastream_label'] = array(
// '#value' => t('<br /><h3>Add Datastream:</h3>'),
// '#weight' => -10,
//);
$form['pid'] = array( $form['fieldset']['pid'] = array(
'#type' => 'hidden', '#type' => 'hidden',
'#value' => "$pid" '#value' => "$pid"
); );
$form['stream_label'] = array( $form['fieldset']['stream_label'] = array(
'#title' => 'Datastream Label', '#title' => 'Datastream Label',
'#required' => 'TRUE', '#required' => 'TRUE',
'#description' => t('A Human readable label'), '#description' => t('A Human readable label'),
@ -687,35 +746,41 @@ class formClass {
); );
$form['#attributes']['enctype'] = 'multipart/form-data'; $form['#attributes']['enctype'] = 'multipart/form-data';
$form['add-stream-file-location'] = array( $form['fieldset']['add-stream-file-location'] = array(
'#type' => 'file', '#type' => 'file',
'#title' => t('Upload Document'), '#title' => t('Upload Document'),
'#size' => 48, '#size' => 48,
// '#required'=>'TRUE', // '#required'=>'TRUE',
'#description' => t('The file to upload.') '#description' => t('The file to upload. (Only for Managed and Inline)')
); );
if (variable_get('fedora_control_group_control_during_ingest', FALSE)) {
$form['fieldset']['ds_reference'] = array(
'#type' => 'textfield',
'#title' => t('Datastream reference'),
'#size' => 48,
'#description' => t('A URL reference to resolve for the contents of the datastream. (Required for External and Redirect, but will still work for Managed and Inline.)'),
);
}
$form['#redirect'] = "fedora/repository/$pid/"; $form['#redirect'] = "fedora/repository/$pid/";
$form['submit'] = array( $form['fieldset']['submit'] = array(
'#type' => 'submit', '#type' => 'submit',
'#value' => t('Add Datastream') '#value' => t('Add Datastream')
); );
if (!empty($unused_dsids)) { if (!empty($unused_dsids)) {
$dsidsForForm = array(); $form['fieldset']['stream_id'] = array(
foreach ($unused_dsids as $dsid) {
$dsidsForForm[$dsid] = $dsid;
}
$form['stream_id'] = array(
'#type' => 'select', '#type' => 'select',
'#title' => t('Datastream ID'), '#title' => t('Datastream ID'),
'#default_value' => variable_get('feed_item_length', 'teaser'), '#default_value' => variable_get('feed_item_length', 'teaser'),
'#weight' => '-1', '#weight' => -1,
'#description' => t('Datastream IDs defined by the content model.'), '#description' => t('Datastream IDs defined by the content model.'),
'#options' => array_combine($unused_dsids, $unused_dsids),
); );
$form['stream_id']['#options'] = array_combine($unused_dsids, $unused_dsids);
} }
else { else {
$form['stream_id'] = array( $form['fieldset']['stream_id'] = array(
'#title' => 'Datastream ID', '#title' => 'Datastream ID',
'#required' => 'TRUE', '#required' => 'TRUE',
'#description' => t('An ID for this stream that is unique to this object. Must start with a letter and contain only alphanumeric characters and dashes and underscores.'), '#description' => t('An ID for this stream that is unique to this object. Must start with a letter and contain only alphanumeric characters and dashes and underscores.'),
@ -723,6 +788,21 @@ class formClass {
'#weight' => -1, '#weight' => -1,
); );
} }
if (variable_get('fedora_control_group_control_during_ingest', FALSE)) {
$form['fieldset']['control_group'] = array(
'#type' => 'select',
'#title' => t('Control group'),
'#options' => array(
'X' => t('Inline XML'),
'M' => t('Managed datastream'),
'E' => t('Externally Referenced/managed datastream'),
'R' => t('Redirect datastream'),
),
'#description' => t('The manner in which the datastream will be stored. "Inline XML" must be XML and will be placed directly into the FOXML for the object. "Managed" datastreams are made to live on the filesystem as discrete files in the Fedora data directory. Both "Redirect" and "External" streams are URL references; the difference being the redirect stream instruct clients to perform an HTTP redirect, such that the data does not pass though Fedora (useful for streaming). External streams are mediated (by which I mean loaded and streamed from) the Fedora server.'),
'#weight' => 0,
);
}
return $form; return $form;
} }
@ -737,15 +817,12 @@ class formClass {
* @return string * @return string
*/ */
function createQDCEditForm($pid, $dsid, $client, &$form_state) { function createQDCEditForm($pid, $dsid, $client, &$form_state) {
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$dsid = empty($dsid) ? 'QDC' : $dsid; $dsid = empty($dsid) ? 'QDC' : $dsid;
try {
$params = array('pid' => "$pid", 'dsID' => "$dsid", 'asOfDateTime' => ""); $item = new fedora_item($pid);
$object = $client->__soapCall('getDatastreamDissemination', array('parameters' => $params)); $content = trim($item->get_datastream_dissemination($dsid));
} catch (Exception $e) {
return array();
}
$content = $object->dissemination->stream;
$content = trim($content);
$doc = new DOMDocument(); $doc = new DOMDocument();
if (!$doc->loadXML($content)) { if (!$doc->loadXML($content)) {
echo "error loading xml"; echo "error loading xml";
@ -849,11 +926,32 @@ class formClass {
$form = array(); $form = array();
$form['#attributes']['enctype'] = 'multipart/form-data'; $form['#attributes']['enctype'] = 'multipart/form-data';
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$item = new Fedora_Item($pid);
$info = $item->get_datastream_info($dsId);
$control_group = $info->datastream->controlGroup;
if (in_array($control_group, array('M', 'X'))) {
$form['file'] = array( $form['file'] = array(
'#type' => 'file', '#type' => 'file',
'#title' => t('Upload Document'), '#title' => t('Upload Document'),
'#description' => t('The file to upload.') '#description' => t('A file with which to replace the contents of this datastream.'),
);
}
if ($control_group != 'X') {
$form['reference'] = array(
'#type' => 'textfield',
'#title' => t('Reference to object'),
'#description' => t('A URL the datastream will be updated to reference.'),
);
}
if ($control_group == 'M') {
$form['note'] = array(
'#type' => 'item',
'#title' => t('NOTE'),
'#value' => t('If both a file and a reference are given, the file will be given preference.'),
); );
}
$form['pid'] = array( $form['pid'] = array(
'#type' => 'value', '#type' => 'value',

6
xsl/convertQDC.xsl → object_details_xslts/convertQDC.xsl

@ -12,13 +12,13 @@
<tr><th colspan="3"><h3>MetaData</h3></th></tr> <tr><th colspan="3"><h3>MetaData</h3></th></tr>
<xsl:for-each select="/*/*"> <xsl:for-each select="/*/*">
<xsl:variable name="FULLFIELD" select="name()"/> <xsl:variable name="FULLFIELD" select="name()"/>
<xsl:variable name="FIELD" select="substring-after(name(),':')"/> <xsl:variable name="FIELD" select="local-name()"/>
<xsl:variable name="DATA" select="text()"/> <xsl:variable name="DATA" select="text()"/>
<xsl:if test="$DATA != ' '"> <xsl:if test="$DATA != ' '">
<tr><td><strong><xsl:value-of select="substring-after(name(),':')"/></strong></td><td><xsl:value-of select="text()"/> <tr><td><strong><xsl:value-of select="local-name()"/></strong></td><td><xsl:value-of select="text()"/>
<xsl:for-each select="*"> <xsl:for-each select="*">
<div> <div>
<xsl:value-of select="substring-after(name(),':')"/> = <xsl:value-of select="text()"/> <xsl:value-of select="local-name()"/> = <xsl:value-of select="text()"/>
</div> </div>
</xsl:for-each> </xsl:for-each>
</td></tr> </td></tr>

232
object_details_xslts/mods2html.xsl

@ -0,0 +1,232 @@
<xsl:stylesheet xmlns:mods="http://www.loc.gov/mods/v3" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="mods" version="1.0">
<xsl:output indent="yes" method="html"/>
<xsl:variable name="dictionary" select="document('http://www.loc.gov/standards/mods/modsDictionary.xml')/dictionary"/>
<xsl:template match="/">
<html>
<head>
<style type="text/css">
.modsLabelTop {
}
.modsLabelLevel2 {
padding-left: 10px;
}
.modsLabelLevel3 {
padding-left: 20px;
}
.modsLabelLevel4 {
padding-left: 30px;
}
.modsValueTop {
}
.modsValueLevel2 {
}
.modsValueLevel3 {
}
</style>
</head>
<body>
<xsl:choose>
<xsl:when test="mods:modsCollection">
<xsl:apply-templates select="mods:modsCollection"/>
</xsl:when>
<xsl:when test="mods:mods">
<xsl:apply-templates select="mods:mods"/>
</xsl:when>
</xsl:choose>
</body>
</html>
</xsl:template>
<xsl:template match="mods:modsCollection">
<xsl:apply-templates select="mods:mods"/>
</xsl:template>
<xsl:template match="mods:mods">
<table class="modsContainer">
<xsl:apply-templates/>
</table>
<!--hr/-->
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="child::*">
<tr><td colspan="2">
<span class="modsLabelTop">
<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="local-name()"/>:
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="attr"/>
</span>
</td></tr>
<xsl:apply-templates mode="level2"/>
</xsl:when>
<xsl:otherwise>
<tr><td>
<span class="modsLabelTop">
<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="local-name()"/>
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="attr"/>
</span>
</td><td>
<span class="modsValueTop">
<xsl:call-template name="formatValue"/>
</span>
</td></tr>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="formatValue">
<xsl:choose>
<xsl:when test="@type='uri'">
<a href="{text()}" class="modsLink">
<xsl:value-of select="text()"/>
</a>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="text()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="*" mode="level2">
<xsl:choose>
<xsl:when test="child::*">
<tr><td colspan="2">
<span class="modsLabelLevel2">
<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="local-name()"/>
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="attr"/>
</span>
</td></tr>
<xsl:apply-templates mode="level3"/>
</xsl:when>
<xsl:otherwise>
<tr><td>
<span class="modsLabelLevel2">
<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="local-name()"/>
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="attr"/>
</span>
</td><td>
<span class="modsValueLevel2">
<xsl:call-template name="formatValue"/>
</span>
</td></tr>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="*" mode="level3">
<xsl:choose>
<xsl:when test="child::*">
<tr><td colspan="2">
<span class="modsLabelLevel3">
<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="local-name()"/>
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="attr"/>
</span>
</td></tr>
<xsl:apply-templates mode="level4"/>
</xsl:when>
<xsl:otherwise>
<tr><td>
<span class="modsLabelLevel3">
<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="local-name()"/>
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="attr"/>
</span>
</td><td>
<span class="modsValueLevel3">
<xsl:call-template name="formatValue"/>
</span>
</td></tr>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="*" mode="level4">
<tr><td>
<span class="modsLabelLevel4">
<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="local-name()"/>
</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="attr"/>
</span>
</td><td>
<span class="modsValueLevel4">
<xsl:value-of select="text()"/>
</span>
</td></tr>
</xsl:template>
<xsl:template name="longName">
<xsl:param name="name"/>
<xsl:choose>
<xsl:when test="$dictionary/entry[@key=$name]">
<xsl:value-of select="$dictionary/entry[@key=$name]"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$name"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="attr">
<xsl:for-each select="@type|@point">:
<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
<xsl:if test="@authority or @edition">
<xsl:for-each select="@authority">(<xsl:call-template name="longName">
<xsl:with-param name="name">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
<xsl:if test="@edition">
Edition <xsl:value-of select="@edition"/>
</xsl:if>)
</xsl:if>
<xsl:variable name="attrStr">
<xsl:for-each select="@*[local-name()!='edition' and local-name()!='type' and local-name()!='authority' and local-name()!='point']">
<xsl:value-of select="local-name()"/>="<xsl:value-of select="."/>",
</xsl:for-each>
</xsl:variable>
<xsl:variable name="nattrStr" select="normalize-space($attrStr)"/>
<xsl:if test="string-length($nattrStr)">
(<xsl:value-of select="substring($nattrStr,1,string-length($nattrStr)-1)"/>)
</xsl:if>
</xsl:template>
</xsl:stylesheet>

2
plugins/DarwinCore.inc

@ -247,7 +247,7 @@ class DarwinCore {
* @return type * @return type
*/ */
public function asHTML() { public function asHTML() {
$path = drupal_get_path('module', 'Fedora_Repository'); $path = drupal_get_path('module', 'fedora_repository');
module_load_include('inc', 'fedora_repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper');
module_load_include('inc', 'fedora_repository', 'CollectionClass'); module_load_include('inc', 'fedora_repository', 'CollectionClass');

43
plugins/FedoraObjectDetailedContent.inc

@ -32,7 +32,6 @@ class FedoraObjectDetailedContent {
*/ */
public function showFieldSets() { public function showFieldSets() {
global $user; global $user;
drupal_set_title($this->item->objectProfile->objLabel);
$objectHelper = new ObjectHelper(); $objectHelper = new ObjectHelper();
$tabset = array(); $tabset = array();
$show_purge_tab = (!empty($_POST['form_id']) && $_POST['form_id'] == 'fedora_repository_purge_object_form'); $show_purge_tab = (!empty($_POST['form_id']) && $_POST['form_id'] == 'fedora_repository_purge_object_form');
@ -48,9 +47,28 @@ class FedoraObjectDetailedContent {
$tabset['fedora_object_details']['tabset'] = array( $tabset['fedora_object_details']['tabset'] = array(
'#type' => 'tabset', '#type' => 'tabset',
); );
$dc_html = $objectHelper->getFormattedDC($this->item);
$ds_list = $objectHelper->get_formatted_datastream_list($this->pid, NULL, $this->item); module_load_include('inc', 'fedora_repository', 'ObjectDetails');
$object_details_profile = variable_get('islandora_object_details_display_table', 'xslt');
$profiles = module_invoke_all("islandora_object_details_display");
$profile = $profiles[$object_details_profile];
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);
}
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);
}
else {
// problem - display profile not found
watchdog('fedora_repository', "Error - could not find object details display function @function", array('@function' => $details_function), WATCHDOG_WARNING);
}
}
$i = 0; $i = 0;
if (fedora_repository_access(OBJECTHELPER :: $VIEW_DETAILED_CONTENT_LIST, $this->pid, $user)) { if (fedora_repository_access(OBJECTHELPER :: $VIEW_DETAILED_CONTENT_LIST, $this->pid, $user)) {
@ -63,9 +81,24 @@ class FedoraObjectDetailedContent {
'#weight' => $i++ '#weight' => $i++
), ),
'list' => array( 'list' => array(
'#type' => 'fieldset',
'#title' => t('Detailed List of Content'),
'#attributes' => array(
'class' => 'fedora_detailed_list',
),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => $i++,
'parents' => array(
'#type' => 'markup', '#type' => 'markup',
'#value' => $ds_list, //XXX: The function called here could be cleaned up a fair bit as well... '#value' => $objectHelper->get_parent_objects_asHTML($this->pid),
'#weight' => $i++ '#weight' => $i++,
),
'datastreams' => array(
'#type' => 'markup',
'#value' => $objectHelper->get_formatted_datastream_list($this->pid, NULL, $this->item), //XXX: The function called here could be cleaned up a fair bit as well...
'#weight' => $i++,
),
), ),
'purge' => array( 'purge' => array(
'#type' => 'markup', '#type' => 'markup',

2
plugins/FlvFormBuilder.inc

@ -58,7 +58,7 @@ class FlvFormBuilder extends FormBuilder {
$ds1v->appendChild($ds1content); $ds1v->appendChild($ds1content);
$rootElement->appendChild($ds1); $rootElement->appendChild($ds1);
$createdFile = drupal_get_path('module', 'Fedora_Repository') . '/images/flashThumb.jpg'; $createdFile = drupal_get_path('module', 'fedora_repository') . '/images/flashThumb.jpg';
$fileUrl = $base_url . '/' . drupal_urlencode($createdFile); //'http://'.$_SERVER['HTTP_HOST'].'/'.$createdFile; $fileUrl = $base_url . '/' . drupal_urlencode($createdFile); //'http://'.$_SERVER['HTTP_HOST'].'/'.$createdFile;
$ds1 = $dom->createElement("foxml:datastream"); $ds1 = $dom->createElement("foxml:datastream");
$ds1->setAttribute("ID", "TN"); $ds1->setAttribute("ID", "TN");

8
plugins/FormBuilder.inc

@ -95,21 +95,21 @@ class FormBuilder {
try { try {
$xml = new SimpleXMLElement($policyStreamDoc); $xml = new SimpleXMLElement($policyStreamDoc);
} catch (Exception $e) { } catch (Exception $e) {
watchdog(t("Fedora_Repository"), "Problem getting security policy.", NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), "Problem getting security policy.", NULL, WATCHDOG_ERROR);
drupal_set_message(t('Problem getting security policy: @e', array('@e' => check_plain($e->getMessage()))), 'error'); drupal_set_message(t('Problem getting security policy: @e', array('@e' => check_plain($e->getMessage()))), 'error');
return FALSE; return FALSE;
} }
$policyElement = $dom->createDocumentFragment(); $policyElement = $dom->createDocumentFragment();
if (!$policyElement) { if (!$policyElement) {
drupal_set_message(t('Error parsing security policy stream.')); drupal_set_message(t('Error parsing security policy stream.'));
watchdog(t("Fedora_Repository"), "Error parsing security policy stream, could not parse policy stream.", NULL, WATCHDOG_NOTICE); watchdog(t("fedora_repository"), "Error parsing security policy stream, could not parse policy stream.", NULL, WATCHDOG_NOTICE);
return FALSE; return FALSE;
} }
$dom->importNode($policyElement, TRUE); $dom->importNode($policyElement, TRUE);
$value = $policyElement->appendXML($policyStreamDoc); $value = $policyElement->appendXML($policyStreamDoc);
if (!$value) { if (!$value) {
drupal_set_message(t('Error creating security policy stream.')); drupal_set_message(t('Error creating security policy stream.'));
watchdog(t("Fedora_Repository"), "Error creating security policy stream, could not parse collection policy template file.", NULL, WATCHDOG_NOTICE); watchdog(t("fedora_repository"), "Error creating security policy stream, could not parse collection policy template file.", NULL, WATCHDOG_NOTICE);
return FALSE; return FALSE;
} }
@ -183,7 +183,7 @@ class FormBuilder {
file_delete($form_values['ingest-file-location']); file_delete($form_values['ingest-file-location']);
} catch (exception $e) { } catch (exception $e) {
drupal_set_message(t('Error ingesting object: @e', array('@e' => check_plain($e->getMessage()))), 'error'); drupal_set_message(t('Error ingesting object: @e', array('@e' => check_plain($e->getMessage()))), 'error');
watchdog(t("Fedora_Repository"), "Error ingesting object: @e", array('@e' => check_plain($e->getMessage())), NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), "Error ingesting object: @e", array('@e' => check_plain($e->getMessage())), NULL, WATCHDOG_ERROR);
return; return;
} }
} }

2
plugins/ModsFormBuilder.inc

@ -317,7 +317,7 @@ class ModsFormBuilder extends FormBuilder {
file_delete($form_values['ingest-file-location']); file_delete($form_values['ingest-file-location']);
} catch (exception $e) { } catch (exception $e) {
drupal_set_message(t('Error ingesting object: @e', array('@e' => check_plain($e->getMessage()))), 'error'); drupal_set_message(t('Error ingesting object: @e', array('@e' => check_plain($e->getMessage()))), 'error');
watchdog(t("Fedora_Repository"), "Error ingesting object: @e", array('@e' => check_plain($e->getMessage())), NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), "Error ingesting object: @e", array('@e' => check_plain($e->getMessage())), NULL, WATCHDOG_ERROR);
return; return;
} }
} }

8
plugins/PersonalCollectionClass.inc

@ -71,11 +71,11 @@ class PersonalCollectionClass {
* @return type * @return type
*/ */
function createCollectionPolicyStream($user, $dom, $rootElement) { function createCollectionPolicyStream($user, $dom, $rootElement) {
$collectionTemplate = file_get_contents(drupal_get_path('module', 'Fedora_Repository') . '/collection_policies/PERSONAL-COLLECTION-POLICY.xml'); $collectionTemplate = file_get_contents(drupal_get_path('module', 'fedora_repository') . '/collection_policies/PERSONAL-COLLECTION-POLICY.xml');
try { try {
$xml = new SimpleXMLElement($collectionTemplate); $xml = new SimpleXMLElement($collectionTemplate);
} catch (Exception $e) { } catch (Exception $e) {
watchdog(t("Fedora_Repository"), "Problem creating personal collection policy, could not parse collection policy stream.", NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), "Problem creating personal collection policy, could not parse collection policy stream.", NULL, WATCHDOG_ERROR);
drupal_set_message(t('Problem creating personal collection policy, could not parse collection policy stream: @e', array('@e' => check_plain($e->getMessage()))), 'error'); drupal_set_message(t('Problem creating personal collection policy, could not parse collection policy stream: @e', array('@e' => check_plain($e->getMessage()))), 'error');
return FALSE; return FALSE;
} }
@ -83,7 +83,7 @@ class PersonalCollectionClass {
if (!$policyElement) { if (!$policyElement) {
drupal_set_message(t('Error parsing policy stream.')); drupal_set_message(t('Error parsing policy stream.'));
watchdog(t("Fedora_Repository"), "Error parsing policy stream, could not parse policy stream.", NULL, WATCHDOG_NOTICE); watchdog(t("fedora_repository"), "Error parsing policy stream, could not parse policy stream.", NULL, WATCHDOG_NOTICE);
return FALSE; return FALSE;
} }
$dom->importNode($policyElement, TRUE); $dom->importNode($policyElement, TRUE);
@ -91,7 +91,7 @@ class PersonalCollectionClass {
$value = $policyElement->appendXML($collectionTemplate); $value = $policyElement->appendXML($collectionTemplate);
if (!$value) { if (!$value) {
drupal_set_message(t('Error creating collection policy stream.')); drupal_set_message(t('Error creating collection policy stream.'));
watchdog(t("Fedora_Repository"), "Error creating collection policy stream, could not parse collection policy template file.", NULL, WATCHDOG_NOTICE); watchdog(t("fedora_repository"), "Error creating collection policy stream, could not parse collection policy template file.", NULL, WATCHDOG_NOTICE);
return FALSE; return FALSE;
} }

4
plugins/QtFormBuilder.php

@ -18,7 +18,7 @@ class QtFormBuilder extends FormBuilder {
* Constructor * Constructor
*/ */
function QtFormBuilder() { function QtFormBuilder() {
module_load_include('php', 'Fedora_Repository', 'plugins/FormBuilder'); module_load_include('php', 'fedora_repository', 'plugins/FormBuilder');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
} }
@ -57,7 +57,7 @@ class QtFormBuilder extends FormBuilder {
$rootElement->appendChild($ds1); $rootElement->appendChild($ds1);
if (empty($_SESSION['fedora_ingest_files']) || !isset($_SESSION['fedora_ingest_files']['TN'])) { if (empty($_SESSION['fedora_ingest_files']) || !isset($_SESSION['fedora_ingest_files']['TN'])) {
$createdFile = drupal_get_path('module', 'Fedora_Repository') . '/images/qtThumb.jpg'; $createdFile = drupal_get_path('module', 'fedora_repository') . '/images/qtThumb.jpg';
$fileUrl = $base_url . '/' . drupal_urlencode($createdFile); //'http://'.$_SERVER['HTTP_HOST'].'/'.$createdFile; $fileUrl = $base_url . '/' . drupal_urlencode($createdFile); //'http://'.$_SERVER['HTTP_HOST'].'/'.$createdFile;
$ds1 = $dom->createElement("foxml:datastream"); $ds1 = $dom->createElement("foxml:datastream");
$ds1->setAttribute("ID", "TN"); $ds1->setAttribute("ID", "TN");

6
plugins/Refworks.inc

@ -290,13 +290,13 @@ class Refworks {
if ($client == NULL) { if ($client == NULL) {
drupal_set_message(t('Error getting SOAP client.'), 'error'); drupal_set_message(t('Error getting SOAP client.'), 'error');
watchdog(t("FEDORA_REPOSITORY"), "Error getting SOAP client: @e", array('@e' => $e), NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), "Error getting SOAP client: @e", array('@e' => $e), NULL, WATCHDOG_ERROR);
return; return;
} }
$object = $client->__soapCall('ingest', array( $object = $client->__soapCall('ingest', array(
$params $params
)); ));
watchdog(t("FEDORA_REPOSITORY"), "Successfully added repository item " . $pid . " - ". $item_title, NULL, WATCHDOG_INFO); watchdog(t("fedora_repository"), "Successfully added repository item " . $pid . " - ". $item_title, NULL, WATCHDOG_INFO);
$deleteFiles = $form_values['delete_file']; //remove files from drupal file system $deleteFiles = $form_values['delete_file']; //remove files from drupal file system
if ($deleteFiles > 0) { if ($deleteFiles > 0) {
@ -305,7 +305,7 @@ class Refworks {
} catch (exception $e) { } catch (exception $e) {
$errors++; $errors++;
$errorMessage = 'yes'; $errorMessage = 'yes';
watchdog(t("FEDORA_REPOSITORY"), t("Error during ingest !it @e", array('!it' => $item_title, '@e' => $e)), NULL, WATCHDOG_ERROR); watchdog(t("fedora_repository"), t("Error during ingest !it @e", array('!it' => $item_title, '@e' => $e)), NULL, WATCHDOG_ERROR);
} }
$success++; $success++;
} }

5
plugins/ShowDemoStreamsInFieldSets.inc

@ -29,11 +29,10 @@ class ShowDemoStreamsInFieldSets {
* @return type * @return type
*/ */
function showMediumSize() { function showMediumSize() {
global $base_url; $path = "fedora/repository/{$this->pid}/MEDIUM_SIZE";
$collection_fieldset = array( $collection_fieldset = array(
'#collapsible' => FALSE, '#collapsible' => FALSE,
'#value' => '<a href="' . $base_url . '/fedora/repository/' . $this->pid . '/MEDIUM_SIZE/"><img src="' . '#value' => l(theme('image', $path), $path, array('html' => TRUE)),
$base_url . '/fedora/repository/' . $this->pid . '/MEDIUM_SIZE/MEDIUM_SIZE' . '" /></a>',
); );
return theme('fieldset', $collection_fieldset); return theme('fieldset', $collection_fieldset);
} }

48
plugins/ShowStreamsInFieldSets.inc

@ -28,16 +28,22 @@ class ShowStreamsInFieldSets {
*/ */
function showFlv() { function showFlv() {
//FLV is the datastream id //FLV is the datastream id
$path = drupal_get_path('module', 'Fedora_Repository'); $path = drupal_get_path('module', 'fedora_repository');
$fullPath = base_path() . $path; $fullPath = url($path);
$content = ""; $content = "";
$pathTojs = drupal_get_path('module', 'Fedora_Repository') . '/js/swfobject.js'; $pathTojs = drupal_get_path('module', 'fedora_repository') . '/js/swfobject.js';
drupal_add_js("$pathTojs"); drupal_add_js("$pathTojs");
$content .= '<div id="player' . $this->pid . 'FLV"><a href="http://www.macromedia.com/go/getflashplayer">Get the Flash Player</a> to see this player.</div>'; $div_id = "player' . $this->pid . 'FLV";
drupal_add_js('var s1 = new SWFObject("' . $fullPath . '/flash/flvplayer.swf","single","320","240","7"); $content .= <<<EOH
s1.addParam("allowfullscreen","TRUE"); <div id="$div_id"><a href="http://www.macromedia.com/go/getflashplayer">Get the Flash Player</a> to see this player.</div>
s1.addVariable("file","' . base_path() . 'fedora/repository/' . $this->pid . '/FLV/FLV.flv"); EOH;
s1.write("player' . $this->pid . 'FLV");', 'inline', 'footer'); drupal_add_js(<<<EOJS
var s1 = new SWFObject("$fullPath/flash/flvplayer.swf","single","320","240","7");
s1.addParam("allowfullscreen","TRUE");
s1.addVariable("file", "$fullPath/fedora/repository/{$this->pid}/FLV/FLV.flv");
s1.write("$div_id");
EOJS
, 'inline', 'footer');
$collection_fieldset = array( $collection_fieldset = array(
'#title' => t('Flash Video'), '#title' => t('Flash Video'),
'#collapsible' => TRUE, '#collapsible' => TRUE,
@ -48,30 +54,26 @@ class ShowStreamsInFieldSets {
/** /**
* Show the TN ?? * Show the TN ??
* @global type $base_url
* @return type * @return type
*/ */
function showTN() { function showTN() {
global $base_url;
$collection_fieldset = array( $collection_fieldset = array(
'#title' => '', '#title' => '',
'#attributes' => array(), '#attributes' => array(),
'#collapsible' => FALSE, '#collapsible' => FALSE,
'#value' => '<a href="' . $base_url . '/fedora/repository/' . $this->pid . '/OBJ/"><img src="' . $base_url . '/fedora/repository/' . $this->pid . '/TN/TN' . '" /></a>', '#value' => l(theme('image', "fedora/repository/{$this->pid}/TN/TN", '', '', NULL, FALSE), "fedora/repository/{$this->pid}/OBJ", array('html' => TRUE)),
); );
return theme('fieldset', $collection_fieldset); return theme('fieldset', $collection_fieldset);
} }
/** /**
* Same as showTN but artinventory stores the image in a dsid of IMAGE instead of OBJ * Same as showTN but artinventory stores the image in a dsid of IMAGE instead of OBJ
* @global type $base_url
* @return type * @return type
*/ */
function showArtInventoryTN() { function showArtInventoryTN() {
global $base_url;
$collection_fieldset = array( $collection_fieldset = array(
'#collapsible' => FALSE, '#collapsible' => FALSE,
'#value' => '<a href="' . $base_url . '/fedora/repository/' . $this->pid . '/IMAGE/image.jpg"><img src="' . $base_url . '/fedora/repository/' . $this->pid . '/TN/TN' . '" /></a>', '#value' => l(theme('image', "fedora/repository/{$this->pid}/TN/TN", '', '', NULL, FALSE), "fedora/repository/{$this->pid}/IMAGE/image.jpg", array('html' => TRUE)),
); );
return theme('fieldset', $collection_fieldset); return theme('fieldset', $collection_fieldset);
} }
@ -102,14 +104,16 @@ class ShowStreamsInFieldSets {
$objectHelper = new ObjectHelper(); $objectHelper = new ObjectHelper();
$item = new Fedora_Item($this->pid); $item = new Fedora_Item($this->pid);
if (key_exists('TN', $item->datastreams)) { if (key_exists('TN', $item->datastreams)) {
$tn_url = $base_url . '/fedora/repository/' . $item->pid . '/TN'; $tn_url = "fedora/repository/{$item->pid}/TN";
} }
else { else {
$tn_url = $base_path . drupal_get_path('module', 'fedora_repository') . '/images/Crystal_Clear_app_download_manager.png'; $tn_url = drupal_get_path('module', 'fedora_repository') . '/images/Crystal_Clear_app_download_manager.png';
} }
$tn_url = url($tn_url);
$dc_html = $objectHelper->getFormattedDC($item); $dc_html = $objectHelper->getFormattedDC($item);
$dl_link = l('<div style="float:left; padding: 10px"><img src="' . $tn_url . '"><br />' . t('View Document') .'</div>', 'fedora/repository/' . $this->pid . '/OBJ', array('html' => TRUE)); $dl_link = l('<div style="float:left; padding: 10px">' . theme('image', $tn_url, '', '', NULL, FALSE) . '<br />' . t('View Document') .'</div>', "fedora/repository/{$this->pid}/OBJ", array('html' => TRUE));
$tabset['first_tab']['tabs']['view'] = array( $tabset['first_tab']['tabs']['view'] = array(
'#type' => 'tabpage', '#type' => 'tabpage',
@ -126,11 +130,13 @@ class ShowStreamsInFieldSets {
); );
} }
$viewer_url = 'http://docs.google.com/viewer?url=' . url("fedora/repository/{$this->pid}/OBJ/preview.pdf", array('absolute' => TRUE)) . '&embedded=TRUE';
$tabset['second_tab'] = array( $tabset['second_tab'] = array(
'#type' => 'tabpage', '#type' => 'tabpage',
'#title' => t('Read Online'), '#title' => t('Read Online'),
'#content' => "<iframe src=\"http://docs.google.com/viewer?url=" . $base_url . '/fedora/repository/' . '#content' => <<<EOM
$this->pid . '/OBJ/preview.pdf' . "&embedded=TRUE\" style=\"width:600px; height:500px;\" frameborder=\"0\"></iframe>" <iframe src="$viewer_url" style="width:600px; height:500px;" frameborder="0"></iframe>"
EOM
); );
// Render the tabset. // Render the tabset.
@ -164,7 +170,7 @@ class ShowStreamsInFieldSets {
module_load_include('inc', 'fedora_repository', 'api/fedora_item'); module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$item = new Fedora_Item($this->pid); $item = new Fedora_Item($this->pid);
$streams = $item->get_datastreams_list_as_array(); $streams = $item->get_datastreams_list_as_array();
return "<a href='" . $base_url . "/fedora/repository/" . $this->pid . "/OBJ/" . $streams['OBJ']['label'] . "'>" . $streams['OBJ']['label'] . "</a>"; return l($streams['OBJ']['label'], "fedora/repository/{$this->pid}/OBJ");
} }
/** /**
@ -225,7 +231,7 @@ class ShowStreamsInFieldSets {
* @return type * @return type
*/ */
function showRomeo($collapsed = FALSE) { function showRomeo($collapsed = FALSE) {
$path = drupal_get_path('module', 'Fedora_Repository'); $path = drupal_get_path('module', 'fedora_repository');
module_load_include('inc', 'fedora_repository', 'CollectionClass'); module_load_include('inc', 'fedora_repository', 'CollectionClass');
$collectionHelper = new CollectionClass(); $collectionHelper = new CollectionClass();
$xmlstr = $collectionHelper->getStream($this->pid, "ROMEO", 0); $xmlstr = $collectionHelper->getStream($this->pid, "ROMEO", 0);

2
plugins/fedora_imageapi.module

@ -22,7 +22,7 @@ function fedora_imageapi_menu() {
* @param string $params * @param string $params
*/ */
function fedora_repository_image_manip($pid = '', $dsid = '', $op = '', $params = '') { function fedora_repository_image_manip($pid = '', $dsid = '', $op = '', $params = '') {
module_load_include('inc', 'Fedora_Repository', 'ObjectHelper'); module_load_include('inc', 'fedora_repository', 'ObjectHelper');
module_load_include('module', 'imageapi'); module_load_include('module', 'imageapi');
$obj = new ObjectHelper(); $obj = new ObjectHelper();
$mimetype = $obj->getMimeType($pid, $dsid); $mimetype = $obj->getMimeType($pid, $dsid);

4
plugins/herbarium.inc

@ -161,13 +161,13 @@ class Herbarium {
'#title' => t('Full-size'), '#title' => t('Full-size'),
'#content' => $html '#content' => $html
); );
$image = theme('image', "fedora/imageapi/{$this->pid}/JPG/JPG.jpg", '', '', NULL, FALSE);
$tabset['first_tab'] = array( $tabset['first_tab'] = array(
// #type and #title are the minimum requirements. // #type and #title are the minimum requirements.
'#type' => 'tabpage', '#type' => 'tabpage',
'#title' => t('View'), '#title' => t('View'),
// This will be the content of the tab. // This will be the content of the tab.
'#content' => '<a href="' . $base_url . '/fedora/repository/' . $this->pid . '/FULL_JPG/"><img src="' . $base_url . '/fedora/imageapi/' . '#content' => l($image, "fedora/repository/{$this->pid}/FULL_JPG", array('html' => TRUE)), '<p>' . drupal_get_form('fedora_repository_image_tagging_form', $this->pid) . '</p>',
$this->pid . '/JPG/JPG.jpg' . '" /></a>' . '<p>' . drupal_get_form('fedora_repository_image_tagging_form', $this->pid) . '</p>',
); );
$dwc = new DarwinCore($this->item); $dwc = new DarwinCore($this->item);

67
plugins/qt_viewer.inc

@ -125,31 +125,53 @@ class ShowQtStreamsInFieldSets {
if ($media === FALSE) { if ($media === FALSE) {
return ''; return '';
} }
global $base_url;
$path = drupal_get_path('module', 'Fedora_Repository'); $path = drupal_get_path('module', 'fedora_repository');
$fullPath = base_path() . $path;
$content = ''; drupal_add_js("$path/js/AC_Quicktime.js");
$pathTojs = drupal_get_path('module', 'Fedora_Repository') . '/js/AC_Quicktime.js';
drupal_add_js($pathTojs);
$divid = 'player' . md5($this->pid) . 'MOV'; $divid = 'player' . md5($this->pid) . 'MOV';
$content .= '<div class="player" id="' . $divid . '">';
$collection_fieldset = array(
'#title' => t('Quicktime'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'player' => array(
'#type' => 'markup',
'#prefix' => '<div class="player" id="' . $divid . '">',
'#suffix' => '</div>',
),
);
if ($pframe !== FALSE) { if ($pframe !== FALSE) {
$content .= '<div class="poster" style="cursor: pointer; position: relative; width: ' . $width . 'px; min-height: ' . ($height) . 'px;">'; $collection_fieldset['player']['poster_container'] = array(
$content .= '<img src="' . base_path() . 'fedora/repository/' . $this->pid . '/' . $pframe->ID . '/poster.jpg' . '" />'; '#type' => 'markup',
$content .= '<div class="play" style="font-size: 128px; color: white; position: absolute; top: 50%; left: 50%; margin-top: -0.085em; margin-left: -0.33em; opacity: 0.9; "></div>'; '#prefix' => '<div class="poster" style="cursor: pointer; position: relative; width: ' . $width . 'px; min-height: ' . ($height) . 'px;">',
$content .= '</div>'; '#suffix' => '</div>',
'poster' => array(
'#type' => 'markup',
'#value' => theme('image', "fedora/repository/{$this->pid}/{$pframe->ID}/poster.jpg", '', '', NULL, FALSE)
)
'play' => array(
'#type' => 'markup',
'#prefix' => '<div class="play" style="font-size: 128px; color: white; position: absolute; top: 50%; left: 50%; margin-top: -0.085em; margin-left: -0.33em; opacity: 0.9;">',
'#suffix' => '</div>',
'#value' => '&nbsp;',
),
);
} }
$content .= '</div>';
if ($this->enableDownload()) { if ($this->enableDownload()) {
$url = base_path() . 'fedora/repository/' . $this->pid . '/OBJ/MOV.mov'; //$url = url();
$content .= '<a class="download" href="' . $url . '">Download Media File</a>'; $collection_fieldset['download_link'] = array(
'#type' => 'markup',
'#value' => l(t('Download Media File'), "fedora/repository/{$this->pid}/OBJ/MOV.mov", array('attributes' => array('class' => 'download'))),
);
} }
$src = base_path() . 'fedora/repository/' . $this->pid . '/' . $media->ID . '/MOV.mov'; $src = url("fedora/repository/{$this->pid}/{$media->ID}/MOV.mov";
$qtparams = '';
$qtparams .= "'autostart', '" . ($pframe !== FALSE ? 'TRUE' : 'FALSE') . "', "; $qtparams = "'autostart', '" . ($pframe !== FALSE ? 'TRUE' : 'FALSE') . "', ";
$init = <<<EOD $init = <<<EOD
$(function() { $(function() {
src = "$src"; src = "$src";
if(src.substring(0,4) != 'http') { if(src.substring(0,4) != 'http') {
src = 'http://' + location.host + src; src = 'http://' + location.host + src;
@ -163,21 +185,16 @@ class ShowQtStreamsInFieldSets {
'SCALE', 'aspect', 'SCALE', 'aspect',
'LOOP', 'FALSE' 'LOOP', 'FALSE'
); );
if($('.poster', '#$divid').length ==0) { if($('.poster', '#$divid').length == 0) {
$('#$divid').append(str); $('#$divid').append(str);
} else { } else {
$('#$divid .poster').one('click', function() { $(this).hide(); $('#$divid').append(str); }); $('#$divid .poster').one('click', function() { $(this).hide(); $('#$divid').append(str); });
} }
}); });
EOD; EOD;
drupal_add_js($init, 'inline', 'footer'); drupal_add_js($init, 'inline', 'footer');
$collection_fieldset = array(
'#title' => t('Quicktime'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#value' => $content);
return theme('fieldset', $collection_fieldset); return theme('fieldset', $collection_fieldset);
} }

6
plugins/slide_viewer.inc

@ -30,14 +30,13 @@ class ShowSlideStreamsInFieldSets {
function showJPG() { function showJPG() {
module_load_include('inc', 'fedora_repository', 'plugins/tagging_form'); module_load_include('inc', 'fedora_repository', 'plugins/tagging_form');
module_load_include('inc', 'fedora_repository', 'plugins/ShowStreamsInFieldSets'); module_load_include('inc', 'fedora_repository', 'plugins/ShowStreamsInFieldSets');
global $base_url;
global $user; global $user;
$tabset = array(); $tabset = array();
$qs = ''; $qs = '';
if ($user->uid != 0) { if ($user->uid != 0) {
$qs = '?uid=' . base64_encode($user->name . ':' . $user->pass); $qs = '?uid=' . base64_encode($user->name . ':' . $user->pass); //XXX: Base64 encoding is not encryption; SSL would be nice...
} }
$viewer_url = variable_get('fedora_base_url', 'http://localhost:8080/fedora') . '/get/' . $this->pid . '/ilives:viewerSdef/getViewer' . $qs; $viewer_url = variable_get('fedora_base_url', 'http://localhost:8080/fedora') . '/get/' . $this->pid . '/ilives:viewerSdef/getViewer' . $qs;
@ -55,8 +54,7 @@ class ShowSlideStreamsInFieldSets {
'#type' => 'tabpage', '#type' => 'tabpage',
'#title' => t('View'), '#title' => t('View'),
// This will be the content of the tab. // This will be the content of the tab.
'#content' => '<img src="' . $base_url . '#content' => theme('image', "fedora/imageapi/{$this->pid}/JPG/JPG.jpg", '', '', NULL, FALSE) . '<p>' . drupal_get_form('fedora_repository_image_tagging_form', $this->pid) . '</p>',
'/fedora/imageapi/' . $this->pid . '/JPG/JPG.jpg' . '" />' . '<p>' . drupal_get_form('fedora_repository_image_tagging_form', $this->pid) . '</p>',
); );
return $tabset; return $tabset;

29
plugins/tagging_form.inc

@ -19,13 +19,15 @@ function _show_subject_tags($pid) {
$obj = new Fedora_Item($pid); $obj = new Fedora_Item($pid);
$tags = new TagSet($obj); $tags = new TagSet($obj);
if (!empty($tags->tags)) { if (!empty($tags->tags)) {
$output = "<ul>"; $items = array();
foreach ($tags->tags as $tag) { foreach ($tags->tags as $tag) {
$output .= "<li title=" . $tag['creator'] . '>' . $tag['name'] . '</li> '; $items[] = array(
'data' => $tag['name'],
'title' => $tag['creator'],
);
} }
$output .= "</ul>"; return theme('item_list', $items);
} }
return $output;
} }
/** /**
@ -57,21 +59,28 @@ function fedora_repository_image_tagging_form($form_state, $pid) {
// Add the current tags to the form. // Add the current tags to the form.
$tagset = new TagSet($obj); $tagset = new TagSet($obj);
$tags = array();
foreach ($tagset->tags as $tag) { foreach ($tagset->tags as $tag) {
$form['tags-wrapper']['tags'][$tag['name']] = array( $form['tags-wrapper']['tags'][$tag['name']] = array(
'#prefix' => '<li>', '#prefix' => '<li>',
'#suffix' => '</li>', '#suffix' => '</li>',
); );
$form['tags-wrapper']['tags'][$tag['name']]['tag'] = array( $form_tag =& $form['tags-wrapper']['tags'][$tag['name']];
'#prefix' => '<a title="Added by ' . $tag['creator'] . '" href="' . $base_url . '/fedora/repository/mnpl_advanced_search/tag:' . $tag['name'] . '">',
'#value' => $tag['name'], $tag_title_text = t('Added by @creator.', array(
'#suffix' => '</a>', '@creator' => $tag['creator'],
));
$tag_mnpl_search_path = "fedora/repository/mnpl_advanced_search/tag:{$tag['name']}";
$form_tag['tag'] = array(
'#value' => l($tag['name'], $tag_mnpl_search_path, array('attributes' => array(
'title' => $tag_title_text
))),
); );
if (user_access('modify fedora datastreams') || user_access('add fedora tags')) { if (user_access('modify fedora datastreams') || user_access('add fedora tags')) {
// Delete button for each existing tag. // Delete button for each existing tag.
$form['tags-wrapper']['tags'][$tag['name']]['delete'] = array( $form_tag['delete'] = array(
'#type' => 'imagebutton', '#type' => 'imagebutton',
'#image' => $base_url . '/' . drupal_get_path('module', 'fedora_repository') . '/images/remove_icon.png', '#image' => drupal_get_path('module', 'fedora_repository') . '/images/remove_icon.png',
'#default_value' => $tag['name'], '#default_value' => $tag['name'],
'#title' => t('Delete this tag'), '#title' => t('Delete this tag'),
); );

34
xsl/convertQDC.xsl.deprecated

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This was how the metadata in the 'Fedora Object Details' tab was rendered. Can be renamed back to 'convertQDC.xsl' (without '.deprecated') to make it be used again. -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- Old parameter names "$baseUrl" and "$path" are deprecated. Currently just used as defaults. -->
<xsl:param name="BASEURL" select="$baseUrl"/>
<xsl:param name="PATH" select="$path"/>
<xsl:template match="/">
<div>
<table cellspacing="3" cellpadding="3">
<tbody>
<tr>
<th colspan="3"><h3>MetaData</h3></th>
</tr>
<xsl:for-each select="/*/*">
<xsl:variable name="FULLFIELD" select="name()"/>
<xsl:variable name="FIELD" select="local-name()"/>
<xsl:variable name="DATA" select="normalize-space(text())"/>
<xsl:if test="$DATA">
<tr>
<td><strong><xsl:value-of select="local-name()"/></strong></td>
<td><xsl:value-of select="$DATA"/>
<xsl:for-each select="*">
<div><xsl:value-of select="concat(local-name(), ' = ', text())"/></div>
</xsl:for-each>
</td>
</tr>
</xsl:if>
</xsl:for-each>
</tbody>
</table>
</div>
</xsl:template>
</xsl:stylesheet>

200
xsl/sparql_to_html.xsl

@ -1,154 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://www.w3.org/2001/sw/DataAccess/rf1/result" version="1.0" xmlns:php="http://php.net/xsl" exclude-result-prefixes="php"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://www.w3.org/2001/sw/DataAccess/rf1/result" version="1.0" xmlns:php="http://php.net/xsl" exclude-result-prefixes="php">
<!-- Red and White XSLT --> <!-- Red and White XSLT -->
<xsl:variable name="BASEURL"> <xsl:param name="BASEURL" select="$baseUrl"/>
<xsl:value-of select="$baseUrl"/> <xsl:param name="PATH" select="$path"/>
</xsl:variable> <xsl:param name="thisPid" select="$collectionPid"/>
<xsl:variable name="PATH"> <xsl:param name="page" select="$hitPage"/>
<xsl:value-of select="$path"/> <xsl:param name="COLLECTION_TITLE" select="$collectionTitle"/>
</xsl:variable> <xsl:param name="imagecache_preset">fedora_repository_collection_thumbnail</xsl:param>
<xsl:variable name="thisPid" select="$collectionPid"/>
<xsl:variable name="size" select="20"/> <xsl:variable name="size" select="20"/>
<xsl:variable name="page" select="$hitPage"/>
<xsl:variable name="start" select="((number($page) - 1) * number($size)) + 1"/> <xsl:variable name="start" select="((number($page) - 1) * number($size)) + 1"/>
<xsl:variable name="end" select="($start - 1) + number($size)"/> <xsl:variable name="end" select="($start - 1) + number($size)"/>
<xsl:variable name="cellsPerRow" select="4"/> <xsl:variable name="cellsPerRow" select="4"/>
<xsl:variable name="count" select="count(s:sparql/s:results/s:result)"/> <xsl:variable name="count" select="count(s:sparql/s:results/s:result)"/>
<xsl:template match="/">
<xsl:template match="/">
<xsl:if test="$count>0"> <xsl:if test="$count>0">
<table cellpadding="3" cellspacing="3" width="90%"> <xsl:call-template name="render_pager"/>
<tr><td colspan="{$cellsPerRow}"> <table cellpadding="3" cellspacing="3" width="90%">
<!-- <div STYLE="text-align: center;">--> <xsl:apply-templates select="s:sparql/s:results"/>
<!-- start previous next --> </table><br clear="all" />
<div class="item-list"> <xsl:call-template name="render_pager"/>
<ul class="pager"> </xsl:if>
<xsl:choose> </xsl:template>
<xsl:when test="$end >= $count and $start = 1">
<xsl:value-of select="$start"/>-<xsl:value-of select="$count"/>
of <xsl:value-of select="$count"/>&#160;<br />
</xsl:when>
<xsl:when test="$end >= $count">
<xsl:value-of select="$start"/>-<xsl:value-of select="$count"/> <xsl:template match="s:sparql/s:results">
of <xsl:value-of select="$count"/>&#160;<br /> <xsl:for-each select="s:result[position() mod $cellsPerRow = 1 and position()>=$start and position() &lt;=$end]">
<li class="pager-previous"> <tr>
<a> <xsl:apply-templates select=". | following-sibling::s:result[position() &lt; $cellsPerRow]"/>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$thisPid"/>/-/Collection/<xsl:value-of select="$page - 1"/> </tr>
</xsl:attribute> </xsl:for-each>
&lt;Prev </xsl:template>
</a></li>
</xsl:when>
<xsl:when test="$start = 1">
<xsl:value-of select="$start"/>-<xsl:value-of select="$end"/>
of <xsl:value-of select="$count"/>&#160;<br />
<li class="pager-next">
<a>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$thisPid"/>/-/Collection/<xsl:value-of select="$page + 1"/>
</xsl:attribute>
Next>
</a></li>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$start"/>-<xsl:value-of select="$end"/>
of <xsl:value-of select="$count"/>&#160;<br />
<li class="pager-previous">
<a>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$thisPid"/>/-/Collection/<xsl:value-of select="$page - 1"/>
</xsl:attribute>
&lt;Prev
</a>&#160;</li>
<li class="pager-next">
<a>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$thisPid"/>/-/Collection/<xsl:value-of select="$page + 1"/>
</xsl:attribute>
Next>
</a></li>
</xsl:otherwise>
</xsl:choose>
</ul>
</div>
<!-- end previous next-->
<br clear="all" />
</td></tr>
<!--<xsl:for-each select="/sparql/results/result[position()>=$start and position() &lt;=$end]"> <xsl:template name="render_pager">
<xsl:variable name='OBJECTURI' select="object/@uri"/> <!-- start previous next -->
<xsl:variable name='PID' select="substring-after($OBJECTURI,'/')"/>
<tr>
<td>
<img>
<xsl:attribute name="src"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$PID"/>/TN
</xsl:attribute>
</img>
<a>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:copy-of select="$PID"/>/-/<xsl:value-of select="title"/>
</xsl:attribute>
<xsl:value-of select="title"/>
</a>
</td>
</tr>
</xsl:for-each>-
-->
<xsl:apply-templates select="s:sparql/s:results"/>
</table><br clear="all" />
<!-- start previous next -->
<div class="item-list"> <div class="item-list">
<ul class="pager"> <ul class="pager">
<xsl:choose> <xsl:choose>
<xsl:when test="$end >= $count and $start = 1"> <xsl:when test="$end >= $count and $start = 1">
<xsl:value-of select="$start"/>-<xsl:value-of select="$count"/> <xsl:value-of select="concat($start, '-', $count, ' of ', $count, '&#160;')"/><br />
of <xsl:value-of select="$count"/>&#160;<br />
</xsl:when> </xsl:when>
<xsl:when test="$end >= $count"> <xsl:when test="$end >= $count">
<xsl:value-of select="concat($start, '-', $count, ' of ', $count, '&#160;')"/><br />
<xsl:value-of select="$start"/>-<xsl:value-of select="$count"/>
of <xsl:value-of select="$count"/>&#160;<br />
<li class="pager-previous"> <li class="pager-previous">
<a> <a>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$thisPid"/>/-/Collection/<xsl:value-of select="$page - 1"/> <xsl:attribute name="href">
<xsl:value-of select="php:functionString('url', concat('fedora/repository/', $thisPid, '/-/Collection/', $page - 1))"/>
</xsl:attribute> </xsl:attribute>
&lt;Prev &lt;Prev
</a></li> </a>
</li>
</xsl:when> </xsl:when>
<xsl:when test="$start = 1"> <xsl:when test="$start = 1">
<xsl:value-of select="$start"/>-<xsl:value-of select="$end"/> <xsl:value-of select="concat($start, '-', $end, ' of ', $count, '&#160;')"/><br />
of <xsl:value-of select="$count"/>&#160;<br />
<li class="pager-next"> <li class="pager-next">
<a> <a>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$thisPid"/>/-/Collection/<xsl:value-of select="$page + 1"/> <xsl:attribute name="href">
<xsl:value-of select="php:functionString('url', concat('fedora/repository/', $thisPid, '/-/Collection/', $page + 1))"/>
</xsl:attribute> </xsl:attribute>
Next> Next>
</a></li> </a>
</li>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<xsl:value-of select="$start"/>-<xsl:value-of select="$end"/> <xsl:value-of select="concat($start, '-', $end, ' of ', $count, '&#160;')"/><br />
of <xsl:value-of select="$count"/>&#160;<br />
<li class="pager-previous"> <li class="pager-previous">
<a> <a>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$thisPid"/>/-/Collection/<xsl:value-of select="$page - 1"/> <xsl:attribute name="href">
<xsl:value-of select="php:functionString('url', concat('fedora/repository/', $thisPid, '/-/Collection/', $page - 1))"/>
</xsl:attribute> </xsl:attribute>
&lt;Prev &lt;Prev
</a>&#160;</li> </a>&#160;
</li>
<li class="pager-next"> <li class="pager-next">
<a> <a>
<xsl:attribute name="href"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$thisPid"/>/-/Collection/<xsl:value-of select="$page + 1"/> <xsl:attribute name="href">
<xsl:value-of select="php:functionString('url', concat('fedora/repository/', $thisPid, '/-/Collection/', $page + 1))"/>
</xsl:attribute> </xsl:attribute>
Next> Next>
</a></li> </a>
</li>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</ul> </ul>
</div> </div>
<!-- end previous next--> <!-- end previous next-->
</xsl:if>
</xsl:template>
<xsl:template match="s:sparql/s:results">
<xsl:for-each select="s:result[position() mod $cellsPerRow = 1 and position()>=$start and position() &lt;=$end]">
<tr>
<xsl:apply-templates select=". | following-sibling::s:result[position() &lt; $cellsPerRow]"/>
</tr>
</xsl:for-each>
</xsl:template> </xsl:template>
<xsl:template match="s:result"> <xsl:template match="s:result">
<xsl:variable name='OBJECTURI' select="s:object/@uri"/> <xsl:variable name='OBJECTURI' select="s:object/@uri"/>
<xsl:variable name='CONTENTURI' select="s:content/@uri"/> <xsl:variable name='CONTENTURI' select="s:content/@uri"/>
@ -160,48 +98,47 @@
<xsl:with-param name="from" select="'_'"/> <xsl:with-param name="from" select="'_'"/>
<xsl:with-param name="to" select="' '"/> <xsl:with-param name="to" select="' '"/>
</xsl:call-template> </xsl:call-template>
</xsl:variable>
<xsl:variable name="cleanTitle">
<xsl:value-of select="php:functionString('fedora_repository_urlencode_string', $newTitle)"/>
</xsl:variable> </xsl:variable>
<xsl:variable name="cleanTitle" select="php:functionString('fedora_repository_urlencode_string', $newTitle)"/>
<xsl:variable name="linkUrl"> <xsl:variable name="linkUrl">
<xsl:choose> <xsl:choose>
<xsl:when test="($CONTENTMODEL='islandora:collectionCModel')"> <xsl:when test="($CONTENTMODEL='islandora:collectionCModel')">
<xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:copy-of select="$PID"/>/-/<xsl:value-of select="'collection'"/> <xsl:value-of select="php:functionString('url', concat('fedora/repository/', $PID, '/-/collection'))"/>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<!--the below is an example of going straight to a datastream instead of the details page. <!--the below is an example of going straight to a datastream instead of the details page.
<xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:copy-of select="$PID"/>/OBJ/<xsl:value-of select="s:title"/>--> <xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:copy-of select="$PID"/>/OBJ/<xsl:value-of select="s:title"/>-->
<xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:copy-of select="$PID"/> <xsl:value-of select="php:functionString('url', concat('fedora/repository/', $PID))"/>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
<xsl:value-of select="s:content"/> <xsl:value-of select="s:content"/>
</xsl:variable> </xsl:variable>
<td valign="top" width="25%"> <td valign="top" width="25%">
<a> <a>
<xsl:attribute name="href"><xsl:value-of select="$linkUrl"/> <xsl:attribute name="href">
</xsl:attribute> <xsl:value-of select="$linkUrl"/>
<img>
<xsl:attribute name="src"><xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:value-of select="$PID"/>/TN
</xsl:attribute>
<xsl:attribute name="alt"><xsl:value-of select="$newTitle" disable-output-escaping="yes"/>
</xsl:attribute> </xsl:attribute>
</img> </a> <br clear="all" /> <xsl:copy-of select="php:function('fedora_repository_string_to_domnode', php:functionString('fedora_repository_render_image', $PID, 'TN', $imagecache_preset))"/>
<!-- <img>
<xsl:attribute name="src"><xsl:value-of select="concat($BASEURL, '/fedora/repository/', $PID, '/TN')"/></xsl:attribute>
<xsl:attribute name="alt"><xsl:value-of select="$newTitle" disable-output-escaping="yes"/></xsl:attribute>
</img> -->
</a><br clear="all" />
<a> <a>
<xsl:attribute name="href"><xsl:value-of select="$linkUrl"/> <xsl:attribute name="href"><xsl:value-of select="$linkUrl"/>
</xsl:attribute> </xsl:attribute>
<xsl:value-of select="$newTitle" disable-output-escaping="yes" /> <xsl:value-of select="$newTitle" disable-output-escaping="yes" />
</a> </a>
<!-- example of a url that would drill down to the details page if the url above went directly to a datastream <!-- example of a url that would drill down to the details page if the url above went directly to a datastream
<xsl:if test="($CONTENTMODEL!='islandora:collectionCModel')"> <xsl:if test="($CONTENTMODEL!='islandora:collectionCModel')">
<br />[[ <a> <br />[[ <a>
<xsl:attribute name="href"> <xsl:attribute name="href">
<xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:copy-of select="$PID"/>/-/<xsl:value-of select="$cleanTitle"/> <xsl:value-of select="$BASEURL"/>/fedora/repository/<xsl:copy-of select="$PID"/>/-/<xsl:value-of select="$cleanTitle"/>
</xsl:attribute> </xsl:attribute>
DETAILS DETAILS
</a> ]] </a> ]]
</xsl:if>--> </xsl:if>-->
</td> </td>
<xsl:if test="(position() = last()) and (position() &lt; $cellsPerRow)"> <xsl:if test="(position() = last()) and (position() &lt; $cellsPerRow)">
@ -210,6 +147,7 @@ DETAILS
</xsl:call-template> </xsl:call-template>
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
<xsl:template name="FillerCells"> <xsl:template name="FillerCells">
<xsl:param name="cellCount"/> <xsl:param name="cellCount"/>
<td>&#160;</td> <td>&#160;</td>
@ -219,6 +157,7 @@ DETAILS
</xsl:call-template> </xsl:call-template>
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
<xsl:template name="replace-string"> <xsl:template name="replace-string">
<xsl:param name="text"/> <xsl:param name="text"/>
<xsl:param name="from"/> <xsl:param name="from"/>
@ -245,4 +184,3 @@ DETAILS
</xsl:choose> </xsl:choose>
</xsl:template> </xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

Loading…
Cancel
Save