/**
  * Create a Dataverse study: create deposit package with journal-, article-, 
  * and suppfile-level metadata, then deposit in Dataverse to create study.
  * @param $article Article
  * @return DataverseStudy
  */
 function createStudy($article)
 {
     $package = $this->createMetadataPackage($article);
     $client = $this->_initSwordClient();
     $depositReceipt = $client->depositAtomEntry($this->getSetting($article->getJournalId(), 'dvUri'), $this->getSetting($article->getJournalId(), 'username'), $this->getSetting($article->getJournalId(), 'password'), '', $package->getAtomEntryFilePath());
     $study = null;
     if ($depositReceipt->sac_status == DATAVERSE_PLUGIN_HTTP_STATUS_CREATED) {
         $this->import('classes.DataverseStudy');
         $study = new DataverseStudy();
         $study->setSubmissionId($article->getId());
         $study->setEditUri($depositReceipt->sac_edit_iri);
         $study->setEditMediaUri($depositReceipt->sac_edit_media_iri);
         $study->setStatementUri($depositReceipt->sac_state_iri_atom);
         $study->setDataCitation($depositReceipt->sac_dcterms['bibliographicCitation'][0]);
         // Persistent URI may be present, as an altenate
         foreach ($depositReceipt->sac_links as $link) {
             if ($link->sac_linkrel == 'alternate') {
                 $study->setPersistentUri($link->sac_linkhref);
                 break;
             }
         }
         // Insert new Dataverse study for this submission
         $dataverseStudyDao =& DAORegistry::getDAO('DataverseStudyDAO');
         $dataverseStudyDao->insertStudy($study);
     }
     return $study;
 }
 /**
  * Internal function to return DataverseStudy object from a row.
  * @param $row array
  * @return DataverseStudy
  */
 function &_returnStudyFromRow(&$row)
 {
     $dataversePlugin =& PluginRegistry::getPlugin('generic', $this->_parentPluginName);
     $dataversePlugin->import('classes.DataverseStudy');
     $study = new DataverseStudy();
     $study->setId($row['study_id']);
     $study->setSubmissionId($row['submission_id']);
     $study->setEditUri($row['edit_uri']);
     $study->setEditMediaUri($row['edit_media_uri']);
     $study->setStatementUri($row['statement_uri']);
     $study->setPersistentUri($row['persistent_uri']);
     $study->setDataCitation($row['data_citation']);
     return $study;
 }
 /**
  * Create a Dataverse study: create and deposit Atom entry; package and deposit
  * files, if files submitted.
  * @param $article
  * @param $dvFiles array of files to deposit
  * @return DataverseStudy
  */
 function &createStudy(&$article, $dvFiles = array())
 {
     $journal =& Request::getJournal();
     // Go no further if plugin is not configured.
     if (!$this->getSetting($journal->getId(), 'dvUri')) {
         return false;
     }
     $packager = new DataversePackager();
     $suppFileDao =& DAORegistry::getDAO('SuppFileDAO');
     // Add article metadata
     $packager->addMetadata('title', $article->getLocalizedTitle());
     $packager->addMetadata('description', $article->getLocalizedAbstract());
     foreach ($article->getAuthors() as $author) {
         $packager->addMetadata('creator', $author->getFullName(true));
     }
     // subject: academic disciplines
     $split = '/\\s*' . DATAVERSE_PLUGIN_SUBJECT_SEPARATOR . '\\s*/';
     foreach (preg_split($split, $article->getLocalizedDiscipline(), NULL, PREG_SPLIT_NO_EMPTY) as $subject) {
         $packager->addMetadata('subject', $subject);
     }
     // subject: subject classifications
     foreach (preg_split($split, $article->getLocalizedSubjectClass(), NULL, PREG_SPLIT_NO_EMPTY) as $subject) {
         $packager->addMetadata('subject', $subject);
     }
     // subject:	 keywords
     foreach (preg_split($split, $article->getLocalizedSubject(), NULL, PREG_SPLIT_NO_EMPTY) as $subject) {
         $packager->addMetadata('subject', $subject);
     }
     // geographic coverage
     foreach (preg_split($split, $article->getLocalizedCoverageGeo(), NULL, PREG_SPLIT_NO_EMPTY) as $coverage) {
         $packager->addMetadata('coverage', $coverage);
     }
     // publisher
     $packager->addMetadata('publisher', $journal->getSetting('publisherInstitution'));
     // rights
     $packager->addMetadata('rights', $journal->getLocalizedSetting('copyrightNotice'));
     // isReferencedBy
     $packager->addMetadata('isReferencedBy', $this->getCitation($article));
     // Include (some) suppfile metadata in study
     foreach ($dvFiles as $dvFile) {
         $suppFile =& $suppFileDao->getSuppFile($dvFile->getSuppFileId(), $article->getId());
         if (isset($suppFile)) {
             // subject
             foreach (preg_split($split, $suppFile->getSuppFileSubject(), NULL, PREG_SPLIT_NO_EMPTY) as $subject) {
                 $packager->addMetadata('subject', $subject);
             }
             // Type of file
             if ($suppFile->getType()) {
                 $packager->addMetadata('type', $suppFile->getType());
             }
             // Type of file, user-defined:
             if ($suppFile->getSuppFileTypeOther()) {
                 $packager->addMetadata('type', $suppFile->getSuppFileTypeOther());
             }
         }
     }
     // Write Atom entry file
     $packager->createAtomEntry();
     // Create the study in Dataverse
     $client = $this->_initSwordClient();
     $depositReceipt = $client->depositAtomEntry($this->getSetting($article->getJournalId(), 'dvUri'), $this->getSetting($article->getJournalId(), 'username'), $this->getSetting($article->getJournalId(), 'password'), '', $packager->getAtomEntryFilePath());
     // Exit & notify if study failed to be created
     if ($depositReceipt->sac_status != DATAVERSE_PLUGIN_HTTP_STATUS_CREATED) {
         return false;
     }
     // Insert new Dataverse study for this submission
     $dataverseStudyDao =& DAORegistry::getDAO('DataverseStudyDAO');
     $this->import('classes.DataverseStudy');
     $study = new DataverseStudy();
     $study->setSubmissionId($article->getId());
     $study->setEditUri($depositReceipt->sac_edit_iri);
     $study->setEditMediaUri($depositReceipt->sac_edit_media_iri);
     $study->setStatementUri($depositReceipt->sac_state_iri_atom);
     $study->setDataCitation($depositReceipt->sac_dcterms['bibliographicCitation'][0]);
     // Persistent URI may be present, as an altenate
     foreach ($depositReceipt->sac_links as $link) {
         if ($link->sac_linkrel == 'alternate') {
             $study->setPersistentUri($link->sac_linkhref);
             break;
         }
     }
     $dataverseStudyDao->insertStudy($study);
     // Fine. Now add the files, if any are present.
     for ($i = 0; $i < sizeof($dvFiles); $i++) {
         $dvFile =& $dvFiles[$i];
         $suppFile =& $suppFileDao->getSuppFile($dvFile->getSuppFileId(), $article->getId());
         $dvFileIndex[str_replace(' ', '_', $suppFile->getOriginalFileName())] =& $dvFile;
         $packager->addFile($suppFile);
     }
     // Create the deposit package & add package to Dataverse
     $packager->createPackage();
     $depositReceipt = $client->deposit($study->getEditMediaUri(), $this->getSetting($journal->getId(), 'username'), $this->getSetting($journal->getId(), 'password'), '', $packager->getPackageFilePath(), $packager->getPackaging(), $packager->getContentType(), false);
     // in progress? false
     if ($depositReceipt->sac_status != DATAVERSE_PLUGIN_HTTP_STATUS_CREATED) {
         return false;
     }
     // Get the study statement & update the local file list
     $studyStatement = $client->retrieveAtomStatement($study->getStatementUri(), $this->getSetting($journal->getId(), 'username'), $this->getSetting($journal->getId(), 'password'), '');
     if (!isset($studyStatement)) {
         return false;
     }
     // Update each Dataverse file with study id & content source URI
     $dvFileDao =& DAORegistry::getDAO('DataverseFileDAO');
     foreach ($studyStatement->sac_entries as $entry) {
         $dvUriFileName = substr($entry->sac_content_source, strrpos($entry->sac_content_source, '/') + 1);
         if (array_key_exists($dvUriFileName, $dvFileIndex)) {
             $dvFile =& $dvFileIndex[$dvUriFileName];
             $dvFile->setContentSourceUri($entry->sac_content_source);
             $dvFile->setStudyId($study->getId());
             $dvFileDao->updateDataverseFile($dvFile);
         }
     }
     // Done.
     return $study;
 }