function handleRevisionElement($node, $stageId, $fileId)
{
static $genresByContextId = array();
$deployment = $this->getDeployment();
$submission = $deployment->getSubmission();
$context = $deployment->getContext();
$errorOccured = false;
$revisionId = $node->getAttribute('number');
$genreId = null;
$genreName = $node->getAttribute('genre');
if ($genreName) {
// Build a cached list of genres by context ID by name
if (!isset($genresByContextId[$context->getId()])) {
$genreDao = DAORegistry::getDAO('GenreDAO');
$genres = $genreDao->getByContextId($context->getId());
while ($genre = $genres->next()) {
foreach ($genre->getName(null) as $locale => $name) {
$genresByContextId[$context->getId()][$name] = $genre;
}
}
}
if (!isset($genresByContextId[$context->getId()][$genreName])) {
$deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __('plugins.importexport.common.error.unknownGenre', array('param' => $genreName)));
$errorOccured = true;
} else {
$genre = $genresByContextId[$context->getId()][$genreName];
$genreId = $genre->getId();
}
}
$submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
$submissionFile = $submissionFileDao->newDataObjectByGenreId($genreId);
$submissionFile->setSubmissionId($submission->getId());
$submissionFile->setGenreId($genreId);
$submissionFile->setFileStage($stageId);
$submissionFile->setDateUploaded(Core::getCurrentDate());
$submissionFile->setDateModified(Core::getCurrentDate());
if ($node->getAttribute('available') == 'true') {
$submissionFile->setViewable(true);
}
$submissionFile->setOriginalFileName($filename = $node->getAttribute('filename'));
for ($n = $node->firstChild; $n !== null; $n = $n->nextSibling) {
if (is_a($n, 'DOMElement')) {
$filename = $this->handleRevisionChildElement($n, $submission, $submissionFile);
}
}
$uploaderUsername = $node->getAttribute('uploader');
$uploaderUserGroup = $node->getAttribute('user_group_ref');
// Determine the user group based on the user_group_ref element.
$userGroupDao = DAORegistry::getDAO('UserGroupDAO');
$userGroups = $userGroupDao->getByContextId($context->getId());
while ($userGroup = $userGroups->next()) {
if (in_array($uploaderUserGroup, $userGroup->getName(null))) {
$submissionFile->setUserGroupId($userGroup->getId());
break;
}
}
if (!$submissionFile->getUserGroupId()) {
$deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __('plugins.importexport.common.error.unknownUserGroup', array('param' => $uploaderUserGroup)));
$errorOccured = true;
}
// Do the same for the user.
$userDao = DAORegistry::getDAO('UserDAO');
$user = $userDao->getByUsername($uploaderUsername);
if ($user) {
$submissionFile->setUploaderUserId($user->getId());
} else {
$deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __('plugins.importexport.common.error.unknownUploader', array('param' => $uploaderUsername)));
$errorOccured = true;
}
$fileSize = $node->getAttribute('filesize');
$submissionFile->setFileSize($fileSize);
$fileType = $node->getAttribute('filetype');
$submissionFile->setFileType($fileType);
$submissionFile->setRevision($revisionId);
if ($errorOccured) {
// if error occured, the file cannot be inserted into DB, becase
// genre, uploader and user group are required (e.g. at name generation).
$submissionFile = null;
} else {
$insertedSubmissionFile = $submissionFileDao->insertObject($submissionFile, $filename, false);
$deployment->setFileDBId($fileId, $revisionId, $insertedSubmissionFile->getFileId());
}
$fileManager = new FileManager();
$fileManager->deleteFile($filename);
return $submissionFile;
}