my $cache_timeout;
my $default_url_base; # Default resolver location
my $resolver_type; # Default resolver type
+my $default_lwp_timeout; # Default browser timeout
our ($ua, $parser);
$default_url_base = $sclient->config_value(
"apps", "open-ils.resolver", "app_settings", "default_url_base");
$resolver_type = $sclient->config_value(
- "apps", "open-ils.resolver", "app_settings", "resolver_type");
+ "apps", "open-ils.resolver", "app_settings", "resolver_type") || 'sfx';
+ # We set a browser timeout
+ $default_lwp_timeout = $sclient->config_value(
+ "apps", "open-ils.resolver", "app_settings", "lwp_timeout" ) || 60;
}
sub child_init {
+
# We need a User Agent to speak to the SFX beast
$ua = new LWP::UserAgent;
$ua->agent('SameOrigin/1.0');
my $id_type = shift; # keep it simple for now, either 'issn' or 'isbn'
my $id_value = shift; # the normalized ISSN or ISBN
my $url_base = shift || $default_url_base;
+ my $lwp_timeout = shift || $default_lwp_timeout;
+
+ if (!$id_type) {
+ $logger->warn("Resolver was not given an ID type to resolve");
+ return;
+ }
+ if (!$id_value) {
+ $logger->warn("Resolver was not given an ID value to resolve");
+ return;
+ }
+
+ # Need some sort of timeout in case resolver is unreachable
+ $ua->timeout($lwp_timeout);
if ($resolver_type eq 'cufts') {
return cufts_holdings($self,$conn,$id_type,$id_value,$url_base);
return $result;
}
- # Otherwise, let's go and grab the info from the CUFTS server
- my $req = HTTP::Request->new('GET', "$url_base$url_args");
+ my $res = undef;
# Let's see what we we're trying to request
$logger->info("Resolving the following request: $url_base$url_args");
- my $res = $ua->request($req);
+ # We attempt to deal with potential problems in request
+ eval {
+ $res = $ua->get("$url_base$url_args");
+ } or do {
+ $logger->info("execution error");
+ return bow_out_gracefully("$url_base?ctx_ver=Z39.88-2004&rft.$id_type=$id_value",
+ 'Check link for additional holdings information.');
+ };
+
+ if ($res->status_line =~ /timeout/) {
+ $logger->info("timeout error");
+ return bow_out_gracefully("$url_base?ctx_ver=Z39.88-2004&rft.$id_type=$id_value",
+ 'Check link for additional holdings information.');
+ }
my $xml = $res->content;
my $parsed_cufts = $parser->parse_string($xml);
return $result;
}
- # Otherwise, let's go and grab the info from the SFX server
- my $req = HTTP::Request->new('GET', "$url_base$url_args");
+ my $res = undef;
# Let's see what we we're trying to request
$logger->info("Resolving the following request: $url_base$url_args");
- my $res = $ua->request($req);
+ # We attempt to deal with potential problems in request
+ eval {
+ $res = $ua->get("$url_base$url_args");
+ } or do {
+ $logger->info("execution error");
+ return bow_out_gracefully("$url_base?ctx_ver=Z39.88-2004&rft.$id_type=$id_value",
+ 'Check link for additional holdings information.');
+ };
+
+ if ($res->status_line =~ /timeout/) {
+ $logger->info("timeout error");
+ return bow_out_gracefully("$url_base?ctx_ver=Z39.88-2004&rft.$id_type=$id_value",
+ 'Check link for additional holdings information.');
+ }
+ # All clear
my $xml = $res->content;
my $parsed_sfx = $parser->parse_string($xml);
return undef;
}
+# This uses the resolver structure for passing back a link directly to the resolver
+sub bow_out_gracefully {
+ my $alt_url = $_[0];
+ my $reason = $_[1];
+
+ my @sfx_result;
+
+ push @sfx_result, {
+ public_name => "Online holdings",
+ target_url => $alt_url,
+ target_coverage => $reason,
+ target_embargo => "",
+ };
+
+ return \@sfx_result;
+}
+
__PACKAGE__->register_method(
method => 'resolve_holdings',
api_name => 'open-ils.resolver.resolve_holdings',
name => 'url_base',
desc => 'The base URL for the resolver and instance',
type => 'string'
+ }, {
+ name => 'lwp_timeout',
+ desc => 'The timeout for the LWP request',
+ type => 'string'
},
],
'return' => {
name => 'url_base',
desc => 'The base URL for the resolver and instance',
type => 'string'
+ }, {
+ name => 'lwp_timeout',
+ desc => 'The timeout for the LWP request',
+ type => 'string'
},
],
'return' => {
name => 'url_base',
desc => 'The base URL for the resolver and instance',
type => 'string'
+ }, {
+ name => 'lwp_timeout',
+ desc => 'The timeout for the LWP request',
+ type => 'string'
},
],
'return' => {
sub resolve_issn
{
- my ($class, $c, $baseurl) = @_;
+ my ($class, $issn, $baseurl, $timeout) = @_;
- if (length($c) <= 9) {
+ if (length($issn) <= 9) {
my $session = OpenSRF::AppSession->create("open-ils.resolver");
- my $request = $session->request("open-ils.resolver.resolve_holdings.raw", "issn", $c, $baseurl)->gather();
+ my $request = $session->request("open-ils.resolver.resolve_holdings.raw", "issn", $issn, $baseurl, $timeout)->gather();
if ($request) {
return $request;
}
sub resolve_isbn
{
- my ($class, $c, $baseurl) = @_;
+ my ($class, $isbn, $baseurl, $timeout) = @_;
my $session = OpenSRF::AppSession->create("open-ils.resolver");
- my $request = $session->request("open-ils.resolver.resolve_holdings.raw", "isbn", $c, $baseurl)->gather();
+ my $request = $session->request("open-ils.resolver.resolve_holdings.raw", "isbn", $isbn, $baseurl, $timeout)->gather();
if ($request) {
return $request;
args.holdings = [];
args.uris = [];
args.issns = [];
+ args.resolver_isbns = [];
+ args.resolver_issns = [];
# we use $9 of ISBN and ISSN as a flag for e-version
- sfx_isbn = xml.findnodes('//*[@tag="020"]/*[@code="9"]');
- IF sfx_isbn;
- IF sfx_isbn.textContent == "SFX";
- my_parent = sfx_isbn.parentNode();
- sfx_isbn = my_parent.findnodes('./*[@code="a"]').textContent;
- sfx_isbn = sfx_isbn.replace('-', '');
- args.resolver_isbn = sfx_isbn.replace('\ .*', '');
+ FOR resolver_isbn IN xml.findnodes('//*[@tag="020"]/*[@code="9"]');
+ IF resolver_isbn.textContent == "SFX" || resolver_isbn.textContent == "CUFTS";
+ my_parent = resolver_isbn.parentNode();
+ FOR resolver_isbn_val IN my_parent.findnodes('./*[@code="a"]');
+ args.resolver_isbns.push(
+ resolver_isbn_val.textContent.replace('-', '').replace('\ .*', '')
+ );
+ END;
END;
END;
- sfx_issn = xml.findnodes('//*[@tag="022"]/*[@code="9"]');
- IF sfx_issn;
- IF sfx_issn.textContent == "SFX";
- my_parent = sfx_issn.parentNode();
- sfx_issn = my_parent.findnodes('./*[@code="a"]');
- args.issns.push(
- sfx_issn.textContent.replace('[^\d\-X]', '')
- );
+ FOR resolver_issn IN xml.findnodes('//*[@tag="022"]/*[@code="9"]');
+ IF resolver_issn.textContent == "SFX" || resolver_issn.textContent == "CUFTS";
+ my_parent = resolver_issn.parentNode();
+ FOR resolver_issn_val IN my_parent.findnodes('./*[@code="a"]');
+ args.resolver_issns.push(
+ resolver_issn_val.textContent.replace('[^\d\-X]', '')
+ );
+ END;
END;
END;
- # we snag all issns if no SFX available
- IF args.issns.size == 0;
- FOR rawissn IN xml.findnodes('//*[@tag="022"]/*[@code="a"]');
- args.issns.push(
- rawissn.textContent.replace('[^\d\-X]', '')
- );
- END;
+ # now snag all issns
+ FOR rawissn IN xml.findnodes('//*[@tag="022"]/*[@code="a"]');
+ args.issns.push(
+ rawissn.textContent.replace('[^\d\-X]', '')
+ );
END;
FOR volume IN xml.findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]');