Example #1
0
 /**
  * Constructor
  *
  * @access public
  */
 public function __construct()
 {
     global $interface;
     global $configArray;
     // Call parent constructor
     parent::__construct();
     // Fetch Record
     $config = getExtraConfigArray('MetaLib');
     $metalib = new MetaLib();
     $this->record = $metalib->getRecord($_REQUEST['id']);
     if (PEAR::isError($this->record)) {
         PEAR::raiseError($this->record);
     }
     // Get record driver
     $this->recordDriver = RecordDriverFactory::initRecordDriver($this->record);
     // Set Proxy URL
     $interface->assign('proxy', isset($configArray['EZproxy']['host']) ? $configArray['EZproxy']['host'] : false);
     // Whether RSI is enabled
     if (isset($configArray['OpenURL']['use_rsi']) && $configArray['OpenURL']['use_rsi']) {
         $interface->assign('rsi', true);
     }
     // Whether embedded openurl autocheck is enabled
     if (isset($configArray['OpenURL']['autocheck']) && $configArray['OpenURL']['autocheck']) {
         $interface->assign('openUrlAutoCheck', true);
     }
     // Send record ID to template
     $interface->assign('id', $_REQUEST['id']);
     // Send down legal export formats (if any):
     $interface->assign('exportFormats', array('RefWorks', 'EndNote'));
     // Set AddThis User
     $interface->assign('addThis', isset($configArray['AddThis']['key']) ? $configArray['AddThis']['key'] : false);
     // Get core metadata
     $interface->assign('coreMetadata', $this->recordDriver->getCoreMetadata());
 }
Example #2
0
 /**
  * Get data and output in JSON
  *
  * @return void
  * @access public
  */
 public function getRSIStatuses()
 {
     //<SFX server>:<port>/<sfx_instance>/cgi/core/rsi/rsi.cgi
     global $configArray;
     if (!isset($configArray['OpenURL']['url'])) {
         return $this->output(array(), JSON::STATUS_OK);
     }
     $sfxUrl = $configArray['OpenURL']['url'] . "/cgi/core/rsi/rsi.cgi";
     $metalib = new MetaLib();
     $indexEngine = SearchObjectFactory::initSearchObject()->getIndexEngine();
     $dom = new DOMDocument('1.0', 'UTF-8');
     // ID REQUEST
     $idReq = $dom->createElement('IDENTIFIER_REQUEST', '');
     $idReq->setAttribute("VERSION", "1.0");
     $idReq->setAttribute("xsi:noNamespaceSchemaLocation", "ISSNRequest.xsd");
     $idReq->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
     $dom->appendChild($idReq);
     // Cache values and status in an array
     $rsiResults = array();
     $validRequest = false;
     foreach ($_REQUEST['id'] as $id) {
         if (strncmp($id, 'metalib.', 8) == 0) {
             if (!($record = $metalib->getRecord($id))) {
                 $this->output('Record does not exist', JSON::STATUS_ERROR);
                 return;
             }
             $values = array('isbn' => !empty($record['ISBN']) ? $record['ISBN'][0] : '', 'issn' => !empty($record['ISSN']) ? $record['ISSN'][0] : '', 'year' => !empty($record['PublicationDate']) ? $record['PublicationDate'][0] : '', 'volume' => !empty($record['Volume']) ? $record['Volume'] : '', 'issue' => !empty($record['Issue']) ? $record['Issue'] : '', 'institute' => isset($configArray['OpenURL']['institute']) ? $configArray['OpenURL']['institute'] : '');
         } else {
             if (!($record = $indexEngine->getRecord($id))) {
                 $this->output('Record does not exist', JSON::STATUS_ERROR);
                 return;
             }
             $recordDriver = RecordDriverFactory::initRecordDriver($record);
             $values = $recordDriver->getRSIValues($recordDriver);
         }
         $result = array('id' => $id, 'status' => 'noInformation');
         // Ignore the record if mandatory elements are not available
         if (empty($values['issn']) && empty($values['isbn'])) {
             // Mark this result invalid so it can be skipped when processing results
             $result['invalid'] = true;
             $rsiResults[] = $result;
             continue;
         }
         $rsiResults[] = $result;
         $validRequest = true;
         // ID REQUEST ITEM
         $idReqItem = $dom->createElement('IDENTIFIER_REQUEST_ITEM', '');
         $idReq->appendChild($idReqItem);
         // ID
         if (!empty($values['issn'])) {
             $identifier = $dom->createElement('IDENTIFIER', 'issn:' . $values['issn']);
             $idReqItem->appendChild($identifier);
         }
         if (!empty($values['isbn'])) {
             $identifier = $dom->createElement('IDENTIFIER', 'isbn:' . $values['isbn']);
             $idReqItem->appendChild($identifier);
         }
         // Optional elements
         if ($values['year']) {
             $year = $dom->createElement('YEAR', $values['year']);
             $idReqItem->appendChild($year);
         }
         if ($values['volume']) {
             $volume = $dom->createElement('VOLUME', $values['volume']);
             $idReqItem->appendChild($volume);
         }
         if ($values['issue']) {
             $issue = $dom->createElement('ISSUE', $values['issue']);
             $idReqItem->appendChild($issue);
         }
         if ($values['institute']) {
             $institute = $dom->createElement('INSTITUTE_NAME', $values['institute']);
             $idReqItem->appendChild($institute);
         }
     }
     if (!$validRequest) {
         return $this->output(array(), JSON::STATUS_OK);
     }
     $xml = $dom->saveXML();
     $req = new Proxy_Request($sfxUrl, array('saveBody' => true));
     $req->setMethod(HTTP_REQUEST_METHOD_POST);
     $req->addPostData('request_xml', $xml);
     $req->sendRequest();
     $code = $req->getResponseCode();
     if ($code != 200) {
         $this->output("SFX RSI request failed ({$code})", JSON::STATUS_ERROR);
         return;
     }
     $dom->loadXML($req->getResponseBody());
     $items = $dom->getElementsByTagName('IDENTIFIER_RESPONSE_ITEM');
     $position = -1;
     foreach ($items as $item) {
         $requests = $dom->getElementsByTagName('IDENTIFIER_REQUEST_ITEM');
         $request = $requests->item(0);
         $position++;
         // Bypass invalid ID's and stop if at the end of list.
         while (isset($rsiResults[$position]['invalid'])) {
             ++$position;
         }
         if (!isset($rsiResults[$position])) {
             break;
         }
         $result = $item->getElementsByTagName('RESULT')->item(0)->nodeValue;
         if ($result == 'not found') {
             $rsiResults[$position]['status'] = 'noFullText';
         } elseif ($result == 'maybe') {
             $rsiResults[$position]['status'] = 'maybeFullText';
         } else {
             foreach ($item->getElementsByTagName('AVAILABLE_SERVICES') as $service) {
                 if ($service->nodeValue == 'getFullTxt') {
                     $peerReviewed = false;
                     foreach ($item->getElementsByTagName('PEER_REVIEWED') as $peer) {
                         if ($peer->nodeValue == 'YES') {
                             $peerReviewed = true;
                             break;
                         }
                     }
                     $rsiResults[$position]['status'] = $peerReviewed ? 'peerReviewedFullText' : 'fullText';
                     break;
                 }
             }
         }
     }
     $results = array();
     foreach ($rsiResults as $result) {
         $results[] = array('id' => $result['id'], 'status' => $result['status']);
     }
     return $this->output($results, JSON::STATUS_OK);
 }
Example #3
0
 /**
  * Get record and export data
  * Display error message on terminal error or email details page on success
  *
  * @param string $format The desired export format
  * @param array  $ids    A list of bib IDs
  *
  * @return array Record data for each ID, plus an list of IDs without results
  * @access public
  */
 public function exportAll($format, $ids)
 {
     global $interface;
     global $configArray;
     $exportDetails = array();
     $errorMsgDetails = array();
     // MARC-XML needs a container at the start:
     if ($format == 'MARCXML') {
         $exportDetails[] = '<?xml version="1.0" encoding="UTF-8"?>' . '<collection xmlns="http://www.loc.gov/MARC21/slim">';
     }
     foreach ($ids as $id) {
         // Retrieve the record from the index
         list($index, $recId) = explode('.', $id, 2);
         $current = null;
         if ($index === 'pci' || $index === 'metalib') {
             $format = strtolower($format);
             if ($index === 'pci') {
                 $db = new SearchObject_PCI();
                 if ($rec = $db->getRecord($id)) {
                     $pci = new PCI();
                     $current = $interface->fetch($pci->export($rec, $format));
                 }
             } else {
                 if ($index === 'metalib') {
                     $db = new MetaLib();
                     if ($rec = $db->getRecord($id)) {
                         $current = $interface->fetch($db->export($rec, $format));
                     }
                 }
             }
             if ($current) {
                 $exportDetails[] = $current;
             } else {
                 $errorMsgDetails[] = $id;
             }
         } else {
             if (!($record = $this->db->getRecord($id))) {
                 $errorMsgDetails[] = $id;
             } else {
                 $recordDetails = RecordDriverFactory::initRecordDriver($record);
                 // Assign core metadata to be sure export has all necessary values
                 // available:
                 $recordDetails->getCoreMetadata();
                 $result = $recordDetails->getExport($format);
                 if (!empty($result)) {
                     $interface->assign('id', $id);
                     $current = $interface->fetch($result);
                     // For MARC-XML, extract <record> from <collection>:
                     if ($format == 'MARCXML') {
                         $current = $this->extractXMLRecord($current);
                     }
                     if (!empty($current)) {
                         $exportDetails[] = $current;
                     }
                 } else {
                     $errorMsgDetails[] = $id;
                 }
             }
         }
     }
     // MARC-XML needs a container close at the end:
     if ($format == 'MARCXML') {
         $exportDetails[] = '</collection>';
     }
     $results = array('exportDetails' => $exportDetails, 'errorDetails' => $errorMsgDetails);
     return $results;
 }
 /**
  * Get data and output in JSON
  *
  * @return void
  * @access public
  */
 public function getbXRecommendations()
 {
     global $configArray;
     if (!isset($configArray['bX']['token'])) {
         $this->output('bX support not enabled', JSON::STATUS_ERROR);
         return;
     }
     $id = $_REQUEST['id'];
     if (strncmp($id, 'metalib.', 8) == 0) {
         include_once 'sys/MetaLib.php';
         $metalib = new MetaLib();
         if (!($record = $metalib->getRecord($id))) {
             $this->output('Record does not exist', JSON::STATUS_ERROR);
             return;
         }
         $openUrl = $record['openUrl'];
     } elseif (strncmp($id, 'pci.', 4) == 0) {
         include_once 'sys/PCI.php';
         $pci = new PCI();
         if (!($record = $pci->getRecord($id))) {
             $this->output('Record does not exist', JSON::STATUS_ERROR);
             return;
         }
         $openUrl = $record['openUrl'];
     } else {
         $searchObject = SearchObjectFactory::initSearchObject();
         if (!($record = $searchObject->getIndexEngine()->getRecord($id))) {
             $this->output('Record does not exist', JSON::STATUS_ERROR);
             return;
         }
         $recordDriver = RecordDriverFactory::initRecordDriver($record);
         $openUrl = $recordDriver->getOpenURL();
     }
     $params = http_build_query(array('token' => $configArray['bX']['token'], 'format' => 'xml', 'source' => isset($configArray['bX']['source']) ? $configArray['bX']['source'] : 'global', 'maxRecords' => isset($configArray['bX']['maxRecords']) ? $configArray['bX']['maxRecords'] : '5', 'threshold' => isset($configArray['bX']['threshold']) ? $configArray['bX']['threshold'] : '50'));
     $openUrl .= '&res_dat=' . urlencode($params);
     $baseUrl = isset($configArray['bX']['baseUrl']) ? $configArray['bX']['baseUrl'] : 'http://recommender.service.exlibrisgroup.com/service/recommender/openurl';
     $client = new HTTP_Request();
     $client->setMethod(HTTP_REQUEST_METHOD_GET);
     $client->setURL($baseUrl . "?{$openUrl}");
     $result = $client->sendRequest();
     if (!PEAR::isError($result)) {
         // Even if we get a response, make sure it's a 'good' one.
         if ($client->getResponseCode() != 200) {
             $this->output('bX request failed, response code ' . $client->getResponseCode(), JSON::STATUS_ERROR);
         }
     } else {
         $this->_output('bX request failed: ' . $result, JSON::STATUS_ERROR);
     }
     $xml = simplexml_load_string($client->getResponseBody());
     $data = array();
     $jnl = 'info:ofi/fmt:xml:xsd:journal';
     $xml->registerXPathNamespace('jnl', $jnl);
     foreach ($xml->xpath('//jnl:journal') as $journal) {
         $item = $this->convertToArray($journal, $jnl);
         if (!isset($item['authors']['author'][0])) {
             $item['authors']['author'] = array($item['authors']['author']);
         }
         $item['openurl'] = $this->createOpenUrl($item);
         $data[] = $item;
     }
     $this->output($data, JSON::STATUS_OK);
 }
Example #5
0
 /**
  * Support method -- get details about records based on an array of IDs.
  *
  * @param array $ids IDs to look up.
  *
  * @return array
  * @access protected
  */
 protected function getRecordDetails($ids)
 {
     global $interface;
     $recordList = array();
     $metalib = null;
     $pci = null;
     foreach ($ids as $id) {
         if (strncmp($id, 'metalib.', 8) == 0) {
             if (!isset($metalib)) {
                 $metalib = new MetaLib();
             }
             $record = $metalib->getRecord($id);
             $record['id'] = $id;
             $interface->assign('record', $record);
             $email = $interface->fetch('MetaLib/result-email.tpl');
             $recordList[] = array('id' => $id, 'isbn' => isset($record['ISBN'][0]) ? $record['ISBN'][0] : '', 'author' => isset($record['Author'][0]) ? $record['Author'][0] : '', 'title' => isset($record['Title'][0]) ? $record['Title'][0] : '', 'format' => isset($record['format'][0]) ? $record['format'][0] : '', 'email' => $email);
         } elseif (strncmp($id, 'pci.', 4) == 0) {
             if (!isset($pci)) {
                 $pci = new PCI();
             }
             $record = $pci->getRecord($id);
             $interface->assign('record', $record);
             $email = $interface->fetch('PCI/result-email.tpl');
             $recordList[] = array('id' => $id, 'isbn' => '', 'author' => isset($record['author'][0]) ? $record['author'][0] : '', 'title' => isset($record['title']) ? $record['title'] : '', 'format' => isset($record['format']) ? $record['format'] : '', 'email' => $email);
         } else {
             $record = $this->db->getRecord($id);
             $driver = RecordDriverFactory::initRecordDriver($record);
             $email = $interface->fetch($driver->getSearchResult('email'));
             $recordList[] = array('id' => $id, 'isbn' => isset($record['isbn']) ? $record['isbn'] : '', 'author' => isset($record['author']) ? $record['author'] : '', 'title' => $driver->getTitle(), 'format' => $record['format'], 'email' => $email);
         }
     }
     return $recordList;
 }