Open Journal Systems  3.3.0
PKPSwordDeposit.inc.php
1 <?php
2 
16 require_once dirname(__FILE__) . '/../libs/swordappv2/swordappclient.php';
17 require_once dirname(__FILE__) . '/../libs/swordappv2/swordappentry.php';
18 require_once dirname(__FILE__) . '/PKPPackagerMetsSwap.php';
19 
22  protected $_package = null;
23 
25  protected $_outPath = null;
26 
28  protected $_context = null;
29 
31  protected $_section = null;
32 
34  protected $_issue = null;
35 
37  protected $_article = null;
38 
44  public function __construct($submission) {
45  $this->_submission = $submission;
46 
47  // Create a directory for deposit contents
48  $this->_outPath = tempnam('/tmp', 'sword');
49  unlink($this->_outPath);
50  mkdir($this->_outPath);
51  mkdir($this->_outPath . '/files');
52 
53  // Create a package
54  $this->_package = new PKPPackagerMetsSwap(
55  $this->_outPath,
56  'files',
57  $this->_outPath,
58  'deposit.zip'
59  );
60 
61  $journalDao = DAORegistry::getDAO('JournalDAO');
62  $this->_context = $journalDao->getById($submission->getContextId());
63 
64  $sectionDao = DAORegistry::getDAO('SectionDAO');
65  $this->_section = $sectionDao->getById($submission->getSectionId());
66 
67  if (method_exists($submission, 'getIssueId')) {
68  $issueDao = DAORegistry::getDAO('IssueDAO');
69  $this->_issue = $issueDao->getById($submission->getIssueId());
70  }
71  }
72 
77  public function setMetadata($request) {
78  $this->_package->setCustodian($this->_context->getContactName());
79  $this->_package->setTitle(html_entity_decode($this->_submission->getLocalizedTitle(), ENT_QUOTES, 'UTF-8'));
80  $this->_package->setAbstract(html_entity_decode(strip_tags($this->_submission->getLocalizedAbstract()), ENT_QUOTES, 'UTF-8'));
81  $this->_package->setType($this->_section->getLocalizedIdentifyType());
82  $publication = $this->_submission->getCurrentPublication();
83  foreach ($publication->getData('authors') as $author) {
84  $creator = $author->getFullName(true);
85  $affiliation = $author->getLocalizedAffiliation();
86  if (!empty($affiliation)) $creator .= "; $affiliation";
87  $this->_package->addCreator($creator);
88 
89  $this->_package->sac_name_records[] = [
90  'family' => $author->getFamilyName(Locale::getDefault()),
91  'given' => $author->getGivenName(Locale::getDefault()),
92  'email' => $author->getEmail(),
93  'primary_contact' => ($author->getId() === $publication->getData('primaryContactId'))
94  ];
95  }
96  }
97 
102  public function _addFile($submissionFile) {
103  $targetFilename = $this->_outPath . '/files/' . $submissionFile->getOriginalFileName();
104  copy($submissionFile->getFilePath(), $targetFilename);
105  $this->_package->addFile($submissionFile->getOriginalFileName(), $submissionFile->getFileType());
106  }
107 
111  public function addGalleys() {
112  foreach ($this->_submission->getGalleys() as $galley) {
113  $this->_addFile($galley->getFile());
114  }
115  }
116 
121  public function addEditorial() {
122  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
123  $submissionFiles = $submissionFileDao->getBySubmissionId($this->_submission->getId());
124  // getBySubmission orders results by id ASC, let's reverse the array to have recent files first
125  $submissionFiles = array_reverse($submissionFiles, true);
126  $files = array();
127  foreach ($submissionFiles as $submissionFile) {
128  $fileStage = $submissionFile->getFileStage();
129  if (!isset($files[$fileStage])) {
130  $files[$fileStage] = array();
131  }
132  $files[$fileStage][] = $submissionFile;
133  }
134  // Move through stages in reverse order and try to use them.
135  $stages = array(
136  SUBMISSION_FILE_PRODUCTION_READY,
137  SUBMISSION_FILE_COPYEDIT,
138  SUBMISSION_FILE_REVIEW_FILE,
139  SUBMISSION_FILE_SUBMISSION
140  );
141  $mostRecentEditorialFile = null;
142  foreach ($stages as $subFileStage) {
143  if (isset($files[$subFileStage])) {
144  $mostRecentEditorialFile = array_shift($files[$subFileStage]);
145  $this->_addFile($mostRecentEditorialFile);
146  return true;
147  }
148  }
149  return false;
150  }
151 
155  public function createPackage() {
156  $this->_package->create();
157  }
158 
165  public function deposit($url, $username, $password, $apikey = null) {
166  $clientOpts = $apikey ? [CURLOPT_HTTPHEADER => ["X-Ojs-Sword-Api-Token:".$apikey]] : array();
167  $client = new SWORDAPPClient($clientOpts);
168  $response = $client->deposit(
169  $url, $username, $password,
170  '',
171  $this->_outPath . '/deposit.zip',
172  'http://purl.org/net/sword/package/METSDSpaceSIP',
173  'application/zip', false, true
174  );
175  if ($response->sac_status > 299)
176  throw new Exception("Status: $response->sac_status , summary: $response->sac_summary");
177 
178  return $response;
179  }
180 
184  public function cleanup() {
185  import('lib.pkp.classes.file.FileManager');
186  $fileManager = new FileManager();
187  $fileManager->rmtree($this->_outPath);
188  }
189 }
PKPSwordDeposit\cleanup
cleanup()
Definition: PKPSwordDeposit.inc.php:202
PKPSwordDeposit\$_outPath
$_outPath
Definition: PKPSwordDeposit.inc.php:31
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
SWORDAPPClient
Definition: swordappclient.php:12
PKPSwordDeposit
Class providing a SWORD deposit wrapper for submissions.
Definition: PKPSwordDeposit.inc.php:20
PKPSwordDeposit\setMetadata
setMetadata($request)
Definition: PKPSwordDeposit.inc.php:95
PKPSwordDeposit\addEditorial
addEditorial()
Definition: PKPSwordDeposit.inc.php:139
PKPSwordDeposit\$_context
$_context
Definition: PKPSwordDeposit.inc.php:37
PKPSwordDeposit\$_issue
$_issue
Definition: PKPSwordDeposit.inc.php:49
PKPSwordDeposit\$_article
$_article
Definition: PKPSwordDeposit.inc.php:55
PKPSwordDeposit\$_package
$_package
Definition: PKPSwordDeposit.inc.php:25
PKPSwordDeposit\createPackage
createPackage()
Definition: PKPSwordDeposit.inc.php:173
PKPSwordDeposit\deposit
deposit($url, $username, $password, $apikey=null)
Definition: PKPSwordDeposit.inc.php:183
PKPSwordDeposit\_addFile
_addFile($submissionFile)
Definition: PKPSwordDeposit.inc.php:120
PKPSwordDeposit\$_section
$_section
Definition: PKPSwordDeposit.inc.php:43
FileManager
Class defining basic operations for file management.
Definition: FileManager.inc.php:35
PKPSwordDeposit\addGalleys
addGalleys()
Definition: PKPSwordDeposit.inc.php:129
PKPPackagerMetsSwap
Definition: PKPPackagerMetsSwap.php:5
PKPSwordDeposit\__construct
__construct($submission)
Definition: PKPSwordDeposit.inc.php:62