Open Monograph Press  3.3.0
SubmissionNativeXmlFilter.inc.php
1 <?php
2 
16 import('lib.pkp.plugins.importexport.native.filter.NativeExportFilter');
17 
19 
21 
26  function __construct($filterGroup) {
27  $this->setDisplayName('Native XML submission export');
28  parent::__construct($filterGroup);
29  }
30 
31 
32  //
33  // Implement template methods from PersistableFilter
34  //
38  function getClassName() {
39  return 'lib.pkp.plugins.importexport.native.filter.SubmissionNativeXmlFilter';
40  }
41 
42 
43  //
44  // Implement template methods from Filter
45  //
51  function &process(&$submissions) {
52  // Create the XML document
53  $doc = new DOMDocument('1.0');
54  $doc->preserveWhiteSpace = false;
55  $doc->formatOutput = true;
56  $deployment = $this->getDeployment();
57 
58  if (count($submissions)==1 && !$this->getIncludeSubmissionsNode()) {
59  // Only one submission specified; create root node
60  $rootNode = $this->createSubmissionNode($doc, $submissions[0]);
61  } else {
62  // Multiple submissions; wrap in a <submissions> element
63  $rootNode = $doc->createElementNS($deployment->getNamespace(), $deployment->getSubmissionsNodeName());
64  foreach ($submissions as $submission) {
65  $rootNode->appendChild($this->createSubmissionNode($doc, $submission));
66  }
67  }
68  $doc->appendChild($rootNode);
69  $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
70  $rootNode->setAttribute('xsi:schemaLocation', $deployment->getNamespace() . ' ' . $deployment->getSchemaFilename());
71 
72  return $doc;
73  }
74 
75  //
76  // Submission conversion functions
77  //
84  function createSubmissionNode($doc, $submission) {
85  // Create the root node and attributes
86  $deployment = $this->getDeployment();
87  $deployment->setSubmission($submission);
88  $submissionNode = $doc->createElementNS($deployment->getNamespace(), $deployment->getSubmissionNodeName());
89 
90  $submissionNode->setAttribute('date_submitted', strftime('%Y-%m-%d', strtotime($submission->getData('dateSubmitted'))));
91  $submissionNode->setAttribute('status', $submission->getData('status'));
92  $submissionNode->setAttribute('submission_progress', $submission->getData('submissionProgress'));
93  $submissionNode->setAttribute('current_publication_id', $submission->getData('currentPublicationId'));
94 
95  $workflowStageDao = DAORegistry::getDAO('WorkflowStageDAO');
96  $submissionNode->setAttribute('stage', WorkflowStageDAO::getPathFromId($submission->getData('stageId')));
97 
98  // FIXME: language attribute (from old DTD). Necessary? Data migration needed?
99 
100  $this->addIdentifiers($doc, $submissionNode, $submission);
101  $this->addFiles($doc, $submissionNode, $submission);
102  $this->addPublications($doc, $submissionNode, $submission);
103 
104  return $submissionNode;
105  }
106 
113  function addIdentifiers($doc, $submissionNode, $submission) {
114  $deployment = $this->getDeployment();
115 
116  // Add internal ID
117  $submissionNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'id', $submission->getId()));
118  $node->setAttribute('type', 'internal');
119  $node->setAttribute('advice', 'ignore');
120 
121  // // Add pub IDs by plugin
122  // $pubIdPlugins = PluginRegistry::loadCategory('pubIds', true, $deployment->getContext()->getId());
123  // foreach ($pubIdPlugins as $pubIdPlugin) {
124  // $this->addPubIdentifier($doc, $submissionNode, $submission, $pubIdPlugin);
125  // }
126  }
127 
136  function addControlledVocabulary($doc, $submissionNode, $controlledVocabulariesNodeName, $controlledVocabularyNodeName, $controlledVocabulary) {
137  $deployment = $this->getDeployment();
138  $locales = array_keys($controlledVocabulary);
139  foreach ($locales as $locale) {
140  if (!empty($controlledVocabulary[$locale])) {
141  $controlledVocabulariesNode = $doc->createElementNS($deployment->getNamespace(), $controlledVocabulariesNodeName);
142  $controlledVocabulariesNode->setAttribute('locale', $locale);
143  foreach ($controlledVocabulary[$locale] as $controlledVocabularyItem) {
144  $controlledVocabulariesNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), $controlledVocabularyNodeName, htmlspecialchars($controlledVocabularyItem, ENT_COMPAT, 'UTF-8')));
145  }
146  $submissionNode->appendChild($controlledVocabulariesNode);
147  }
148  }
149  }
150 
157  function addFiles($doc, $submissionNode, $submission) {
158  $filterDao = DAORegistry::getDAO('FilterDAO'); /* @var $filterDao FilterDAO */
159  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO'); /* @var $submissionFileDao SubmissionFileDAO */
160  $submissionFiles = $submissionFileDao->getBySubmissionId($submission->getId());
161 
162  // Submission files will come back from the file export filter
163  // with one revision each, wrapped in a submission_file node:
164  // <submission_file ...>
165  // <revision ...>...</revision>
166  // </submission_file>
167  // Reformat them into groups by submission_file, i.e.:
168  // <submission_file ...>
169  // <revision ...>...</revision>
170  // <revision ...>...</revision>
171  // </submission_file>
172  $submissionFileNodesByFileId = array();
173  foreach ($submissionFiles as $submissionFile) {
174  $nativeExportFilters = $filterDao->getObjectsByGroup(get_class($submissionFile) . '=>native-xml');
175  assert(count($nativeExportFilters)==1); // Assert only a single serialization filter
176  $exportFilter = array_shift($nativeExportFilters);
177  $exportFilter->setDeployment($this->getDeployment());
178 
179  $exportFilter->setOpts($this->opts);
180  $submissionFileDoc = $exportFilter->execute($submissionFile);
181  $fileId = $submissionFileDoc->documentElement->getAttribute('id');
182  if (!isset($submissionFileNodesByFileId[$fileId])) {
183  $clone = $doc->importNode($submissionFileDoc->documentElement, true);
184  $submissionNode->appendChild($clone);
185  $submissionFileNodesByFileId[$fileId] = $clone;
186  } else {
187  $submissionFileNode = $submissionFileNodesByFileId[$fileId];
188  // Look for a <revision> element
189  $revisionNode = null;
190  foreach ($submissionFileDoc->documentElement->childNodes as $childNode) {
191  if (!is_a($childNode, 'DOMElement')) continue;
192  if ($childNode->tagName == 'revision') $revisionNode = $childNode;
193  }
194  assert(is_a($revisionNode, 'DOMElement'));
195  $clone = $doc->importNode($revisionNode, true);
196  $firstRevisionChild = $submissionFileNode->firstChild;
197  $submissionFileNode->insertBefore($clone, $firstRevisionChild);
198  }
199  }
200  }
201 
208  function addPublications($doc, $submissionNode, $submission) {
209  $filterDao = DAORegistry::getDAO('FilterDAO');
210  $nativeExportFilters = $filterDao->getObjectsByGroup('publication=>native-xml');
211  assert(count($nativeExportFilters)==1); // Assert only a single serialization filter
212  $exportFilter = array_shift($nativeExportFilters);
213  $exportFilter->setDeployment($this->getDeployment());
214 
215  $publications = (array) $submission->getData('publications');
216  foreach ($publications as $publication) {
217  $publicationDoc = $exportFilter->execute($publication);
218  if ($publicationDoc->documentElement instanceof DOMElement) {
219  $clone = $doc->importNode($publicationDoc->documentElement, true);
220  $submissionNode->appendChild($clone);
221  }
222  }
223  }
224 
225 
226  //
227  // Abstract methods for subclasses to implement
228  //
229 
235  function setIncludeSubmissionsNode($includeSubmissionsNode) {
236  $this->_includeSubmissionsNode = $includeSubmissionsNode;
237  }
238 
246  }
247 }
248 
249 
SubmissionNativeXmlFilter\process
& process(&$submissions)
Definition: SubmissionNativeXmlFilter.inc.php:51
SubmissionNativeXmlFilter
Base class that converts a set of submissions to a Native XML document.
Definition: SubmissionNativeXmlFilter.inc.php:18
SubmissionNativeXmlFilter\addFiles
addFiles($doc, $submissionNode, $submission)
Definition: SubmissionNativeXmlFilter.inc.php:157
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
SubmissionNativeXmlFilter\addIdentifiers
addIdentifiers($doc, $submissionNode, $submission)
Definition: SubmissionNativeXmlFilter.inc.php:113
SubmissionNativeXmlFilter\getClassName
getClassName()
Definition: SubmissionNativeXmlFilter.inc.php:38
NativeImportExportFilter\getDeployment
getDeployment()
Definition: NativeImportExportFilter.inc.php:49
SubmissionNativeXmlFilter\$_includeSubmissionsNode
$_includeSubmissionsNode
Definition: SubmissionNativeXmlFilter.inc.php:20
NativeExportFilter
Base class that converts a DataObject to a Native XML document.
Definition: NativeExportFilter.inc.php:18
SubmissionNativeXmlFilter\addControlledVocabulary
addControlledVocabulary($doc, $submissionNode, $controlledVocabulariesNodeName, $controlledVocabularyNodeName, $controlledVocabulary)
Definition: SubmissionNativeXmlFilter.inc.php:136
SubmissionNativeXmlFilter\setIncludeSubmissionsNode
setIncludeSubmissionsNode($includeSubmissionsNode)
Definition: SubmissionNativeXmlFilter.inc.php:235
SubmissionNativeXmlFilter\createSubmissionNode
createSubmissionNode($doc, $submission)
Definition: SubmissionNativeXmlFilter.inc.php:84
WorkflowStageDAO\getPathFromId
static getPathFromId($stageId)
Definition: WorkflowStageDAO.inc.php:24
SubmissionNativeXmlFilter\__construct
__construct($filterGroup)
Definition: SubmissionNativeXmlFilter.inc.php:26
Filter\setDisplayName
setDisplayName($displayName)
Definition: Filter.inc.php:140
SubmissionNativeXmlFilter\addPublications
addPublications($doc, $submissionNode, $submission)
Definition: SubmissionNativeXmlFilter.inc.php:208
SubmissionNativeXmlFilter\getIncludeSubmissionsNode
getIncludeSubmissionsNode()
Definition: SubmissionNativeXmlFilter.inc.php:244