Open Journal Systems  3.3.0
IssueNativeXmlFilter.inc.php
1 <?php
2 
16 import('lib.pkp.plugins.importexport.native.filter.NativeExportFilter');
17 
23  function __construct($filterGroup) {
24  $this->setDisplayName('Native XML issue export');
25  parent::__construct($filterGroup);
26  }
27 
28 
29  //
30  // Implement template methods from PersistableFilter
31  //
35  function getClassName() {
36  return 'plugins.importexport.native.filter.IssueNativeXmlFilter';
37  }
38 
39 
40  //
41  // Implement template methods from Filter
42  //
48  function &process(&$issues) {
49  // Create the XML document
50  $doc = new DOMDocument('1.0');
51  $doc->preserveWhiteSpace = false;
52  $doc->formatOutput = true;
53  $deployment = $this->getDeployment();
54 
55  if (count($issues)==1) {
56  // Only one issue specified; create root node
57  $rootNode = $this->createIssueNode($doc, $issues[0]);
58  } else {
59  // Multiple issues; wrap in a <issues> element
60  $rootNode = $doc->createElementNS($deployment->getNamespace(), 'issues');
61  foreach ($issues as $issue) {
62  $rootNode->appendChild($this->createIssueNode($doc, $issue));
63  }
64  }
65  $doc->appendChild($rootNode);
66  $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
67  $rootNode->setAttribute('xsi:schemaLocation', $deployment->getNamespace() . ' ' . $deployment->getSchemaFilename());
68 
69  return $doc;
70  }
71 
72  //
73  // Submission conversion functions
74  //
81  function createIssueNode($doc, $issue) {
82  // Create the root node and attributes
83  $deployment = $this->getDeployment();
84  $deployment->setIssue($issue);
85 
86  $issueNode = $doc->createElementNS($deployment->getNamespace(), 'issue');
87  $this->addIdentifiers($doc, $issueNode, $issue);
88 
89  $issueNode->setAttribute('published', $issue->getPublished());
90  $issueNode->setAttribute('current', $issue->getCurrent());
91  $issueNode->setAttribute('access_status', $issue->getAccessStatus());
92  $issueNode->setAttribute('url_path', $issue->getData('urlPath'));
93 
94  $this->createLocalizedNodes($doc, $issueNode, 'description', $issue->getDescription(null));
95  import('plugins.importexport.native.filter.NativeFilterHelper');
96  $nativeFilterHelper = new NativeFilterHelper();
97  $issueNode->appendChild($nativeFilterHelper->createIssueIdentificationNode($this, $doc, $issue));
98 
99  $this->addDates($doc, $issueNode, $issue);
100  $this->addSections($doc, $issueNode, $issue);
101  // cover images
102  import('plugins.importexport.native.filter.NativeFilterHelper');
103  $nativeFilterHelper = new NativeFilterHelper();
104  $coversNode = $nativeFilterHelper->createIssueCoversNode($this, $doc, $issue);
105  if ($coversNode) $issueNode->appendChild($coversNode);
106 
107  $this->addIssueGalleys($doc, $issueNode, $issue);
108  $this->addArticles($doc, $issueNode, $issue);
109 
110  return $issueNode;
111  }
112 
119  function addIdentifiers($doc, $issueNode, $issue) {
120  $deployment = $this->getDeployment();
121 
122  // Add internal ID
123  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'id', $issue->getId()));
124  $node->setAttribute('type', 'internal');
125  $node->setAttribute('advice', 'ignore');
126 
127  // Add public ID
128  if ($pubId = $issue->getStoredPubId('publisher-id')) {
129  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'id', htmlspecialchars($pubId, ENT_COMPAT, 'UTF-8')));
130  $node->setAttribute('type', 'public');
131  $node->setAttribute('advice', 'update');
132  }
133 
134  // Add pub IDs by plugin
135  $pubIdPlugins = PluginRegistry::loadCategory('pubIds', true, $deployment->getContext()->getId());
136  foreach ($pubIdPlugins as $pubIdPlugin) {
137  $this->addPubIdentifier($doc, $issueNode, $issue, $pubIdPlugin);
138  }
139  }
140 
149  function addPubIdentifier($doc, $issueNode, $issue, $pubIdPlugin) {
150  $pubId = $issue->getStoredPubId($pubIdPlugin->getPubIdType());
151  if ($pubId) {
152  $deployment = $this->getDeployment();
153  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'id', htmlspecialchars($pubId, ENT_COMPAT, 'UTF-8')));
154  $node->setAttribute('type', $pubIdPlugin->getPubIdType());
155  $node->setAttribute('advice', 'update');
156  return $node;
157  }
158  return null;
159  }
160 
167  function addDates($doc, $issueNode, $issue) {
168  $deployment = $this->getDeployment();
169 
170  if ($issue->getDatePublished())
171  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'date_published', strftime('%Y-%m-%d', strtotime($issue->getDatePublished()))));
172 
173  if ($issue->getDateNotified())
174  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'date_notified', strftime('%Y-%m-%d', strtotime($issue->getDateNotified()))));
175 
176  if ($issue->getLastModified())
177  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'last_modified', strftime('%Y-%m-%d', strtotime($issue->getLastModified()))));
178 
179  if ($issue->getOpenAccessDate())
180  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'open_access_date', strftime('%Y-%m-%d', strtotime($issue->getOpenAccessDate()))));
181  }
182 
189  function addArticles($doc, $issueNode, $issue) {
190  $filterDao = DAORegistry::getDAO('FilterDAO'); /* @var $filterDao FilterDAO */
191  $nativeExportFilters = $filterDao->getObjectsByGroup('article=>native-xml');
192  assert(count($nativeExportFilters)==1); // Assert only a single serialization filter
193  $exportFilter = array_shift($nativeExportFilters);
194  $exportFilter->setOpts($this->opts);
195  $exportFilter->setDeployment($this->getDeployment());
196  $exportFilter->setIncludeSubmissionsNode(true);
197 
198  $submissionsIterator = Services::get('submission')->getMany([
199  'contextId' => $issue->getJournalId(),
200  'issueIds' => $issue->getId(),
201  ]);
202  $submissionsArray = iterator_to_array($submissionsIterator);
203  $articlesDoc = $exportFilter->execute($submissionsArray);
204  if ($articlesDoc->documentElement instanceof DOMElement) {
205  $clone = $doc->importNode($articlesDoc->documentElement, true);
206  $issueNode->appendChild($clone);
207  }
208  }
209 
216  function addIssueGalleys($doc, $issueNode, $issue) {
217  $filterDao = DAORegistry::getDAO('FilterDAO'); /* @var $filterDao FilterDAO */
218  $nativeExportFilters = $filterDao->getObjectsByGroup('issuegalley=>native-xml');
219  assert(count($nativeExportFilters)==1); // Assert only a single serialization filter
220  $exportFilter = array_shift($nativeExportFilters);
221  $exportFilter->setDeployment($this->getDeployment());
222 
223  $issueGalleyDao = DAORegistry::getDAO('IssueGalleyDAO'); /* @var $issueGalleyDao IssueGalleyDAO */
224  $issue = $issueGalleyDao->getByIssueId($issue->getId());
225  $issueGalleysDoc = $exportFilter->execute($issue);
226  if ($issueGalleysDoc->documentElement instanceof DOMElement) {
227  $clone = $doc->importNode($issueGalleysDoc->documentElement, true);
228  $issueNode->appendChild($clone);
229  }
230  }
231 
238  function addSections($doc, $issueNode, $issue) {
239  $sectionDao = DAORegistry::getDAO('SectionDAO'); /* @var $sectionDao SectionDAO */
240  $sections = $sectionDao->getByIssueId($issue->getId());
241  $deployment = $this->getDeployment();
242  $journal = $deployment->getContext();
243 
244  // Boundary condition: no sections in this issue.
245  if (!count($sections)) return;
246 
247  $sectionsNode = $doc->createElementNS($deployment->getNamespace(), 'sections');
248  foreach ($sections as $section) {
249  $sectionNode = $doc->createElementNS($deployment->getNamespace(), 'section');
250 
251  $sectionNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'id', $section->getId()));
252  $node->setAttribute('type', 'internal');
253  $node->setAttribute('advice', 'ignore');
254 
255  if ($section->getReviewFormId()) $sectionNode->setAttribute('review_form_id', $section->getReviewFormId());
256  $sectionNode->setAttribute('ref', $section->getAbbrev($journal->getPrimaryLocale()));
257  $sectionNode->setAttribute('seq', (int) $section->getSequence());
258  $sectionNode->setAttribute('editor_restricted', $section->getEditorRestricted());
259  $sectionNode->setAttribute('meta_indexed', $section->getMetaIndexed());
260  $sectionNode->setAttribute('meta_reviewed', $section->getMetaReviewed());
261  $sectionNode->setAttribute('abstracts_not_required', $section->getAbstractsNotRequired());
262  $sectionNode->setAttribute('hide_title', $section->getHideTitle());
263  $sectionNode->setAttribute('hide_author', $section->getHideAuthor());
264  $sectionNode->setAttribute('abstract_word_count', (int) $section->getAbstractWordCount());
265 
266  $this->createLocalizedNodes($doc, $sectionNode, 'abbrev', $section->getAbbrev(null));
267  $this->createLocalizedNodes($doc, $sectionNode, 'policy', $section->getPolicy(null));
268  $this->createLocalizedNodes($doc, $sectionNode, 'title', $section->getTitle(null));
269 
270  $sectionsNode->appendChild($sectionNode);
271  }
272 
273  $issueNode->appendChild($sectionsNode);
274  }
275 
276 }
IssueNativeXmlFilter\addArticles
addArticles($doc, $issueNode, $issue)
Definition: IssueNativeXmlFilter.inc.php:189
IssueNativeXmlFilter\addIdentifiers
addIdentifiers($doc, $issueNode, $issue)
Definition: IssueNativeXmlFilter.inc.php:119
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
IssueNativeXmlFilter
Base class that converts a set of issues to a Native XML document.
Definition: IssueNativeXmlFilter.inc.php:18
IssueNativeXmlFilter\addPubIdentifier
addPubIdentifier($doc, $issueNode, $issue, $pubIdPlugin)
Definition: IssueNativeXmlFilter.inc.php:149
NativeImportExportFilter\getDeployment
getDeployment()
Definition: NativeImportExportFilter.inc.php:49
IssueNativeXmlFilter\addIssueGalleys
addIssueGalleys($doc, $issueNode, $issue)
Definition: IssueNativeXmlFilter.inc.php:216
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
IssueNativeXmlFilter\addDates
addDates($doc, $issueNode, $issue)
Definition: IssueNativeXmlFilter.inc.php:167
IssueNativeXmlFilter\createIssueNode
createIssueNode($doc, $issue)
Definition: IssueNativeXmlFilter.inc.php:81
IssueNativeXmlFilter\process
& process(&$issues)
Definition: IssueNativeXmlFilter.inc.php:48
Filter\setDisplayName
setDisplayName($displayName)
Definition: Filter.inc.php:140
IssueNativeXmlFilter\__construct
__construct($filterGroup)
Definition: IssueNativeXmlFilter.inc.php:23
NativeFilterHelper
Class that provides native import/export filter-related helper methods.
Definition: NativeFilterHelper.inc.php:15
IssueNativeXmlFilter\getClassName
getClassName()
Definition: IssueNativeXmlFilter.inc.php:35
IssueNativeXmlFilter\addSections
addSections($doc, $issueNode, $issue)
Definition: IssueNativeXmlFilter.inc.php:238
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49