/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;