예제 #1
0
    /**
     * For 3.0.0 upgrade.  Migrates submission files to new paths.
     */
    function migrateSubmissionFilePaths()
    {
        $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
        import('lib.pkp.classes.submission.SubmissionFile');
        $genreDao = DAORegistry::getDAO('GenreDAO');
        $journalDao = DAORegistry::getDAO('JournalDAO');
        $submissionFile = new SubmissionFile();
        import('lib.pkp.classes.file.FileManager');
        $fileManager = new FileManager();
        $articleFilesResult = $submissionFileDao->retrieve('SELECT af.*, s.submission_id, s.context_id FROM article_files_migration af, submissions s WHERE af.article_id = s.submission_id');
        $filesDir = Config::getVar('files', 'files_dir') . '/journals/';
        while (!$articleFilesResult->EOF) {
            $row = $articleFilesResult->GetRowAssoc(false);
            // Assemble the old file path.
            $oldFilePath = $filesDir . $row['context_id'] . '/articles/' . $row['submission_id'] . '/';
            if (isset($row['type'])) {
                // pre 2.4 upgrade.
                $oldFilePath .= $row['type'];
            } else {
                // post 2.4, we have file_stage instead.
                switch ($row['file_stage']) {
                    case 1:
                        $oldFilePath .= 'submission/original';
                        break;
                    case 2:
                        $oldFilePath .= 'submission/review';
                        break;
                    case 3:
                        $oldFilePath .= 'submission/editor';
                        break;
                    case 4:
                        $oldFilePath .= 'submission/copyedit';
                        break;
                    case 5:
                        $oldFilePath .= 'submission/layout';
                        break;
                    case 6:
                        $oldFilePath .= 'supp';
                        break;
                    case 7:
                        $oldFilePath .= 'public';
                        break;
                    case 8:
                        $oldFilePath .= 'note';
                        break;
                    case 9:
                        $oldFilePath .= 'attachment';
                        break;
                }
            }
            $oldFilePath .= '/' . $row['file_name'];
            if (file_exists($oldFilePath)) {
                // sanity check.
                $newFilePath = $filesDir . $row['context_id'] . '/articles/' . $row['submission_id'] . '/';
                // Since we cannot be sure that we had a file_stage column before, query the new submission_files table.
                $submissionFileResult = $submissionFileDao->retrieve('SELECT genre_id, file_stage, date_uploaded, original_file_name
							FROM submission_files WHERE file_id = ? and revision = ?', array($row['file_id'], $row['revision']));
                $submissionFileRow = $submissionFileResult->GetRowAssoc(false);
                $newFilePath .= $submissionFile->_fileStageToPath($submissionFileRow['file_stage']);
                $genre = $genreDao->getById($submissionFileRow['genre_id']);
                // pull in the primary locale for this journal without loading the whole object.
                $localeResult = $journalDao->retrieve('SELECT primary_locale FROM journals WHERE journal_id = ?', array($row['context_id']));
                $localeRow = $localeResult->GetRowAssoc(false);
                $newFilePath .= '/' . $row['submission_id'] . '-' . $genre->getDesignation() . '_' . $genre->getName($localeRow['primary_locale']) . '-' . $row['file_id'] . '-' . $row['revision'] . '-' . $submissionFileRow['file_stage'] . '-' . date('Ymd', strtotime($submissionFileRow['date_uploaded'])) . '.' . strtolower_codesafe($fileManager->parseFileExtension($submissionFileRow['original_file_name']));
                $fileManager->copyFile($oldFilePath, $newFilePath);
                if (file_exists($newFilePath)) {
                    $fileManager->deleteFile($oldFilePath);
                }
            }
            $articleFilesResult->MoveNext();
            unset($localeResult);
            unset($submissionFileResult);
            unset($localeRow);
            unset($submissionFileRow);
        }
        return true;
    }
예제 #2
0
 /**
  * Get the file's extension.
  * @return string
  */
 function getExtension()
 {
     import('lib.pkp.classes.file.FileManager');
     return strtoupper(FileManager::parseFileExtension($this->getOriginalFileName()));
 }
예제 #3
0
 /**
  * Output PDF generated from the XML/XSL/FO source to browser
  * This function performs any necessary filtering, like image URL replacement.
  * @return string
  */
 function viewFileContents()
 {
     import('lib.pkp.classes.file.FileManager');
     $fileManager = new FileManager();
     $pdfFileName = CacheManager::getFileCachePath() . DIRECTORY_SEPARATOR . 'fc-xsltGalley-' . str_replace($fileManager->parseFileExtension($this->getFileName()), 'pdf', $this->getFileName());
     // if file does not exist or is outdated, regenerate it from FO
     if (!$fileManager->fileExists($pdfFileName) || filemtime($pdfFileName) < filemtime($this->getFilePath())) {
         // render XML into XSL-FO
         $cache =& $this->_getXSLTCache($this->getFileName() . '-' . $this->getId());
         $contents = $cache->getContents();
         if ($contents == "") {
             return false;
         }
         // if for some reason the XSLT failed, show original file
         // Replace image references
         $images =& $this->getImageFiles();
         if ($images !== null) {
             // TODO: this should "smart replace" the file path ($this->getFilePath()) in the XSL-FO
             // in lieu of requiring XSL parameters, and transparently for FO that are hardcoded
             foreach ($images as $image) {
                 $contents = preg_replace('/src\\s*=\\s*"([^"]*)' . preg_quote($image->getOriginalFileName()) . '([^"]*)"/i', 'src="${1}' . dirname($this->getFilePath()) . DIRECTORY_SEPARATOR . $image->getFileName() . '$2"', $contents);
             }
         }
         // Replace supplementary file references
         $this->suppFileDao =& DAORegistry::getDAO('SuppFileDAO');
         $suppFiles = $this->suppFileDao->getSuppFilesByArticle($this->getArticleId());
         if ($suppFiles) {
             $journal =& Request::getJournal();
             foreach ($suppFiles as $supp) {
                 $suppUrl = Request::url(null, 'article', 'downloadSuppFile', array($this->getArticleId(), $supp->getBestSuppFileId($journal)));
                 $contents = preg_replace('/external-destination\\s*=\\s*"([^"]*)' . preg_quote($supp->getOriginalFileName()) . '([^"]*)"/i', 'external-destination="' . $suppUrl . '"', $contents);
             }
         }
         // create temporary FO file and write the contents
         import('classes.file.TemporaryFileManager');
         $temporaryFileManager = new TemporaryFileManager();
         $tempFoName = $temporaryFileManager->filesDir . $this->getFileName() . '-' . $this->getId() . '.fo';
         $temporaryFileManager->writeFile($tempFoName, $contents);
         // perform %fo and %pdf replacements for fully-qualified shell command
         $journal =& Request::getJournal();
         $xmlGalleyPlugin =& PluginRegistry::getPlugin('generic', $this->parentPluginName);
         $fopCommand = str_replace(array('%fo', '%pdf'), array($tempFoName, $pdfFileName), $xmlGalleyPlugin->getSetting($journal->getId(), 'externalFOP'));
         // check for safe mode and escape the shell command
         if (!ini_get('safe_mode')) {
             $fopCommand = escapeshellcmd($fopCommand);
         }
         // run the shell command and get the results
         exec($fopCommand . ' 2>&1', $contents, $status);
         // if there is an error, spit out the shell results to aid debugging
         if ($status != false) {
             if ($contents != '') {
                 echo implode("\n", $contents);
                 $cache->flush();
                 // clear the XSL cache in case it's a FO error
                 return true;
             } else {
                 return false;
             }
         }
         // clear the temporary FO file
         $fileManager->deleteFile($tempFoName);
     }
     // use FileManager to send file to browser
     $fileManager->downloadFile($pdfFileName, $this->getFileType(), true);
     return true;
 }