/**
  * PRIVATE routine to upload the file, add it to the database, convert into proof formats and ingest in repository.
  * @param $fileName string index into the $_FILES array
  * @param $type string identifying type
  * @param $fileId int ID of an existing file to update
  * @param $overwrite boolean overwrite all previous revisions of the file (revision number is still incremented)
  * @return int the file ID (false if upload failed)
  */
 function handleUpload($fileName, $type, $fileId = null, $overwrite = false)
 {
     if (HookRegistry::call('ArticleFileManager::handleUpload', array(&$fileName, &$type, &$fileId, &$overwrite, &$result))) {
         return $result;
     }
     $articleDao =& DAORegistry::getDAO('ArticleDAO');
     $articleFileDao =& DAORegistry::getDAO('ArticleFileDAO');
     $typePath = $this->typeToPath($type);
     $dir = $this->filesDir . $typePath . '/';
     //%CBP% get the most recent supplementary files - this is used later for upating supplmentary file datastreams
     $CBPPlatformDao =& DAORegistry::getDAO('CBPPlatformDAO');
     $mostRecentSupplementaryFiles = $CBPPlatformDao->getMostRecentSupplementaryFiles($this->articleId, $fileId);
     if (!$fileId) {
         // Insert dummy file to generate file id FIXME?
         $dummyFile = true;
         $articleFile =& $this->generateDummyFile($this->article);
     } else {
         $dummyFile = false;
         $articleFile = new ArticleFile();
         $articleFile->setRevision($articleFileDao->getRevisionNumber($fileId) + 1);
         $articleFile->setArticleId($this->articleId);
         $articleFile->setFileId($fileId);
         $articleFile->setDateUploaded(Core::getCurrentDate());
         $articleFile->setDateModified(Core::getCurrentDate());
     }
     $article = $articleDao->getArticle($articleFile->getArticleId());
     $articleFile->setFileType($_FILES[$fileName]['type']);
     $articleFile->setFileSize($_FILES[$fileName]['size']);
     $articleFile->setOriginalFileName(ArticleFileManager::truncateFileName($_FILES[$fileName]['name'], 127));
     $articleFile->setType($typePath);
     $articleFile->setRound($this->article->getCurrentRound());
     $newFileName = $this->generateFilename($articleFile, $type, $this->getUploadedFileName($fileName));
     if (!$this->uploadFile($fileName, $dir . $newFileName)) {
         // Delete the dummy file we inserted
         $articleFileDao->deleteArticleFileById($articleFile->getFileId());
         return false;
     }
     if ($dummyFile) {
         $articleFileDao->updateArticleFile($articleFile);
     } else {
         $articleFileDao->insertArticleFile($articleFile);
     }
     if ($overwrite) {
         $this->removePriorRevisions($articleFile->getFileId(), $articleFile->getRevision());
     }
     //%CBP% Upload file to Repository and update database with PID/DsId
     $epubconvert = new CBPPlatformEpubConvert();
     $mobiconvert = new CBPPlatformMobiConvert();
     $pdfconvert = new CBPPlatformPdfConvert();
     if ($type == "SP") {
         //if we're uploading a supplementary file
         if ($fileId) {
             $dsSuffix = str_replace("content", "", $mostRecentSupplementaryFiles[0]['fedora_dsid']);
         } else {
             $mostRecentSupplementaryFiles = $CBPPlatformDao->getMostRecentSupplementaryFiles($this->articleId);
         }
         if (count($mostRecentSupplementaryFiles) == 1 && !$fileId) {
             $dsSuffix = "05";
         } elseif (count($mostRecentSupplementaryFiles) > 1 && !$fileId) {
             $mostRecentSupplementaryFiles = $CBPPlatformDao->getMostRecentSupplementaryFiles($this->articleId);
             $dsId = str_replace("content", "", $mostRecentSupplementaryFiles[1]['fedora_dsid']);
             $dsId = (int) $dsId;
             $dsId++;
             $dsSuffix = sprintf("%02d", $dsId);
         }
     }
     if (mime_content_type($dir . $newFileName) == "application/zip" && $type != "SP") {
         $ebookFileName = str_replace($this->parseFileExtension($newFileName), "", $newFileName);
         $epubArgs = array("author" => $this->article->getAuthorString(), "title" => $this->article->getArticleTitle(), "description" => $this->article->getArticleAbstract());
         $epubconvert->createEpub($dir, $newFileName, $dir . $ebookFileName . "epub", null, $this->article->getJournalId(), $epubArgs);
         $mobiconvert->createMobi($dir, $newFileName, $dir . $ebookFileName . "mobi", null, $this->article->getJournalId(), $epubArgs);
         $pdfconvert->createPdf($dir, $newFileName, $dir . $ebookFileName . "pdf", null, $this->article->getJournalId(), $epubArgs);
         $digitalObject = new CBPPlatformDigitalObject();
         $digitalObject->setPID($this->articleId);
         //we use articleId as the unique identifier -- this should correspond with articleId in OJS database
         $digitalObject->setLabel($article->getArticleTitle());
         //label could be anything
         $digitalObject->setNamespace(Config::getVar('general', 'component_namespace'));
         $digitalObject->setPrimaryFormat("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
         $ext = $this->parseFileExtension($newFileName);
         $label = str_replace(".{$ext}", "", $newFileName);
         $ext = "docx";
         $digitalObject->setDatastream(array($dsId = $dsPrefix . "content" => array("id" => $dsPrefix . "content", "file" => "{$dir}{$newFileName}", "label" => $label . ".{$ext}", "mimetype" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "filetype" => $ext)));
         //
         $ext = "pdf";
         $digitalObject->setDatastream(array($dsPrefix . "content02" => array("id" => $dsPrefix . "content02", "file" => "{$dir}{$ebookFileName}" . "{$ext}", "label" => $label . ".{$ext}", "mimetype" => "application/pdf", "filetype" => $ext)));
         //
         $ext = "epub";
         $digitalObject->setDatastream(array($dsPrefix . "content03" => array("id" => $dsPrefix . "content03", "file" => "{$dir}{$ebookFileName}" . "{$ext}", "label" => $label . ".{$ext}", "mimetype" => "application/epub+zip", "filetype" => $ext)));
         ///
         $ext = "mobi";
         $digitalObject->setDatastream(array($dsPrefix . "content04" => array("id" => $dsPrefix . "content04", "file" => "{$dir}{$ebookFileName}" . "{$ext}", "label" => $label . ".{$ext}", "mimetype" => "application/x-mobipocket-ebook", "filetype" => $ext)));
     } else {
         $digitalObject = new CBPPlatformDigitalObject();
         $digitalObject->setPID($this->articleId);
         //we use articleId as the unique identifier -- this should correspond with articleId in OJS database
         $digitalObject->setLabel($article->getArticleTitle());
         //label could be anything
         $digitalObject->setNamespace(Config::getVar('general', 'component_namespace'));
         if ($type != "SP") {
             $digitalObject->setPrimaryFormat(mime_content_type($dir . $newFileName));
         }
         $label = $newFileName;
         $path_parts = pathinfo("{$dir}{$newFileName}");
         $digitalObject->setDatastream(array($dsId = $dsPrefix . "content" . $dsSuffix => array("id" => $dsPrefix . "content" . $dsSuffix, "file" => "{$dir}{$newFileName}", "label" => $label, "mimetype" => $this->returnMIMEType($dir . $newFileName), "filetype" => $path_parts['extension'])));
     }
     $obj = new SimpleXMLElement($digitalObject->readObjectProperties());
     foreach ($obj as $result) {
         $noObjects = $result->count();
     }
     if ($noObjects == 0) {
         $digitalObject->createObject();
     }
     $digitalObject->createObjectDatastreams();
     if ($type != "SP") {
         $digitalObject->makeHydraCompliant(null, $article->getArticleTitle(), $article->getAuthorString());
     }
     if ($digitalObject->obj->PID != "" && $dsId != "") {
         $CBPPlatformDao->setFedoraObjectInformation($digitalObject->obj->PID, $digitalObject->obj->ns, $dsId, $articleFile->getFileId(), $articleFile->getRevision());
     }
     return $articleFile->getFileId();
 }