/usr/local/CPAN/Keystone-Resolver/Keystone/ContentURL/Elsevier.pm
# $Id: Elsevier.pm,v 1.4 2007-05-24 17:04:09 mike Exp $
package Keystone::ContentURL::Elsevier;
use strict;
use URI::Escape qw(uri_escape_utf8);
use Digest::MD5;
# See ../../doc/providers/elsevier/GIS40R4P.pdf
# for a description of the process going on here.
#
# To use this module, create a Keystone::ContentURL::Elsevier object,
# passing in the Origin, Salt Version, Salt and Base-URL, that you've
# been allocated. If the Base-URL is omitted, the standard one is
# used. Thereafter, you can repeatedly call its url() method, passing
# in whatever metadata you have from the list of relevant elements.
# This will either return a URL for the article, or throw an exception
# (a string containing an error message)
sub new {
my $class = shift();
my($origin, $saltVersion, $salt, $baseURL) = @_;
$baseURL = "http://www.sciencedirect.com/science" if !defined $baseURL;
return bless {
origin => $origin,
saltVersion => $saltVersion,
salt => $salt,
baseURL => $baseURL,
}, $class;
}
sub url {
my $this = shift();
foreach my $param (@_) {
$param = uri_escape_utf8($param) if defined $param;
}
my($pii, $issn, $volume, $issue, $firstPage, $lastPage, $initial,
$surname, $year) = @_;
my($type, $key);
if (defined $pii) {
$type = "pii"; # "publisher identified item"
$key = $pii;
$key =~ s/[^a-zA-Z0-9]//;
} elsif (defined $issn && defined $volume && defined $firstPage) {
$issn =~ s/-//;
$type = "vol"; # Volume key (a.k.a. IVIP key)
$key = "$issn#$volume#$firstPage";
$key .= "#$issue" if defined $issue;
} elsif (defined $surname && defined $year && defined $firstPage) {
$type = "ref"; # Reference key
$key = "$surname#$year#$firstPage";
$key .= "#" if defined $lastPage || defined $initial;
$key .= "$lastPage" if defined $lastPage;
$key .= "#$initial" if defined $initial;
} else {
die "not enough metadata supplied for PII, _volkey or _refkey";
}
# MD5 sum must be calculated on the _un_encoded values
my $query = ("_ob=GatewayURL&" .
"_origin=" . $this->{origin} .
"&_method=citationSearch" .
"&_${type}key=" . $key .
"&_version=" . $this->{saltVersion});
my $md5 = Digest::MD5::md5_hex($query . $this->{salt});
# Actual URL must use encoded values (particularly, "%23" for "#")
### Does the Elsevier gateway expect us to encode UTF8 or Latin1?
$query = ("_ob=GatewayURL&" .
"_origin=" . uri_escape_utf8($this->{origin}) .
"&_method=citationSearch" .
"&_${type}key=" . uri_escape_utf8($key) .
"&_version=" . $this->{saltVersion});
return $this->{baseURL} . "?$query&md5=$md5";
}
1;