Drupal modules for browsing and managing Fedora-based digital repositories.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

2244 lines
81 KiB

<?php
// $Id$
/**
* @package Islandora
* @subpackage rootdirectory
*/
module_load_include('inc', 'fedora_repository', 'XMLDatastream');
class ContentModel extends XMLDatastream {
static $SCHEMA_URI = 'http://localhost/islandoracm.xsd';
static $DEFAULT_DSID = 'ISLANDORACM';
private $mimes = NULL;
public $pid_namespace;
public $name;
private $xpath;
/**
* Gets the default DSID to use for ContentModel datastreams.
*
* @return string $default_dsid
*/
static function getDefaultDSID() {
return variable_get('Islandora_Content_Model_DSID', ContentModel::$DEFAULT_DSID);
}
/**
* Constructs a ContentModel object from a Fedora item
* by getting the first content model from the hasModel relationship.
* Returns false on failure.
* @param string $pid
* @return ContentModel $cm
*/
public static function loadFromObject($pid) {
$ret = FALSE;
if (self::validPid($pid)) {
module_load_include('inc', 'fedora_repository', 'ObjectHelper');
$objectHelper=new ObjectHelper();
$content_models = $objectHelper->get_content_models_list($pid);
foreach ($content_models as $content_model) {
if ($content_model != 'fedora-system:FedoraObject-3.0') {
$ret = $content_model;
break;
}
}
}
return $ret;
}
/**
* Ingests a Content Model from a file to the specified pid/dsid .
* Returns false on failure.
*
* @param string $pid
* @param string $name
* @param string $modelDsid
* @param string $file
* @return ContentModel $cm
*/
public static function ingestFromFile($pid, $name, $modelDsid, $file) {
$ret = FALSE;
if (($cm = self::loadFromModel($pid, $modelDsid)) === FALSE && file_exists($file)) {
$cm = new ContentModel(file_get_contents($file), $pid, $modelDsid);
$rootEl = $cm->xml->getElementsByTagName('content_model')->item(0);
$rootEl->setAttribute('name', $name);
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$fedoraItem = new Fedora_Item($pid);
$fedoraItem->add_datastream_from_string($cm->dumpXml(), $modelDsid, $name, 'text/xml', 'X');
$ret= $cm;
}
return $ret;
}
/**
* Ingests a Content Model from an existing model to the specified pid/dsid .
* Returns false on failure.
*
* @param string $pid
* @param string $name
* @param string $modelDsid
* @param string $copy_model_pid
* @return ContentModel $cm
*/
public static function ingestFromModel($pid, $name, $modelDsid, $copy_model_pid) {
$ret = FALSE;
if (($cm = self::loadFromModel($pid, $modelDsid)) === FALSE && ($copy_cm = self::loadFromModel($copy_model_pid)) !== FALSE && $copy_cm->validate()) {
$newDom = $copy_cm->xml;
$rootEl = $newDom->getElementsByTagName('content_model')->item(0);
$rootEl->setAttribute('name', $name);
$cm = new ContentModel($newDom, $pid, $modelDsid);
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$fedoraItem = new Fedora_Item($pid);
$fedoraItem->add_datastream_from_string($cm->dumpXml(), $modelDsid, $name, 'text/xml', 'X');
$ret = $cm;
}
return $ret;
}
/**
* Ingests a minimum Content Model to the specified pid/dsid.
* Returns false on failure.
*
* @param string $pid
* @param string $name
* @param string $modelDsid
* @param string $defaultMimetype
* @param string $ingestFromDsid
* @param integer $ingestFormPage
* @param boolean $ingestFormHideFileChooser
* @param string $ingestFormModule
* @param string $ingestFormModule
* @param string $ingestFormFile
* @param string $ingestFormClass
* @param string $ingestFormMethod
* @param string $ingestFormHandler
*
* @return ContentModel $cm
*/
public static function ingestBlankModel($pid, $name, $modelDsid, $defaultMimetype, $ingestFormDsid, $ingestFormPage, $ingestFormHideChooser, $ingestFormModule, $ingestFormModule, $ingestFormFile, $ingestFormClass, $ingestFormMethod, $ingestFormHandler) {
$ret = FALSE;
if (($cm = self::loadFromModel($pid, $modelDsid)) === FALSE) {
$newDom = new DOMDocument('1.0', 'utf-8');
$newDom->formatOutput = TRUE;
$rootEl = $newDom->createElement('content_model');
$rootEl->setAttribute('name', $name);
$rootEl->setAttribute('xmlns', self::$XMLNS);
$rootEl->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$rootEl->setAttribute('xsi:schemaLocation', self::$XMLNS .' '. self::$SCHEMA_URI);
$mimeEl = $newDom->createElement('mimetypes');
$typeEl=$newDom->createElement('type', $defaultMimetype);
$mimeEl->appendChild($typeEl);
$rootEl->appendChild($mimeEl);
$ingestRulesEl = $newDom->createElement('ingest_rules');
$rootEl->appendChild($ingestRulesEl);
$ingestFormEl = $newDom->createElement('ingest_form');
$ingestFormEl->setAttribute('dsid', $ingestFormDsid);
$ingestFormEl->setAttribute('page', $ingestFormPage);
if ($ingestFormHideChooser == 'true') {
$ingestFormEl->setAttribute('hide_file_chooser', 'true');
}
$builderEl= $newDom->createElement('form_builder_method');
$builderEl->setAttribute('module', $ingestFormModule);
$builderEl->setAttribute('file', $ingestFormFile);
$builderEl->setAttribute('class', $ingestFormClass);
$builderEl->setAttribute('method', $ingestFormMethod);
$builderEl->setAttribute('handler', $ingestFormHandler);
$ingestFormEl->appendChild($builderEl);
$elementsEl = $newDom->createElement('form_elements');
$ingestFormEl->appendChild($elementsEl);
$rootEl->appendChild($ingestFormEl);
$newDom->appendChild($rootEl);
$cm = new ContentModel($newDom, $pid, $modelDsid);
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
$fedoraItem = new Fedora_Item($pid);
$fedoraItem->add_datastream_from_string($cm->dumpXml(), $modelDsid, $name, 'text/xml', 'X');
$ret = $cm;
}
return $ret;
}
/**
* Constructs a ContentModel object from the PID of the model in Fedora.
* If DSID is specified it will use that datastream as the model, otherwise it will
* use the default (usually ISLANDORACM). PID_NAMESPACE and name can also be initialized
* from the collection policy.
* Returns false on failure.
*
* NOTE: $name will be overwritten with the content model name found in the datastream
* when the model is first validated.\
*
* @param string $pid
* @param string $dsid
* @param string $pid_namespace
* @param string $name
* @return ContentModel $cm
*/
public static function loadFromModel($pid, $dsid = NULL, $pid_namespace = NULL, $name = NULL) {
$ret = FALSE;
module_load_include('inc', 'fedora_repository', 'api/fedora_item');
try {
if (self::validPid($pid)) {
$fedoraItem = new Fedora_Item($pid);
$dsid = ($dsid != NULL && self::validDsid($dsid)) ? $dsid : ContentModel::getDefaultDSID();
$ds = $fedoraItem->get_datastream_dissemination($dsid);
if (!empty($ds)) {
$ret=new ContentModel($ds, $pid, $dsid, $pid_namespace, $name);
}
}
}
catch (SOAPException $e) {
$ret = FALSE;
}
return $ret;
}
/**
* Constructor
* NOTE: Use the static constructor methods whenever possible.
*
* @param string $xmlStr
* @param string $pid
* @param string $dsid
* @param string $pid_namespace
* @param string $name
* @return XMLDatastream $cm
*/
public function __construct($xmlStr, $pid = NULL, $dsid = NULL, $pid_namespace = NULL, $name = NULL) {
parent::__construct($xmlStr, $pid, $dsid);
$this->pid_namespace = $pid_namespace;
$this->name = ($name == NULL)?'Islandora Content Model':$name;
$this->xpath = new DOMXPath($this->xml);
$this->xpath->registerNamespace('cm', 'http://www.islandora.ca');
}
/**
* Attempts to convert from the old XML schema to the new by
* traversing the XML DOM and building a new DOM. When done
* $this->xml is replaced by the newly created DOM..
*
* @return void
*/
protected function convertFromOldSchema() {
$sXml = simplexml_load_string($this->xml->saveXML());
$newDom = new DOMDocument('1.0', 'utf-8');
$newDom->formatOutput = TRUE;
$rootEl = $newDom->createElement('content_model');
$rootEl->setAttribute('name', $sXml['name']);
$rootEl->setAttribute('xmlns', self::$XMLNS);
$rootEl->setAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
$rootEl->setAttribute('xsi:schemaLocation', self::$XMLNS .' ' . self::$SCHEMA_URI);
$mimeEl = $newDom->createElement('mimetypes');
foreach ($sXml->mimetypes->type as $mime) {
$typeEl = $newDom->createElement('type', $mime);
$mimeEl->appendChild($typeEl);
}
$rootEl->appendChild($mimeEl);
$ingestRulesEl = $newDom->createElement('ingest_rules');
foreach ($sXml->ingest_rules->rule as $rule) {
$ruleEl = $newDom->createElement('rule');
foreach ($rule->applies_to as $appTo) {
$applToEl = $newDom->createElement('applies_to', trim($appTo));
$ruleEl->appendChild($applToEl);
}
if (isset($rule->methods->method) && count($rule->methods->method) > 0) {
$methodsEl = $newDom->createElement('ingest_methods');
foreach ($rule->methods->method as $method) {
$methodEl = $newDom->createElement('ingest_method');
$methodEl->setAttribute('module', $method->module);
$methodEl->setAttribute('file', $method->file);
$methodEl->setAttribute('class', $method->class_name);
$methodEl->setAttribute('method', $method->method_name);
$methodEl->setAttribute('dsid', $method->datastream_id);
$methodEl->setAttribute('modified_files_ext', $method->modified_files_ext);
if (isset($method->parameters)) {
$paramsEl = $newDom->createElement('parameters');
foreach ($method->parameters->parameter as $param) {
$paramEl = $newDom->createElement('parameter', $param);
$paramEl->setAttribute('name', $param['name']);
$paramsEl->appendChild($paramEl);
}
$methodEl->appendChild($paramsEl);
}
$methodsEl->appendChild($methodEl);
}
$ruleEl->appendChild($methodsEl);
$ingestRulesEl->appendChild($ruleEl);
}
}
$rootEl->appendChild($ingestRulesEl);
if (isset($sXml->display_in_fieldset) && count($sXml->display_in_fieldset->datastream) > 0) {
$datastreamsEl = $newDom->createElement('datastreams');
foreach ($sXml->display_in_fieldset->datastream as $ds) {
$dsEl = $newDom->createElement('datastream');
$dsEl->setAttribute('dsid', $ds['id']);
if (isset($ds->add_datastream_method)) {
$add_ds_methodEl = $newDom->createElement('add_datastream_method');
$add_ds_methodEl->setAttribute('module', $ds->add_datastream_method->module);
$add_ds_methodEl->setAttribute('file', $ds->add_datastream_method->file);
$add_ds_methodEl->setAttribute('class', $ds->add_datastream_method->class_name);
$add_ds_methodEl->setAttribute('method', $ds->add_datastream_method->method_name);
$add_ds_methodEl->setAttribute('dsid', $ds->add_datastream_method->datastream_id);
$add_ds_methodEl->setAttribute('modified_files_ext', $ds->add_datastream_method->modified_files_ext);
if (isset($ds->add_datastream_method->parameters)) {
$paramsEl = $newDom->createElement('parameters');
foreach ($ds->add_datastream_method->parameters->parameter as $param) {
$paramEl = $newDom->createElement('parameter', $param);
$paramEl->setAttribute('name', $param['name']);
$paramsEl->appendChild($paramEl);
}
$add_ds_methodEl->appendChild($paramsEl);
}
$dsEl->appendChild($add_ds_methodEl);
}
foreach ($ds->method as $disp_meth) {
$disp_methEl = $newDom->createElement('display_method');
$disp_methEl->setAttribute('module', $disp_meth->module);
$disp_methEl->setAttribute('file', $disp_meth->file);
$disp_methEl->setAttribute('class', $disp_meth->class_name);
$disp_methEl->setAttribute('method', $disp_meth->method_name);
$dsEl->appendChild($disp_methEl);
}
$datastreamsEl->appendChild($dsEl);
}
$rootEl->appendChild($datastreamsEl);
}
$ingest_formEl = $newDom->createElement('ingest_form');
$ingest_formEl->setAttribute('dsid', $sXml->ingest_form['dsid']);
$ingest_formEl->setAttribute('page', $sXml->ingest_form['page']);
if (isset($sXml->ingest_form['hide_file_chooser'])) {
$ingest_formEl->setAttribute('hide_file_chooser', (strtolower($sXml->ingest_form['hide_file_chooser']) == 'true') ? 'true' : 'false');
}
$form_builderEl = $newDom->createElement('form_builder_method');
$form_builderEl->setAttribute('module', $sXml->ingest_form->form_builder_method->module);
$form_builderEl->setAttribute('file', $sXml->ingest_form->form_builder_method->file);
$form_builderEl->setAttribute('class', $sXml->ingest_form->form_builder_method->class_name);
$form_builderEl->setAttribute('method', $sXml->ingest_form->form_builder_method->method_name);
$form_builderEl->setAttribute('handler', $sXml->ingest_form->form_builder_method->form_handler);
$ingest_formEl->appendChild($form_builderEl);
$form_elementsEl = $newDom->createElement('form_elements');
foreach ($sXml->ingest_form->form_elements->element as $element) {
//I found an XML where the label was HTML.. this code will attempt to
//walk the object setting the label to be the first string it finds.
if (count(get_object_vars($element->label)) > 0) {
$obj=$element->label;
while ($obj != NULL && !is_string($obj)) {
$keys = get_object_vars($obj);
$obj = array_shift($keys);
}
$element->label=($obj == NULL) ? '' : $obj;
}
$elEl = $newDom->createElement('element');
$elEl->setAttribute('label', $element->label);
$elEl->setAttribute('name', $element->name);
$elEl->setAttribute('type', $element->type);
if (strtolower($element->required) == 'true') {
$elEl->setAttribute('required', 'true');
}
if (isset($element->description) && trim($element->description) != '') {
$descEl = $newDom->createElement('description', trim($element->description));
$elEl->appendChild($descEl);
}
if (isset($element->authoritative_list)) {
$authListEl = $newDom->createElement('authoritative_list');
foreach ($element->authoritative_list->item as $item) {
$itemEl = $newDom->createElement('item', trim($item->value));
if (trim($item->value) != trim($item->field)) {
$itemEl->setAttribute('field', trim($item->field));
}
$authListEl->appendChild($itemEl);
}
$elEl->appendChild($authListEl);
}
$form_elementsEl->appendChild($elEl);
}
$ingest_formEl->appendChild($form_builderEl);
$ingest_formEl->appendChild($form_elementsEl);
$rootEl->appendChild($ingest_formEl);
if (isset($sXml->edit_metadata) &&
trim($sXml->edit_metadata->build_form_method->module) != '' &&
trim($sXml->edit_metadata->build_form_method->file) != '' &&
trim($sXml->edit_metadata->build_form_method->class_name) != '' &&
trim($sXml->edit_metadata->build_form_method->method_name) != '' &&
trim($sXml->edit_metadata->submit_form_method->method_name) != '' &&
trim($sXml->edit_metadata->build_form_method['dsid']) != ''
) {
$edit_metadata_methodEl= $newDom->createElement('edit_metadata_method');
$edit_metadata_methodEl->setAttribute('module', $sXml->edit_metadata->build_form_method->module);
$edit_metadata_methodEl->setAttribute('file', $sXml->edit_metadata->build_form_method->file);
$edit_metadata_methodEl->setAttribute('class', $sXml->edit_metadata->build_form_method->class_name);
$edit_metadata_methodEl->setAttribute('method', $sXml->edit_metadata->build_form_method->method_name);
$edit_metadata_methodEl->setAttribute('handler', $sXml->edit_metadata->submit_form_method->method_name);
$edit_metadata_methodEl->setAttribute('dsid', $sXml->edit_metadata->build_form_method['dsid']);
$rootEl->appendChild($edit_metadata_methodEl);
}
$newDom->appendChild($rootEl);
$this->xml = DOMDocument::loadXML($newDom->saveXml());
}
/**
* Gets a list of service deployments that this model has.
*
* NOTE: Not currently being used.
*
* @return String[] $serviceDepPids
*/
public function getServices() {
$query = 'select $object $title from <#ri>
where ($object <dc:title> $title
and $object <fedora-model:isDeploymentOf> $deploymentOf
and $object <fedora-model:hasModel> <info:fedora/fedora-system:ServiceDeployment-3.0>
and $object <fedora-model:isContractorOf> <info:fedora/'. $this->pid .'>
and $object <fedora-model:state> <info:fedora/fedora-system:def/model#Active>)
order by $title';
module_load_include('inc', 'fedora_repository', 'CollectionClass');
$collectionHelper = new CollectionClass();
$xml = simplexml_load_string($collectionHelper->getRelatedItems($this->pid, $query));
$results = array();
foreach ($xml->results->result as $result) {
$pid = strval(($result->object['uri']));
$pid = substr($pid, strpos($pid, "/") + 1, strlen($pid));
$results[] = $pid;
}
return $results;
}
/**
* Gets the name of the ContentModel
* Returns false on failure.
*
* @return String $name
*/
public function getName() {
$ret = FALSE;
if ($this->name != NULL) {
$ret = $this->name;
}
elseif ($this->validate()) {
$rootEl = $this->xml->getElementsByTagName('content_model')->item(0);
$this->name = $rootEl->getAttribute('name');
$ret = $this->name;
}
return $ret;
}
/**
* Gets the element corresponding to the datastream specified
* in the <datastreams> element of the schema.
* Returns FALSE on failure.
*
* @param $dsid
* @return DOMElement $datastream
*/
private function getDSModel($dsid) {
$ret = FALSE;
if (self::validDsid($dsid) && $this->validate()) {
$result=$this->xml->getElementsByTagName('datastreams');
if ($result->length > 0) {
$result=$result->item(0)->getElementsByTagName('datastream');
for ($i = 0; $ret == FALSE && $i < $result->length; $i++) {
if ($result->item($i)->getAttribute('dsid') == $dsid)
$ret=$result->item($i);
}
}
}
return $ret;
}
/**
* Gets an array of form elements to use in the ingest form. The results of this array are passed
* to the specified ingest form builder. The form builder can optionally not use the elements as defined
* in the form builder if more complex forms or behaviour is required.
* Each element has the following keys: 'label', 'type', 'required', 'description', and if defined, 'authoritative_list' and/or 'parameters'
*
* @return string[] $elements
*/
public function getIngestFormElements() {
$ret = FALSE;
if ($this->validate()) {
$elements_array = array();
$form_elements_wrapper = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements');
if ($form_elements_wrapper->length == 0) {
return $ret;
}
$elements = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0)->getElementsByTagName('element');
for ($i=0;$i<$elements->length;$i++) {
$desc = $elements->item($i)->getElementsByTagName('description');
$desc = ($desc->length > 0)?$desc->item(0)->nodeValue:'';
$label = $elements->item($i)->getAttribute('label');
if ($label == NULL) {
$label=$elements->item($i)->getAttribute('name');
}
$element=array('name' => $elements->item($i)->getAttribute('name'),
'label' => $label,
'type' => $elements->item($i)->getAttribute('type'),
'required' => ($elements->item($i)->getAttribute('required') == 'true') ? TRUE : FALSE,
'description' => $desc
);
$auth_list = $elements->item($i)->getElementsByTagName('authoritative_list');
if ($auth_list->length > 0) {
$list = array();
$items = $auth_list->item(0)->getElementsByTagName('item');
for ($j = 0; $j < $items->length; $j++) {
$field = $items->item($j)->attributes->getNamedItem('field');
$list[ $items->item($j)->nodeValue ] = ($field !== NULL) ? $field->nodeValue : $items->item($j)->nodeValue;
}
$element['authoritative_list']=$list;
}
$params = $elements->item($i)->getElementsByTagName('parameters');
$list = array();
if ($params->length > 0) {
$items = $params->item(0)->getElementsByTagName('parameter');
for ($j = 0; $j < $items->length; $j++) {
$value = $items-> item($j)->nodeValue;
$list[$items->item($j)->getAttribute('name')] = (strtolower($value) == 'true' ? TRUE : (strtolower($value) == 'false' ? FALSE : $value));
}
}
$element['parameters'] = $list;
$elements_array[] = $element;
}
$ret = $elements_array;
}
return $ret;
}
/**
* Decrements an ingest form element in the list of elements.
* Updates the "order". This method is simply an overload to the incIngestFormElement
* which has a direction parameter.
*
* TODO: Might be useful to move multiple places at once, or define
* a method to move to an absolute position.
*
* @param String $name
* @return boolean $success
*/
public function decIngestFormElement($name) {
return $this->incIngestFormElement($name, 'dec');
}
/**
* Increments (or decrements) ingest form element in the list of elements.
* Updates the "order". The $reorder parameter accepts 'inc' or 'dec' to
* specify the direction to move (defaults to increment.)
*
* TODO: Might be useful to move multiple places at once, or define
* a method to move to an absolute position.
*
* @param String $name
* @param String $reorder
* @return boolean $success
*/
public function incIngestFormElement($name, $reorder = 'inc') {
$ret = FALSE;
if ($this->validate()) {
$elementsEl = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0);
$elements = $elementsEl->getElementsByTagName('element');
$found = FALSE;
$refEl = FALSE;
for ($i = 0; $found === FALSE && $i < $elements->length; $i++) {
if ($elements->item($i)->getAttribute('name') == trim($name)) {
if ($reorder == 'inc') {
$found=$elements->item($i);
$refEl = ($i > 0)?$elements->item($i-1):false;
}
else {
$found = ($i + 1 < $elements->length) ? $elements->item($i + 1) : FALSE;
$refEl = $elements->item($i);
}
}
}
if ($found !== FALSE) {
$elementsEl->removeChild($found);
$elementsEl->insertBefore($found, $refEl);
$ret = TRUE;
}
}
return $ret;
}
/**
* Removes an ingest form element from the list of ingest form elements.
* @param String $name
* @return boolean $success
*/
public function removeIngestFormElement($name) {
$ret = FALSE;
if ($this->validate()) {
$elementsEl = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0);
$elements = $elementsEl->getElementsByTagName('element');
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $elements->length; $i++) {
if ($elements->item($i)->getAttribute('name') == trim($name)) {
$found=$elements->item($i);
}
}
if ($found !== FALSE) {
$elementsEl->removeChild($found);
$ret = TRUE;
}
}
return $ret;
}
/**
* Sets a parameter of an ingest form element. If the value of the element is FALSE the parameter
* will be removed entirely (if you want to store false as a value, then send the String "false").
*
* @param String $elementName
* @param String $paramName
* @param String $paramValue
* @return boolean success
*/
public function setIngestFormElementParam($name, $paramName, $paramValue) {
$ret = FALSE;
if ($this->validate()) {
$elements = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0)->getElementsByTagName('element');
$element = FALSE;
for ($i = 0; $element === FALSE && $i < $elements->length; $i++) {
if ($elements->item($i)->getAttribute('name') == $name) {
$element = $elements->item($i);
}
}
if ($element !== FALSE) {
$paramsEl = $element->getElementsByTagName('parameters');
if ($paramsEl->length == 0) {
if ($paramValue !== FALSE) {
$paramsEl = $this->xml->createElement('parameters');
$element->appendChild($paramsEl);
}
else {
$ret = TRUE;
}
}
else {
$paramsEl=$paramsEl->item(0);
}
if (!$ret) {
$params = $paramsEl->getElementsByTagName('parameter');
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $params->length; $i++) {
if ($params->item($i)->getAttribute('name') == $paramName) {
$found=$params->item($i);
}
}
if ($paramValue === FALSE) {
if ($found !== FALSE) {
$paramsEl->removeChild($found);
if ($params->length == 0) {
$element->removeChild($paramsEl);
}
}
$ret = TRUE;
}
else {
if ($found !== FALSE) {
$found->nodeValue = $paramValue;
}
else {
$paramEl=$this->xml->createElement('parameter', $paramValue);
$paramEl->setAttribute('name', $paramName);
$paramsEl->appendChild($paramEl);
}
$ret = TRUE;
}
}
}
}
return $ret;
}
/**
* Gets a list of all parameters that belong to the specified ingest form element.
*
* @param String $elementName
* @return boolean success
*/
public function getIngestFormElementParams($name) {
$ret = FALSE;
if ($this->validate()) {
$elements = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0)->getElementsByTagName('element');
$element = FALSE;
for ($i=0; $element === FALSE && $i < $elements->length; $i++) {
if ($elements->item($i)->getAttribute('name') == $name) {
$element = $elements->item($i);
}
}
if ($element !== FALSE) {
$ret = array();
$paramsEl = $element->getElementsByTagName('parameters');
if ($paramsEl->length > 0) {
$params = $paramsEl->item(0)->getElementsByTagName('parameter');
for ($i = 0; $i < $params->length; $i++) {
$ret[$params->item($i)->getAttribute('name')]=$params->item($i)->nodeValue;
}
}
}
}
return $ret;
}
/**
* Edits the ingest form element specified.
* NOTE: The element name can not be changed. To update an elements name
* it must be deleted and added with the new name.
*
* @param String $name
* @param String $label
* @param String $type
* @param boolean $required
* @param String description
* @return boolean success
*/
public function editIngestFormElement($name, $label, $type, $required, $description) {
$ret = FALSE;
if ($this->validate()) {
$elements = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0)->getElementsByTagName('element');
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $elements->length; $i++) {
if ($elements->item($i)->getAttribute('name') == $name) {
$found = $elements->item($i);
}
}
$found->setAttribute('name', $name);
$found->setAttribute('type', $type);
$found->setAttribute('required', $required ? 'true' : 'false');
if (trim($label) != '' && trim($label) != trim($name)) {
$found->setAttribute('label', $label);
}
elseif ($found->getAttribute('label') != '') {
$found->removeAttribute('label');
}
$descEl=$found->getElementsByTagName('description');
if (trim($description) != '') {
if ($descEl->length > 0) {
$descEl=$descEl->item(0);
$descEl->nodeValue = $description;
}
else {
$descEl = $this->xml->createElement('description', $description);
$found->appendChild($descEl);
}
}
elseif ($descEl->length > 0) {
$found->removeChild($descEl->item(0));
}
if ($found->getAttribute('type') != 'select' && $found->getAttribute('type') != 'radio') {
$authList = $found->getElementsByTagName('authoritative_list');
if ($authList->length > 0) {
$found->removeChild($authList->item(0));
}
}
$ret = TRUE;
}
return $ret;
}
/**
* Add an ingest form element to the model.
*
* @param String $name
* @param String $label
* @param String $type
* @param boolean $required
* @param String $description
* @return boolean $success
*/
public function addIngestFormElement($name, $label, $type, $required, $description = '') {
$ret = FALSE;
if ($this->validate()) {
$elements = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0);
$elementEl = $this->xml->createElement('element');
$elementEl->setAttribute('name', $name);
$elementEl->setAttribute('type', $type);
$elementEl->setAttribute('required', $requiredi ? 'true' : 'false');
if (trim($label) != '' && trim($label) != trim($name)) {
$elementEl->setAttribute('label', $label);
}
if (trim($description) != '') {
$descEl=$this->xml->createElement('description', $description);
$elementEl->appendChild($descEl);
}
$elements->appendChild($elementEl);
$ret = TRUE;
}
return $ret;
}
/**
* Decrements an authority list item from a form element in the list of elements.
* Updates the "order". This method is simply an overload to the incAuthListItem
* which has a direction parameter.
*
* @param String $elementName
* @param String $value
* @return boolean $success
*/
public function decAuthListItem($elementName, $value) {
return $this->incAuthListItem($elementName, $value, 'dec');
}
/**
* Increments (or decrements) an authority list item from a form element in the list of elements.
* Updates the "order".
*
* @param String $elementName
* @param String $value
* @param String $direction
* @return boolean $success
*/
public function incAuthListItem($elementName, $value, $reorder = 'inc') {
$ret = FALSE;
if ($this->validate()) {
$elements = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0)->getElementsByTagName('element');
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $elements->length; $i++) {
if ($elements->item($i)->getAttribute('name') == $elementName) {
$found = $elements->item($i);
}
}
if ($found !== FALSE) {
$authListEl = $found->getElementsByTagName('authoritative_list');
if ($authListEl->length > 0) {
$authListEl = $authListEl->item(0);
$items = $authListEl->getElementsByTagName('item');
$found = FALSE;
$refEl = FALSE;
for ($i = 0; $found === FALSE && $i < $items->length; $i++) {
if ($items->item($i)->nodeValue == $value) {
if ($reorder == 'inc') {
$refEl = ($i > 0) ? $items->item($i - 1) : FALSE;
$found = $items->item($i);
}
else {
$refEl = $items->item($i);
$found = ($i + 1 < $items->length) ? $items->item($i + 1) : FALSE;
}
}
}
if ($found !== FALSE && $refEl !== FALSE) {
$authListEl->removeChild($found);
$authListEl->insertBefore($found, $refEl);
$ret = TRUE;
}
}
}
}
return $ret;
}
/**
* Removes an authority list item from a form element.
@param String $elementName
@param String $value
@return boolean $success
*/
public function removeAuthListItem($elementName, $value) {
$ret = FALSE;
if ($this->validate()) {
$elements = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0)->getElementsByTagName('element');
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $elements->length; $i++) {
if ($elements->item($i)->getAttribute('name') == $elementName) {
$found = $elements->item($i);
}
}
if ($found !== FALSE) {
$authListEl = $found->getElementsByTagName('authoritative_list');
if ($authListEl->length > 0) {
$authListEl = $authListEl->item(0);
$items = $authListEl->getElementsByTagName('item');
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $items->length; $i++) {
if ($items->item($i)->nodeValue == $value) {
$found=$items->item($i);
}
}
if ($found !== FALSE) {
if ($items->length == 1) {
$found->removeChild($authListEl);
}
else {
$authListEl->removeChild($found);
}
$ret = TRUE;
}
}
}
}
return $ret;
}
/**
* Adds an authority list item to a form element.
@param String $elementName
@param String $value
@param String $label (optional)
@return boolean $success
*/
public function addAuthListItem($elementName, $value, $label = '') {
$ret = FALSE;
if ($this->validate()) {
$elements = $this->xml->getElementsbyTagName('ingest_form')->item(0)->getElementsByTagName('form_elements')->item(0)->getElementsByTagName('element');
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $elements->length; $i++) {
if ($elements->item($i)->getAttribute('name') == $elementName) {
$found = $elements->item($i);
}
}
if ($found !== FALSE) {
$authListEl = $found->getElementsByTagName('authoritative_list');
if ($authListEl->length == 0) {
$authListEl = $this->xml->createElement('authoritative_list');
$found->appendChild($authListEl);
}
else {
$authListEl = $authListEl->item(0);
}
$items = $authListEl->getElementsByTagName('item');
$found = FALSE;
for ($i = 0; $found == FALSE && $i < $items->length; $i++) {
if ($items->item($i)->nodeValue == $value) {
$found = TRUE;
}
}
if (!$found) {
$itemEl = $this->xml->createElement('item', trim($value));
if (trim($label) != '' && trim($label) != trim($value)) {
$itemEl->setAttribute('field', trim($label));
}
$authListEl->appendChild($itemEl);
$ret = TRUE;
}
}
}
return $ret;
}
/**
* Builds an ingest form using the method specified in <form_builder_method> element of <ingest_form>
* Returns FALSE on failure.
*
* @param &$form
* @param &$form_state
* @return string identifier
*/
public function buildIngestForm(&$form, &$form_state) {
$ret = FALSE;
if ($this->validate()) {
$docRoot = $_SERVER['DOCUMENT_ROOT'];
$file = (isset($form_state['values']['ingest-file-location']) ? $form_state['values']['ingest-file-location'] : '');
$fullpath = $file;
$form['step'] = array(
'#type' => 'hidden',
'#value' => (isset($form_state['values']['step']) ? $form_state['values']['step'] : 0) + 1,
);
$form['ingest-file-location'] = array(
'#type' => 'hidden',
'#value' => $file,
);
$form['content_model_name'] = array(
'#type' => 'hidden',
'#value' => 'ISLANDORACM',
);
$form['models'] = array( //content models available
'#type' => 'hidden',
'#value' => $form_state['values']['models'],
);
$form['fullpath'] = array(
'#type' => 'hidden',
'#value' => $fullpath,
);
$form['#attributes']['enctype'] = 'multipart/form-data';
$form['indicator']['ingest-file-location'] = array(
'#type' => 'file',
'#title' => t('Upload Document'),
'#size' => 48,
'#description' => t('Full text'),
);
$ingest_form = $this->xml->getElementsByTagName('ingest_form')->item(0);
if (!empty($ingest_form)) {
if (strtolower($ingest_form->getAttribute('hide_file_chooser')) == 'true') {
$form['indicator']['ingest-file-location']['#type'] = 'hidden';
}
}
$dsid = $ingest_form->getAttribute('dsid');
$method=$ingest_form->getElementsByTagName('form_builder_method')->item(0);
$module = $method->getAttribute('module');
$path=drupal_get_path('module', !empty($module) ? $module : 'fedora_repository') . '/' . $method->getAttribute('file');
if (!file_exists($path)) {
self::$errors[]='Build Ingest Form: file \''. $path .'\' does not exist.';
}
else {
@require_once($path);
$className=$method->getAttribute('class');
$methodName=($method->getAttribute('method'));
if (!class_exists($className)) {
self::$errors[] = 'Build Ingest Form: class \''. $className .' does not exist.';
}
else {
$class = new $className;
$elements_array=$this->getIngestFormElements();
if (method_exists($class, $methodName)) {
$ret = $class->$methodName ($form, $elements_array, $form_state);
}
else {
self::$errors[] = 'Build Ingest Form: method \''. $className .'->'. $methodName .'\' does not exist.';
}
}
}
}
return $ret;
}
/**
* Builds an edit metadata form using the method specified in the <edit_metadata_method> element
= * The DSID specified must match the DSID attribute of <edit_metadata_method>. Returns FALSE on failure.
*
* @param string $dsid
* @return $form
*/
public function buildEditMetadataForm($pid, $dsid) {
$ret = FALSE;
if (self::validDsid($dsid) && $this->validate()) {
$method = $this->xml->getElementsByTagName('edit_metadata_method');
if ($method->length > 0 && $method->item(0)->getAttribute('dsid') == $dsid) {
$method = $method->item(0);
$module = $method->getAttribute('module');
$path = drupal_get_path('module', !empty($module) ? $module : 'fedora_repository') . '/' . $method->getAttribute('file') ;
if (!file_exists($path)) {
self::$errors[] = 'Build Edit Metadata Form: file \''. $path .'\' does not exist.';
}
else {
@require_once($path );
$className=$method->getAttribute('class');
$methodName=($method->getAttribute('method'));
if (!class_exists($className)) {
self::$errors[] = 'Build Edit Metadata Form: class \''. $className .'\' does not exist.';
}
else {
$class = new $className($pid);
if (!method_exists($class, $methodName)) {
self::$errors[] = 'Build Edit Metadata Form: method \''. $className .'->'. $methodName .'\' does not exist.';
}
else {
$ret = $class->$methodName();
}
}
}
}
}
return $ret;
}
/**
* Handles the edit metadata form using the handler specified in the <edit_metadata_method> element
* Returns FALSE on failure.
*
* @param &$form_id
* @param &$form_values
* @param &$soap_client
* @return $result
*/
public function handleEditMetadataForm(&$form_id, &$form_state, &$soap_client) {
global $base_url;
$ret = FALSE;
if ($this->validate()) {
$method = $this->xml->getElementsByTagName('edit_metadata_method');
if ($method->length > 0) {
$method=$method->item(0);
$module = $method->getAttribute('module');
$path = drupal_get_path('module', !empty($module) ? $module : 'fedora_repository') . '/' . $method->getAttribute('file');
if (!file_exists($path)) {
self::$errors[] = 'Handle Edit Metadata Form: file \''. $path .'\' does not exist.';
}
else {
@require_once($path);
$className = $method->getAttribute('class');
$methodName = ($method->getAttribute('handler'));
if (!class_exists($className)) {
self::$errors[] = 'Handle Edit Metadata Form: class \''. $className .'\' does not exist.';
}
else {
$class = new $className($form_state['values']['pid']);
if (!method_exists($class, $methodName)) {
self::$errors[] = 'Handle Edit Metadata Form: metho \''. $className .'->'. $methodName .'\' does not exist.';
}
else {
$ret = $class->$methodName($form_id, $form_state['values'], $soap_client);
}
}
}
}
else {
// Assume DC form if none is specified.
module_load_include('inc', 'fedora_repository', 'formClass');
$metaDataForm = new formClass();
$ret = $metaDataForm->updateMetaData($form_state['values']['form_id'], $form_state['values'], $soap_client);
$form_state['storage'] = NULL;
$form_state['redirect'] = $base_url . '/fedora/repository/' . $form_state['values']['pid'];
}
}
return $ret;
}
/**
* Gets an associative array describing the edit metadata method.
* Array has the following keys: 'file', 'class', 'method', 'handler', 'dsid'
* @return String[] $method
*/
public function getEditMetadataMethod() {
$ret = FALSE;
if ($this->validate()) {
$method=$this->xml->getElementsByTagName('content_model')->item(0)->getElementsByTagName('edit_metadata_method');
if ($method->length > 0) {
$method = $method->item(0);
$ret = array('module' => $method->getAttribute('module') == '' ? 'fedora_repository' : $method->getAttribute('module'),
'file' => $method->getAttribute('file'),
'class' => $method->getAttribute('class'),
'method' => $method->getAttribute('method'),
'handler' => $method->getAttribute('handler'),
'dsid' => $method->getAttribute('dsid')
);
}
}
return $ret;
}
/**
* Removes the edit data method from the Content Model.
* @return boolean $success
*/
public function removeEditMetadataMethod() {
$ret = FALSE;
if ($this->validate()) {
$rootEl=$this->xml->getElementsByTagName('content_model')->item(0);
$method = $rootEl->getElementsByTagName('edit_metadata_method');
if ($method->length > 0) {
$rootEl->removeChild($method->item(0));
$ret = TRUE;
}
}
return $ret;
}
/**
* Update the Edit Metadata Method defined in the Content Model
* @param String $module
* @param String $file
* @param String $class
* @param String $method
* @param String $handler
* @param String $dsid
* @return boolean $success
*/
public function updateEditMetadataMethod($module, $file, $class, $method, $handler, $dsid) {
$ret = FALSE;
if (self::validDsid($dsid) && $this->validate()) {
$methodEl = $this->xml->getElementsByTagName('content_model')->item(0)->getElementsByTagName('edit_metadata_method');
if ($methodEl->length > 0) {
$methodEl=$methodEl->item(0);
}
else {
$methodEl = $this->xml->createElement('edit_metadata_method');
$this->xml->getElementsByTagName('content_model')->item(0)->appendChild($methodEl);
}
$methodEl->setAttribute('module', $module);
$methodEl->setAttribute('file', $file);
$methodEl->setAttribute('class', $class);
$methodEl->setAttribute('method', $method);
$methodEl->setAttribute('handler', $handler);
$methodEl->setAttribute('dsid', $dsid);
$ret = TRUE;
}
return $ret;
}
/**
* Executes the add datastream method for the specified datastream on the specified file.
* Returns FALSE on failure.
*
* @param string $dsid
* @param string $filen
* @return $result
*/
public function execAddDatastreamMethods($dsid, $file) {
$ret = FALSE;
if (self::validDsid($dsid) && $this->validate() && ($ds = $this->getDSModel($dsid)) !== FALSE) {
$addMethod = $ds->getElementsByTagName('add_datastream_method');
if ($addMethod->length > 0) {
$addMethod=$addMethod->item(0);
$paramArray = array();
$params= $addMethod->getElementsByTagName('parameters');
if ($params->length > 0) {
$params=$params->item(0)->getElementsByTagName('parameter');
for ($i = 0; $i < $params->length; $i++) {
$paramsArray[$params->item($i)->getAttribute('name')] = $params->item($i)->nodeValue;
}
}
$module = $addMethod->getAttribute('module');
$path = drupal_get_path('module', !empty($module) ? $module : 'fedora_repository') . '/' . $addMethod->getAttribute('file') ;
if (!file_exists($path)) {
self::$errors[] = 'Execute Add Datastream Methods: file \''. $path .'\' does not exist.';
}
else {
@require_once($path);
$className = $addMethod->getAttribute('class');
$methodName = $addMethod->getAttribute('method');
if (!class_exists($className)) {
self::$errors[] = 'Execute Add Datastream Methods: class \''. $className .'\' does not exist.';
}
else {
$class = new $className;
if (!method_exists($class, $methodName)) {
self::$errors[] = 'Execute Add Datastream Methods: method \''. $className .'->'. $methodName .'\' does not exist.';
}
else {
$ret = $class->$methodName($paramsArray, $addMethod->getAttribute('dsid'), $file, $addMethod->getAttribute('modified_files_ext'));
}
}
}
}
}
return $ret;
}
/**
* Executes the ingest rules that apply to the specified file/mimetype.
* Returns FALSE on failure.
*
* If $preview is TRUE, then only execute rules with
* a parameter 'preview'. Used to generate previews for the file chooser.
*
* @param string $file
* @param string $mimetype
* @param boolean $preview
* @return $result
*/
public function execIngestRules($file, $mimetype, $preview = FALSE) {
$ret = FALSE;
if ($this->validate()) {
$ret = TRUE;
$rules = $this->xml->getElementsByTagName('ingest_rules')->item(0)->getElementsByTagName('rule');
for ($i = 0; $i < $rules->length; $i++) {
$rule=$rules->item($i);
$types = $rule->getElementsbyTagName('applies_to');
$valid_types = array();
for ($j = 0; $j < $types->length; $j++) {
$valid_types[]=trim($types->item($j)->nodeValue);
}
if (in_array($mimetype, $valid_types)) {
$methods = $rule->getElementsByTagName('ingest_methods');
if ($methods->length > 0) {
$methods = $methods->item(0)->getElementsbyTagName('ingest_method');
for ($j = 0; $j < $methods->length; $j++) {
$method=$methods->item($j);
$param_array=array();
$params=$method->getElementsByTagName('parameters');
$param_array['model_pid'] = $this->pid;
if ($params->length > 0) {
$params = $params->item(0)->getElementsByTagName('parameter');
for ($k = 0; $k < $params->length; $k++)
$param_array[$params->item($k)->getAttribute('name')]=$params->item($k)->nodeValue;
}
if (!$preview || isset($param_array['preview'])) {
$module = $method->getAttribute('module');
$path = drupal_get_path('module', !empty($module) ? $module : 'fedora_repository') . '/' . $method->getAttribute('file') ;
if (!file_exists($path) || substr_compare($path, 'fedora_repository/', -strlen('fedora_repository/'), strlen('fedora_repository/')) === 0) {
self::$errors[] = 'Execute Ingest Rules: file \''. $path .'\' does not exist.';
$ret = FALSE;
}
else {
require_once($path);
$className=$method->getAttribute('class');
$methodName=($method->getAttribute('method'));
if (!class_exists($className)) {
self::$errors[] = 'Execute Ingest Rules: class \''. $className .'\' does not exist.';
$ret = FALSE;
}
else $class = new $className;
if (!method_exists($class, $methodName)) {
self::$errors[] = 'Execute Ingest Rules: method \''. $className .'->' . $methodName .'\' does not exist.';
$ret = FALSE;
}
else {
$status = $class->$methodName($param_array, $method->getAttribute('dsid'), $file, $method->getAttribute('modified_files_ext'));
if ($status !== TRUE) {
$ret = FALSE;
}
}
}
}
}
}
}
}
}
return $ret;
}
/**
* Executes the form handler from the <form_builder_method> element of <ingest_form>.
*
* @param &$formData
* @param &$form_state
* @return boolean $success
*/
public function execFormHandler(&$data,&$form_state) {
$ret = FALSE;
if ($this->validate()) {
$method =$this->xml->getElementsByTagName('ingest_form')->item(0)->getElementsByTagName('form_builder_method')->item(0);
$module = $method->getAttribute('module');
$path=drupal_get_path('module', !empty($module) ? $module : 'fedora_repository') . '/' . $method->getAttribute('file') ;
if (!file_exists($path)) {
self::$errors[] = 'Execute Form Handler: file \''. $path .'\' does not exist.';
}
else {
require_once($path);
$className=$method->getAttribute('class');
$methodName=($method->getAttribute('handler'));
if (!class_exists($className)) {
self::$errors[] = 'Execute Form Handler: class \''. $className .'\' does not exist.';
}
else {
$class = new $className;
if (!method_exists($class, $methodName)) {
self::$errors[] = 'Execute Form Handler: method \''. $className .'->'. $methodName .'\' does not exist.';
}
else {
$class->$methodName($data,$form_state);
$ret = TRUE;
}
}
}
}
return $ret;
}
/**
* Gets a list of valid mimetypes that can apply to this model.
* Returns FALSE on failure.
*
* @return string[] $mimetypes
*/
public function getMimetypes() {
//only proceed if the xml is valid.
if ($this->validate()) {
if ($this->mimes === NULL) {
$result=$this->xml->getElementsByTagName('mimetypes');
$result=$result->item(0)->getElementsByTagName('type');
$mimes = array();
for ($i = 0; $i < $result->length; $i++) {
$mimes[] = trim($result->item($i)->nodeValue);
}
$this->mimes=$mimes;
}
return $this->mimes;
}
}
/**
* Calls all defined display methods for the ContentModel.
* The PID specified is passed to the constructor of the display
* class(es) specified in the Content Model.
*
* @param string $pid
* @return string $output
*/
public function displayExtraFieldset($pid, $page_number) {
$output = '';
if ($this->validate()) {
$datastreams = $this->xml->getElementsByTagName('datastreams');
if ($datastreams->length > 0) {
$datastreams = $datastreams->item(0)->getElementsByTagName('datastream');
for ($i=0; $i < $datastreams->length; $i++) {
$ds = $datastreams->item($i);
if ($ds->attributes->getNamedItem('display_in_fieldset') == NULL || strtolower($ds->getAttribute('display_in_fieldset')) != 'false' ) {
$dispMethods = $ds->getElementsByTagName('display_method');
for ($j = 0; $j < $dispMethods->length; $j++) {
$method = $dispMethods->item($j);
$module = $method->getAttribute('module');
$path=drupal_get_path('module', !empty($module) ? $module : 'fedora_repository') . '/' . $method->getAttribute('file') ;
if (!file_exists($path)) {
self::$errors[] = 'Execute Form Handler: file \''. $path .'\' does not exist.';
}
else {
require_once($path);
$className = $method->getAttribute('class');
$methodName = ($method->getAttribute('method'));
if (!class_exists($className)) {
self::$errors[] = 'Execute Form Handler: class \''. $className .'\' does not exist.';
}
else {
$class = new $className($pid);
if (!method_exists($class, $methodName)) {
self::$errors[] = 'Execute Form Handler: method \''. $className .'->'. $methodName .'\' does not exist.';
}
else {
$output = $class->$methodName($page_number);
}
}
}
}
}
}
}
}
return $output;
}
/**
* Gets a list of datastreams from the ContentModel
* (not including the QDC ds if it is listed).
* Returns FALSE on failure.
*
* @return string[] $datastreams
*/
public function listDatastreams() {
$ds_array=array();
if ($this->validate()) {
$datastreams = $this->xml->getElementsByTagName('datastreams');
if ($datastreams->length > 0) {
$datastreams=$datastreams->item(0)->getElementsByTagName('datastream');
for ($i=0;$i<$datastreams->length;$i++) {
$dsName=$datastreams->item($i)->getAttribute('dsid');
// if ($dsName != 'QDC')
// {
$ds_array[]=$dsName;
// }
}
}
}
return $ds_array;
}
/**
* Adds an allowed mimetype to the model.
*
* @param String $type
* @return boolean $success
*/
public function addMimetype($type) {
$ret=FALSE;
if ($this->validate()) {
$mimetypesEl = $this->xml->getElementsByTagName('mimetypes')->item(0);
$types= $mimetypesEl->getElementsByTagName('type');
$found = FALSE;
for ($i=0;!$found && $i<$types->length;$i++) {
if ($types->item($i)->nodeValue == $type)
$found = TRUE;
}
if (!$found) {
$newTypeEl = $this->xml->createElement('type', $type);
$mimetypesEl->appendChild($newTypeEl);
$ret=TRUE;
}
}
return $ret;
}
/**
* Removes an allowed mimetype from the model.
*
* @param String $type
* @return boolean $success
*/
public function removeMimetype($type) {
$ret=FALSE;
if ($this->validate()) {
$mimetypesEl = $this->xml->getElementsByTagName('mimetypes')->item(0);
$types= $mimetypesEl->getElementsByTagName('type');
$found=FALSE;
for ($i=0;!$found && $i<$types->length;$i++) {
if ($types->item($i)->nodeValue == $type)
$found=$types->item($i);
}
if ($found !== FALSE && $types->length > 1) {
$mimetypesEl->removeChild($found);
$ret = TRUE;
}
}
return $ret;
}
public function getDisplayMethods($ds) {
$ret=FALSE;
if (($ds = $this->getDSModel($ds))!==FALSE) {
$ret=array();
$dispMethods= $ds->getElementsByTagName('display_method');
for ($i=0;$i<$dispMethods->length;$i++) {
$ret[] = array( 'module' => $dispMethods->item($i)->getAttribute('module')==''?'fedora_repository':$dispMethods->item($i)->getAttribute('module'),
'file' => $dispMethods->item($i)->getAttribute('file'),
'class' => $dispMethods->item($i)->getAttribute('class'),
'method' => $dispMethods->item($i)->getAttribute('method'),
'default' => ($dispMethods->item($i)->attributes->getNamedItem('default') !== NULL ? strtolower($dispMethods->item($i)->getAttribute('default')) == 'true' : FALSE));
}
}
return $ret;
}
public function addDs($dsid, $display_in_fieldset = FALSE) {
$ret=FALSE;
if (self::validDsid($dsid) && ($ds = $this->getDSModel($dsid)) === FALSE) {
$datastreamsEl = $this->xml->getElementsByTagName('datastreams');
if ($datastreamsEl->length > 0) {
$datastreamsEl=$datastreamsEl->item(0);
}
else {
$datastreamsEl = $this->xml->createElement('datastreams');
$this->xml->getElementsByTagName('content_model')->item(0)->appendChild($datastreamsEl);
}
$dsEl = $this->xml->createElement('datastream');
$dsEl->setAttribute('dsid', $dsid);
if ($display_in_fieldset == TRUE) {
$dsEl->setAttribute('display_in_fieldset', 'true');
}
$datastreamsEl->appendChild($dsEl);
$ret = TRUE;
}
return $ret;
}
public function removeDs($dsid) {
$ret = FALSE;
if (self::validDsid($dsid) && ($ds = $this->getDSModel($dsid)) !== FALSE) {
$datastreamsEl = $this->xml->getElementsByTagName('datastreams')->item(0);
$datastreamsEl->removeChild($ds);
$ret = TRUE;
}
return $ret;
}
public function displayInFieldset($dsid) {
$ret = FALSE;
if (self::validDsid($dsid) && ($ds = $this->getDSModel($dsid)) !== FALSE) {
$ret = strtolower($ds->getAttribute('display_in_fieldset')) == 'true';
}
return $ret;
}
public function setDisplayInFieldset($dsid, $value = TRUE) {
$ret = FALSE;
if (self::validDsid($dsid) && ($ds = $this->getDSModel($dsid)) !== FALSE) {
if ($value == FALSE && $ds->attributes->getNamedItem('display_in_fieldset') !== NULL) {
$ds->removeAttribute('display_in_fieldset');
$ret = TRUE;
}
elseif ($value == TRUE) {
$ds->setAttribute('display_in_fieldset', 'true');
$ret = TRUE;
}
}
return $ret;
}
public function setDefaultDispMeth($dsid, $module, $file, $class, $method) {
$ret = FALSE;
if (self::validDsid($dsid) && ($ds = $this->getDSModel($dsid)) !== FALSE) {
$found = FALSE;
$dispMethods = $ds->getElementsByTagName('display_method');
for ($i = 0; !$found && $i < $dispMethods->length; $i++) {
if ($module == ($dispMethods->item($i)->getAttribute('module') == '' ? 'fedora_repository' : $dispMethods->item($i)->getAttribute('module')) &&
$file == $dispMethods->item($i)->getAttribute('file') &&
$class == $dispMethods->item($i)->getAttribute('class') &&
$method == $dispMethods->item($i)->getAttribute('method')) {
$found=$dispMethods->item($i);
}
}
if ($found !== FALSE) {
for ($i = 0; $i < $dispMethods->length; $i++) {
if ($dispMethods->item($i)->attributes->getNamedItem('default') !== NULL) {
$dispMethods->item($i)->removeAttribute('default');
}
}
$found->setAttribute('default', 'true');
$ret = TRUE;
}
}
return $ret;
}
public function removeDispMeth($dsid, $module, $file, $class, $method) {
$ret = FALSE;
if (self::validDsid($dsid) && ($ds = $this->getDSModel($dsid)) !== FALSE) {
$found = FALSE;
$dispMethods= $ds->getElementsByTagName('display_method');
for ($i=0;!$found && $i<$dispMethods->length;$i++) {
if ($module == ($dispMethods->item($i)->getAttribute('module') == '' ? 'fedora_repository' : $dispMethods->item($i)->getAttribute('module') == '') &&
$file == $dispMethods->item($i)->getAttribute('file') &&
$class == $dispMethods->item($i)->getAttribute('class') &&
$method == $dispMethods->item($i)->getAttribute('method')) {
$found=$dispMethods->item($i);
}
}
if ($found !== FALSE) {
$ds->removeChild($found);
$ret = TRUE;
}
}
return $ret;
}
public function addDispMeth($dsid, $module, $file, $class, $method, $default = FALSE) {
$ret=FALSE;
if (self::validDsid($dsid) && ($ds = $this->getDSModel($dsid))!==FALSE) {
$dispMethEl = $this->xml->createElement('display_method');
$dispMethEl->setAttribute('module', $module);
$dispMethEl->setAttribute('file', $file);
$dispMethEl->setAttribute('class', $class);
$dispMethEl->setAttribute('method', $method);
if ($default==TRUE) {
$dispMethEl->setAttribute('default', TRUE);
}
$ds->appendChild($dispMethEl);
$ret = TRUE;
}
return $ret;
}
public function getAddDsMethod($ds) {
$ret=FALSE;
if (($ds = $this->getDSModel($ds))!==FALSE) {
$addDsMethod= $ds->getElementsByTagName('add_datastream_method');
if ($addDsMethod !== FALSE && $addDsMethod->length > 0) {
$ret = array('module' => $addDsMethod->item(0)->getAttribute('module') == '' ? 'fedora_repository' : $addDsMethod->item(0)->getAttribute('module'),
'file' => $addDsMethod->item(0)->getAttribute('file'),
'class' => $addDsMethod->item(0)->getAttribute('class'),
'method' => $addDsMethod->item(0)->getAttribute('method'),
'modified_files_ext' => $addDsMethod->item(0)->getAttribute('modified_files_ext'),
'dsid' => $addDsMethod->item(0)->getAttribute('dsid')
);
}
}
return $ret;
}
public function getIngestRule($rule_id) {
$ret = FALSE;
if ($this->validate()) {
$rules = $this->xml->getElementsByTagName('ingest_rules')->item(0)->getElementsByTagName('rule');
if ($rule_id < $rules->length)
$ret = $rules->item($rule_id);
}
return $ret;
}
public function removeAppliesTo($rule_id, $type) {
$ret = FALSE;
if (($rule = $this->getIngestRule($rule_id)) !== FALSE) {
$applies = $rule->getElementsByTagName('applies_to');
$found = FALSE;
for ($i=0; $found === FALSE && $i < $applies->length; $i++) {
if ($type == $applies->item($i)->nodeValue) {
$found = $applies->item($i);
}
}
if ($found) {
$rule->removeChild($found);
$ret = TRUE;
}
}
return $ret;
}
public function addAppliesTo($rule_id, $type) {
$ret=FALSE;
if (($rule = $this->getIngestRule($rule_id))!==FALSE) {
$applies = $rule->getElementsByTagName('applies_to');
$found = FALSE;
for ($i=0;!$found && $i<$applies->length;$i++) {
$found = ($type == $applies->item($i)->nodeValue);
}
if (!$found) {
$newAppliesTo = $this->xml->createElement('applies_to', $type);
$rule->insertBefore($newAppliesTo, $rule->getElementsByTagName('ingest_methods')->item(0));
$ret = TRUE;
}
}
return $ret;
}
public function addIngestMethod($rule_id, $module, $file, $class, $method, $dsid, $modified_files_ext) {
$ret=FALSE;
if (self::validDsid($dsid) && ($rule=$this->getIngestRule($rule_id))!==FALSE) {
$methodsEl = $rule->getElementsByTagName('ingest_methods')->item(0);
$meth = $this->xml->createElement('ingest_method');
$meth->setAttribute('module', $module);
$meth->setAttribute('file', $file);
$meth->setAttribute('class', $class);
$meth->setAttribute('method', $method);
$meth->setAttribute('dsid', $dsid);
$meth->setAttribute('modified_files_ext', $modified_files_ext);
$methodsEl->appendChild($meth);
$ret = TRUE;
}
return $ret;
}
public function removeIngestMethod($rule_id, $module, $file, $class, $method) {
$ret=FALSE;
if (($rule=$this->getIngestRule($rule_id))!==FALSE) {
$found=FALSE;
$methodsEl = $rule->getElementsByTagName('ingest_methods')->item(0);
$methods = $methodsEl->getElementsByTagName('ingest_method');
for ($i=0;!$found && $i<$methods->length;$i++) {
if ($methods->item($i)->getAttribute('module') == $module && $methods->item($i)->getAttribute('file') == $file && $methods->item($i)->getAttribute('class') == $class && $methods->item($i)->getAttribute('method') == $method) {
$found = $methods->item($i);
}
}
if ($found !== FALSE && $methods->length > 1) {
$methodsEl->removeChild($found);
$ret = TRUE;
}
}
return $ret;
}
public function addIngestMethodParam($rule_id, $module, $file, $class, $method, $name, $value) {
$ret = FALSE;
if (($rule=$this->getIngestRule($rule_id)) !== FALSE) {
$methods = $rule->getElementsByTagName('ingest_methods')->item(0)->getElementsByTagName('ingest_method');
$found = FALSE;
for ($i = 0; $found === FALSE && $i < $methods->length; $i++) {
if (($methods->item($i)->getAttribute('module') == '' ? 'fedora_repository' : $methods->item($i)->getAttribute('module')) == $module &&
$methods->item($i)->getAttribute('file') == $file &&
$methods->item($i)->getAttribute('class') == $class &&
$methods->item($i)->getAttribute('method') == $method) {
$found=$methods->item($i);
}
}
if ($found !== FALSE) {
$paramsEl = $found->getElementsByTagName('parameters');
if ($paramsEl->length == 0) {
$paramsEl=$found->appendChild($this->xml->createElement('parameters'));
}
else {
$paramsEl=$paramsEl->item(0);
}
$params = $paramsEl->getElementsByTagName('parameter');
$found = FALSE;
for ($i=0; $found === FALSE && $i < $params->length; $i++) {
if ($params->item($i)->getAttribute('name') == $name) {
$found = $params->item($i);
}
}
if ($found === FALSE) {
$param = $this->xml->createElement('parameter', $value);
$param->setAttribute('name', $name);
$paramsEl->appendChild($param);
$ret = TRUE;
}
}
}
return $ret;
}
public function removeIngestMethodParam($rule_id, $module, $file, $class, $method, $name) {
$ret = FALSE;
if (($rule=$this->getIngestRule($rule_id)) !== FALSE) {
$found = FALSE;
$methodsEl = $rule->getElementsByTagName('ingest_methods')->item(0);
$methods = $methodsEl->getElementsByTagName('ingest_method');
for ($i=0; !$found && $i < $methods->length; $i++) {
if (( trim($methods->item($i)->getAttribute('module')) == $module || (trim($methods->item($i)->getAttribute('module')) == '' && $module == 'fedora_repository')) && trim($methods->item($i)->getAttribute('file')) == $file && trim($methods->item($i)->getAttribute('class')) == $class && trim($methods->item($i)->getAttribute('method')) == $method) {
$found = $methods->item($i);
}
}
if ($found !== FALSE) {
$methodEl = $found;
$paramsEl = $found->getElementsByTagName('parameters');
if ($paramsEl->length > 0) {
$paramsEl=$paramsEl->item(0);
$params = $paramsEl->getElementsByTagName('parameter');
$found = FALSE;
for ($i=0; $found === FALSE && $i < $params->length; $i++) {
if ($params->item($i)->getAttribute('name') == $name) {
$found=$params->item($i);
}
}
if ($found !== FALSE) {
$paramsEl->removeChild($found);
if ($params->length == 0) {
$methodEl->removeChild($paramsEl);
}
$ret = TRUE;
}
}
}
}
return $ret;
}
public function removeIngestRule($rule_id) {
$ret = FALSE;
if (($rule = $this->getIngestRule($rule_id))!==FALSE) {
$ret = $this->xml->getElementsByTagName('ingest_rules')->item(0)->removeChild($rule);
}
return $ret;
}
public function addIngestRule($applies_to, $module, $file, $class, $method, $dsid, $modified_files_ext) {
$ret = FALSE;
if (self::validDsid($dsid) && $this->validate()) {
$ingestRulesEl = $this->xml->getElementsByTagName('ingest_rules')->item(0);
$rule = $this->xml->createElement('rule');
$ingestMethodsEl = $this->xml->createElement('ingest_methods');
$rule->appendChild($ingestMethodsEl);
$ingestRulesEl->appendChild($rule);
$newRuleId = $ingestRulesEl->getElementsByTagName('rule')->length - 1;
$ret = ($this->addAppliesTo($newRuleId, $applies_to) && $this->addIngestMethod($newRuleId, $module, $file, $class, $method, $dsid, $modified_files_ext));
}
return $ret;
}
public function getIngestRules() {
$ret = FALSE;
if ($this->validate()) {
$ret = array();
$rules = $this->xml->getElementsByTagName('ingest_rules')->item(0)->getElementsByTagName('rule');
for ($i=0; $i < $rules->length; $i++) {
$rule = array('applies_to' => array(),
'ingest_methods' => array());
$applies_to = $rules->item($i)->getElementsByTagName('applies_to');
for ($j=0; $j < $applies_to->length; $j++) {
$rule['applies_to'][] = trim($applies_to->item($j)->nodeValue);
}
$methods = $rules->item($i)->getElementsByTagName('ingest_methods')->item(0)->getElementsByTagName('ingest_method');
for ($j=0; $j < $methods->length; $j++) {
$method = array('module' => $methods->item($j)->getAttribute('module') == '' ? 'fedora_repository' : $methods->item($j)->getAttribute('module'),
'file' => $methods->item($j)->getAttribute('file'),
'class' => $methods->item($j)->getAttribute('class'),
'method' => $methods->item($j)->getAttribute('method'),
'dsid' => $methods->item($j)->getAttribute('dsid'),
'modified_files_ext' => $methods->item($j)->getAttribute('modified_files_ext'),
'parameters' => array());
$params = $methods->item($j)->getElementsByTagName('parameters');
if ($params->length > 0) {
$params=$params->item(0)->getElementsByTagName('parameter');
for ($k=0; $k < $params->length; $k++) {
$method['parameters'][$params->item($k)->getAttribute('name')] = $params->item($k)->nodeValue;
}
}
$rule['ingest_methods'][] = $method;
}
$ret[] = $rule;
}
}
return $ret;
}
public function getIngestFormAttributes() {
$ret = FALSE;
if ($this->validate()) {
$ingest_formEl = $this->xml->getElementsByTagName('ingest_form')->item(0);
$ret=array('dsid' => $ingest_formEl->getAttribute('dsid'),
'page' => $ingest_formEl->getAttribute('page'),
'hide_file_chooser' => strtolower($ingest_formEl->getAttribute('hide_file_chooser')) == 'true',
'redirect' => strtolower($ingest_formEl->getAttribute('redirect')) == 'false' ? FALSE : TRUE);
}
return $ret;
}
public function editIngestFormAttributes($dsid, $page, $hide_file_chooser = FALSE, $redirect = TRUE) {
$ret = FALSE;
if (self::validDsid($dsid) && $this->validate()) {
$ingest_formEl = $this->xml->getElementsByTagName('ingest_form')->item(0);
$ingest_formEl->setAttribute('dsid', $dsid);
$ingest_formEl->setAttribute('page', $page);
if (!$redirect) {
$ingest_formEl->setAttribute('redirect', 'false');
}
else {
$ingest_formEl->removeAttribute('redirect');
}
if ($hide_file_chooser) {
$ingest_formEl->setAttribute('hide_file_chooser', 'true');
}
else {
$ingest_formEl->removeAttribute('hide_file_chooser');
}
$ret = TRUE;
}
return $ret;
}
public function getIngestFormBuilderMethod() {
$ret = FALSE;
if ($this->validate()) {
$method = $this->xml->getElementsByTagName('ingest_form')->item(0)->getElementsByTagName('form_builder_method')->item(0);
$ret = array( 'module' => ($method->getAttribute('module')==''?'fedora_repository':$method->getAttribute('module')),
'file' => $method->getAttribute('file'),
'class' => $method->getAttribute('class'),
'method' => $method->getAttribute('method'),
'handler' => $method->getAttribute('handler'));
}
return $ret;
}
public function editIngestFormBuilderMethod($module, $file, $class, $method, $handler) {
$ret = FALSE;
if ($this->validate()) {
$methodEl = $this->xml->getElementsByTagName('ingest_form')->item(0)->getElementsByTagName('form_builder_method')->item(0);
$methodEl->setAttribute('module', $module);
$methodEl->setAttribute('file', $file);
$methodEl->setAttribute('class', $class);
$methodEl->setAttribute('method', $method);
$methodEl->setAttribute('handler', $handler);
$ret = TRUE;
}
return $ret;
}
/**
* Find the form element with name $name.
*
* @param string $name
* The name of the form element to find.
* @return DOMElement
* The form element $name, if found FALSE otherwise.
*/
public function getForm($name) {
$result = $this->xpath->query("//cm:form[@name='$name']");
return $result->length == 1 ? $result->item(0) : FALSE;
}
/**
*
* @return array
* An array of form names that exist in this content model.
*/
public function getFormNames() {
if (!$this->validate()) {
return FALSE;
}
$names = FALSE;
$result = $this->xpath->query('//cm:forms/cm:form/@name'); // Select the name attribute of all forms.
for($i = 0; $i < $result->length; $i++) {
$attribute = $result->item($i);
$name = $attribute->value;
$names[$name] = $name;
}
return $names;
}
/**
*
* @return array
* An array of form names that exist in this content model.
*/
public function getIngestFormNames() {
if (!$this->validate()) {
return FALSE;
}
$result = $this->xpath->query('//cm:forms/cm:form[@ingest_class and @ingest_file and @ingest_module]/@name'); // Select the name attribute of all forms.
for($i = 0; $i < $result->length; $i++) {
$attribute = $result->item($i);
$name = $attribute->value;
$names[$name] = $name;
}
return $names;
}
/**
*
* @return array
* An array of form names that exist in this content model.
*/
public function getEditFormNames() {
if (!$this->validate()) {
return FALSE;
}
$result = $this->xpath->query('//cm:forms/cm:form[@edit_class and @edit_file and @edit_module]/@name'); // Select the name attribute of all forms.
for($i = 0; $i < $result->length; $i++) {
$attribute = $result->item($i);
$name = $attribute->value;
$names[$name] = $name;
}
return $names;
}
/**
* Removes the named form.
*
* @param string $name
* Name of the form to remove.
*
* @return boolean
* TRUE on success, FALSE otherwise.
*/
public function removeForm($name) {
$result = $this->xpath->query("//cm:form[@name='$name']");
if ($result->length == 1) {
$form = $result->item(0);
$form->parentNode->removeChild($form);
return TRUE;
}
return FALSE;
}
/**
* Adds the named form.
*
* @param string $element
* Name of the form to add.
*
* @return boolean
* TRUE on success, FALSE otherwise.
*/
public function addForm($element) {
$result = $this->xpath->query("//cm:forms");
if ($result->length == 0) { // Forms doesn't exist
$forms = $this->xml->createElement('forms');
$element = $this->xml->importNode($element);
$forms->appendChild($element);
$result = $this->xpath->query("//cm:content_model");
$result->item(0)->appendChild($forms);
return TRUE;
}
else if ($result->length == 1) {
$element = $this->xml->importNode($element);
$result->item(0)->appendChild($element);
return TRUE;
}
return FALSE;
}
/**
* Edits a form element with attribute name='$name' from the 'forms' element.
*
* @param String $name
*/
public function editForm($name, $element) {
if (!$this->validate()) {
return FALSE;
}
$result = $this->xpath->query("//cm:form[@name='$name']");
if($result->length == 1) {
$form = $result->item(0);
$result = $this->xpath->query("child::node()", $form);
$element = $this->xml->importNode($element);
for($i = 0; $i < $result->length; $i++) {
$child = $result->item($i);
$element->appendChild($child);
}
$form->parentNode->replaceChild($element, $form);
return TRUE;
}
return FALSE;
}
/**
*
* @param <type> $element_definition
* @param <type> $parent_element
* @return <type>
*/
public function addElementToForm($element, $parent_element) {
$element = $this->xml->importNode($element, TRUE);
$parent_element->appendChild($element);
return TRUE;
}
/**
*
* @param <type> $element_definition
* @param <type> $parent_element
*/
public function editFormElement($new_element, $edit_element) {
$new_element = $this->xml->importNode($new_element, TRUE);
$name = $new_element->tagName;
$result = $new_element->getElementsByTagName('content');
if($result->length == 1) {
$new_content = $result->item(0);
$result = $this->xpath->query("child::cm:content/child::node()", $edit_element);
for($i = 0; $i < $result->length; $i++) {
$child = $result->item($i);
$new_content->appendChild($child);
}
}
$edit_element->parentNode->replaceChild($new_element, $edit_element);
return TRUE;
}
/**
*
* @param <type> $new_element
* @param <type> $element
*/
private function insertElementInPlace($new_element, $element) {
$next = $element->nextSibling;
if ($next) {
$element->parentNode->insertBefore($new_element, $next);
}
else {
$element->parentNode->appendChild($new_element);
}
}
/**
*
* @param <type> $form_element
* @return <type>
*/
public function incFormElement($form_element) {
$prev = $form_element;
$name = $prev->getAttribute('name');
while ($prev = $prev->previousSibling) {
if (get_class($prev) == 'DOMElement') {
$form_element->parentNode->insertBefore($form_element, $prev);
break;
}
}
return TRUE;
}
/**
*
* @param <type> $form_element
* @return <type>
*/
public function decFormElement($form_element) {
$next = $form_element;
while ($next = $next->nextSibling) {
if (get_class($next) == 'DOMElement') {
$this->insertElementInPlace($form_element, $next);
break;
}
}
return TRUE;
}
}