public function testNativeDoiImport() { $testfile = 'tests/functional/plugins/importexport/native/testissue.xml'; $args = array('import', $testfile, 'test', 'admin'); $result = $this->executeCli('NativeImportExportPlugin', $args); self::assertRegExp('/##plugins.importexport.native.import.success.description##/', $result); $daos = array('Issue' => 'IssueDAO', 'PublishedArticle' => 'PublishedArticleDAO', 'Galley' => 'ArticleGalleyDAO'); $articleId = null; foreach ($daos as $objectType => $daoName) { $dao = DAORegistry::getDAO($daoName); $pubObject = call_user_func(array($dao, "get{$objectType}ByPubId"), 'doi', $this->expectedDois[$objectType]); self::assertNotNull($pubObject, "Error while testing {$objectType}: object or DOI has not been imported."); $pubObjectByURN = call_user_func(array($dao, "get{$objectType}ByPubId"), 'other::urn', $this->expectedURNs[$objectType]); self::assertNotNull($pubObjectByURN, "Error while testing {$objectType}: object or URN has not been imported."); if ($objectType == 'PublishedArticle') { $articleId = $pubObject->getId(); } } // Trying to import the same file again should lead to an error. $args = array('import', $testfile, 'test', 'admin'); $result = $this->executeCli('NativeImportExportPlugin', $args); self::assertRegExp('/##plugins.importexport.native.import.error.duplicatePubId##/', $result); // Delete inserted article files from the filesystem. $request = $application->getRequest(); $context = $request->getContext(); import('lib.pkp.classes.file.SubmissionFileManager'); $submissionFileManager = new SubmissionFileManager($context->getId(), $articleId); $submissionFileManager->rmtree($submissionFileManager->getBasePath()); }
/** * Fix broken submission filenames (bug #8461) * @param $upgrade Upgrade * @param $params array * @param $dryrun boolean True iff only a dry run (displaying rather than executing changes) should be done. * @return boolean */ function fixFilenames($upgrade, $params, $dryrun = false) { $pressDao = DAORegistry::getDAO('PressDAO'); $submissionDao = DAORegistry::getDAO('MonographDAO'); $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); DAORegistry::getDAO('GenreDAO'); // Load constants $siteDao = DAORegistry::getDAO('SiteDAO'); /* @var $siteDao SiteDAO */ $site = $siteDao->getSite(); $adminEmail = $site->getLocalizedContactEmail(); import('lib.pkp.classes.file.SubmissionFileManager'); $contexts = $pressDao->getAll(); while ($context = $contexts->next()) { $submissions = $submissionDao->getByPressId($context->getId()); while ($submission = $submissions->next()) { $submissionFileManager = new SubmissionFileManager($context->getId(), $submission->getId()); $submissionFiles = $submissionFileDao->getBySubmissionId($submission->getId()); foreach ($submissionFiles as $submissionFile) { $generatedFilename = $submissionFile->getServerFileName(); $basePath = $submissionFileManager->getBasePath() . $submissionFile->_fileStageToPath($submissionFile->getFileStage()) . '/'; $globPattern = $submissionFile->getSubmissionId() . '-' . '*' . '-' . $submissionFile->getFileId() . '-' . $submissionFile->getRevision() . '-' . $submissionFile->getFileStage() . '-' . date('Ymd', strtotime($submissionFile->getDateUploaded())) . '.' . strtolower_codesafe($submissionFile->getExtension()); $matchedResults = glob($basePath . $globPattern); if (count($matchedResults) > 1) { error_log("Duplicate potential files for \"{$globPattern}\"!", 1, $adminEmail); continue; } if (count($matchedResults) == 1) { // 1 result matched. $discoveredFilename = array_shift($matchedResults); if ($dryrun) { echo "Need to rename \"{$discoveredFilename}\" to \"{$generatedFilename}\".\n"; } else { rename($discoveredFilename, $basePath . $generatedFilename); } } else { // 0 results matched. error_log("Unable to find a match for \"{$globPattern}\".\n", 1, $adminEmail); continue; } } } } return true; }
/** * Delete a submission by ID. * @param $submissionId int */ function deleteById($submissionId) { // Delete submission files. $submission = $this->getById($submissionId); assert(is_a($submission, 'Submission')); import('lib.pkp.classes.file.SubmissionFileManager'); $submissionFileManager = new SubmissionFileManager($submission->getContextId(), $submission->getId()); $submissionFileManager->rmtree($submissionFileManager->getBasePath()); $this->authorDao->deleteBySubmissionId($submissionId); $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); $reviewRoundDao->deleteBySubmissionId($submissionId); $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); $editDecisionDao->deleteDecisionsBySubmissionId($submissionId); $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); $reviewAssignmentDao->deleteBySubmissionId($submissionId); // Signoff DAOs $signoffDao = DAORegistry::getDAO('SignoffDAO'); $submissionFileSignoffDao = DAORegistry::getDAO('SubmissionFileSignoffDAO'); // Delete Signoffs associated with a submission file of this submission. $submissionFileSignoffs = $submissionFileSignoffDao->getAllBySubmission($submissionId); while ($signoff = $submissionFileSignoffs->next()) { $signoffDao->deleteObject($signoff); } // Delete the Signoffs associated with the submission itself. $submissionSignoffs = $signoffDao->getAllByAssocType(ASSOC_TYPE_SUBMISSION, $submissionId); while ($signoff = $submissionSignoffs->next()) { $signoffDao->deleteObject($signoff); } // Delete the stage assignments. $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); $stageAssignments = $stageAssignmentDao->getBySubmissionAndStageId($submissionId); while ($stageAssignment = $stageAssignments->next()) { $stageAssignmentDao->deleteObject($stageAssignment); } // N.B. Files must be deleted after signoffs to identify submission file signoffs. // Delete submission files. $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */ $submissionFileDao->deleteAllRevisionsBySubmissionId($submissionId); $noteDao = DAORegistry::getDAO('NoteDAO'); $noteDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); $submissionCommentDao = DAORegistry::getDAO('SubmissionCommentDAO'); $submissionCommentDao->deleteBySubmissionId($submissionId); // Delete any outstanding notifications for this submission $notificationDao = DAORegistry::getDAO('NotificationDAO'); $notificationDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); $submissionEventLogDao = DAORegistry::getDAO('SubmissionEventLogDAO'); $submissionEventLogDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); $submissionEmailLogDao = DAORegistry::getDAO('SubmissionEmailLogDAO'); $submissionEmailLogDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); // Delete controlled vocab lists assigned to this submission $submissionKeywordDao = DAORegistry::getDAO('SubmissionKeywordDAO'); $submissionKeywordVocab = $submissionKeywordDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_KEYWORD, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionKeywordVocab)) { $submissionKeywordDao->deleteObject($submissionKeywordVocab); } $submissionDisciplineDao = DAORegistry::getDAO('SubmissionDisciplineDAO'); $submissionDisciplineVocab = $submissionDisciplineDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionDisciplineVocab)) { $submissionDisciplineDao->deleteObject($submissionDisciplineVocab); } $submissionAgencyDao = DAORegistry::getDAO('SubmissionAgencyDAO'); $submissionAgencyVocab = $submissionAgencyDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_AGENCY, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionAgencyVocab)) { $submissionAgencyDao->deleteObject($submissionAgencyVocab); } $submissionLanguageDao = DAORegistry::getDAO('SubmissionLanguageDAO'); $submissionLanguageVocab = $submissionLanguageDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_LANGUAGE, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionLanguageVocab)) { $submissionLanguageDao->deleteObject($submissionLanguageVocab); } $submissionSubjectDao = DAORegistry::getDAO('SubmissionSubjectDAO'); $submissionSubjectVocab = $submissionSubjectDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_SUBJECT, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionSubjectVocab)) { $submissionSubjectDao->deleteObject($submissionSubjectVocab); } $this->update('DELETE FROM submission_settings WHERE submission_id = ?', (int) $submissionId); $this->update('DELETE FROM submissions WHERE submission_id = ?', (int) $submissionId); }
/** * Return a context-aware file path. */ function getFilePath() { // Get the context ID $submissionDao = Application::getSubmissionDAO(); $submission = $submissionDao->getById($this->getSubmissionId()); if (!$submission) { return null; } $contextId = $submission->getContextId(); unset($submission); // Construct the file path import('lib.pkp.classes.file.SubmissionFileManager'); $submissionFileManager = new SubmissionFileManager($contextId, $this->getSubmissionId()); return $submissionFileManager->getBasePath() . $this->_fileStageToPath($this->getFileStage()) . '/' . $this->getServerFileName(); }
/** * Delete a submission by ID. * @param $submissionId int */ function deleteById($submissionId) { // Delete submission files. $submission = $this->getById($submissionId); assert(is_a($submission, 'Submission')); // 'deleteAllRevisionsBySubmissionId' has to be called before 'rmtree' // because SubmissionFileDaoDelegate::deleteObjects checks the file // and returns false if the file is not there, which makes the foreach loop in // PKPSubmissionFileDAO::_deleteInternally not run till the end. $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */ $submissionFileDao->deleteAllRevisionsBySubmissionId($submissionId); import('lib.pkp.classes.file.SubmissionFileManager'); $submissionFileManager = new SubmissionFileManager($submission->getContextId(), $submission->getId()); $submissionFileManager->rmtree($submissionFileManager->getBasePath()); $this->authorDao->deleteBySubmissionId($submissionId); $reviewRoundDao = DAORegistry::getDAO('ReviewRoundDAO'); $reviewRoundDao->deleteBySubmissionId($submissionId); $editDecisionDao = DAORegistry::getDAO('EditDecisionDAO'); $editDecisionDao->deleteDecisionsBySubmissionId($submissionId); $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); $reviewAssignmentDao->deleteBySubmissionId($submissionId); // Delete the queries associated with a submission $queryDao = DAORegistry::getDAO('QueryDAO'); $queryDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); // Delete the stage assignments. $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); $stageAssignments = $stageAssignmentDao->getBySubmissionAndStageId($submissionId); while ($stageAssignment = $stageAssignments->next()) { $stageAssignmentDao->deleteObject($stageAssignment); } $noteDao = DAORegistry::getDAO('NoteDAO'); $noteDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); $submissionCommentDao = DAORegistry::getDAO('SubmissionCommentDAO'); $submissionCommentDao->deleteBySubmissionId($submissionId); // Delete any outstanding notifications for this submission $notificationDao = DAORegistry::getDAO('NotificationDAO'); $notificationDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); $submissionEventLogDao = DAORegistry::getDAO('SubmissionEventLogDAO'); $submissionEventLogDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); $submissionEmailLogDao = DAORegistry::getDAO('SubmissionEmailLogDAO'); $submissionEmailLogDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submissionId); // Delete controlled vocab lists assigned to this submission $submissionKeywordDao = DAORegistry::getDAO('SubmissionKeywordDAO'); $submissionKeywordVocab = $submissionKeywordDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_KEYWORD, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionKeywordVocab)) { $submissionKeywordDao->deleteObject($submissionKeywordVocab); } $submissionDisciplineDao = DAORegistry::getDAO('SubmissionDisciplineDAO'); $submissionDisciplineVocab = $submissionDisciplineDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionDisciplineVocab)) { $submissionDisciplineDao->deleteObject($submissionDisciplineVocab); } $submissionAgencyDao = DAORegistry::getDAO('SubmissionAgencyDAO'); $submissionAgencyVocab = $submissionAgencyDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_AGENCY, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionAgencyVocab)) { $submissionAgencyDao->deleteObject($submissionAgencyVocab); } $submissionLanguageDao = DAORegistry::getDAO('SubmissionLanguageDAO'); $submissionLanguageVocab = $submissionLanguageDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_LANGUAGE, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionLanguageVocab)) { $submissionLanguageDao->deleteObject($submissionLanguageVocab); } $submissionSubjectDao = DAORegistry::getDAO('SubmissionSubjectDAO'); $submissionSubjectVocab = $submissionSubjectDao->getBySymbolic(CONTROLLED_VOCAB_SUBMISSION_SUBJECT, ASSOC_TYPE_SUBMISSION, $submissionId); if (isset($submissionSubjectVocab)) { $submissionSubjectDao->deleteObject($submissionSubjectVocab); } $this->update('DELETE FROM submission_settings WHERE submission_id = ?', (int) $submissionId); $this->update('DELETE FROM submissions WHERE submission_id = ?', (int) $submissionId); }
/** * Migrate submission filenames from OJS 2.x * @param $upgrade Upgrade * @param $params array * @return boolean */ function migrateFiles($upgrade, $params) { $journalDao = DAORegistry::getDAO('JournalDAO'); $submissionDao = DAORegistry::getDAO('ArticleDAO'); $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); DAORegistry::getDAO('GenreDAO'); // Load constants $siteDao = DAORegistry::getDAO('SiteDAO'); /* @var $siteDao SiteDAO */ $site = $siteDao->getSite(); $adminEmail = $site->getLocalizedContactEmail(); import('lib.pkp.classes.file.SubmissionFileManager'); $contexts = $journalDao->getAll(); while ($context = $contexts->next()) { $submissions = $submissionDao->getByContextId($context->getId()); while ($submission = $submissions->next()) { $submissionFileManager = new SubmissionFileManager($context->getId(), $submission->getId()); $submissionFiles = $submissionFileDao->getBySubmissionId($submission->getId()); foreach ($submissionFiles as $submissionFile) { $generatedFilename = $submissionFile->getServerFileName(); $basePath = $submissionFileManager->getBasePath() . '/'; $globPattern = $submissionFile->getSubmissionId() . '-' . $submissionFile->getFileId() . '-' . $submissionFile->getRevision() . '-' . '??' . '.' . strtolower_codesafe($submissionFile->getExtension()); $matchedResults = array_merge(glob($basePath . '*/*/' . $globPattern), glob($basePath . '*/' . $globPattern)); if (count($matchedResults) > 1) { // Too many filenames matched. Continue with the first; this is just a warning. error_log("WARNING: Duplicate potential files for \"{$globPattern}\" in \"" . $submissionFileManager->getBasePath() . "\". Taking the first."); } elseif (count($matchedResults) == 0) { // No filenames matched. Skip migrating. error_log("WARNING: Unable to find a match for \"{$globPattern}\" in \"" . $submissionFileManager->getBasePath() . "\". Skipping this file."); continue; } $discoveredFilename = array_shift($matchedResults); $targetFilename = $basePath . $submissionFile->_fileStageToPath($submissionFile->getFileStage()) . '/' . $generatedFilename; if (file_exists($targetFilename)) { continue; } // Skip existing files/links if (!file_exists($path = dirname($targetFilename)) && !$submissionFileManager->mkdirtree($path)) { error_log("Unable to make directory \"{$path}\""); } if (!rename($discoveredFilename, $targetFilename)) { error_log("Unable to move \"{$discoveredFilename}\" to \"{$targetFilename}\"."); } } } } return true; }