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.
 
 
 
 

313 lines
11 KiB

<?php
// $Id$
/**
* @file
* Form Builder class
*/
/**
* implements method from content model ingest form xml
*/
class FormBuilder {
/**
* Constructor
*/
function FormBuilder() {
module_load_include('inc', 'Flv', '');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
}
/**
* Create QDC Stream ???
* @param type $form_values
* @param type $dom
* @param type $rootElement
*/
function createQDCStream($form_values, &$dom, &$rootElement) {
$datastream = $dom->createElement("foxml:datastream");
$datastream->setAttribute("ID", "QDC");
$datastream->setAttribute("STATE", "A");
$datastream->setAttribute("CONTROL_GROUP", "X");
$version = $dom->createElement("foxml:datastreamVersion");
$version->setAttribute("ID", "QDC.0");
$version->setAttribute("MIMETYPE", "text/xml");
$version->setAttribute("LABEL", "QDC Dublin Core Record");
$datastream->appendChild($version);
$content = $dom->createElement("foxml:xmlContent");
$version->appendChild($content);
///begin writing qdc
$oai = $dom->createElement("oai_dc:dc");
$oai->setAttribute('xmlns:oai_dc', "http://www.openarchives.org/OAI/2.0/oai_dc/");
$oai->setAttribute('xmlns:dc', "http://purl.org/dc/elements/1.1/");
$oai->setAttribute('xmlns:dcterms', "http://purl.org/dc/terms/");
$oai->setAttribute('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance");
$content->appendChild($oai);
//dc elements
$previousElement = NULL; //used in case we have to nest elements for qualified dublin core
foreach ($form_values as $key => $value) {
$index = strrpos($key, '-');
if ($index > 01) {
$key = substr($key, 0, $index);
}
$test = substr($key, 0, 2);
if ($test == 'dc' || $test == 'ap') {//don't try to process other form values
try {
if (!strcmp(substr($key, 0, 4), 'app_')) {
$key = substr($key, 4);
$previousElement->appendChild($dom->createElement($key, $value));
}
else {
$previousElement = $dom->createElement($key, $value);
$oai->appendChild($previousElement);
}
} catch (exception $e) {
drupal_set_message(t("!e", array('!e' => $e->getMessage())), 'error');
continue;
}
}
$rootElement->appendChild($datastream);
}
}
/**
* Handle QDC Form ???
* @param type $form_values
* @return type
*/
function handleQDCForm($form_values) {
$dom = new DomDocument("1.0", "UTF-8");
$dom->formatOutput = TRUE;
$pid = $form_values['pid'];
$rootElement = $dom->createElement("foxml:digitalObject");
$rootElement->setAttribute('PID', "$pid");
$rootElement->setAttribute('xmlns:foxml', "info:fedora/fedora-system:def/foxml#");
$rootElement->setAttribute('xmlns:xsi', "http://www.w3.org/2001/XMLSchema-instance");
$rootElement->setAttribute('xsi:schemaLocation', "info:fedora/fedora-system:def/foxml# http://www.fedora.info/definitions/1/0/foxml1-0.xsd");
$dom->appendChild($rootElement);
//create standard fedora stuff
$this->createStandardFedoraStuff($form_values, $dom, $rootElement);
//create relationships
$this->createRelationShips($form_values, $dom, $rootElement);
//create dublin core
$this->createQDCStream($form_values, $dom, $rootElement);
$this->createFedoraDataStreams($form_values, $dom, $rootElement);
$params = array(
'objectXML' => $dom->saveXML(),
'format' => "foxml1.0",
'logMessage' => "Fedora Object Ingested",
);
try {
$soapHelper = new ConnectionHelper();
$client = $soapHelper->getSoapClient(variable_get('fedora_soap_manage_url', 'http://localhost:8080/fedora/services/management?wsdl'));
if ($client == NULL) {
drupal_set_message(t('Error getting SOAP client.'), 'error');
return;
}
$object = $client->__soapCall('ingest', array($params));
$deleteFiles = $form_values['delete_file']; //remove files from drupal file system
if ($deleteFiles > 0) {
foreach ($_SESSION['fedora_ingest_files'] as $dsid => $createdFile) {
unlink($createdFile);
}
unlink($form_values['fullpath']);
}
} catch (exception $e) {
drupal_set_message(t('Error ingesting object: !e', array('!e' => $e->getMessage())), 'error');
return;
}
}
/**
* Create Fedora DataStream
* @param type $form_values
* @param type $dom
* @param type $rootElement
*/
function createFedoraDataStreams($form_values, &$dom, &$rootElement) {
module_load_include('inc', 'islandora_repository', 'MimeClass');
$mimetype = new MimeClass();
$server = NULL;
$file = $form_values['ingest-file-location'];
$dformat = $mimetype->getType($file);
$fileUrl = 'http://' . $_SERVER['HTTP_HOST'] . $file;
$beginIndex = strrpos($fileUrl, '/');
$dtitle = substr($fileUrl, $beginIndex + 1);
$dtitle = substr($dtitle, 0, strpos($dtitle, "."));
$ds1 = $dom->createElement("foxml:datastream");
$ds1->setAttribute("ID", "OBJ");
$ds1->setAttribute("STATE", "A");
$ds1->setAttribute("CONTROL_GROUP", "M");
$ds1v = $dom->createElement("foxml:datastreamVersion");
$ds1v->setAttribute("ID", "OBJ.0");
$ds1v->setAttribute("MIMETYPE", "$dformat");
$ds1v->setAttribute("LABEL", "$dtitle");
$ds1content = $dom->createElement('foxml:contentLocation');
$ds1content->setAttribute("REF", "$fileUrl");
$ds1content->setAttribute("TYPE", "URL");
$ds1->appendChild($ds1v);
$ds1v->appendChild($ds1content);
$rootElement->appendChild($ds1);
foreach ($_SESSION['fedora_ingest_files'] as $dsid => $createdFile) {
$createdFile = strstr($createdFile, $file);
$dformat = $mimetype->getType($createdFile);
$fileUrl = 'http://' . $_SERVER['HTTP_HOST'] . $createdFile;
$beginIndex = strrpos($fileUrl, '/');
$dtitle = substr($fileUrl, $beginIndex + 1);
$dtitle = substr($dtitle, 0, strpos($dtitle, "."));
$dtitle = $dtitle . '_' . $dsid;
$ds1 = $dom->createElement("foxml:datastream");
$ds1->setAttribute("ID", "$dsid");
$ds1->setAttribute("STATE", "A");
$ds1->setAttribute("CONTROL_GROUP", "M");
$ds1v = $dom->createElement("foxml:datastreamVersion");
$ds1v->setAttribute("ID", "$dsid.0");
$ds1v->setAttribute("MIMETYPE", "$dformat");
$ds1v->setAttribute("LABEL", "$dtitle");
$ds1content = $dom->createElement('foxml:contentLocation');
$ds1content->setAttribute("REF", "$fileUrl");
$ds1content->setAttribute("TYPE", "URL");
$ds1->appendChild($ds1v);
$ds1v->appendChild($ds1content);
$rootElement->appendChild($ds1);
}
}
/**
* creates the RELS-EXT for the foxml
* @param type $form_values
* @param type $dom
* @param type $rootElement
*/
function createRelationShips($form_values, &$dom, &$rootElement) {
$drdf = $dom->createElement("foxml:datastream");
$drdf->setAttribute("ID", "RELS-EXT");
$drdf->setAttribute("CONTROL_GROUP", "X");
$dvrdf = $dom->createElement("foxml:datastreamVersion");
$dvrdf->setAttribute("ID", "RELS-EXT.0");
$dvrdf->setAttribute("MIMETYPE", "text/xml");
$dvrdf->setAttribute("LABEL", "Fedora Object-to-Object Relationship Metadata");
$dvcontent = $dom->createElement("foxml:xmlContent");
$rdf = $dom->createElement("rdf:RDF");
$rdf->setAttribute("xmlns:rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
$rdf->setAttribute("xmlns:rdfs", "http://www.w3.org/2000/01/rdf-schema#");
$rdf->setAttribute("xmlns:fedora", "info:fedora/fedora-system:def/relations-external#");
$rdf->setAttribute("xmlns:dc", "http://purl.org/dc/elements/1.1/");
$rdf->setAttribute("xmlns:oai_dc", "http://www.openarchives.org/OAI/2.0/oai_dc/");
$rdfdesc = $dom->createElement("rdf:description");
$pid = $form_values['pid'];
$rdfdesc->setAttribute("rdf:about", "info:fedora/$pid");
$member = $dom->createElement("fedora:isMemberOfCollection");
$membr = $form_values['collection_pid'];
$member->setAttribute("rdf:resource", "info:fedora/$membr");
$drdf->appendChild($dvrdf);
$dvrdf->appendChild($dvcontent);
$dvcontent->appendChild($rdf);
$rdf->appendChild($rdfdesc);
$rdfdesc->appendChild($member);
$rootElement->appendChild($drdf);
}
/**
* creates the standard foxml properties
* @param type $form_values
* @param type $dom
* @param type $rootElement
*/
function createStandardFedoraStuff($form_values, &$dom, &$rootElement) {
/* foxml object properties section */
$objproperties = $dom->createElement("foxml:objectProperties");
$prop1 = $dom->createElement("foxml:property");
$prop1->setAttribute("NAME", "http://www.w3.org/1999/02/22-rdf-syntax-ns#type");
$prop1->setAttribute("VALUE", "FedoraObject");
$prop2 = $dom->createElement("foxml:property");
$prop2->setAttribute("NAME", "info:fedora/fedora-system:def/model#state");
$prop2->setAttribute("VALUE", "A");
$prop3 = $dom->createElement("foxml:property");
$prop3->setAttribute("NAME", "info:fedora/fedora-system:def/model#label");
$prop3->setAttribute("VALUE", $form_values['dc:title']);
$prop4 = $dom->createElement("foxml:property");
$prop4->setAttribute("NAME", "info:fedora/fedora-system:def/model#contentModel");
$prop4->setAttribute("VALUE", $form_values['content_model_name']);
$prop5 = $dom->createElement("foxml:property");
$prop5->setAttribute("NAME", "info:fedora/fedora-system:def/model#ownerId");
$prop5->setAttribute("VALUE", $form_values['user_id']);
$objproperties->appendChild($prop1);
$objproperties->appendChild($prop2);
$objproperties->appendChild($prop3);
$objproperties->appendChild($prop4);
$objproperties->appendChild($prop5);
$rootElement->appendChild($objproperties);
}
/**
* Build QDC Form
* @param type $form
* @param type $ingest_form_definition
* @param type $form_values
* @return type
*/
function buildQDCForm(&$form, $ingest_form_definition, &$form_values) {
$form['indicator2'] = array(
'#type' => 'fieldset',
'#title' => t('Ingest Digital Object Step #2')
);
foreach ($ingest_form_definition->form_elements->element as $element) {
$name = strip_tags($element->name->asXML());
$title = strip_tags($element->label->asXML());
$required = strip_tags($element->required->asXML());
$required = strtolower($required);
if ($required != 'TRUE') {
$required = '0';
}
$description = strip_tags($element->description->asXML());
$type = strip_tags($element->type->asXML());
$options = array();
if ($element->type == 'select') {
foreach ($element->authoritative_list->item as $item) {
$field = strip_tags($item->field->asXML());
$value = strip_tags($item->value->asXML());
$options["$field"] = $value;
}
$form['indicator2']["$name"] = array(
'#title' => $title,
'#required' => $required,
'#description' => $description,
'#type' => $type,
'#options' => $options,
);
}
else {
$form['indicator2']["$name"] = array(
'#title' => $title,
'#required' => $required,
'#description' => $description,
'#type' => $type
);
}
}
return $form;
}
}