Open Journal Systems  3.3.0
IssueCrossrefXmlFilter.inc.php
1 <?php
2 
16 import('lib.pkp.plugins.importexport.native.filter.NativeExportFilter');
17 
23  function __construct($filterGroup) {
24  $this->setDisplayName('Crossref XML issue export');
25  parent::__construct($filterGroup);
26  }
27 
28  //
29  // Implement template methods from PersistableFilter
30  //
34  function getClassName() {
35  return 'plugins.importexport.crossref.filter.IssueCrossrefXmlFilter';
36  }
37 
38  //
39  // Implement template methods from Filter
40  //
46  function &process(&$pubObjects) {
47  // Create the XML document
48  $doc = new DOMDocument('1.0', 'utf-8');
49  $doc->preserveWhiteSpace = false;
50  $doc->formatOutput = true;
51  $deployment = $this->getDeployment();
52  $context = $deployment->getContext();
53 
54  // Create the root node
55  $rootNode = $this->createRootNode($doc);
56  $doc->appendChild($rootNode);
57 
58  // Create and appet the 'head' node and all parts inside it
59  $rootNode->appendChild($this->createHeadNode($doc));
60 
61  // Create and append the 'body' node, that contains everything
62  $bodyNode = $doc->createElementNS($deployment->getNamespace(), 'body');
63  $rootNode->appendChild($bodyNode);
64 
65  foreach($pubObjects as $pubObject) {
66  // pubObject is either Issue or Submission
67  $journalNode = $this->createJournalNode($doc, $pubObject);
68  $bodyNode->appendChild($journalNode);
69  }
70  return $doc;
71  }
72 
73  //
74  // Issue conversion functions
75  //
81  function createRootNode($doc) {
82  $deployment = $this->getDeployment();
83  $rootNode = $doc->createElementNS($deployment->getNamespace(), $deployment->getRootElementName());
84  $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:xsi', $deployment->getXmlSchemaInstance());
85  $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:jats', $deployment->getJATSNamespace());
86  $rootNode->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ai', $deployment->getAINamespace());
87  $rootNode->setAttribute('version', $deployment->getXmlSchemaVersion());
88  $rootNode->setAttribute('xsi:schemaLocation', $deployment->getNamespace() . ' ' . $deployment->getSchemaFilename());
89  return $rootNode;
90  }
91 
97  function createHeadNode($doc) {
98  $deployment = $this->getDeployment();
99  $context = $deployment->getContext();
100  $plugin = $deployment->getPlugin();
101  $headNode = $doc->createElementNS($deployment->getNamespace(), 'head');
102  $headNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'doi_batch_id', htmlspecialchars($context->getData('initials', $context->getPrimaryLocale()) . '_' . time(), ENT_COMPAT, 'UTF-8')));
103  $headNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'timestamp', time()));
104  $depositorNode = $doc->createElementNS($deployment->getNamespace(), 'depositor');
105  $depositorName = $plugin->getSetting($context->getId(), 'depositorName');
106  if (empty($depositorName)) {
107  $depositorName = $context->getData('supportName');
108  }
109  $depositorEmail = $plugin->getSetting($context->getId(), 'depositorEmail');
110  if (empty($depositorEmail)) {
111  $depositorEmail = $context->getData('supportEmail');
112  }
113  $depositorNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'depositor_name', htmlspecialchars($depositorName, ENT_COMPAT, 'UTF-8')));
114  $depositorNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'email_address', htmlspecialchars($depositorEmail, ENT_COMPAT, 'UTF-8')));
115  $headNode->appendChild($depositorNode);
116  $publisherInstitution = $context->getData('publisherInstitution');
117  $headNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'registrant', htmlspecialchars($publisherInstitution, ENT_COMPAT, 'UTF-8')));
118  return $headNode;
119  }
120 
127  function createJournalNode($doc, $pubObject) {
128  $deployment = $this->getDeployment();
129  $journalNode = $doc->createElementNS($deployment->getNamespace(), 'journal');
130  $journalNode->appendChild($this->createJournalMetadataNode($doc));
131  $journalNode->appendChild($this->createJournalIssueNode($doc, $pubObject));
132  return $journalNode;
133  }
134 
140  function createJournalMetadataNode($doc) {
141  $deployment = $this->getDeployment();
142  $context = $deployment->getContext();
143 
144  $journalMetadataNode = $doc->createElementNS($deployment->getNamespace(), 'journal_metadata');
145  // Full title
146  $journalTitle = $context->getName($context->getPrimaryLocale());
147  // Attempt a fall back, in case the localized name is not set.
148  if ($journalTitle == '') {
149  $journalTitle = $context->getData('abbreviation', $context->getPrimaryLocale());
150  }
151  $journalMetadataNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'full_title', htmlspecialchars($journalTitle, ENT_COMPAT, 'UTF-8')));
152  /* Abbreviated title - defaulting to initials if no abbreviation found */
153  $journalAbbrev = $context->getData('abbreviation', $context->getPrimaryLocale());
154  if ( $journalAbbrev == '' ) {
155  $journalAbbrev = $context->getData('acronym', $context->getPrimaryLocale());
156  }
157  $journalMetadataNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'abbrev_title', htmlspecialchars($journalAbbrev, ENT_COMPAT, 'UTF-8')));
158  /* Both ISSNs are permitted for CrossRef, so sending whichever one (or both) */
159  if ($ISSN = $context->getData('onlineIssn') ) {
160  $journalMetadataNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'issn', $ISSN));
161  $node->setAttribute('media_type', 'electronic');
162  }
163  /* Both ISSNs are permitted for CrossRef so sending whichever one (or both) */
164  if ($ISSN = $context->getData('printIssn') ) {
165  $journalMetadataNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'issn', $ISSN));
166  $node->setAttribute('media_type', 'print');
167  }
168  return $journalMetadataNode;
169  }
170 
177  function createJournalIssueNode($doc, $issue) {
178  $deployment = $this->getDeployment();
179  $context = $deployment->getContext();
180  $deployment->setIssue($issue);
181 
182  $journalIssueNode = $doc->createElementNS($deployment->getNamespace(), 'journal_issue');
183  if ($issue->getDatePublished()) {
184  $journalIssueNode->appendChild($this->createPublicationDateNode($doc, $issue->getDatePublished()));
185  }
186  if ($issue->getVolume() && $issue->getShowVolume()){
187  $journalVolumeNode = $doc->createElementNS($deployment->getNamespace(), 'journal_volume');
188  $journalVolumeNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'volume', htmlspecialchars($issue->getVolume(), ENT_COMPAT, 'UTF-8')));
189  $journalIssueNode->appendChild($journalVolumeNode);
190  }
191  if ($issue->getNumber() && $issue->getShowNumber()) {
192  $journalIssueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'issue', htmlspecialchars($issue->getNumber(), ENT_COMPAT, 'UTF-8')));
193  }
194  if ($issue->getDatePublished() && $issue->getStoredPubId('doi')) {
195  $request = Application::get()->getRequest();
196  $journalIssueNode->appendChild($this->createDOIDataNode($doc, $issue->getStoredPubId('doi'), $request->url($context->getPath(), 'issue', 'view', $issue->getBestIssueId($context), null, null, true)));
197  }
198  return $journalIssueNode;
199  }
200 
207  function createPublicationDateNode($doc, $objectPublicationDate) {
208  $deployment = $this->getDeployment();
209  $publicationDate = strtotime($objectPublicationDate);
210  $publicationDateNode = $doc->createElementNS($deployment->getNamespace(), 'publication_date');
211  $publicationDateNode->setAttribute('media_type', 'online');
212  if (date('m', $publicationDate)) {
213  $publicationDateNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'month', date('m', $publicationDate)));
214  }
215  if (date('d', $publicationDate)) {
216  $publicationDateNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'day', date('d', $publicationDate)));
217  }
218  $publicationDateNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'year', date('Y', $publicationDate)));
219  return $publicationDateNode;
220  }
221 
229  function createDOIDataNode($doc, $doi, $url) {
230  $deployment = $this->getDeployment();
231  $doiDataNode = $doc->createElementNS($deployment->getNamespace(), 'doi_data');
232  $doiDataNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'doi', htmlspecialchars($doi, ENT_COMPAT, 'UTF-8')));
233  $doiDataNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'resource', $url));
234  return $doiDataNode;
235  }
236 
237 }
238 
239 
IssueCrossrefXmlFilter
Class that converts an Issue to a Crossref XML document.
Definition: IssueCrossrefXmlFilter.inc.php:18
IssueCrossrefXmlFilter\createJournalNode
createJournalNode($doc, $pubObject)
Definition: IssueCrossrefXmlFilter.inc.php:127
IssueCrossrefXmlFilter\createHeadNode
createHeadNode($doc)
Definition: IssueCrossrefXmlFilter.inc.php:97
IssueCrossrefXmlFilter\createPublicationDateNode
createPublicationDateNode($doc, $objectPublicationDate)
Definition: IssueCrossrefXmlFilter.inc.php:207
IssueCrossrefXmlFilter\createDOIDataNode
createDOIDataNode($doc, $doi, $url)
Definition: IssueCrossrefXmlFilter.inc.php:229
IssueCrossrefXmlFilter\createJournalIssueNode
createJournalIssueNode($doc, $issue)
Definition: IssueCrossrefXmlFilter.inc.php:177
NativeImportExportFilter\getDeployment
getDeployment()
Definition: NativeImportExportFilter.inc.php:49
IssueCrossrefXmlFilter\process
& process(&$pubObjects)
Definition: IssueCrossrefXmlFilter.inc.php:46
NativeExportFilter
Base class that converts a DataObject to a Native XML document.
Definition: NativeExportFilter.inc.php:18
IssueCrossrefXmlFilter\createRootNode
createRootNode($doc)
Definition: IssueCrossrefXmlFilter.inc.php:81
IssueCrossrefXmlFilter\createJournalMetadataNode
createJournalMetadataNode($doc)
Definition: IssueCrossrefXmlFilter.inc.php:140
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
Filter\setDisplayName
setDisplayName($displayName)
Definition: Filter.inc.php:140
IssueCrossrefXmlFilter\getClassName
getClassName()
Definition: IssueCrossrefXmlFilter.inc.php:34
IssueCrossrefXmlFilter\__construct
__construct($filterGroup)
Definition: IssueCrossrefXmlFilter.inc.php:23