Open Journal Systems  3.3.0
SubmissionFileNativeXmlFilter.inc.php
1 <?php
2 
16 import('lib.pkp.plugins.importexport.native.filter.NativeExportFilter');
17 
23  function __construct($filterGroup) {
24  $this->setDisplayName('Native XML submission file export');
25  parent::__construct($filterGroup);
26  }
27 
28 
29  //
30  // Implement template methods from PersistableFilter
31  //
35  function getClassName() {
36  return 'lib.pkp.plugins.importexport.native.filter.SubmissionFileNativeXmlFilter';
37  }
38 
39  //
40  // Implement template methods from Filter
41  //
47  function &process(&$submissionFile) {
48  // Create the XML document
49  $doc = new DOMDocument('1.0');
50  $doc->preserveWhiteSpace = false;
51  $doc->formatOutput = true;
52  $deployment = $this->getDeployment();
53  $rootNode = $this->createSubmissionFileNode($doc, $submissionFile);
54  $doc->appendChild($rootNode);
55  $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
56  $rootNode->setAttribute('xsi:schemaLocation', $deployment->getNamespace() . ' ' . $deployment->getSchemaFilename());
57 
58  return $doc;
59  }
60 
61  //
62  // SubmissionFile conversion functions
63  //
70  function createSubmissionFileNode($doc, $submissionFile) {
71  $deployment = $this->getDeployment();
72  $context = $deployment->getContext();
73 
74  // Create the submission_file node and set metadata
75  $submissionFileNode = $doc->createElementNS($deployment->getNamespace(), $this->getSubmissionFileElementName());
76 
77  $stageToName = array_flip($deployment->getStageNameStageIdMapping());
78  $submissionFileNode->setAttribute('stage', $stageToName[$submissionFile->getFileStage()]);
79  $submissionFileNode->setAttribute('id', $submissionFile->getFileId());
80 
81  // Create the revision node and set metadata
82  $revisionNode = $doc->createElementNS($deployment->getNamespace(), 'revision');
83  $revisionNode->setAttribute('number', $submissionFile->getRevision());
84  if ($sourceFileId = $submissionFile->getSourceFileId()) {
85  $revisionNode->setAttribute('source', $sourceFileId . '-' . $submissionFile->getSourceRevision());
86  }
87 
88  $genreDao = DAORegistry::getDAO('GenreDAO'); /* @var $genreDao GenreDAO */
89  $genre = $genreDao->getById($submissionFile->getGenreId());
90  if ($genre) {
91  $revisionNode->setAttribute('genre', $genre->getName($context->getPrimaryLocale()));
92  }
93 
94  $revisionNode->setAttribute('filename', $submissionFile->getOriginalFileName());
95  $revisionNode->setAttribute('viewable', $submissionFile->getViewable()?'true':'false');
96  $revisionNode->setAttribute('date_uploaded', strftime('%Y-%m-%d', strtotime($submissionFile->getDateUploaded())));
97  $revisionNode->setAttribute('date_modified', strftime('%Y-%m-%d', strtotime($submissionFile->getDateModified())));
98  if ($submissionFile->getDirectSalesPrice() !== null) {
99  $revisionNode->setAttribute('direct_sales_price', $submissionFile->getDirectSalesPrice());
100  }
101  $revisionNode->setAttribute('filesize', $submissionFile->getFileSize());
102  $revisionNode->setAttribute('filetype', $submissionFile->getFileType());
103 
104  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
105  $uploaderUser = $userDao->getById($submissionFile->getUploaderUserId());
106  assert(isset($uploaderUser));
107  $revisionNode->setAttribute('uploader', $uploaderUser->getUsername());
108 
109  $this->addIdentifiers($doc, $revisionNode, $submissionFile);
110  $this->createLocalizedNodes($doc, $revisionNode, 'name', $submissionFile->getName(null));
111 
112  // if it is a dependent file, add submission_file_ref element
113  if ($submissionFile->getFileStage() == SUBMISSION_FILE_DEPENDENT && $submissionFile->getAssocType() == ASSOC_TYPE_SUBMISSION_FILE) {
114  $fileRefNode = $doc->createElementNS($deployment->getNamespace(), 'submission_file_ref');
115  $fileRefNode->setAttribute('id', $submissionFile->getAssocId());
116  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
117  $latestRevision = $submissionFileDao->getLatestRevisionNumber($submissionFile->getAssocId());
118  $fileRefNode->setAttribute('revision', $latestRevision);
119  $revisionNode->appendChild($fileRefNode);
120  }
121 
122  $submissionFileNode->appendChild($revisionNode);
123  // Embed the file contents
124 
125  if (array_key_exists('no-embed', $this->opts)) {
126  $hrefNode = $doc->createElementNS($deployment->getNamespace(), 'href');
127  if (array_key_exists('use-file-urls', $this->opts)) {
128  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
129  $stageId = $submissionFileDao->getWorkflowStageId($submissionFile);
131  $dispatcher = $app->getDispatcher();
132  $params = ["fileId" => $submissionFile->getFileId(),
133  "revision" => $submissionFile->getRevision(),
134  "submissionId" => $submissionFile->getSubmissionId(),
135  "stageId" => $stageId];
136  $url = $dispatcher->url($app->getRequest(), ROUTE_COMPONENT, $context->getPath(), "api.file.FileApiHandler", "downloadFile", null, $params);
137  $hrefNode->setAttribute('src', $url);
138  } else {
139  $hrefNode->setAttribute('src', $submissionFile->getFilePath());
140  }
141  $hrefNode->setAttribute('mime_type', $submissionFile->getFileType());
142  $revisionNode->appendChild($hrefNode);
143  } else {
144  $embedNode = $doc->createElementNS($deployment->getNamespace(), 'embed', base64_encode(file_get_contents($submissionFile->getFilePath())));
145  $embedNode->setAttribute('encoding', 'base64');
146  $revisionNode->appendChild($embedNode);
147  }
148  return $submissionFileNode;
149  }
150 
157  function addIdentifiers($doc, $revisionNode, $submissionFile) {
158  $deployment = $this->getDeployment();
159 
160  // Ommiting the internal ID here because it is in the submission_file attribute
161 
162  // Add public ID
163  if ($pubId = $submissionFile->getStoredPubId('publisher-id')) {
164  $revisionNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'id', htmlspecialchars($pubId, ENT_COMPAT, 'UTF-8')));
165  $node->setAttribute('type', 'public');
166  $node->setAttribute('advice', 'update');
167  }
168 
169  // Add pub IDs by plugin
170  $pubIdPlugins = PluginRegistry::loadCategory('pubIds', true, $deployment->getContext()->getId());
171  foreach ($pubIdPlugins as $pubIdPlugin) {
172  $this->addPubIdentifier($doc, $revisionNode, $submissionFile, $pubIdPlugin);
173  }
174  }
175 
184  function addPubIdentifier($doc, $revisionNode, $submissionFile, $pubIdPlugin) {
185  $pubId = $submissionFile->getStoredPubId($pubIdPlugin->getPubIdType());
186  if ($pubId) {
187  $deployment = $this->getDeployment();
188  $revisionNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'id', htmlspecialchars($pubId, ENT_COMPAT, 'UTF-8')));
189  $node->setAttribute('type', $pubIdPlugin->getPubIdType());
190  $node->setAttribute('advice', 'update');
191  return $node;
192  }
193  return null;
194  }
195 
200  return 'submission_file';
201  }
202 }
203 
204 
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
SubmissionFileNativeXmlFilter\getSubmissionFileElementName
getSubmissionFileElementName()
Definition: SubmissionFileNativeXmlFilter.inc.php:199
NativeImportExportFilter\getDeployment
getDeployment()
Definition: NativeImportExportFilter.inc.php:49
NativeExportFilter\createLocalizedNodes
createLocalizedNodes($doc, $parentNode, $name, $values)
Definition: NativeExportFilter.inc.php:87
PluginRegistry\loadCategory
static loadCategory($category, $enabledOnly=false, $mainContextId=null)
Definition: PluginRegistry.inc.php:103
NativeExportFilter
Base class that converts a DataObject to a Native XML document.
Definition: NativeExportFilter.inc.php:18
PKPApplication\getApplication
static getApplication()
Definition: PKPApplication.inc.php:227
SubmissionFileNativeXmlFilter\__construct
__construct($filterGroup)
Definition: SubmissionFileNativeXmlFilter.inc.php:23
SubmissionFileNativeXmlFilter\addIdentifiers
addIdentifiers($doc, $revisionNode, $submissionFile)
Definition: SubmissionFileNativeXmlFilter.inc.php:157
SubmissionFileNativeXmlFilter
Base class that converts a submissionFile to a Native XML document.
Definition: SubmissionFileNativeXmlFilter.inc.php:18
SubmissionFileNativeXmlFilter\getClassName
getClassName()
Definition: SubmissionFileNativeXmlFilter.inc.php:35
SubmissionFileNativeXmlFilter\process
& process(&$submissionFile)
Definition: SubmissionFileNativeXmlFilter.inc.php:47
Filter\setDisplayName
setDisplayName($displayName)
Definition: Filter.inc.php:140
SubmissionFileNativeXmlFilter\addPubIdentifier
addPubIdentifier($doc, $revisionNode, $submissionFile, $pubIdPlugin)
Definition: SubmissionFileNativeXmlFilter.inc.php:184
SubmissionFileNativeXmlFilter\createSubmissionFileNode
createSubmissionFileNode($doc, $submissionFile)
Definition: SubmissionFileNativeXmlFilter.inc.php:70