Open Journal Systems  3.3.0
IssueMedraXmlFilter.inc.php
1 <?php
2 
16 import('plugins.importexport.medra.filter.O4DOIXmlFilter');
17 
18 
24  function __construct($filterGroup) {
25  $this->setDisplayName('mEDRA XML issue export');
26  parent::__construct($filterGroup);
27  }
28 
32  function isWork($context, $plugin) {
33  return $plugin->getSetting($context->getId(), 'exportIssuesAs') == O4DOI_ISSUE_AS_WORK;
34  }
35 
36  //
37  // Implement template methods from PersistableFilter
38  //
42  function getClassName() {
43  return 'plugins.importexport.medra.filter.IssueMedraXmlFilter';
44  }
45 
46  //
47  // Implement template methods from Filter
48  //
54  function &process(&$pubObjects) {
55  // Create the XML document
56  $doc = new DOMDocument('1.0', 'utf-8');
57  $doc->preserveWhiteSpace = false;
58  $doc->formatOutput = true;
59  $deployment = $this->getDeployment();
60  $context = $deployment->getContext();
61  $plugin = $deployment->getPlugin();
62 
63  // Create the root node
64  $rootNodename = $this->isWork($context, $plugin) ? 'ONIXDOISerialIssueWorkRegistrationMessage' : 'ONIXDOISerialIssueVersionRegistrationMessage';
65  $rootNode = $this->createRootNode($doc, $rootNodename);
66  $doc->appendChild($rootNode);
67 
68  // Create and appet the header node and all parts inside it
69  $rootNode->appendChild($this->createHeadNode($doc));
70 
71  // Create and append the issue nodes
72  foreach($pubObjects as $pubObject) {
73  $rootNode->appendChild($this->createIssueNode($doc, $pubObject));
74  }
75  return $doc;
76  }
77 
84  function createIssueNode($doc, $pubObject) {
85  $deployment = $this->getDeployment();
86  $context = $deployment->getContext();
87  $cache = $deployment->getCache();
88  $plugin = $deployment->getPlugin();
89  $request = Application::get()->getRequest();
90  $router = $request->getRouter();
91 
92  $issueNodeName = $this->isWork($context, $plugin) ? 'DOISerialIssueWork' : 'DOISerialIssueVersion';
93  $issueNode = $doc->createElementNS($deployment->getNamespace(), $issueNodeName);
94  // Notification type (mandatory)
95  $doi = $pubObject->getStoredPubId('doi');
96  $registeredDoi = $pubObject->getData('medra::registeredDoi');
97  assert(empty($registeredDoi) || $registeredDoi == $doi);
98  $notificationType = (empty($registeredDoi) ? O4DOI_NOTIFICATION_TYPE_NEW : O4DOI_NOTIFICATION_TYPE_UPDATE);
99  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'NotificationType', $notificationType));
100  // DOI (mandatory)
101  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'DOI', htmlspecialchars($doi, ENT_COMPAT, 'UTF-8')));
102  // DOI URL (mandatory)
103  $url = $router->url($request, $context->getPath(), 'issue', 'view', $pubObject->getBestIssueId(), null, null, true);
104  if ($plugin->isTestMode($context)) {
105  // Change server domain for testing.
106  $url = PKPString::regexp_replace('#://[^\s]+/index.php#', '://example.com/index.php', $url);
107  }
108  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'DOIWebsiteLink', $url));
109  // DOI strucural type
110  $structuralType = $this->isWork($context, $plugin) ? 'Abstraction' : 'DigitalFixation';
111  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'DOIStructuralType', $structuralType));
112  // Registrant (mandatory)
113  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'RegistrantName', htmlspecialchars($plugin->getSetting($context->getId(), 'registrantName'), ENT_COMPAT, 'UTF-8')));
114  // Registration authority (mandatory)
115  $issueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'RegistrationAuthority', 'mEDRA'));
116  // Work/ProductIdentifier - proprietary ID
117  $pubObjectProprietaryId = $context->getId() . '-' . $pubObject->getId();
118  $workOrProduct = $this->isWork($context, $plugin) ? 'Work' : 'Product';
119  $issueNode->appendChild($this->createIdentifierNode($doc, $workOrProduct, O4DOI_ID_TYPE_PROPRIETARY, $pubObjectProprietaryId));
120  // Issue/journal and object locale precedence.
121  $journalLocalePrecedence = $objectLocalePrecedence = $this->getObjectLocalePrecedence($context, null, null);
122  // Serial Publication (mandatory)
123  $issueNode->appendChild($this->createSerialPublicationNode($doc, $journalLocalePrecedence, O4DOI_EPUB_FORMAT_HTML));
124  // Journal Issue (mandatory)
125  $issueId = $pubObject->getId();
126  if (!$cache->isCached('issues', $issueId)) {
127  $cache->add($pubObject, null);
128  }
129  $issueNode->appendChild($this->createJournalIssueNode($doc, $pubObject, $journalLocalePrecedence));
130  // Object Description 'OtherText'
131  $descriptions = $this->getTranslationsByPrecedence($pubObject->getDescription(null), $objectLocalePrecedence);
132  foreach ($descriptions as $locale => $description) {
133  $issueNode->appendChild($this->createOtherTextNode($doc, $locale, $description));
134  }
135 
136  // 4) issue (as-work and as-manifestation):
137  // related works:
138  // - includes articles-as-work
139  $submissionsIterator = Services::get('submission')->getMany([
140  'contextId' => $pubObject->getJournalId(),
141  'issueIds' => $pubObject->getId(),
142  'status' => STATUS_PUBLISHED,
143  ]);
144  $galleyDao = DAORegistry::getDAO('ArticleGalleyDAO'); /* @var $galleyDao ArticleGalleyDAO */
145  $relatedGalleys = [];
146  foreach ($submissionsIterator as $relatedSubmission) {
147  $articleProprietaryId = $context->getId() . '-' . $pubObject->getId() . '-' . $relatedSubmission->getId();
148  $relatedSubmissionIds = array(O4DOI_ID_TYPE_PROPRIETARY => $articleProprietaryId);
149  $doi = $relatedSubmission->getStoredPubId('doi');
150  if (!empty($doi)) $relatedSubmissionIds[O4DOI_ID_TYPE_DOI] = $doi;
151  $issueNode->appendChild($this->createRelatedNode($doc, 'Work', O4DOI_RELATION_INCLUDES, $relatedSubmissionIds));
152  // related products:
153  // - includes articles-as-manifestation
154  $galleys = (array) $relatedSubmission->getCurrentPublication()->getData('galleys');
155  foreach ($galleys as $galley) {
156  $galleyProprietaryId = $context->getId() . '-' . $pubObject->getId() . '-' . $relatedSubmission->getId() . '-g' . $galley->getId();
157  $relatedGalleyIds = array(O4DOI_ID_TYPE_PROPRIETARY => $galleyProprietaryId);
158  $doi = $galley->getStoredPubId('doi');
159  if (!empty($doi)) $relatedGalleyIds[O4DOI_ID_TYPE_DOI] = $doi;
160  $issueNode->appendChild($this->createRelatedNode($doc, 'Product', O4DOI_RELATION_INCLUDES, $relatedGalleyIds));
161  unset($galley, $relatedGalleyIds);
162 
163  }
164  unset($relatedSubmission, $relatedSubmissionIds);
165  }
166 
167  return $issueNode;
168  }
169 
173  function createJournalIssueNode($doc, $issue, $journalLocalePrecedence) {
174  $deployment = $this->getDeployment();
175  $context = $deployment->getContext();
176  $plugin = $deployment->getPlugin();
177 
178  $journalIssueNode = parent::createJournalIssueNode($doc, $issue, $journalLocalePrecedence);
179 
180  // Publication Date
181  $datePublished = $issue->getDatePublished();
182  if (!empty($datePublished)) {
183  $journalIssueNode->appendChild($node = $doc->createElementNS($deployment->getNamespace(), 'PublicationDate', date('Ymd', strtotime($datePublished))));
184  }
185  // Issue Title (mandatory)
186  $localizedTitles = $this->getTranslationsByPrecedence($issue->getTitle(null), $journalLocalePrecedence);
187  // Retrieve the first key/value pair...
188  foreach($localizedTitles as $locale => $localizedTitle) break;
189  if (empty($localizedTitle)) {
190  $localizedTitles = $this->getTranslationsByPrecedence($context->getName(null), $journalLocalePrecedence);
191  // Retrieve the first key/value pair...
192  foreach($localizedTitles as $locale => $localizedTitle) break;
193  assert(!empty($localizedTitle));
194 
195  // Hack to make sure that no untranslated title appears:
196  $showTitle = $issue->getShowTitle();
197  $issue->setShowTitle(0);
198  $localizedTitle = $localizedTitle . ', ' . $issue->getIssueIdentification();
199  $issue->setShowTitle($showTitle);
200  }
201  $journalIssueNode->appendChild($this->createTitleNode($doc, $locale, $localizedTitle, O4DOI_TITLE_TYPE_ISSUE));
202 
203  // Extent (for issues-as-manifestation only)
204  if (!$this->isWork($context, $plugin)) {
205  $issueGalleyDao = DAORegistry::getDAO('IssueGalleyDAO'); /* @var $issueGalleyDao IssueGalleyDAO */
206  $issueGalleys = $issueGalleyDao->getByIssueId($issue->getId());
207  if (!empty($issueGalleys)) {
208  foreach($issueGalleys as $issueGalley) {
209  $journalIssueNode->appendChild($this->createExtentNode($doc, $issueGalley));
210  }
211  }
212  }
213 
214  return $journalIssueNode;
215  }
216 
217 }
218 
219 
PKPString\regexp_replace
static regexp_replace($pattern, $replacement, $subject, $limit=-1)
Definition: PKPString.inc.php:279
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
IssueMedraXmlFilter\process
& process(&$pubObjects)
Definition: IssueMedraXmlFilter.inc.php:54
O4DOIXmlFilter\createExtentNode
createExtentNode($doc, $file)
Definition: O4DOIXmlFilter.inc.php:369
O4DOIXmlFilter\createOtherTextNode
createOtherTextNode($doc, $locale, $description)
Definition: O4DOIXmlFilter.inc.php:388
O4DOIXmlFilter\getTranslationsByPrecedence
getTranslationsByPrecedence($localizedData, $localePrecedence)
Definition: O4DOIXmlFilter.inc.php:524
IssueMedraXmlFilter\getClassName
getClassName()
Definition: IssueMedraXmlFilter.inc.php:42
IssueMedraXmlFilter
Class that converts an Issue as work or manifestation to a O4DOI XML document.
Definition: IssueMedraXmlFilter.inc.php:19
O4DOIXmlFilter\createHeadNode
createHeadNode($doc)
Definition: O4DOIXmlFilter.inc.php:130
O4DOIXmlFilter
Basis class for converting objects (issues, articles, galleys) to a O4DOI XML document.
Definition: O4DOIXmlFilter.inc.php:81
NativeImportExportFilter\getDeployment
getDeployment()
Definition: NativeImportExportFilter.inc.php:49
O4DOIXmlFilter\createRootNode
createRootNode($doc, $rootNodeName)
Definition: O4DOIXmlFilter.inc.php:117
IssueMedraXmlFilter\isWork
isWork($context, $plugin)
Definition: IssueMedraXmlFilter.inc.php:32
IssueMedraXmlFilter\createJournalIssueNode
createJournalIssueNode($doc, $issue, $journalLocalePrecedence)
Definition: IssueMedraXmlFilter.inc.php:173
IssueMedraXmlFilter\createIssueNode
createIssueNode($doc, $pubObject)
Definition: IssueMedraXmlFilter.inc.php:84
O4DOIXmlFilter\createSerialPublicationNode
createSerialPublicationNode($doc, $journalLocalePrecedence, $epubFormat=null)
Definition: O4DOIXmlFilter.inc.php:156
O4DOIXmlFilter\getObjectLocalePrecedence
getObjectLocalePrecedence($context, $article, $galley)
Definition: O4DOIXmlFilter.inc.php:428
O4DOIXmlFilter\createTitleNode
createTitleNode($doc, $locale, $localizedTitle, $titleType)
Definition: O4DOIXmlFilter.inc.php:205
IssueMedraXmlFilter\__construct
__construct($filterGroup)
Definition: IssueMedraXmlFilter.inc.php:24
O4DOIXmlFilter\createIdentifierNode
createIdentifierNode($doc, $workOrProduct, $idType, $id)
Definition: O4DOIXmlFilter.inc.php:353
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
Filter\setDisplayName
setDisplayName($displayName)
Definition: Filter.inc.php:140
O4DOIXmlFilter\createRelatedNode
createRelatedNode($doc, $workOrProduct, $relationCode, $ids)
Definition: O4DOIXmlFilter.inc.php:333
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49