ppound
3 years ago
7 changed files with 4469 additions and 0 deletions
@ -0,0 +1,818 @@ |
|||||||
|
<?php |
||||||
|
namespace Drupal\roblib_search_eds\Lib; |
||||||
|
/** |
||||||
|
* @file |
||||||
|
* The EBSCO EDS API class. |
||||||
|
* |
||||||
|
* PHP version 5 |
||||||
|
* |
||||||
|
* |
||||||
|
* Copyright [2017] [EBSCO Information Services] |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
use Drupal\roblib_search_eds\Lib\EBSCOConnector; |
||||||
|
use Drupal\roblib_search_eds\Lib\EBSCOResponse; |
||||||
|
|
||||||
|
/** |
||||||
|
* EBSCO API class. |
||||||
|
*/ |
||||||
|
class EBSCOAPI { |
||||||
|
/** |
||||||
|
* The authentication token used for API transactions. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $authenticationToken; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The session token for API transactions. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $sessionToken; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The EBSCOConnector object used for API transactions. |
||||||
|
* |
||||||
|
* @global object EBSCOConnector |
||||||
|
*/ |
||||||
|
private $connector; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Configuration options. |
||||||
|
*/ |
||||||
|
protected $config; |
||||||
|
|
||||||
|
/** |
||||||
|
* VuFind search types mapped to EBSCO search types |
||||||
|
* used for urls in search results / detailed result. |
||||||
|
* |
||||||
|
* @global array |
||||||
|
*/ |
||||||
|
private static $search_tags = array( |
||||||
|
'' => '', |
||||||
|
'AllFields' => '', |
||||||
|
'Abstract' => 'AB', |
||||||
|
'Author' => 'AU', |
||||||
|
'Source' => 'SO', |
||||||
|
'Subject' => 'SU', |
||||||
|
'Title' => 'TI', |
||||||
|
'ISBN' => 'IB', |
||||||
|
'ISSN' => 'IS', |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* EBSCO sort options . |
||||||
|
* |
||||||
|
* @global array |
||||||
|
*/ |
||||||
|
private static $sort_options = array( |
||||||
|
'relevance', |
||||||
|
'date', |
||||||
|
'date2', |
||||||
|
'source', |
||||||
|
); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* VuFind sort types mapped to EBSCO sort types |
||||||
|
* used for urls in Search results / Detailed view. |
||||||
|
* |
||||||
|
* @global array |
||||||
|
*/ |
||||||
|
private static $mapped_sort_options = array( |
||||||
|
'' => 'relevance', |
||||||
|
'relevance' => 'relevance', |
||||||
|
'subject' => 'date', |
||||||
|
'date' => 'date2', |
||||||
|
'date_asc' => 'date2', |
||||||
|
'date_desc' => 'date', |
||||||
|
'callnumber' => 'date', |
||||||
|
'author' => 'author', |
||||||
|
'title' => 'date', |
||||||
|
); |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
* |
||||||
|
* @param array config |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function __construct($config) { |
||||||
|
$this->config = $config; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Setter / Getter for authentication token. |
||||||
|
* |
||||||
|
* @param string The authentication token |
||||||
|
* |
||||||
|
* @return string or none |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
public function authenticationToken(){ |
||||||
|
|
||||||
|
$autocompleteTokenTimeOut = time(); |
||||||
|
$authenticationTimeout = 0; |
||||||
|
//$authenticationTimeout; |
||||||
|
// $autocompleteUrl = ''; |
||||||
|
// $token = ''; |
||||||
|
// $timeout = ''; |
||||||
|
// $autoToken = ''; |
||||||
|
// //$autocompleteTokenTimeOut = ''; |
||||||
|
// //$autocompleteTokenTimeOut; |
||||||
|
// $autocompleteTokenTimeOut = 0; |
||||||
|
// $autocompleteCustId =''; |
||||||
|
|
||||||
|
if (isset($_SESSION["authenticationToken"])){ |
||||||
|
$token = $_SESSION["authenticationToken"]; |
||||||
|
$authenticationTimeout = $_SESSION["authenticationTimeout"]-600; |
||||||
|
$timeout = $_SESSION["authenticationTimeout"]; |
||||||
|
$autocompleteUrl = $_SESSION["autocompleteUrl"]; |
||||||
|
$autoToken = $_SESSION["autocompleteToken"]; |
||||||
|
$autocompleteTokenTimeOut = $_SESSION["autocompleteTokenTimeOut"]; |
||||||
|
$autocompleteCustId = $_SESSION["autocompleteCustId"]; |
||||||
|
}else{ |
||||||
|
$result = $this->apiAuthenticationToken(); |
||||||
|
$_SESSION["authenticationToken"]= $result['authenticationToken']; |
||||||
|
$_SESSION["authenticationTimeout"]= $result['authenticationTimeout']; |
||||||
|
$_SESSION['autocompleteUrl'] = $result['autocompleteUrl']; |
||||||
|
$_SESSION['autocompleteToken'] = $result['autocompleteToken']; |
||||||
|
$_SESSION["autocompleteTokenTimeOut"]= $result['autocompleteTokenTimeOut']; |
||||||
|
$_SESSION['autocompleteCustId'] = $result['autocompleteCustId']; |
||||||
|
} |
||||||
|
|
||||||
|
if(time()-$autocompleteTokenTimeOut >= $authenticationTimeout){ |
||||||
|
$result = $this->apiAuthenticationToken(); |
||||||
|
$_SESSION["authenticationToken"]= $result['authenticationToken']; |
||||||
|
$_SESSION["authenticationTimeout"]= $result['authenticationTimeout']; |
||||||
|
$_SESSION['autocompleteUrl'] = $result['autocompleteUrl']; |
||||||
|
$_SESSION['autocompleteToken'] = $result['autocompleteToken']; |
||||||
|
$_SESSION["autocompleteTokenTimeOut"]= $result['autocompleteTokenTimeOut']; |
||||||
|
$_SESSION['autocompleteCustId'] = $result['autocompleteCustId']; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
$result = array( |
||||||
|
'authenticationToken' => $token, |
||||||
|
'authenticationTimeout' => $timeout, |
||||||
|
'autocompleteUrl' => $autocompleteUrl, |
||||||
|
'autocompleteToken' => $autoToken, |
||||||
|
'autocompleteTokenTimeOut' => $autocompleteTokenTimeOut, |
||||||
|
'autocompleteCustId' => $autocompleteCustId |
||||||
|
); |
||||||
|
|
||||||
|
return $result['authenticationToken']; |
||||||
|
}else{ |
||||||
|
return $this->token; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Setter / Getter for session token. |
||||||
|
* |
||||||
|
* @param string The session token |
||||||
|
* |
||||||
|
* @return string or none |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function sessionToken($token = NULL) { |
||||||
|
if (empty($token)) { |
||||||
|
$token = $this->readSession('sessionToken'); |
||||||
|
return !empty($token) ? $token : $this->sessionToken; |
||||||
|
} |
||||||
|
else { |
||||||
|
$this->sessionToken = $token; |
||||||
|
$this->writeSession('sessionToken', $token); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Getter for isGuest. |
||||||
|
* |
||||||
|
* @param string 'y' or 'n' |
||||||
|
* |
||||||
|
* @return string or none |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function isGuest($boolean = NULL) { |
||||||
|
if (empty($boolean)) { |
||||||
|
return $this->readSession('isGuest'); |
||||||
|
} |
||||||
|
else { |
||||||
|
$this->writeSession('isGuest', $boolean); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a new EBSCOConnector object or reuse an existing one. |
||||||
|
* |
||||||
|
* @param none |
||||||
|
* |
||||||
|
* @return EBSCOConnector object |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function connector() { |
||||||
|
if (empty($this->connector)) { |
||||||
|
$this->connector = new EBSCOConnector($this->config); |
||||||
|
} |
||||||
|
return $this->connector; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a new EBSCOResponse object. |
||||||
|
* |
||||||
|
* @param object $response |
||||||
|
* |
||||||
|
* @return EBSCOResponse object |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function response($response) { |
||||||
|
$responseObj = new EBSCOResponse($response); |
||||||
|
return $responseObj; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request authentication and session tokens, then send the API request. |
||||||
|
* Retry the request if authentication errors occur. |
||||||
|
* |
||||||
|
* @param string $action |
||||||
|
* The EBSCOConnector method name. |
||||||
|
* @param array $params |
||||||
|
* The parameters of the HTTP request. |
||||||
|
* @param int $attempts |
||||||
|
* The number of retries. |
||||||
|
* |
||||||
|
* @return object SimpleXml DOM or PEAR Error |
||||||
|
* |
||||||
|
* @access protected |
||||||
|
*/ |
||||||
|
protected function request($action, $params = NULL, $attempts = 5) { |
||||||
|
$authenticationToken = $this->authenticationToken(); |
||||||
|
$sessionToken = $this->sessionToken(); |
||||||
|
|
||||||
|
// If authentication token is missing then the session token is missing too, so get both tokens |
||||||
|
// If session token is missing then the authentication token may be invalid, so get both tokens. |
||||||
|
if (empty($authenticationToken) || empty($sessionToken)) { |
||||||
|
$result = $this->apiAuthenticationAndSessionToken(); |
||||||
|
if ($this->isError($result)) { |
||||||
|
// Any error should terminate the request immediately |
||||||
|
// in order to prevent infinite recursion. |
||||||
|
return $result; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Any change of the isGuest should request a new session |
||||||
|
// (and don't terminate the current request if there was an error during the session request |
||||||
|
// since it's not that important) |
||||||
|
if ($this->isGuest() != $this->connector()->isGuest()) { |
||||||
|
$this->apiSessionToken(); |
||||||
|
} |
||||||
|
|
||||||
|
$headers = array( |
||||||
|
'x-authenticationToken: '.$this->authenticationToken(), |
||||||
|
'x-sessionToken: '.$this->sessionToken(), |
||||||
|
); |
||||||
|
|
||||||
|
$response = call_user_func_array(array($this->connector(), "request{$action}"), array($params, $headers)); |
||||||
|
if ($this->isError($response)) { |
||||||
|
// Retry the request if there were authentication errors. |
||||||
|
$code = $response->getCode(); |
||||||
|
switch ($code) { |
||||||
|
// If authentication token is invalid then the session token is invalid too, so get both tokens |
||||||
|
// If session token is invalid then the authentication token may be invalid too, so get both tokens. |
||||||
|
case EBSCOConnector::EDS_AUTH_TOKEN_INVALID: |
||||||
|
$result = $this->apiAuthenticationToken(); |
||||||
|
if ($this->isError($result)) { |
||||||
|
// Any error should terminate the request immediately |
||||||
|
// in order to prevent infinite recursion. |
||||||
|
return $result; |
||||||
|
} |
||||||
|
if ($attempts > 0) { |
||||||
|
$result = $this->request($action, $params, --$attempts); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case EBSCOConnector::EDS_SESSION_TOKEN_INVALID: |
||||||
|
$result = $this->apiAuthenticationAndSessionToken(); |
||||||
|
if ($this->isError($result)) { |
||||||
|
// Any error should terminate the request immediately |
||||||
|
// in order to prevent infinite recursion. |
||||||
|
return $result; |
||||||
|
} |
||||||
|
if ($attempts > 0) { |
||||||
|
$result = $this->request($action, $params, --$attempts); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
$result = $this->handleError($response); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
else { |
||||||
|
$result = $this->response($response)->result(); |
||||||
|
} |
||||||
|
|
||||||
|
return $result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Wrapper for authentication API call. |
||||||
|
* |
||||||
|
* @param none |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
|
||||||
|
public function apiAuthenticationToken() { |
||||||
|
$response = $this->connector()->requestAuthenticationToken(); |
||||||
|
$result = $this->response($response)->result(); |
||||||
|
|
||||||
|
return $result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Wrapper for session API call. |
||||||
|
* |
||||||
|
* @param none |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function apiSessionToken() { |
||||||
|
// Add authentication tokens to headers. |
||||||
|
$headers = array( |
||||||
|
'x-authenticationToken: '.$this->authenticationToken(), |
||||||
|
); |
||||||
|
|
||||||
|
$response = $this->connector()->requestSessionToken($headers); |
||||||
|
// Raise the exception so that any code running this method should exit immediately. |
||||||
|
if ($this->isError($response)) { |
||||||
|
return $response; |
||||||
|
} |
||||||
|
else { |
||||||
|
$result = $this->response($response)->result(); |
||||||
|
if (is_string($result)) { |
||||||
|
$this->sessionToken($result); |
||||||
|
return $result; |
||||||
|
} |
||||||
|
else { |
||||||
|
return new EBSCOException("No session token was found in the response."); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Initialize the authentication and session tokens. |
||||||
|
* |
||||||
|
* @param none |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function apiAuthenticationAndSessionToken() { |
||||||
|
$authenticationToken = $this->apiAuthenticationToken(); |
||||||
|
if ($this->isError($authenticationToken)) { |
||||||
|
// An authentication error should terminate the request immediately. |
||||||
|
return $authenticationToken; |
||||||
|
} |
||||||
|
|
||||||
|
$sessionToken = $this->apiSessionToken(); |
||||||
|
if ($this->isError($sessionToken)) { |
||||||
|
// A session error should terminate the request immediately. |
||||||
|
return $sessionToken; |
||||||
|
} |
||||||
|
|
||||||
|
// We don't have to return anything, both tokens can be accessed using the getters. |
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Wrapper for search API call. |
||||||
|
* |
||||||
|
* @param array $search |
||||||
|
* The search terms. |
||||||
|
* @param array $filters |
||||||
|
* The facet filters. |
||||||
|
* @param string $start |
||||||
|
* The page to start with. |
||||||
|
* @param string $limit |
||||||
|
* The number of records to return. |
||||||
|
* @param string $sortBy |
||||||
|
* The value to be used by for sorting. |
||||||
|
* @param string $amount |
||||||
|
* The amount of data to be returned. |
||||||
|
* @param string $mode |
||||||
|
* The search mode. |
||||||
|
* |
||||||
|
* @throws object PEAR Error |
||||||
|
* |
||||||
|
* @return array An array of query results |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function apiSearch($search, |
||||||
|
$filters, |
||||||
|
$start = 1, |
||||||
|
$limit = 10, |
||||||
|
$sortBy = 'relevance', |
||||||
|
$amount = 'detailed', |
||||||
|
$mode = 'all', |
||||||
|
$rs = FALSE, |
||||||
|
$emp = FALSE, |
||||||
|
$autosuggest = FALSE, |
||||||
|
$includeimagequickview = FALSE, |
||||||
|
$styles = '', |
||||||
|
$IllustrationInfo = FALSE, |
||||||
|
$autoComplete = FALSE |
||||||
|
) { |
||||||
|
$query = array(); |
||||||
|
|
||||||
|
// Basic search. |
||||||
|
if (!empty($search['lookfor'])) { |
||||||
|
$lookfor = $search['lookfor']; |
||||||
|
$type = isset($search['index']) && !empty($search['index']) ? $search['index'] : 'AllFields'; |
||||||
|
|
||||||
|
// Escape some characters from lookfor term. |
||||||
|
$term = str_replace(array(',', ':', '(', ')'), array('\,', '\:', '\(', '\)'), $lookfor); |
||||||
|
// Replace multiple consecutive empty spaces with one empty space. |
||||||
|
$term = preg_replace("/\s+/", ' ', $term); |
||||||
|
|
||||||
|
// Search terms |
||||||
|
// Complex search term. |
||||||
|
if (preg_match('/(.*) (AND|OR) (.*)/i', $term)) { |
||||||
|
$query['query'] = $term; |
||||||
|
} |
||||||
|
else { |
||||||
|
$tag = self::$search_tags[$type]; |
||||||
|
$op = 'AND'; |
||||||
|
$query_str = implode(',', array($op, $tag)); |
||||||
|
$query_str = implode(($tag ? ':' : ''), array($query_str, $term)); |
||||||
|
$query['query-1'] = $query_str; |
||||||
|
} |
||||||
|
|
||||||
|
// Advanced search. |
||||||
|
} |
||||||
|
elseif (!empty($search['group'])) { |
||||||
|
|
||||||
|
$counter = 1; |
||||||
|
foreach ($search['group'] as $group) { |
||||||
|
$type = $group['type']; |
||||||
|
if (isset($group['lookfor'])) { |
||||||
|
$term = $group['lookfor']; |
||||||
|
$op = isset($group['bool'])?$group['bool']:"AND"; |
||||||
|
$tag = $type && isset(self::$search_tags[$type]) ? self::$search_tags[$type] : ''; |
||||||
|
|
||||||
|
// Escape some characters from lookfor term. |
||||||
|
$term = str_replace(array(',', ':', '(', ')'), array('\,', '\:', '\(', '\)'), $term); |
||||||
|
// Replace multiple consecutive empty spaces with one empty space. |
||||||
|
$term = preg_replace("/\s+/", ' ', $term); |
||||||
|
if (!empty($term)) { |
||||||
|
$query_str = implode(',', array($op, $tag)); |
||||||
|
$query_str = implode(($tag ? ':' : ''), array($query_str, $term)); |
||||||
|
$query["query-$counter"] = $query_str; |
||||||
|
$counter++; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// No search term, return an empty array. |
||||||
|
} |
||||||
|
else { |
||||||
|
$results = array( |
||||||
|
'recordCount' => 0, |
||||||
|
'numFound' => 0, |
||||||
|
'start' => 0, |
||||||
|
'documents' => array(), |
||||||
|
'facets' => array(), |
||||||
|
); |
||||||
|
return $results; |
||||||
|
} |
||||||
|
|
||||||
|
// Add filters. |
||||||
|
$limiters = array(); $expanders = array(); $facets = array(); |
||||||
|
foreach ($filters as $filter) { |
||||||
|
if (preg_match('/addlimiter/', $filter)) { |
||||||
|
list($action, $str) = explode('(', $filter, 2); |
||||||
|
// e.g. FT:y or GZ:Student Research, Projects and Publications. |
||||||
|
$field_and_value = substr($str, 0, -1); |
||||||
|
list($field, $value) = explode(':', $field_and_value, 2); |
||||||
|
$limiters[$field][] = $value; |
||||||
|
} |
||||||
|
elseif (preg_match('/addexpander/', $filter)) { |
||||||
|
list($action, $str) = explode('(', $filter, 2); |
||||||
|
// Expanders don't have value. |
||||||
|
$field = substr($str, 0, -1); |
||||||
|
$expanders[] = $field; |
||||||
|
} |
||||||
|
elseif (preg_match('/addfacetfilter/', $filter)) { |
||||||
|
list($action, $str) = explode('(', $filter, 2); |
||||||
|
// e.g. ZG:FRANCE. |
||||||
|
$field_and_value = substr($str, 0, -1); |
||||||
|
list($field, $value) = explode(':', $field_and_value, 2); |
||||||
|
$facets[$field][] = $field_and_value; |
||||||
|
} |
||||||
|
} |
||||||
|
if (!empty($limiters)) { |
||||||
|
$query['limiter']=''; |
||||||
|
foreach ($limiters as $field => $limiter) { |
||||||
|
// e.g. LA99:English,French,German. |
||||||
|
$query['limiter'].= $field . ':' . implode(',', $limiter); |
||||||
|
} |
||||||
|
} |
||||||
|
if (!empty($expanders)) { |
||||||
|
// e.g. fulltext, thesaurus. |
||||||
|
$query['expander'] = implode(',', $expanders); |
||||||
|
} |
||||||
|
if (!empty($facets)) { |
||||||
|
$groupId = 1; |
||||||
|
foreach ($facets as $field => $facet) { |
||||||
|
// e.g. 1,DE:Math,DE:History. |
||||||
|
$query['facetfilter'] = $groupId . ',' . implode(',', $facet); |
||||||
|
$groupId += 1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 2014-03-26 - new action to jump to page. |
||||||
|
if ($start > 1) { |
||||||
|
$query['action'] = "GoToPage(" . $start . ")"; |
||||||
|
} |
||||||
|
|
||||||
|
// Add the sort option. |
||||||
|
$sortBy = in_array($sortBy, self::$sort_options) ? $sortBy : self::$mapped_sort_options[$sortBy]; |
||||||
|
|
||||||
|
// Add the HTTP query params. |
||||||
|
$params = array( |
||||||
|
// Specifies the sort. Valid options are: |
||||||
|
// relevance, date, date2 |
||||||
|
// date = Date descending |
||||||
|
// date2 = Date ascending. |
||||||
|
'sort' => $sortBy, |
||||||
|
// Specifies the search mode. Valid options are: |
||||||
|
// bool, any, all, smart. |
||||||
|
'searchmode' => $mode, |
||||||
|
// Specifies the amount of data to return with the response |
||||||
|
// Valid options are: |
||||||
|
// title: Title only |
||||||
|
// brief: Title + Source, Subjects |
||||||
|
// detailed: Brief + full abstract. |
||||||
|
'view' => $amount, |
||||||
|
// Specifies whether or not to include facets. |
||||||
|
'includefacets' => 'y', |
||||||
|
'resultsperpage' => $limit, |
||||||
|
|
||||||
|
// 2014-03-26 RF. |
||||||
|
'pagenumber' => $start, |
||||||
|
// 'pagenumber' => 1, |
||||||
|
// Specifies whether or not to include highlighting in the search results. |
||||||
|
'highlight' => 'y', |
||||||
|
|
||||||
|
|
||||||
|
'includeimagequickview' => $includeimagequickview, |
||||||
|
|
||||||
|
|
||||||
|
'format' => 'ris', |
||||||
|
|
||||||
|
'styles' => $styles, |
||||||
|
|
||||||
|
|
||||||
|
); |
||||||
|
|
||||||
|
if ($autosuggest == TRUE) { |
||||||
|
$params["autosuggest"] = "y"; |
||||||
|
} |
||||||
|
|
||||||
|
if ($rs == TRUE) { |
||||||
|
$params["relatedcontent"] = "rs"; |
||||||
|
} |
||||||
|
|
||||||
|
if ($emp == TRUE) { |
||||||
|
if (isset($params["relatedcontent"])) { |
||||||
|
$params["relatedcontent"] .= ",emp"; |
||||||
|
} |
||||||
|
else { |
||||||
|
$params["relatedcontent"] = "emp"; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if ($includeimagequickview == TRUE) { |
||||||
|
$params["includeimagequickview"] = "y"; |
||||||
|
} |
||||||
|
|
||||||
|
if ($styles == 'all') { |
||||||
|
$params["styles"] = "all"; |
||||||
|
} |
||||||
|
|
||||||
|
if ($autoComplete == TRUE) { |
||||||
|
$params["autocomplete"] = "y"; |
||||||
|
} |
||||||
|
|
||||||
|
$params = array_merge($params, $query); |
||||||
|
|
||||||
|
|
||||||
|
$result = $this->request('Search', $params); |
||||||
|
|
||||||
|
return $result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Wrapper for retrieve API call. |
||||||
|
* |
||||||
|
* @param array $an |
||||||
|
* The accession number. |
||||||
|
* @param string $start |
||||||
|
* The short database name. |
||||||
|
* |
||||||
|
* @throws object PEAR Error |
||||||
|
* |
||||||
|
* @return array An associative array of data |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function apiRetrieve($an, $db) { |
||||||
|
// Add the HTTP query params. |
||||||
|
//$includeimagequickviewDetail = FALSE; |
||||||
|
$params = array( |
||||||
|
'an' => $an, |
||||||
|
'dbid' => $db, |
||||||
|
'highlight' => 'y', |
||||||
|
//'includeimagequickview' => $includeimagequickviewDetail, |
||||||
|
//'IllustrationInfo' => 'y', |
||||||
|
'IllustrationInfo' => $IllustrationInfo, |
||||||
|
'format' => 'ris', |
||||||
|
'styles' => $styles, |
||||||
|
); |
||||||
|
|
||||||
|
$result = $this->request('Retrieve', $params); |
||||||
|
|
||||||
|
return $result; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public function apiExport($an, $db) { |
||||||
|
|
||||||
|
$params = array( |
||||||
|
'an' => $an, |
||||||
|
'dbid' => $db, |
||||||
|
'format' => 'ris' |
||||||
|
); |
||||||
|
|
||||||
|
$result = $this->request('Export', $params); |
||||||
|
|
||||||
|
return $result; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public function apiCitationStyles($an, $db, $styles) { |
||||||
|
|
||||||
|
$params = array( |
||||||
|
'an' => $an, |
||||||
|
'dbid' => $db, |
||||||
|
'styles' => $styles |
||||||
|
); |
||||||
|
|
||||||
|
$result = $this->request('CitationStyles', $params); |
||||||
|
|
||||||
|
return $result; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Wrapper for info API call. |
||||||
|
* |
||||||
|
* @throws object PEAR Error |
||||||
|
* |
||||||
|
* @return array An associative array of data |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function apiInfo() { |
||||||
|
if ($result = $this->readSession('info')) { |
||||||
|
return $result; |
||||||
|
} |
||||||
|
$result = $this->request('Info'); |
||||||
|
|
||||||
|
if (!$this->isError($result)) { |
||||||
|
$this->writeSession('info', $result); |
||||||
|
} |
||||||
|
return $result; |
||||||
|
} |
||||||
|
|
||||||
|
public function apiAutoComplete(){ |
||||||
|
if(self::$autocomplete == 'y'){ |
||||||
|
// var_dump($autocomplete); |
||||||
|
// die(); |
||||||
|
return true; |
||||||
|
} |
||||||
|
else{ |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Handle a PEAR_Error. Return : |
||||||
|
* - if the error is critical : an associative array with the current error message |
||||||
|
* - if the error is not critical : the error message . |
||||||
|
* |
||||||
|
* @param Pear_Error $exception |
||||||
|
* |
||||||
|
* @return array or the Pear_Error exception |
||||||
|
* |
||||||
|
* @access protected |
||||||
|
*/ |
||||||
|
private function handleError($error) { |
||||||
|
$errorCode = $error->getCode(); |
||||||
|
switch ($errorCode) { |
||||||
|
// This kind of error was generated by user , so display it to user. |
||||||
|
case EBSCOConnector::EDS_INVALID_ARGUMENT_VALUE: |
||||||
|
// Any other errors are system errors, don't display them to user. |
||||||
|
default: |
||||||
|
$errorMessage = 'An error occurred when getting the data.'; |
||||||
|
break; |
||||||
|
} |
||||||
|
$result = array( |
||||||
|
'errors' => $errorMessage, |
||||||
|
'recordCount' => 0, |
||||||
|
'numFound' => 0, |
||||||
|
'start' => 0, |
||||||
|
'documents' => array(), |
||||||
|
'facets' => array(), |
||||||
|
); |
||||||
|
return $result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Store the given object into session. |
||||||
|
* |
||||||
|
* @param string $key |
||||||
|
* The key used for reading the value. |
||||||
|
* @param object $value |
||||||
|
* The object stored in session. |
||||||
|
* |
||||||
|
* @return none |
||||||
|
* |
||||||
|
* @access protected |
||||||
|
*/ |
||||||
|
protected function writeSession($key, $value) { |
||||||
|
if (!empty($key) && !empty($value)) { |
||||||
|
$_SESSION['EBSCO'][$key] = $value; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Read from session the object having the given key. |
||||||
|
* |
||||||
|
* @param string $key |
||||||
|
* The key used for reading the object. |
||||||
|
* |
||||||
|
* @return object |
||||||
|
* |
||||||
|
* @access protected |
||||||
|
*/ |
||||||
|
protected function readSession($key) { |
||||||
|
$value = isset($_SESSION['EBSCO'][$key]) ? $_SESSION['EBSCO'][$key] : ''; |
||||||
|
return $value; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Check if given object is an EBSCOException object. |
||||||
|
* |
||||||
|
* @param object $object |
||||||
|
* |
||||||
|
* @return bool |
||||||
|
* |
||||||
|
* @access protected |
||||||
|
*/ |
||||||
|
protected function isError($object) { |
||||||
|
return is_a($object, 'EBSCOException'); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,577 @@ |
|||||||
|
<?php |
||||||
|
namespace Drupal\roblib_search_eds\Lib; |
||||||
|
/** |
||||||
|
* @file |
||||||
|
* The EBSCO Connector and Exception classes. |
||||||
|
* |
||||||
|
* Used when EBSCO API calls return error messages. |
||||||
|
* |
||||||
|
* Copyright [2017] [EBSCO Information Services] |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* EBSCOException class. |
||||||
|
*/ |
||||||
|
class EBSCOException extends \Exception { |
||||||
|
const CRITICAL_ERROR = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* Make message argument mandatory. |
||||||
|
*/ |
||||||
|
public function __construct($message, $code = self::CRITICAL_ERROR, Exception $previous = NULL) { |
||||||
|
parent::__construct($message, $code, $previous); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
/** |
||||||
|
* EBSCOConnector class. |
||||||
|
*/ |
||||||
|
class EBSCOConnector { |
||||||
|
/** |
||||||
|
* Error codes defined by EDS API. |
||||||
|
*/ |
||||||
|
const EDS_UNKNOWN_PARAMETER = 100; |
||||||
|
const EDS_INCORRECT_PARAMETER_FORMAT = 101; |
||||||
|
const EDS_INVALID_PARAMETER_INDEX = 102; |
||||||
|
const EDS_MISSING_PARAMETER = 103; |
||||||
|
const EDS_AUTH_TOKEN_INVALID = 104; |
||||||
|
const EDS_INCORRECT_ARGUMENTS_NUMBER = 105; |
||||||
|
const EDS_UNKNOWN_ERROR = 106; |
||||||
|
const EDS_AUTH_TOKEN_MISSING = 107; |
||||||
|
const EDS_SESSION_TOKEN_MISSING = 108; |
||||||
|
const EDS_SESSION_TOKEN_INVALID = 109; |
||||||
|
const EDS_INVALID_RECORD_FORMAT = 110; |
||||||
|
const EDS_UNKNOWN_ACTION = 111; |
||||||
|
const EDS_INVALID_ARGUMENT_VALUE = 112; |
||||||
|
const EDS_CREATE_SESSION_ERROR = 113; |
||||||
|
const EDS_REQUIRED_DATA_MISSING = 114; |
||||||
|
const EDS_TRANSACTION_LOGGING_ERROR = 115; |
||||||
|
const EDS_DUPLICATE_PARAMETER = 116; |
||||||
|
const EDS_UNABLE_TO_AUTHENTICATE = 117; |
||||||
|
const EDS_SEARCH_ERROR = 118; |
||||||
|
const EDS_INVALID_PAGE_SIZE = 119; |
||||||
|
const EDS_SESSION_SAVE_ERROR = 120; |
||||||
|
const EDS_SESSION_ENDING_ERROR = 121; |
||||||
|
const EDS_CACHING_RESULTSET_ERROR = 122; |
||||||
|
const EDS_INVALID_EXPANDER_ERROR = 123; |
||||||
|
const EDS_INVALID_SEARCH_MODE_ERROR = 124; |
||||||
|
const EDS_INVALID_LIMITER_ERROR = 125; |
||||||
|
const EDS_INVALID_LIMITER_VALUE_ERROR = 126; |
||||||
|
const EDS_UNSUPPORTED_PROFILE_ERROR = 127; |
||||||
|
const EDS_PROFILE_NOT_SUPPORTED_ERROR = 128; |
||||||
|
const EDS_INVALID_CONTENT_PROVIDER_ERROR = 129; |
||||||
|
const EDS_INVALID_SOURCE_TYPE_ERROR = 130; |
||||||
|
const EDS_XSLT_ERROR = 131; |
||||||
|
const EDS_RECORD_NOT_FOUND_ERROR = 132; |
||||||
|
const EDS_SIMULTANEOUS_USER_LIMIT_ERROR = 133; |
||||||
|
const EDS_NO_GUEST_ACCESS_ERROR = 134; |
||||||
|
const EDS_DBID_NOT_IN_PROFILE_ERROR = 135; |
||||||
|
const EDS_INVALID_SEARCH_VIEW_ERROR = 136; |
||||||
|
const EDS_RETRIEVING_FULL_TEXT_ERROR = 137; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* HTTP status codes constants |
||||||
|
* https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html. |
||||||
|
* |
||||||
|
* @global integer HTTP_OK The request has succeeded |
||||||
|
* @global integer HTTP_NOT_FOUND The server has not found anything matching the Request-URI |
||||||
|
*/ |
||||||
|
const HTTP_OK = 200; |
||||||
|
const HTTP_BAD_REQUEST = 400; |
||||||
|
const HTTP_NOT_FOUND = 404; |
||||||
|
const HTTP_INTERNAL_SERVER_ERROR = 500; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The HTTP_Request object used for API transactions. |
||||||
|
* |
||||||
|
* @global object HTTP_Request |
||||||
|
*/ |
||||||
|
private $client; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The URL of the EBSCO API server. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private static $end_point = 'https://eds-api.ebscohost.com/EDSAPI/rest'; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The URL of the EBSCO API server. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private static $authentication_end_point = 'https://eds-api.ebscohost.com/AuthService/rest'; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The password used for API transactions. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $password; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The user id used for API transactions. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $userId; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The profile ID used for API transactions. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $profileId; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The interface ID used for API transactions. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $interfaceId; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The customer ID used for API transactions. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $orgId; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The isGuest used for API transactions. |
||||||
|
* |
||||||
|
* @global string 'y' or 'n' |
||||||
|
*/ |
||||||
|
private $isGuest; |
||||||
|
|
||||||
|
/** |
||||||
|
* Contains the list of ip addresses. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $local_ip_address; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* You can log HTTP_Request requests using this option. |
||||||
|
* |
||||||
|
* @global bool logAPIRequests |
||||||
|
*/ |
||||||
|
|
||||||
|
private $logAPIRequests; |
||||||
|
|
||||||
|
/** |
||||||
|
* Autocomplete |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
private $autoComplete; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The logger object. |
||||||
|
* |
||||||
|
* @global object Logger |
||||||
|
*/ |
||||||
|
//private $logger; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
* |
||||||
|
* Sets up the EBSCO API settings. |
||||||
|
* |
||||||
|
* @param none |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function __construct($config) { |
||||||
|
$this->password = $config['password']; |
||||||
|
$this->userId = $config['user']; |
||||||
|
$this->interfaceId = $config['interface']; |
||||||
|
$this->profileId = $config['profile']; |
||||||
|
$this->autoComplete = $config['autocomplete']; |
||||||
|
$this->orgId = $config['organization']; |
||||||
|
$this->local_ip_address = $config['local_ip_address']; |
||||||
|
$this->isGuest = (\Drupal::currentUser()->isAuthenticated() || $this->isGuestIPAddress($_SERVER["REMOTE_ADDR"])) ? 'n' : 'y'; |
||||||
|
$this->logAPIRequests = ($config['log'] == 1); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Detects if the user is authorized based on the IP address. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function isGuestIPAddress($ipUser) { |
||||||
|
$s = $this->local_ip_address; |
||||||
|
|
||||||
|
if (trim($s) == "") { |
||||||
|
return FALSE; |
||||||
|
} |
||||||
|
// Break records. |
||||||
|
$m = explode(",", $s); |
||||||
|
|
||||||
|
foreach ($m as $ip) { |
||||||
|
if (strcmp(substr($ipUser, 0, strlen(trim($ip))), trim($ip)) == 0) { |
||||||
|
// Inside of ip address range of customer. |
||||||
|
return TRUE; |
||||||
|
} |
||||||
|
} |
||||||
|
return FALSE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Public getter for private isGuest . |
||||||
|
* |
||||||
|
* @param none |
||||||
|
* |
||||||
|
* @return string isGuest |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function isGuest() { |
||||||
|
return $this->isGuest; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request the authentication token. |
||||||
|
* |
||||||
|
* @param none |
||||||
|
* |
||||||
|
* @return object SimpleXml or PEAR_Error |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function requestAuthenticationToken() { |
||||||
|
$url = self::$authentication_end_point . '/uidauth'; |
||||||
|
|
||||||
|
// Add the body of the request. |
||||||
|
$params = '<UIDAuthRequestMessage xmlns="https://www.ebscohost.com/services/public/AuthService/Response/2012/06/01">' |
||||||
|
.'<UserId>'.$this->userId.'</UserId>' |
||||||
|
.'<Password>'.$this->password.'</Password>' |
||||||
|
.'<InterfaceId>wsapi</InterfaceId>' |
||||||
|
.'<Options> |
||||||
|
<Option>'.$this->autoComplete.'</Option> |
||||||
|
</Options>' |
||||||
|
.'</UIDAuthRequestMessage>'; |
||||||
|
|
||||||
|
$response = $this->request($url,$params, array(), 'POST'); |
||||||
|
|
||||||
|
return $response; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request the session token. |
||||||
|
* |
||||||
|
* @param array $headers |
||||||
|
* Authentication token. |
||||||
|
* |
||||||
|
* @return object SimpleXml or PEAR_Error |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function requestSessionToken($headers) { |
||||||
|
$url = self::$end_point . '/CreateSession'; |
||||||
|
|
||||||
|
// Add the HTTP query params. |
||||||
|
$params = array( |
||||||
|
'profile' => $this->profileId, |
||||||
|
'org' => $this->orgId, |
||||||
|
'guest' => $this->isGuest |
||||||
|
); |
||||||
|
|
||||||
|
$response = $this->request($url, $params, $headers); |
||||||
|
|
||||||
|
return $response; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request the search records. |
||||||
|
* |
||||||
|
* @param array $params |
||||||
|
* Search specific parameters. |
||||||
|
* @param array $headers |
||||||
|
* Authentication and session tokens. |
||||||
|
* |
||||||
|
* @return object SimpleXml or PEAR_Error |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function requestSearch($params, $headers) { |
||||||
|
$url = self::$end_point . '/Search'; |
||||||
|
|
||||||
|
$response = $this->request($url, $params, $headers); |
||||||
|
return $response; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Request a specific record. |
||||||
|
* |
||||||
|
* @param array $params |
||||||
|
* Retrieve specific parameters. |
||||||
|
* @param array $headers |
||||||
|
* Authentication and session tokens. |
||||||
|
* |
||||||
|
* @return object SimpleXml or PEAR_Error |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function requestRetrieve($params, $headers) { |
||||||
|
$url = self::$end_point . '/Retrieve'; |
||||||
|
|
||||||
|
$response = $this->request($url, $params, $headers); |
||||||
|
|
||||||
|
return $response; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Export a specific record. |
||||||
|
* |
||||||
|
* @param array $params |
||||||
|
* Export specific parameters. |
||||||
|
* @param array $headers |
||||||
|
* Authentication and session tokens. |
||||||
|
* |
||||||
|
* @return object SimpleXml or PEAR_Error |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function requestExport($params, $headers) { |
||||||
|
$url = self::$end_point . '/ExportFormat'; |
||||||
|
|
||||||
|
$response = $this->request($url, $params, $headers); |
||||||
|
|
||||||
|
return $response; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* CitationStyles a specific record. |
||||||
|
* |
||||||
|
* @param array $params |
||||||
|
* CitationStyles specific parameters. |
||||||
|
* @param array $headers |
||||||
|
* Authentication and session tokens. |
||||||
|
* |
||||||
|
* @return object SimpleXml or PEAR_Error |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function requestCitationStyles($params, $headers) { |
||||||
|
$url = self::$end_point . '/CitationStyles'; |
||||||
|
|
||||||
|
|
||||||
|
$responseCitation = $this->request($url, $params, $headers); |
||||||
|
$response = $responseCitation->Citations; |
||||||
|
|
||||||
|
return $response; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Request the info data. |
||||||
|
* |
||||||
|
* @param null $params |
||||||
|
* Not used. |
||||||
|
* @param array $headers |
||||||
|
* Authentication and session tokens. |
||||||
|
* |
||||||
|
* @return object SimpleXml or PEAR_Error |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function requestInfo($params, $headers) { |
||||||
|
$url = self::$end_point . '/Info'; |
||||||
|
|
||||||
|
|
||||||
|
$response = $this->request($url, $params, $headers); |
||||||
|
return $response; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Send an HTTP request and inspect the response. |
||||||
|
* |
||||||
|
* @param string $url |
||||||
|
* The url of the HTTP request. |
||||||
|
* @param array $params |
||||||
|
* The parameters of the HTTP request. |
||||||
|
* @param array $headers |
||||||
|
* The headers of the HTTP request. |
||||||
|
* @param array $body |
||||||
|
* The body of the HTTP request. |
||||||
|
* @param string $method |
||||||
|
* The HTTP method, default is 'GET'. |
||||||
|
* |
||||||
|
* @return object SimpleXml or PEAR_Error |
||||||
|
* |
||||||
|
* @access protected |
||||||
|
*/ |
||||||
|
protected function request($url, $params, $headers = array(), $method = 'GET') { |
||||||
|
$xml = FALSE; |
||||||
|
$return = FALSE; |
||||||
|
$data = NULL; |
||||||
|
|
||||||
|
// Add compression in case its not there. |
||||||
|
array_push($headers, 'Content-Type: text/xml'); |
||||||
|
$data=$params; |
||||||
|
// Send the request. |
||||||
|
$response=null; |
||||||
|
|
||||||
|
|
||||||
|
try { |
||||||
|
$curl = curl_init(); |
||||||
|
curl_setopt($curl, CURLOPT_URL, $url); |
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); |
||||||
|
curl_setopt($curl, CURLOPT_MAXREDIRS, 10 ); |
||||||
|
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); |
||||||
|
curl_setopt($curl, CURLOPT_TIMEOUT, 10); |
||||||
|
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); |
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); |
||||||
|
|
||||||
|
switch ($method) |
||||||
|
{ |
||||||
|
case 'GET': |
||||||
|
if ($data) { $url = sprintf('%s?%s', $url, http_build_query($data)); } |
||||||
|
curl_setopt($curl, CURLOPT_URL, $url); |
||||||
|
break; |
||||||
|
|
||||||
|
case 'POST': |
||||||
|
if ($data) { |
||||||
|
curl_setopt($curl,CURLOPT_POST, 1); |
||||||
|
curl_setopt($curl,CURLOPT_POSTFIELDS, $data); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case 'DELETE': |
||||||
|
if ($data) { |
||||||
|
if (count($headers)>0) { |
||||||
|
curl_setopt($curl,CURLOPT_HTTPHEADER, $headers); |
||||||
|
} |
||||||
|
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
$response = curl_exec($curl); |
||||||
|
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); |
||||||
|
curl_close($curl); |
||||||
|
|
||||||
|
switch ($code) { |
||||||
|
case self::HTTP_OK: |
||||||
|
|
||||||
|
$xml_str = $response; |
||||||
|
|
||||||
|
try { |
||||||
|
// Clean EMP namespace. |
||||||
|
$xml_str = str_replace(array("<a:", "</a:"), array("<", "</"), $xml_str); |
||||||
|
$xml = simplexml_load_string($xml_str); |
||||||
|
$return = $xml; |
||||||
|
} |
||||||
|
catch (Exception $e) { |
||||||
|
$return = new EBSCOException($xml); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case self::HTTP_BAD_REQUEST: |
||||||
|
$xml_str = $response; |
||||||
|
try { |
||||||
|
$xml = simplexml_load_string($xml_str); |
||||||
|
|
||||||
|
// If the response is an API error. |
||||||
|
$isError = isset($xml->ErrorNumber) || isset($xml->ErrorCode); |
||||||
|
if ($isError) { |
||||||
|
$error = ''; $code = 0; |
||||||
|
if (isset($xml->DetailedErrorDescription) && !empty($xml->DetailedErrorDescription)) { |
||||||
|
$error = (string) $xml->DetailedErrorDescription; |
||||||
|
} |
||||||
|
elseif (isset($xml->ErrorDescription)) { |
||||||
|
$error = (string) $xml->ErrorDescription; |
||||||
|
} |
||||||
|
elseif (isset($xml->Reason)) { |
||||||
|
$error = (string) $xml->Reason; |
||||||
|
} |
||||||
|
if (isset($xml->ErrorNumber)) { |
||||||
|
$code = (integer) $xml->ErrorNumber; |
||||||
|
} |
||||||
|
elseif (isset($xml->ErrorCode)) { |
||||||
|
$code = (integer) $xml->ErrorCode; |
||||||
|
} |
||||||
|
$return = new EBSCOException($error, $code); |
||||||
|
} |
||||||
|
else { |
||||||
|
$return = new EBSCOException("HTTP {$code} : The request could not be understood by the server due to malformed syntax. Modify your search before retrying."); |
||||||
|
} |
||||||
|
} |
||||||
|
catch (Exception $e) { |
||||||
|
$return = new EBSCOException($xml); |
||||||
|
} |
||||||
|
break; |
||||||
|
|
||||||
|
case self::HTTP_NOT_FOUND: |
||||||
|
$return = new EBSCOException("HTTP {$code} : The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable."); |
||||||
|
break; |
||||||
|
|
||||||
|
case self::HTTP_INTERNAL_SERVER_ERROR: |
||||||
|
$return = new EBSCOException("HTTP {$code} : The server encountered an unexpected condition which prevented it from fulfilling the request."); |
||||||
|
break; |
||||||
|
|
||||||
|
default: |
||||||
|
$return = new EBSCOException("HTTP {$code} : Unexpected HTTP error."); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
catch (Exception $e) { |
||||||
|
// Or $this->toString($response) |
||||||
|
$message = $this->toString($e); |
||||||
|
\Drupal::logger('ebsco')->error($message); |
||||||
|
$return = new EBSCOException($response); |
||||||
|
} |
||||||
|
|
||||||
|
// Log any error |
||||||
|
if ($this->logAPIRequests) { |
||||||
|
// $client = both the HTTP request and response |
||||||
|
// $response = only the HTTP response |
||||||
|
$message = $this->toString($client); // or $this->toString($response) |
||||||
|
\Drupal::logger('ebsco')->error($client); |
||||||
|
} |
||||||
|
|
||||||
|
return $return; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Capture the output of print_r into a string. |
||||||
|
* |
||||||
|
* @param object Any object |
||||||
|
* |
||||||
|
* @access private |
||||||
|
*/ |
||||||
|
private function toString($object) { |
||||||
|
ob_start(); |
||||||
|
print_r($object); |
||||||
|
return ob_get_clean(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,528 @@ |
|||||||
|
<?php |
||||||
|
namespace Drupal\roblib_search_eds\Lib; |
||||||
|
/** |
||||||
|
* @file |
||||||
|
* The EBSCO record object. |
||||||
|
* |
||||||
|
* PHP version 5 |
||||||
|
* |
||||||
|
* Copyright [2017] [EBSCO Information Services] |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* EBSCORecord class. |
||||||
|
*/ |
||||||
|
class EBSCORecord { |
||||||
|
/** |
||||||
|
* The array of data. |
||||||
|
* |
||||||
|
* @global array |
||||||
|
*/ |
||||||
|
private $data = array(); |
||||||
|
|
||||||
|
/** |
||||||
|
* The result id (the EBSCO counter) of the record. |
||||||
|
* |
||||||
|
* @global integer |
||||||
|
*/ |
||||||
|
public $result_id = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The id of the record. |
||||||
|
* |
||||||
|
* @global integer |
||||||
|
*/ |
||||||
|
public $record_id = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The summary of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $summary = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The authors of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $authors = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The subjects of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $subjects = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The custom links provided for the record. |
||||||
|
* |
||||||
|
* @global array |
||||||
|
*/ |
||||||
|
public $custom_links = array(); |
||||||
|
|
||||||
|
/** |
||||||
|
* The database label of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $db_label = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The full-text availability of the record. |
||||||
|
* |
||||||
|
* @global boolean |
||||||
|
*/ |
||||||
|
public $full_text_availability = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The full text of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $full_text = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The PDF availability of the record. |
||||||
|
* |
||||||
|
* @global boolean |
||||||
|
*/ |
||||||
|
public $pdf_availability = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The items of the record. |
||||||
|
* |
||||||
|
* @global array |
||||||
|
*/ |
||||||
|
public $items = array(); |
||||||
|
|
||||||
|
/** |
||||||
|
* The external link of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $p_link = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The external link to the PDF version of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $pdf_link = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The publication type link of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $publication_type = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The external thumbnails links of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $small_thumb_link = NULL; |
||||||
|
public $medium_thumb_link = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The title of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $title = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The source of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $source = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* The access level of the record. |
||||||
|
* |
||||||
|
* @global string |
||||||
|
*/ |
||||||
|
public $access_level = NULL; |
||||||
|
|
||||||
|
/**image quick view |
||||||
|
* ImageQuickViewItems |
||||||
|
*/ |
||||||
|
/** |
||||||
|
* * @global string |
||||||
|
*/ |
||||||
|
//public $image_quick_view_type = NULL; |
||||||
|
public $image_quick_view = array(); |
||||||
|
|
||||||
|
public $image_quick_view_type_2 = array(); |
||||||
|
/**image quick view |
||||||
|
* ImageQuickViewItems |
||||||
|
*/ |
||||||
|
/** |
||||||
|
* * @global string |
||||||
|
*/ |
||||||
|
public $image_quick_url = NULL; |
||||||
|
|
||||||
|
/* IllustrationInfo |
||||||
|
*/ |
||||||
|
/** |
||||||
|
* * @global string |
||||||
|
*/ |
||||||
|
public $illustrationinfo = array(); |
||||||
|
|
||||||
|
/** |
||||||
|
* Type to IQV |
||||||
|
* * @global string |
||||||
|
*/ |
||||||
|
public $type = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* Cite to IQV |
||||||
|
* * @global string |
||||||
|
*/ |
||||||
|
public $cite = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* Permission to IQV |
||||||
|
* * @global string |
||||||
|
*/ |
||||||
|
public $permission = NULL; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* imgTitle to IQV |
||||||
|
* * @global string |
||||||
|
*/ |
||||||
|
public $imgtitle = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
*Citations styles |
||||||
|
* * @global string |
||||||
|
*/ |
||||||
|
public $citationStylesRecord = NULL; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
* |
||||||
|
* @param array $data |
||||||
|
* Raw data from the EBSCO search representing the record. |
||||||
|
*/ |
||||||
|
public function __construct($data = array()) { |
||||||
|
|
||||||
|
$this->data = $data; |
||||||
|
$this->record_id = $this->record_id(); |
||||||
|
$this->result_id = $this->result_id(); |
||||||
|
$this->title = $this->title(); |
||||||
|
$this->summary = $this->summary(); |
||||||
|
$this->authors = $this->authors(); |
||||||
|
$this->subjects = $this->subjects(); |
||||||
|
$this->custom_links = $this->custom_links(); |
||||||
|
$this->db_label = $this->db_label(); |
||||||
|
$this->full_text_availability = $this->full_text_availability(); |
||||||
|
$this->full_text = $this->full_text(); |
||||||
|
$this->items = $this->items(); |
||||||
|
$this->p_link = $this->p_link(); |
||||||
|
$this->publication_type = $this->publication_type(); |
||||||
|
$this->pdf_availability = $this->pdf_availability(); |
||||||
|
$this->pdf_link = $this->pdf_link(); |
||||||
|
$this->small_thumb_link = $this->thumb_link(); |
||||||
|
$this->medium_thumb_link = $this->thumb_link('medium'); |
||||||
|
$this->source = $this->source(); |
||||||
|
$this->access_level = $this->access_level(); |
||||||
|
$this->image_quick_view = $this->image_quick_view(); |
||||||
|
$this->image_quick_view_type_2 = $this->image_quick_view_type_2(); |
||||||
|
$this->image_quick_url = $this->image_quick_url(); |
||||||
|
$this->illustrationinfo = $this->illustrationinfo(); |
||||||
|
$this->type = $this->type(); |
||||||
|
$this->cite = $this->cite(); |
||||||
|
$this->permission = $this->permission(); |
||||||
|
$this->imgtitle = $this->imgtitle(); |
||||||
|
$this->citationStylesRecord = $this->citationStylesRecord(); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************** |
||||||
|
* |
||||||
|
* Getters |
||||||
|
* |
||||||
|
********************************************************/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the summary of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function access_level() { |
||||||
|
return isset($this->data['AccessLevel']) ? |
||||||
|
$this->data['AccessLevel'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the summary of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function summary() { |
||||||
|
return isset($this->data['Items']['Abstract']) ? |
||||||
|
$this->data['Items']['Abstract']['Data'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the authors of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function authors() { |
||||||
|
return isset($this->data['Items']['Author']) ? |
||||||
|
$this->data['Items']['Author']['Data'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the custom links of the record. |
||||||
|
* |
||||||
|
* @return array |
||||||
|
*/ |
||||||
|
public function custom_links() { |
||||||
|
return isset($this->data['CustomLinks']) ? |
||||||
|
$this->data['CustomLinks'] : array(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the database label of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function db_label() { |
||||||
|
return isset($this->data['DbLabel']) ? |
||||||
|
$this->data['DbLabel'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the full text availability of the record. |
||||||
|
* |
||||||
|
* @return bool |
||||||
|
*/ |
||||||
|
public function full_text() { |
||||||
|
return isset($this->data['FullText']) && |
||||||
|
isset($this->data['FullText']['Value']) ? $this->data['FullText']['Value'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the full text availability of the record. |
||||||
|
* |
||||||
|
* @return bool |
||||||
|
*/ |
||||||
|
public function full_text_availability() { |
||||||
|
return isset($this->data['FullText']) && |
||||||
|
$this->data['FullText']['Availability']; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the items of the record. |
||||||
|
* |
||||||
|
* @return array |
||||||
|
*/ |
||||||
|
public function items() { |
||||||
|
return isset($this->data['Items']) ? $this->data['Items'] : array(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the external url of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function p_link() { |
||||||
|
return isset($this->data['PLink']) ? $this->data['PLink'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the publication type of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function publication_type() { |
||||||
|
return isset($this->data['PubType']) ? $this->data['PubType'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the PDF availability of the record. |
||||||
|
* |
||||||
|
* @return bool |
||||||
|
*/ |
||||||
|
public function pdf_availability() { |
||||||
|
return isset($this->data['FullText']) && |
||||||
|
isset($this->data['FullText']['Links']) && |
||||||
|
isset($this->data['FullText']['Links']['pdflink']) && |
||||||
|
$this->data['FullText']['Links']['pdflink']; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the PDF url of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function pdf_link() { |
||||||
|
return isset($this->data['FullText']) && |
||||||
|
isset($this->data['FullText']['Links']) && |
||||||
|
isset($this->data['FullText']['Links']['pdflink']) ? |
||||||
|
$this->data['FullText']['Links']['pdflink'] : |
||||||
|
''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the result id of the record. |
||||||
|
* |
||||||
|
* @return int |
||||||
|
*/ |
||||||
|
public function result_id() { |
||||||
|
return isset($this->data['ResultId']) ? |
||||||
|
$this->data['ResultId'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the subject data of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function subjects() { |
||||||
|
return isset($this->data['Items']['Subject']) ? |
||||||
|
$this->data['Items']['Subject']['Data'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return a URL to a thumbnail preview of the record, if available; false |
||||||
|
* otherwise. |
||||||
|
* |
||||||
|
* @param string $size |
||||||
|
* Size of thumbnail (small, medium or large -- small is |
||||||
|
* default). |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function thumb_link($size = 'small') { |
||||||
|
$imageInfo = isset($this->data['ImageInfo']) ? $this->data['ImageInfo'] : ''; |
||||||
|
if ($imageInfo && isset($imageInfo['thumb'])) { |
||||||
|
switch ($size) { |
||||||
|
case 'large': |
||||||
|
case 'medium': |
||||||
|
return $imageInfo['medium']; |
||||||
|
|
||||||
|
break; |
||||||
|
|
||||||
|
case 'small': |
||||||
|
default: |
||||||
|
return $imageInfo['thumb']; |
||||||
|
|
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return FALSE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the title of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function title() { |
||||||
|
return isset($this->data['Items']['Title']) ? |
||||||
|
$this->data['Items']['Title']['Data'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the source of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
public function source() { |
||||||
|
return isset($this->data['Items']['TitleSource']) ? |
||||||
|
$this->data['Items']['TitleSource']['Data'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Return the identifier of this record within the EBSCO databases. |
||||||
|
* |
||||||
|
* @return string Unique identifier. |
||||||
|
*/ |
||||||
|
public function record_id() { |
||||||
|
return isset($this->data['id']) ? |
||||||
|
$this->data['id'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get the image quick view of the record. |
||||||
|
* |
||||||
|
* @return string |
||||||
|
*/ |
||||||
|
|
||||||
|
public function image_quick_view() { |
||||||
|
return isset($this->data['iqv']) ? $this->data['iqv'] : array(); |
||||||
|
} |
||||||
|
|
||||||
|
public function image_quick_url() { |
||||||
|
return isset($this->data['iqv']) ? $this->data['iqv'] : array(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public function image_quick_view_type_2() { |
||||||
|
return isset($this->data['ImageQuickViewItems']) && |
||||||
|
isset($this->data['ImageQuickViewItems']['iqv']) && |
||||||
|
isset($this->data['ImageQuickViewItems']['iqv']['DbId']) && |
||||||
|
isset($this->data['ImageQuickViewItems']['iqv']['An']) && |
||||||
|
isset($this->data['ImageQuickViewItems']['iqv']['Type']) && |
||||||
|
isset($this->data['ImageQuickViewItems']['iqv']['Url']) ? |
||||||
|
$this->data['ImageQuickViewItems']['iqv']['DbId']['An']['Type']['Url'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
public function illustrationinfo() { |
||||||
|
return isset($this->data['IllustrationInfo'][0]) ? $this->data['IllustrationInfo'][0] : array(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public function type() { |
||||||
|
|
||||||
|
return isset($this->data['Items']['type']) ? |
||||||
|
$this->data['Items']['type'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
public function cite() { |
||||||
|
return isset($this->data['Items']['Cite']) ? |
||||||
|
$this->data['Items']['Cite'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
public function permission() { |
||||||
|
return isset($this->data['Items']['Permission']) ? |
||||||
|
$this->data['Items']['Permission'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public function imgtitle() { |
||||||
|
return isset($this->data['Items']['imgTitle']) ? |
||||||
|
$this->data['Items']['imgTitle'] : ''; |
||||||
|
} |
||||||
|
|
||||||
|
public function citationStylesRecord() { |
||||||
|
return isset($this->data['Citation']) ? $this->data['Citation'] : array(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,14 @@ |
|||||||
|
<?php |
||||||
|
namespace Drupal\roblib_search_eds\Lib; |
||||||
|
use Drupal\roblib_search_eds\Lib\EBSCOAPI; |
||||||
|
/** |
||||||
|
* Wrapper for the EBSCOAPI class that allows config to be set. |
||||||
|
* |
||||||
|
* @author ppound |
||||||
|
*/ |
||||||
|
class RoblibEBSCOAPI extends EBSCOAPI{ |
||||||
|
|
||||||
|
public function setConfig($config) { |
||||||
|
$this->config = $config; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,446 @@ |
|||||||
|
<?php |
||||||
|
namespace Drupal\roblib_search_eds\Lib; |
||||||
|
/** |
||||||
|
* @file |
||||||
|
* $Id$. |
||||||
|
*/ |
||||||
|
|
||||||
|
// vim: expandtab sw=4 ts=4 sts=4: |
||||||
|
// ***** BEGIN LICENSE BLOCK ***** |
||||||
|
// This file is part of HTML Sanitizer. |
||||||
|
// Copyright (c) 2005-2011 Frederic Minne <zefredz@gmail.com>. |
||||||
|
// All rights reserved. |
||||||
|
// |
||||||
|
// HTML Sanitizer is free software; you can redistribute it and/or modify |
||||||
|
// it under the terms of the GNU Lesser General Public License as published by |
||||||
|
// the Free Software Foundation; either version 3 of the License, or |
||||||
|
// (at your option) any later version. |
||||||
|
// |
||||||
|
// HTML Sanitizer is distributed in the hope that it will be useful, |
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
// GNU General Public License for more details. |
||||||
|
// |
||||||
|
// You should have received a copy of the GNU Lesser General Public License |
||||||
|
// along with HTML Sanitizer; if not, see <https://www.gnu.org/licenses/>. |
||||||
|
// |
||||||
|
// ***** END LICENSE BLOCK *****. |
||||||
|
/** |
||||||
|
* Sanitize HTML contents : |
||||||
|
* Remove dangerous tags and attributes that can lead to security issues like |
||||||
|
* XSS or HTTP response splitting. |
||||||
|
* |
||||||
|
* @author Frederic Minne <zefredz@gmail.com> |
||||||
|
* @copyright Copyright © 2005-2011, Frederic Minne |
||||||
|
* @license https://www.gnu.org/licenses/lgpl.txt GNU Lesser General Public License version 3 or later |
||||||
|
* @version 1.1 |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
class HTML_Sanitizer { |
||||||
|
/** |
||||||
|
* Private fields. |
||||||
|
*/ |
||||||
|
private $_allowedTags; |
||||||
|
private $_allowJavascriptEvents; |
||||||
|
private $_allowJavascriptInUrls; |
||||||
|
private $_allowObjects; |
||||||
|
private $_allowScript; |
||||||
|
private $_allowStyle; |
||||||
|
private $_additionalTags; |
||||||
|
|
||||||
|
/** |
||||||
|
* Constructor. |
||||||
|
*/ |
||||||
|
public function __construct() { |
||||||
|
$this->resetAll(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* (re)set all options to default value. |
||||||
|
*/ |
||||||
|
public function resetAll() { |
||||||
|
$this->_allowDOMEvents = FALSE; |
||||||
|
$this->_allowJavascriptInUrls = FALSE; |
||||||
|
$this->_allowStyle = FALSE; |
||||||
|
$this->_allowScript = FALSE; |
||||||
|
$this->_allowObjects = FALSE; |
||||||
|
$this->_allowStyle = FALSE; |
||||||
|
|
||||||
|
$this->_allowedTags = '<a><br><b><h1><h2><h3><h4><h5><h6>' |
||||||
|
. '<img><li><ol><p><strong><table><tr><td><th><u><ul><thead>' |
||||||
|
. '<tbody><tfoot><em><dd><dt><dl><span><div><del><add><i><hr>' |
||||||
|
. '<pre><br><blockquote><address><code><caption><abbr><acronym>' |
||||||
|
. '<cite><dfn><q><ins><sup><sub><kbd><samp><var><tt><small><big>'; |
||||||
|
|
||||||
|
$this->_additionalTags = ''; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Add additional tags to allowed tags. |
||||||
|
* |
||||||
|
* @param string |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function addAdditionalTags($tags) { |
||||||
|
$this->_additionalTags .= $tags; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Allow iframes. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowIframes() { |
||||||
|
$this->addAdditionalTags('<iframe>'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Allow HTML5 media tags. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowHtml5Media() { |
||||||
|
$this->addAdditionalTags('<canvas><video><audio>'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Allow object, embed, applet and param tags in html. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowObjects() { |
||||||
|
$this->_allowObjects = TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Allow DOM event on DOM elements. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowDOMEvents() { |
||||||
|
$this->_allowDOMEvents = TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Allow script tags. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowScript() { |
||||||
|
$this->_allowScript = TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Allow the use of javascript: in urls. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowJavascriptInUrls() { |
||||||
|
$this->_allowJavascriptInUrls = TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Allow style tags and attributes. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowStyle() { |
||||||
|
$this->_allowStyle = TRUE; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Helper to allow all javascript related tags and attributes. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowAllJavascript() { |
||||||
|
$this->allowDOMEvents(); |
||||||
|
$this->allowScript(); |
||||||
|
$this->allowJavascriptInUrls(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Allow all tags and attributes. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
*/ |
||||||
|
public function allowAll() { |
||||||
|
$this->allowAllJavascript(); |
||||||
|
$this->allowObjects(); |
||||||
|
$this->allowStyle(); |
||||||
|
$this->allowIframes(); |
||||||
|
$this->allowHtml5Media(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Filter URLs to avoid HTTP response splitting attacks. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
* @param string url |
||||||
|
* |
||||||
|
* @return string filtered url |
||||||
|
*/ |
||||||
|
public function filterHTTPResponseSplitting($url) { |
||||||
|
$dangerousCharactersPattern = '~(\r\n|\r|\n|%0a|%0d|%0D|%0A)~'; |
||||||
|
return preg_replace($dangerousCharactersPattern, '', $url); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove potential javascript in urls. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
* @param string url |
||||||
|
* |
||||||
|
* @return string filtered url |
||||||
|
*/ |
||||||
|
public function removeJavascriptURL($str) { |
||||||
|
$HTML_Sanitizer_stripJavascriptURL = 'javascript:[^"]+'; |
||||||
|
|
||||||
|
$str = preg_replace("/$HTML_Sanitizer_stripJavascriptURL/i", '__forbidden__', $str); |
||||||
|
|
||||||
|
return $str; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove potential flaws in urls. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param string url |
||||||
|
* |
||||||
|
* @return string filtered url |
||||||
|
*/ |
||||||
|
private function sanitizeURL($url) { |
||||||
|
if (!$this->_allowJavascriptInUrls) { |
||||||
|
$url = $this->removeJavascriptURL($url); |
||||||
|
} |
||||||
|
|
||||||
|
$url = $this->filterHTTPResponseSplitting($url); |
||||||
|
|
||||||
|
return $url; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Callback for PCRE. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param matches array |
||||||
|
* |
||||||
|
* @return string |
||||||
|
* |
||||||
|
* @see sanitizeURL |
||||||
|
*/ |
||||||
|
private function _sanitizeURLCallback($matches) { |
||||||
|
return 'href="' . $this->sanitizeURL($matches[1]) . '"'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove potential flaws in href attributes. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param string html tag |
||||||
|
* |
||||||
|
* @return string filtered html tag |
||||||
|
*/ |
||||||
|
private function sanitizeHref($str) { |
||||||
|
$HTML_Sanitizer_URL = 'href="([^"]+)"'; |
||||||
|
|
||||||
|
return preg_replace_callback("/$HTML_Sanitizer_URL/i", array(&$this, '_sanitizeURLCallback'), $str); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Callback for PCRE. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param matches array |
||||||
|
* |
||||||
|
* @return string |
||||||
|
* |
||||||
|
* @see sanitizeURL |
||||||
|
*/ |
||||||
|
private function _sanitizeSrcCallback($matches) { |
||||||
|
return 'src="' . $this->sanitizeURL($matches[1]) . '"'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove potential flaws in href attributes. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param string html tag |
||||||
|
* |
||||||
|
* @return string filtered html tag |
||||||
|
*/ |
||||||
|
private function sanitizeSrc($str) { |
||||||
|
$HTML_Sanitizer_URL = 'src="([^"]+)"'; |
||||||
|
|
||||||
|
return preg_replace_callback("/$HTML_Sanitizer_URL/i", array(&$this, '_sanitizeSrcCallback'), $str); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove dangerous attributes from html tags. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param string html tag |
||||||
|
* |
||||||
|
* @return string filtered html tag |
||||||
|
*/ |
||||||
|
private function removeEvilAttributes($str) { |
||||||
|
if (!$this->_allowDOMEvents) { |
||||||
|
$str = preg_replace_callback('/<(.*?)>/i', array(&$this, '_removeDOMEventsCallback'), $str); |
||||||
|
} |
||||||
|
|
||||||
|
if (!$this->_allowStyle) { |
||||||
|
$str = preg_replace_callback('/<(.*?)>/i', array(&$this, '_removeStyleCallback'), $str); |
||||||
|
} |
||||||
|
|
||||||
|
return $str; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove DOM events attributes from html tags. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param string html tag |
||||||
|
* |
||||||
|
* @return string filtered html tag |
||||||
|
*/ |
||||||
|
private function removeDOMEvents($str) { |
||||||
|
$str = preg_replace('/\s*=\s*/', '=', $str); |
||||||
|
|
||||||
|
$HTML_Sanitizer_stripAttrib = '(onclick|ondblclick|onmousedown|' |
||||||
|
. 'onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|' |
||||||
|
. 'onkeyup|onfocus|onblur|onabort|onerror|onload)'; |
||||||
|
|
||||||
|
$str = stripslashes(preg_replace("/$HTML_Sanitizer_stripAttrib/i", 'forbidden', $str)); |
||||||
|
|
||||||
|
return $str; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Callback for PCRE. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param matches array |
||||||
|
* |
||||||
|
* @return string |
||||||
|
* |
||||||
|
* @see removeDOMEvents |
||||||
|
*/ |
||||||
|
private function _removeDOMEventsCallback($matches) { |
||||||
|
return '<' . $this->removeDOMEvents($matches[1]) . '>'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove style attributes from html tags. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param string html tag |
||||||
|
* |
||||||
|
* @return string filtered html tag |
||||||
|
*/ |
||||||
|
private function removeStyle($str) { |
||||||
|
$str = preg_replace('/\s*=\s*/', '=', $str); |
||||||
|
|
||||||
|
$HTML_Sanitizer_stripAttrib = '(style)'; |
||||||
|
|
||||||
|
$str = stripslashes(preg_replace("/$HTML_Sanitizer_stripAttrib/i", 'forbidden', $str)); |
||||||
|
|
||||||
|
return $str; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Callback for PCRE. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param matches array |
||||||
|
* |
||||||
|
* @return string |
||||||
|
* |
||||||
|
* @see removeStyle |
||||||
|
*/ |
||||||
|
private function _removeStyleCallback($matches) { |
||||||
|
return '<' . $this->removeStyle($matches[1]) . '>'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove dangerous HTML tags. |
||||||
|
* |
||||||
|
* @access private |
||||||
|
* @param string html code |
||||||
|
* |
||||||
|
* @return string filtered url |
||||||
|
*/ |
||||||
|
private function removeEvilTags($str) { |
||||||
|
$allowedTags = $this->_allowedTags; |
||||||
|
|
||||||
|
if ($this->_allowScript) { |
||||||
|
$allowedTags .= '<script>'; |
||||||
|
} |
||||||
|
|
||||||
|
if ($this->_allowStyle) { |
||||||
|
$allowedTags .= '<style>'; |
||||||
|
} |
||||||
|
|
||||||
|
if ($this->_allowObjects) { |
||||||
|
$allowedTags .= '<object><embed><applet><param>'; |
||||||
|
} |
||||||
|
|
||||||
|
$allowedTags .= $this->_additionalTags; |
||||||
|
|
||||||
|
$str = strip_tags($str, $allowedTags); |
||||||
|
|
||||||
|
return $str; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Sanitize HTML |
||||||
|
* remove dangerous tags and attributes |
||||||
|
* clean urls. |
||||||
|
* |
||||||
|
* @access public |
||||||
|
* @param string html code |
||||||
|
* |
||||||
|
* @return string sanitized html code |
||||||
|
*/ |
||||||
|
public function sanitize($html) { |
||||||
|
$html = $this->removeEvilTags($html); |
||||||
|
|
||||||
|
$html = $this->removeEvilAttributes($html); |
||||||
|
|
||||||
|
$html = $this->sanitizeHref($html); |
||||||
|
|
||||||
|
$html = $this->sanitizeSrc($html); |
||||||
|
|
||||||
|
return $html; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
function html_sanitize($str) { |
||||||
|
static $san = NULL; |
||||||
|
|
||||||
|
if (empty($san)) { |
||||||
|
$san = new HTML_Sanitizer(); |
||||||
|
} |
||||||
|
|
||||||
|
return $san->sanitize($str); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
function html_loose_sanitize($str) { |
||||||
|
static $san = NULL; |
||||||
|
|
||||||
|
if (empty($san)) { |
||||||
|
$san = new HTML_Sanitizer(); |
||||||
|
$san->allowAll(); |
||||||
|
} |
||||||
|
|
||||||
|
return $san->sanitize($str); |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue