You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
13 KiB
432 lines
13 KiB
<?php |
|
|
|
/** |
|
* EBSCOException class |
|
* Used when EBSCO API calls return error messages |
|
*/ |
|
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); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
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 |
|
* http://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 = 'http://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; |
|
|
|
|
|
/* |
|
* You can log HTTP_Request requests using this option |
|
* @global bool logAPIRequests |
|
*/ |
|
private $logAPIRequests; |
|
|
|
|
|
/** |
|
* 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->orgId = $config['organization']; |
|
$this->isGuest = user_is_logged_in() ? 'n' : 'y'; |
|
$this->logAPIRequests = ($config['log'] == 1); |
|
if ($this->logAPIRequests) { |
|
$writer = new Zend_Log_Writer_Stream('php://output'); |
|
$this->logger = new Zend_Log($writer); |
|
} |
|
} |
|
|
|
|
|
/** |
|
* 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 =<<<BODY |
|
<UIDAuthRequestMessage xmlns="http://www.ebscohost.com/services/public/AuthService/Response/2012/06/01"> |
|
<UserId>{$this->userId}</UserId> |
|
<Password>{$this->password}</Password> |
|
<InterfaceId>{$this->interfaceId}</InterfaceId> |
|
</UIDAuthRequestMessage> |
|
BODY; |
|
|
|
$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; |
|
} |
|
|
|
|
|
/** |
|
* 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; |
|
|
|
if (!empty($params)) { |
|
// Arrays of parameters are used only for GET requests |
|
if (is_array($params)) { |
|
$query = http_build_query($params, '', '&'); |
|
$query = preg_replace('/\%5B\d+\%5D/', '', $query); |
|
$url = $url . '?' . $query; |
|
// String parameters are used only for POST requests |
|
} else { |
|
$data = $params; |
|
$headers = array_merge( |
|
array('content-type' => 'text/xml'), |
|
$headers |
|
); |
|
} |
|
} |
|
|
|
$options = array( |
|
'headers' => $headers, |
|
'method' => $method, |
|
'data' => $data |
|
); |
|
|
|
// Send the request |
|
try { |
|
$response = drupal_http_request($url, $options); |
|
//print_r($response); |
|
$code = $response->code; |
|
switch ($code) { |
|
case self::HTTP_OK: |
|
$xml_str = $response->data; |
|
try { |
|
$xml = simplexml_load_string($xml_str); |
|
$return = $xml; |
|
} catch(Exception $e) { |
|
$return = new EBSCOException($xml); |
|
} |
|
break; |
|
|
|
case self::HTTP_BAD_REQUEST: |
|
$xml_str = $response->data; |
|
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; |
|
} else if (isset($xml->ErrorDescription)) { |
|
$error = (string) $xml->ErrorDescription; |
|
} else if (isset($xml->Reason)) { |
|
$error = (string) $xml->Reason; |
|
} |
|
if (isset($xml->ErrorNumber)) { |
|
$code = (integer) $xml->ErrorNumber; |
|
} else if (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) { |
|
$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) |
|
$this->logger->log($message, Zend_Log::ERR); |
|
}*/ |
|
|
|
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(); |
|
} |
|
|
|
|
|
} |
|
|
|
|
|
?>
|