16 import(
'lib.pkp.plugins.importexport.native.filter.NativeImportFilter');
25 parent::__construct($filterGroup);
36 return 'submission_files';
44 return 'submission_file';
54 return 'lib.pkp.plugins.importexport.native.filter.NativeXmlSubmissionFileFilter';
65 $stageName = $node->getAttribute(
'stage');
66 $fileId = $node->getAttribute(
'id');
67 $stageNameIdMapping = $deployment->getStageNameStageIdMapping();
68 assert(isset($stageNameIdMapping[$stageName]));
69 $stageId = $stageNameIdMapping[$stageName];
71 $submissionFiles = array();
73 for ($n = $node->firstChild; $n !==
null; $n=$n->nextSibling) {
74 if (is_a($n,
'DOMElement')) {
79 return $submissionFiles;
92 $submission = $deployment->getSubmission();
93 switch ($node->tagName) {
96 if ($submissionFile) $submissionFiles[] = $submissionFile;
99 $deployment->addWarning(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.unknownElement', array(
'param' => $node->tagName)));
110 static $genresByContextId = array();
113 $submission = $deployment->getSubmission();
114 $context = $deployment->getContext();
116 $errorOccured =
false;
118 $revisionId = $node->getAttribute(
'number');
120 $source = $node->getAttribute(
'source');
121 $sourceFileAndRevision =
null;
123 $sourceFileAndRevision = explode(
'-', $source);
127 $genreName = $node->getAttribute(
'genre');
130 if (!isset($genresByContextId[$context->getId()])) {
132 $genres = $genreDao->getByContextId($context->getId());
133 while ($genre = $genres->next()) {
134 foreach ($genre->getName(
null) as $locale => $name) {
135 $genresByContextId[$context->getId()][$name] = $genre;
139 if (!isset($genresByContextId[$context->getId()][$genreName])) {
140 $deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.unknownGenre', array(
'param' => $genreName)));
141 $errorOccured =
true;
143 $genre = $genresByContextId[$context->getId()][$genreName];
144 $genreId = $genre->getId();
149 $submissionFile = $submissionFileDao->newDataObjectByGenreId($genreId);
150 $submissionFile->setSubmissionId($submission->getId());
151 $submissionFile->setSubmissionLocale($submission->getLocale());
152 $submissionFile->setGenreId($genreId);
153 $submissionFile->setFileStage($stageId);
156 if ($node->getAttribute(
'available') ==
'true') $submissionFile->setViewable(
true);
158 $submissionFile->setOriginalFileName($filename = $node->getAttribute(
'filename'));
159 for ($n = $node->firstChild; $n !==
null; $n=$n->nextSibling) {
160 if (is_a($n,
'DOMElement')) {
166 $errorOccured =
true;
168 clearstatcache(
true, $filename);
169 if (!file_exists($filename) || !filesize($filename)) {
171 $deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.native.error.submissionFileImportFailed'));
172 $errorOccured =
true;
176 $uploaderUsername = $node->getAttribute(
'uploader');
177 if (!$uploaderUsername) {
178 $user = $deployment->getUser();
182 $user = $userDao->getByUsername($uploaderUsername);
185 $submissionFile->setUploaderUserId($user->getId());
187 $deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.unknownUploader', array(
'param' => $uploaderUsername)));
188 $errorOccured =
true;
191 $fileSize = $node->getAttribute(
'filesize');
192 $fileSizeOnDisk = filesize($filename);
194 if ($fileSize != $fileSizeOnDisk) {
195 $deployment->addWarning(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.filesizeMismatch', array(
'expected' => $fileSize,
'actual' => $fileSizeOnDisk)));
199 $fileSize = $fileSizeOnDisk;
201 $submissionFile->setFileSize($fileSize);
203 $fileType = $node->getAttribute(
'filetype');
204 $submissionFile->setFileType($fileType);
206 $submissionFile->setRevision($revisionId);
208 if ($sourceFileAndRevision) {
210 $sourceFileId = $deployment->getFileDBId($sourceFileAndRevision[0], $sourceFileAndRevision[1]);
212 $submissionFile->setSourceFileId($sourceFileId);
213 $submissionFile->setSourceRevision($sourceFileAndRevision[1]);
218 $DBId = $deployment->getFileDBId($fileId);
220 $submissionFile->setFileId($DBId);
221 $DBRevision = $deployment->getFileDBId($fileId, $revisionId);
224 $errorOccured =
true;
225 $deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.duplicateRevisionForSubmission', array(
'fileId' => $fileId,
'revisionId' => $revisionId)));
232 $submissionFile =
null;
234 $insertedSubmissionFile = $submissionFileDao->insertObject($submissionFile, $filename,
false);
235 $deployment->setFileDBId($fileId, $revisionId, $insertedSubmissionFile->getFileId());
238 import(
'lib.pkp.classes.file.FileManager');
240 $fileManager->deleteByPath($filename);
241 return $submissionFile;
253 $context = $deployment->getContext();
254 $submission = $deployment->getSubmission();
255 switch ($node->tagName) {
256 case 'submission_file_ref':
257 if ($submissionFile->getFileStage() == SUBMISSION_FILE_DEPENDENT) {
258 $fileId = $node->getAttribute(
'id');
259 $revisionId = $node->getAttribute(
'revision');
260 $dbFileId = $deployment->getFileDBId($fileId, $revisionId);
262 $submissionFile->setAssocType(ASSOC_TYPE_SUBMISSION_FILE);
263 $submissionFile->setAssocId($dbFileId);
271 $locale = $node->getAttribute(
'locale');
272 if (empty($locale)) $locale = $context->getPrimaryLocale();
273 $submissionFile->setName($node->textContent, $locale);
274 $submissionFile->setSubmissionLocale($locale);
277 $submissionFile->setFileType($node->getAttribute(
'mime_type'));
278 import(
'lib.pkp.classes.file.TemporaryFileManager');
280 $temporaryFilename = tempnam($temporaryFileManager->getBasePath(),
'src');
281 $filesrc = $node->getAttribute(
'src');
283 if (preg_match(
'|\w+://.+|', $filesrc)) {
286 $response = $client->request(
'GET', $filesrc);
287 file_put_contents($temporaryFilename, $response->getBody());
288 if (!filesize($temporaryFilename)) {
291 } elseif (substr($filesrc, 0, 1) ===
'/') {
293 if (!copy($filesrc, $temporaryFilename)) {
296 } elseif (is_readable($deployment->getImportPath() .
'/' . $filesrc)) {
298 $filesrc = $deployment->getImportPath() .
'/' . $filesrc;
299 if(!copy($filesrc, $temporaryFilename)) {
307 $deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.temporaryFileFailed', array(
'dest' => $temporaryFilename,
'source' => $filesrc)));
309 $fileManager->deleteByPath($temporaryFilename);
310 $temporaryFilename =
'';
312 return $temporaryFilename;
315 $submissionFile->setFileType($node->getAttribute(
'mime_type'));
316 import(
'lib.pkp.classes.file.TemporaryFileManager');
318 $temporaryFilename = tempnam($temporaryFileManager->getBasePath(),
'embed');
319 if (($e = $node->getAttribute(
'encoding')) !=
'base64') {
320 $deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.unknownEncoding', array(
'param' => $e)));
322 $content = base64_decode($node->textContent,
true);
325 $deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.encodingError', array(
'param' => $e)));
327 } elseif (!file_put_contents($temporaryFilename, $content)) {
328 $deployment->addError(ASSOC_TYPE_SUBMISSION, $submission->getId(), __(
'plugins.importexport.common.error.temporaryFileFailed', array(
'dest' => $temporaryFilename,
'source' =>
'embed')));
333 $fileManager->deleteByPath($temporaryFilename);
334 $temporaryFilename =
'';
337 return $temporaryFilename;
349 $advice = $element->getAttribute(
'advice');
350 switch ($element->getAttribute(
'type')) {
353 assert(!$advice || $advice ==
'ignore');
356 if ($advice ==
'update') {
357 $submissionFile->setStoredPubId(
'publisher-id', $element->textContent);
361 if ($advice ==
'update') {
364 $submissionFile->setStoredPubId($element->getAttribute(
'type'), $element->textContent);