Open Monograph Press  3.3.0
SubmissionFileManager.inc.php
1 <?php
2 
28 import('lib.pkp.classes.file.BaseSubmissionFileManager');
29 
36  function __construct($contextId, $submissionId) {
37  parent::__construct($contextId, $submissionId);
38  }
39 
40 
41  //
42  // Public methods
43  //
53  function uploadSubmissionFile($fileName, $fileStage, $uploaderUserId,
54  $revisedFileId = null, $genreId = null, $assocType = null, $assocId = null) {
55  return $this->_handleUpload(
56  $fileName, $fileStage, $uploaderUserId,
57  $revisedFileId, $genreId, $assocType, $assocId
58  );
59  }
60 
70  function copySubmissionFile($filePath, $fileStage, $copyUserId,
71  $revisedFileId = null, $genreId = null, $assocType = null, $assocId = null) {
72  return $this->_handleCopy(
73  $filePath, $fileStage, $copyUserId,
74  $revisedFileId, $genreId, $assocType, $assocId
75  );
76  }
77 
84  function deleteById($fileId, $revision = null) {
85  $submissionFile = $this->_getFile($fileId, $revision);
86  if (isset($submissionFile)) {
87  return parent::deleteByPath($submissionFile->getfilePath());
88  } else {
89  return false;
90  }
91  }
92 
101  function downloadById($fileId, $revision = null, $inline = false, $filename = null) {
102  $returner = false;
103  $submissionFile = $this->_getFile($fileId, $revision);
104  if (isset($submissionFile)) {
105  // Make sure that the file belongs to the submission.
106  if ($submissionFile->getSubmissionId() != $this->getSubmissionId()) fatalError('Invalid file id!');
107 
108  $this->recordView($submissionFile);
109 
110  // Send the file to the user.
111  $filePath = $submissionFile->getFilePath();
112  $mediaType = $submissionFile->getFileType();
113  if(!isset($filename)) $filename = $submissionFile->getClientFileName();
114  $returner = parent::downloadByPath($filePath, $mediaType, $inline, $filename);
115  }
116 
117  return $returner;
118  }
119 
124  function recordView($submissionFile) {
125  // Mark the file as viewed by this user.
126  $sessionManager = SessionManager::getManager();
127  $session = $sessionManager->getUserSession();
128  $user = $session->getUser();
129  if (is_a($user, 'User')) {
130  $viewsDao = DAORegistry::getDAO('ViewsDAO'); /* @var $viewsDao ViewsDAO */
131  $viewsDao->recordView(
132  ASSOC_TYPE_SUBMISSION_FILE, $submissionFile->getFileIdAndRevision(),
133  $user->getId()
134  );
135  }
136  }
137 
147  function copyFileToFileStage($sourceFileId, $sourceRevision, $newFileStage, $destFileId = null, $viewable = false) {
148  if (HookRegistry::call('SubmissionFileManager::copyFileToFileStage', array(&$sourceFileId, &$sourceRevision, &$newFileStage, &$destFileId, &$result))) return $result;
149 
150  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
151  $sourceFile = $submissionFileDao->getRevision($sourceFileId, $sourceRevision); /* @var $sourceFile SubmissionFile */
152  if (!$sourceFile) return false;
153 
154  // Rename the variable just so that we don't get confused.
155  $destFile = $sourceFile;
156 
157  // Find out where the source file lives.
158  $sourcePath = $sourceFile->getFilePath();
159 
160  // Update the ID (or clear if making a new file) and get new revision number.
161  if ($destFileId != null) {
162  $currentRevision = $submissionFileDao->getLatestRevisionNumber($destFileId);
163  $revision = $currentRevision + 1;
164  $destFile->setFileId($destFileId);
165  } else {
166  $destFile->setFileId(null);
167  $revision = 1;
168  }
169 
170  // Update the necessary fields of the destination file.
171  $destFile->setRevision($revision);
172  $destFile->setFileStage($newFileStage);
173  $destFile->setDateModified(Core::getCurrentDate());
174  $destFile->setViewable($viewable);
175  // Set the old file as the source
176  $destFile->setSourceFileId($sourceFileId);
177  $destFile->setSourceRevision($sourceRevision);
178 
179  // Find out where the file should go.
180  $destPath = $destFile->getFilePath();
181 
182  // Now insert the row into the DB and get the inserted file id.
183  $insertedFile = $submissionFileDao->insertObject($destFile, $sourcePath);
184 
185  return $insertedFile ? array($insertedFile->getFileId(), $insertedFile->getRevision()) : null;
186  }
187 
188  //
189  // Private helper methods
190  //
202  function _handleUpload($fileName, $fileStage, $uploaderUserId,
203  $revisedFileId = null, $genreId = null, $assocType = null, $assocId = null) {
204 
205  // Ensure that the file has been correctly uploaded to the server.
206  if (!$this->uploadedFileExists($fileName)) return null;
207 
208  // Retrieve the location of the uploaded file.
209  $sourceFile = $this->getUploadedFilePath($fileName);
210 
211  // Instantiate and pre-populate a new submission file object.
212  $submissionFile = $this->_instantiateSubmissionFile($sourceFile, $fileStage, $revisedFileId, $genreId, $assocType, $assocId);
213  if (is_null($submissionFile)) return null;
214 
215  // Retrieve and copy the file type of the uploaded file.
216  $fileType = $this->getUploadedFileType($fileName);
217  assert($fileType !== false);
218  $submissionFile->setFileType($fileType);
219 
220  // Retrieve and copy the file name of the uploaded file.
221  $originalFileName = $this->getUploadedFileName($fileName);
222  assert($originalFileName !== false);
223  $submissionFile->setOriginalFileName($this->truncateFileName($originalFileName));
224 
225  // Set the uploader's user and user group id.
226  $submissionFile->setUploaderUserId($uploaderUserId);
227 
228  // Copy the uploaded file to its final destination and
229  // persist its meta-data to the database.
230  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
231  return $submissionFileDao->insertObject($submissionFile, $fileName, true);
232  }
233 
245  function _handleCopy($filePath, $fileStage, $copyUserId,
246  $revisedFileId = null, $genreId = null, $assocType = null, $assocId = null) {
247 
248  // Ensure that the file exists on the file system
249  if (!$this->fileExists($filePath)) return null;
250 
251  // Instantiate and pre-populate a new submission file object.
252  $submissionFile = $this->_instantiateSubmissionFile($filePath, $fileStage, $revisedFileId, $genreId, $assocType, $assocId);
253  if (is_null($submissionFile)) return null;
254 
255  // Retrieve and copy the file type of the uploaded file.
256  $fileType = PKPString::mime_content_type($filePath);
257  assert($fileType !== false);
258  $submissionFile->setFileType($fileType);
259 
260  // Retrieve the file name from the file path
261  $originalFileName = basename($filePath);
262  assert($originalFileName !== false);
263  $submissionFile->setOriginalFileName($this->truncateFileName($originalFileName));
264 
265  // Set the user and user group id for the copied file
266  $submissionFile->setUploaderUserId($copyUserId);
267 
268  // Save the submission file to the database.
269  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
270  return $submissionFileDao->insertObject($submissionFile, $filePath, false);
271  }
272 
283  function _instantiateSubmissionFile($sourceFilePath, $fileStage, $revisedFileId = null, $genreId = null, $assocType = null, $assocId = null) {
284  $revisedFile = null;
285 
286  // Retrieve the submission file DAO.
287  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
288 
289  // Except for reviewer file attachments we either need a genre id or a
290  // revised file, otherwise we cannot identify the target file
291  // implementation.
292  if ($fileStage != SUBMISSION_FILE_REVIEW_ATTACHMENT) {
293  assert(isset($genreId) || isset($revisedFileId));
294  if (!$genreId || $revisedFileId) {
295  // Retrieve the revised file. (null $fileStage in case the revision is from a previous stage).
296  $revisedFile = $submissionFileDao->getLatestRevision($revisedFileId, null, $this->getSubmissionId());
297  if (!is_a($revisedFile, 'SubmissionFile')) return null;
298  }
299  }
300 
301  // If we don't have a genre then use the genre from the
302  // existing file.
303  if ($revisedFile && !$genreId) {
304  $genreId = $revisedFile->getGenreId();
305  }
306 
307  // Instantiate a new submission file implementation.
308  $submissionFile = $submissionFileDao->newDataObjectByGenreId($genreId); /* @var $submissionFile SubmissionFile */
309  $submissionFile->setSubmissionId($this->getSubmissionId());
310 
311  // Instantiate submission locale for the file
312  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
313  $submission = $submissionDao->getById($submissionFile->getSubmissionId());
314  $submissionFile->setSubmissionLocale($submission->getLocale());
315 
316  // Do we create a new file or a new revision of an existing file?
317  if ($revisedFileId) {
318  // Make sure that the submission of the revised file is
319  // the same as that of the uploaded file.
320  if ($revisedFile->getSubmissionId() != $this->getSubmissionId()) return null;
321 
322  // If file stages are different we reference with the sourceFileId
323  // Otherwise, we keep the file id, update the revision, and copy other fields.
324  if(!is_null($fileStage) && $fileStage !== $revisedFile->getFileStage()) {
325  $submissionFile->setSourceFileId($revisedFileId);
326  $submissionFile->setSourceRevision($revisedFile->getRevision());
327  $submissionFile->setRevision(1);
328  $submissionFile->setViewable(false);
329  } else {
330  // Create a new revision of the file with the existing file id.
331  $submissionFile->setFileId($revisedFileId);
332  $submissionFile->setRevision($revisedFile->getRevision()+1);
333 
334  // Copy the file stage (in case of null passed in).
335  $fileStage = (int)$revisedFile->getFileStage();
336 
337  // Copy the assoc type.
338  if(!is_null($assocType) && $assocType !== $revisedFile->getAssocType()) fatalError('Invalid submission file assoc type!');
339  $assocType = (int)$revisedFile->getAssocType();
340 
341  // Copy the assoc id.
342  if (!is_null($assocId) && $assocId !== $revisedFile->getAssocId()) fatalError('Invalid submission file assoc ID!');
343  $assocId = (int)$revisedFile->getAssocId();
344 
345  // Copy the viewable flag.
346  $submissionFile->setViewable($revisedFile->getViewable());
347  }
348 
349  // Copy assorted user-facing metadata.
350  $submissionFile->copyEditableMetadataFrom($revisedFile);
351  } else {
352  // Create the first revision of a new file.
353  $submissionFile->setRevision(1);
354  $submissionFile->setViewable($fileStage == SUBMISSION_FILE_SUBMISSION?true:false); // Bug #8308: Submission files should be selected for promotion by default
355  }
356 
357  // Determine and set the file size of the file.
358  $submissionFile->setFileSize(filesize($sourceFilePath));
359 
360  // Set the file file stage.
361  $submissionFile->setFileStage($fileStage);
362 
363  // Set the file genre.
364  $submissionFile->setGenreId($genreId);
365 
366  // Set dates to the current system date.
367  $submissionFile->setDateUploaded(Core::getCurrentDate());
368  $submissionFile->setDateModified(Core::getCurrentDate());
369 
370  // Is the submission file associated to another entity?
371  if(isset($assocId)) {
372  assert(isset($assocType));
373  $submissionFile->setAssocType($assocType);
374  $submissionFile->setAssocId($assocId);
375  }
376 
377  // Return the pre-populated submission file.
378  return $submissionFile;
379  }
380 
388  function _getFile($fileId, $revision = null) {
389  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
390  if ($revision) {
391  return $submissionFileDao->getRevision($fileId, $revision);
392  } else {
393  return $submissionFileDao->getLatestRevision($fileId);
394  }
395  }
396 }
397 
398 
SessionManager\getManager
static getManager()
Definition: SessionManager.inc.php:124
SubmissionFileManager
Helper class for database-backed submission file management tasks.
Definition: SubmissionFileManager.inc.php:30
SubmissionFileManager\copySubmissionFile
copySubmissionFile($filePath, $fileStage, $copyUserId, $revisedFileId=null, $genreId=null, $assocType=null, $assocId=null)
Definition: SubmissionFileManager.inc.php:70
SubmissionFileManager\recordView
recordView($submissionFile)
Definition: SubmissionFileManager.inc.php:124
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
ContextFileManager\$contextId
$contextId
Definition: ContextFileManager.inc.php:24
FileManager\fileExists
fileExists($filePath, $type='file')
Definition: FileManager.inc.php:375
SubmissionFileManager\uploadSubmissionFile
uploadSubmissionFile($fileName, $fileStage, $uploaderUserId, $revisedFileId=null, $genreId=null, $assocType=null, $assocId=null)
Definition: SubmissionFileManager.inc.php:53
SubmissionFileManager\copyFileToFileStage
copyFileToFileStage($sourceFileId, $sourceRevision, $newFileStage, $destFileId=null, $viewable=false)
Definition: SubmissionFileManager.inc.php:147
FileManager\truncateFileName
truncateFileName($fileName, $length=127)
Definition: FileManager.inc.php:510
BaseSubmissionFileManager
Base helper class for submission file management tasks.
Definition: BaseSubmissionFileManager.inc.php:30
SubmissionFileManager\_getFile
_getFile($fileId, $revision=null)
Definition: SubmissionFileManager.inc.php:388
FileManager\getUploadedFileType
getUploadedFileType($fileName)
Definition: FileManager.inc.php:112
SubmissionFileManager\_handleCopy
_handleCopy($filePath, $fileStage, $copyUserId, $revisedFileId=null, $genreId=null, $assocType=null, $assocId=null)
Definition: SubmissionFileManager.inc.php:245
PKPString\mime_content_type
static mime_content_type($filename, $suggestedExtension='')
Definition: PKPString.inc.php:312
BaseSubmissionFileManager\getSubmissionId
getSubmissionId()
Definition: BaseSubmissionFileManager.inc.php:64
FileManager\getUploadedFilePath
getUploadedFilePath($fileName)
Definition: FileManager.inc.php:88
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
SubmissionFileManager\__construct
__construct($contextId, $submissionId)
Definition: SubmissionFileManager.inc.php:36
SubmissionFileManager\deleteById
deleteById($fileId, $revision=null)
Definition: SubmissionFileManager.inc.php:84
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
FileManager\getUploadedFileName
getUploadedFileName($fileName)
Definition: FileManager.inc.php:100
FileManager\uploadedFileExists
uploadedFileExists($fileName)
Definition: FileManager.inc.php:47
HookRegistry\call
static call($hookName, $args=null)
Definition: HookRegistry.inc.php:86
SubmissionFileManager\downloadById
downloadById($fileId, $revision=null, $inline=false, $filename=null)
Definition: SubmissionFileManager.inc.php:101
SubmissionFileManager\_instantiateSubmissionFile
_instantiateSubmissionFile($sourceFilePath, $fileStage, $revisedFileId=null, $genreId=null, $assocType=null, $assocId=null)
Definition: SubmissionFileManager.inc.php:283
SubmissionFileManager\_handleUpload
_handleUpload($fileName, $fileStage, $uploaderUserId, $revisedFileId=null, $genreId=null, $assocType=null, $assocId=null)
Definition: SubmissionFileManager.inc.php:202