/**
  * Mail error report
  *
  * @param string $msg an error message
  * @return bool true for message sent properly
  */
 public static function mailErrors($msg)
 {
     $to = QubitOai::getAdminEmail();
     $from = $to;
     $subject = 'Qubit OAI-PMH Harvest';
     $message = $msg;
     $headers = "From: {QubitOai::getAdminEmail()}\r\nX-Mailer: PHP/" . phpversion();
     $params = sprintf('-oi -f %s', $from);
     return mail($to, $subject, $message, $headers, $params);
 }
 /**
  * Executes action
  *
  * @param sfRequest $request A request object
  */
 public function execute($request)
 {
     $request->setRequestFormat('xml');
     $this->date = QubitOai::getDate();
     $this->path = $this->request->getUriPrefix() . $this->request->getPathInfo();
     $this->attributes = $this->request->getGetParameters();
     $this->attributesKeys = array_keys($this->attributes);
     $this->requestAttributes = '';
     foreach ($this->attributesKeys as $key) {
         $this->requestAttributes .= ' ' . $key . '="' . $this->attributes[$key] . '"';
     }
     $this->sets = array();
     foreach (QubitInformationObject::getCollections() as $el) {
         $this->sets[] = new sfIsadPlugin($el);
     }
 }
 public function execute($request)
 {
     $this->requestname = $request;
     $request->setRequestFormat('xml');
     $this->date = gmdate('Y-m-d\\TH:i:s\\Z');
     $this->attributes = $request->getGetParameters();
     /*
      * If limit dates are not supplied, define them as ''
      */
     if (!isset($request->from)) {
         $this->from = '';
     } else {
         $this->from = $request->from;
     }
     if (!isset($request->until)) {
         $this->until = '';
     } else {
         $this->until = $request->until;
     }
     $this->collectionsTable = QubitOai::getCollectionArray();
     /*
      * If set is not supplied, define it as ''
      */
     if (!isset($request->set)) {
         $collection = '';
     } else {
         $collection = QubitOai::getCollectionInfo($request->set, $this->collectionsTable);
     }
     //Get the records according to the limit dates and collection
     $this->records = QubitInformationObject::getUpdatedRecords($this->from, $this->until, $collection);
     $this->publishedRecords = array();
     foreach ($this->records as $record) {
         if ($record->getPublicationStatus()->statusId == QubitTerm::PUBLICATION_STATUS_PUBLISHED_ID) {
             $this->publishedRecords[] = $record;
         }
     }
     $this->recordsCount = count($this->publishedRecords);
     $this->path = $request->getUriPrefix() . $request->getPathInfo();
     $this->attributesKeys = array_keys($this->attributes);
     $this->requestAttributes = '';
     foreach ($this->attributesKeys as $key) {
         $this->requestAttributes .= ' ' . $key . '="' . $this->attributes[$key] . '"';
     }
 }
 public function execute($request)
 {
     $request->setRequestFormat('xml');
     $oai_local_identifier_value = $request->identifier;
     //TODO: strip the trailing integer value from the full OAI Identifier to get the OaiLocalIdentifier
     $oai_local_identifier_id = QubitOai::getOaiIdNumber($oai_local_identifier_value);
     $this->informationObject = QubitInformationObject::getRecordByOaiID($oai_local_identifier_id);
     $request->setAttribute('informationObject', $this->informationObject);
     // just cut-and-paste from OaiIdentify action for now
     $this->date = gmdate('Y-m-d\\TH:i:s\\Z');
     $this->collectionsTable = QubitOai::getCollectionArray();
     $this->path = $request->getUriPrefix() . $request->getPathInfo();
     $this->attributes = $this->request->getGetParameters();
     $this->attributesKeys = array_keys($this->attributes);
     $this->requestAttributes = '';
     foreach ($this->attributesKeys as $key) {
         $this->requestAttributes .= ' ' . $key . '="' . $this->attributes[$key] . '"';
     }
 }
 /**
  * Executes action
  *
  * @param sfRequest $request A request object
  */
 public function execute($request)
 {
     $request->setRequestFormat('xml');
     $this->date = QubitOai::getDate();
     $this->path = $this->request->getUriPrefix() . $this->request->getPathInfo();
     $this->attributes = $this->request->getGetParameters();
     $this->attributesKeys = array_keys($this->attributes);
     $this->requestAttributes = '';
     foreach ($this->attributesKeys as $key) {
         $this->requestAttributes .= ' ' . $key . '="' . $this->attributes[$key] . '"';
     }
     $this->sets = array();
     foreach (QubitInformationObject::getCollections() as $el) {
         $this->sets[] = new sfIsadPlugin($el);
     }
     if (isset($this->request->verb)) {
         switch ($this->request->verb) {
             case 'Identify':
                 $this->verb = 'identify';
                 break;
             case 'ListMetadataFormats':
                 $this->verb = 'listMetadataFormats';
                 break;
             case 'ListSets':
                 $this->verb = 'listSets';
                 break;
             case 'ListRecords':
                 $this->verb = 'listRecords';
                 break;
             case 'ListIdentifiers':
                 $this->verb = 'listIdentifiers';
                 break;
             case 'GetRecord':
                 $this->verb = 'getRecord';
                 break;
             default:
                 $this->verb = 'badVerb';
         }
     } else {
         $this->verb = 'badVerb';
     }
 }
 /**
  * Populate the OAI Repository form with database values (non-localized)
  */
 protected function populateOaiRepositoryForm()
 {
     // Get OAI Repository settings
     $oaiEnabled = QubitSetting::getSettingByName('oai_enabled');
     $oaiRepositoryCode = QubitSetting::getSettingByName('oai_repository_code');
     $oaiRepositoryIdentifier = QubitOai::getRepositoryIdentifier();
     $sampleOaiIdentifier = QubitOai::getSampleIdentifier();
     $resumptionTokenLimit = QubitSetting::getSettingByName('resumption_token_limit');
     // Set defaults for global form
     $this->oaiRepositoryForm->setDefaults(array('oai_enabled' => isset($oaiEnabled) ? intval($oaiEnabled->getValue(array('sourceCulture' => true))) : 1, 'oai_repository_code' => isset($oaiRepositoryCode) ? $oaiRepositoryCode->getValue(array('sourceCulture' => true)) : null, 'oai_repository_identifier' => $oaiRepositoryIdentifier, 'sample_oai_identifier' => $sampleOaiIdentifier, 'resumption_token_limit' => isset($resumptionTokenLimit) ? $resumptionTokenLimit->getValue(array('sourceCulture' => true)) : null));
 }
 /**
  * Executes action
  *
  * @param sfRequest $request A request object
  */
 public function execute($request)
 {
     //Set resumption token to null so that we enter in the harvester loop
     $resumptionToken = 1;
     //Set no records match to false to start with
     $this->noRecordsMatch = false;
     //Keep track of number of records harvested
     $this->recordCount = 0;
     //If the request did not go through the proper routing, forward to 404
     if (!isset($request->id)) {
         $this->forward404();
     }
     $harvestInfo = QubitOaiHarvest::getById($request->id);
     $harvestInfo->setLastHarvestAttempt(QubitOai::getDate());
     $harvestInfo->save();
     $rep = $harvestInfo->getOaiRepository();
     //If repository was not found 404
     if (!$rep) {
         $this->forward404();
     }
     $this->repositoryName = $rep->getName();
     //Initialise $oaiSimpleRes
     $verb = '';
     $oaiSimpleRes = array();
     $from = date('Y-m-d\\TH:i:s\\Z', strtotime($harvestInfo->getLastHarvest()));
     $until = gmdate('Y-m-d\\TH:i:s\\Z');
     //Create the base request
     $verb = 'verb=ListRecords';
     if ($harvestInfo->getLastHarvest() != null) {
         $verb .= '&from=' . $from;
     }
     $verb .= '&until=' . $until;
     $verb .= '&metadataPrefix=' . $harvestInfo->getMetadataPrefix();
     //Add the set parameter if supplied
     if ($harvestInfo->getSet() != null) {
         $verb .= '&set=' . $harvestInfo->getSet();
     }
     while ($resumptionToken) {
         //Load XML through simplexml http
         $oaiSimple = simplexml_load_file($rep->getUri() . '?' . $verb);
         //Strip oai header, construct array of records
         $oaiSimple->registerXPathNamespace('c', 'http://www.openarchives.org/OAI/2.0/');
         if ($oaiSimple->xpath('//c:error')) {
             $oaiReceivedError = $oaiSimple->xpath('//c:error');
             $oaiReceivedErrorAttr = $oaiReceivedError[0]->attributes();
             if ($oaiReceivedErrorAttr['code'] == 'noRecordsMatch') {
                 $this->noRecordsMatch = true;
             } else {
                 $this->forward404();
             }
         }
         if (!$this->noRecordsMatch) {
             //Container for xml import errors
             $this->errorsFound = array();
             $this->errorsXML = array();
             //Create header and footer for XML record for it to validate
             $oaiHeader = '<?xml version="1.0" encoding="UTF-8" ?>';
             $oaiFooter = '';
             $oaiRecords = $oaiSimple->xpath('//c:ListRecords/c:record');
             foreach ($oaiRecords as $oaiRec) {
                 $oaiRec = $oaiHeader . $oaiRec->asXML() . $oaiFooter . "\n";
                 $options = array();
                 $options = $options['strictXmlParsing'] = false;
                 $importer = new QubitXmlImport();
                 $importer->import($oaiRec, $options);
                 //          $importer = QubitXmlImport::execute($oaiRec, $options);
                 if ($importer->hasErrors()) {
                     $this->errorsFound[] = $importer->getErrors();
                     $this->errorsXML[] = $oaiRec;
                 }
             }
             // Increment record count to keep track of number of records harvested
             $this->recordCount += count($oaiRecords);
             $nbrErrors = count($this->errorsFound);
             $errorReport = '';
             $errorReportHTML = '';
             for ($i = 0; $i < $nbrErrors; $i++) {
                 $errorReport .= "Error when importing record:\n\n" . $this->errorsXML[$i] . "\n\nError message:\n" . $this->errorsFound[$i];
                 $errorReport .= "\n**************************************************\n\n";
                 $errorReportHTML .= "Error when importing record:\n\n <br>" . $this->errorsXML[$i] . "\n\n <br> Error message: <br> \n" . $this->errorsFound[$i];
             }
         }
         //Check for resumption token which will also be the while loop indicator
         $oaiResumptionToken = $oaiSimple->xpath('//c:ListRecords/c:resumptionToken');
         if ($oaiResumptionToken == false || count($oaiResumptionToken) > 1) {
             $resumptionToken = false;
         } else {
             $resumptionToken = $oaiResumptionToken[0];
             $verb = 'verb=ListRecords&resumptionToken=' . $resumptionToken;
         }
     }
     // Update last harvest date
     $harvestInfo->setLastHarvest($until);
     $harvestInfo->save();
 }
?>
</earliestDatestamp>
    <deletedRecord><?php 
echo $deletedRecord;
?>
</deletedRecord>
    <granularity><?php 
echo $granularity;
?>
</granularity>
    <compression><?php 
echo $compression;
?>
</compression>
    <description>
      <oai-identifier xmlns="http://www.openarchives.org/OAI/2.0/oai-identifier" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai-identifier http://www.openarchives.org/OAI/2.0/oai-identifier.xsd">
        <scheme>oai</scheme>

        <repositoryIdentifier><?php 
echo QubitOai::getRepositoryIdentifier();
?>
</repositoryIdentifier>
        <delimiter>:</delimiter>
        <sampleIdentifier><?php 
echo QubitOai::getSampleIdentifier();
?>
</sampleIdentifier>
      </oai-identifier>
    </description>
  </Identify>
<?php 
    foreach ($publishedRecords as $record) {
        $requestname->setAttribute('informationObject', $record);
        ?>
   <record>
    <header>
      <identifier><?php 
        echo $record->getOaiIdentifier();
        ?>
</identifier>
      <datestamp><?php 
        echo QubitOai::getDate($record->getUpdatedAt());
        ?>
</datestamp>
      <setSpec><?php 
        echo QubitOai::getSetSpec($record->getLft(), $collectionsTable);
        ?>
</setSpec>
    </header>
    <metadata>
      <oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
          <?php 
        echo get_component('informationobject', 'dublinCoreElements');
        ?>
      </oai_dc:dc>
    </metadata>
   </record>
<?php 
    }
    ?>
  </ListRecords>
  <ListMetadataFormats>
<?php 
foreach (QubitOai::getMetadataFormats() as $metadataFormat) {
    echo "    <metadataFormat>\n";
    echo "      <metadataPrefix>" . $metadataFormat['prefix'] . "</metadataPrefix>\n";
    echo "      <schema>" . $metadataFormat['schema'] . "</schema>\n";
    echo "      <metadataNamespace>" . $metadataFormat['namespace'] . "</metadataNamespace>\n";
    echo "    </metadataFormat>\n";
}
?>
  </ListMetadataFormats>
 /**
  * Executes action
  *
  * @param sfRequest $request A request object
  */
 public function execute($request)
 {
     // only respond to OAI requests if the feature has been enabled
     if (sfConfig::get('app_oai_oai_enabled') == 0) {
         // the following displays a GUI response, should we return a
         // '503 - Service unavailable' HTTP response (without specifying
         // a 'Retry-After' parameter instead?
         $this->forward('admin', 'oaiDisabled');
     }
     $request->setRequestFormat('xml');
     /*    print_r($this->oaiErrorArray);
         //Check for null and duplicate parameters
         if(QubitOai::hasDuplicateOrNullParameters())
         {
           $request->setParameter('errorCode', 'badArgument');
           $request->setParameter('errorMsg', $this->oaiErrorArray{'badArgument'});
           $this->forward('oai', 'error');
         }*/
     $this->date = QubitOai::getDate();
     $this->path = $this->request->getUriPrefix() . $this->request->getPathInfo();
     $this->attributes = $this->request->getGetParameters();
     $this->attributesKeys = array_keys($this->attributes);
     $this->requestAttributes = '';
     foreach ($this->attributesKeys as $key) {
         $this->requestAttributes .= ' ' . $key . '="' . $this->attributes[$key] . '"';
     }
     $this->sets = array();
     foreach (QubitInformationObject::getCollections() as $el) {
         $this->sets[] = new sfIsadPlugin($el);
     }
     /**
      * Validate that verb is valid
      */
     if (isset($this->request->verb)) {
         if (!in_array($this->request->verb, $this->oaiVerbArr)) {
             $request->setParameter('errorCode', 'badVerb');
             $request->setParameter('errorMsg', 'Value of the verb argument is not a legal OAI-PMH verb, the verb argument is missing, or the verb argument is repeated.');
             $this->forward('oai', 'error');
         }
         /**
          * Validate that attributes are valid
          */
         $allowedKeys = sfConfig::get('mod_oai_' . $this->request->verb . 'Allowed');
         $mandatoryKeys = sfConfig::get('mod_oai_' . $this->request->verb . 'Mandatory');
         if (!QubitOai::checkBadArgument($this->attributesKeys, $allowedKeys, $mandatoryKeys)) {
             $request->setParameter('errorCode', 'badArgument');
             $request->setParameter('errorMsg', 'The request includes illegal arguments, is missing required arguments, includes a repeated argument, or values for arguments have an illegal syntax.');
             $this->forward('oai', 'error');
         }
         // For now, if there is a metadataPrefix requested other than oai_dc, fail the request
         $metadataPrefix = $this->request->metadataPrefix;
         if ($metadataPrefix != '' and $metadataPrefix != 'oai_dc') {
             $request->setParameter('errorCode', 'badVerb');
             $request->setParameter('errorMsg', 'The metadata format identified by the value given for the metadataPrefix argument is not supported by the item or by the repository.');
             $this->forward('oai', 'error');
         }
         switch ($this->request->verb) {
             case 'Identify':
                 $this->verb = 'identify';
                 break;
             case 'ListMetadataFormats':
                 $this->verb = 'listMetadataFormats';
                 break;
             case 'ListSets':
                 $this->verb = 'listSets';
                 break;
             case 'ListRecords':
                 $this->verb = 'listRecords';
                 break;
             case 'ListIdentifiers':
                 $this->verb = 'listIdentifiers';
                 break;
             case 'GetRecord':
                 $this->verb = 'getRecord';
                 break;
             default:
                 $this->verb = 'badVerb';
         }
     } else {
         $this->verb = 'badVerb';
     }
 }
  <GetRecord>
   <record>
    <header>
      <identifier><?php 
echo $informationObject->getOaiIdentifier();
?>
</identifier>
      <datestamp><?php 
echo QubitOai::getDate($informationObject->getUpdatedAt());
?>
</datestamp>
      <setSpec><?php 
echo QubitOai::getSetSpec($informationObject->getLft(), $collectionsTable);
?>
</setSpec>
    </header>
    <metadata>
      <oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd">
          <?php 
echo get_component('informationobject', 'dublinCoreElements');
?>
      </oai_dc:dc>
    </metadata>
  </record>
 </GetRecord>