diff --git a/islandora.module b/islandora.module index d6c89e99..32410596 100644 --- a/islandora.module +++ b/islandora.module @@ -963,6 +963,50 @@ function islandora_add_object(AbstractObject &$object) { return $object->repository->ingestObject($object); } +/** + * Creates a new object with the same properties as the old. + * + * @todo Make Tuque objects support cloneing. + * + * @param AbstractObject $object + * An existing or new Fedora Object. + * + * @return AbstractObject + * The new Fedora Object with properties identical to the object given. This + * returned object is not automatically ingested. + */ +function islandora_copy_object(AbstractObject $object) { + $clone = $object->repository->constructObject($object->id); + $object_properties = array( + 'state', + 'createdDate', + 'lastModifiedDate', + 'label', + 'owner', + 'logMessage', + ); + // Copy Properties. + foreach ($object_properties as $property) { + if (isset($object->$property)) { + $clone->$property = $object->$property; + } + } + // Copy Datastreams. + foreach ($object as $dsid => $datastream) { + if (empty($clone[$dsid])) { + $clone->ingestDatastream($datastream); + } + else { + // Get the content into a file, and add the file. + $temp_file = drupal_tempnam('temporary://', 'datastream'); + $datastream->getContent($temp_file); + $clone[$dsid]->setContentFromFile($temp_file); + drupal_unlink($temp_file); + } + } + return $clone; +} + /** * Delete's or purges the given object. *