###################################################################### # # EPrints OpenURL Internal Resolver # ###################################################################### # # This file is part of GNU EPrints 2. # # Copyright (c) 2000-2004 University of Southampton, UK. SO17 1BJ. # # EPrints 2 is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # EPrints 2 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 General Public License # along with EPrints 2; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # ###################################################################### use EPrints; eval "use URI::OpenURL"; if( $@ ) { EPrints::abort( "To enable the OpenURL resolver please install URI::OpenURL: cpan install URI::OpenURL" ); } use strict; my $session = new EPrints::Session; exit( 0 ) unless( defined $session ); # $session->get_database->set_debug( 1 ); my $repository = $session->get_repository(); # Create an OpenURL object my $uri = URI::OpenURL->new(); # Fill the OpenURL object with the current CGI parameters my @query; foreach my $name ($session->param) { for ($session->param( $name )) { push @query, $name => $_; } } $uri->query_form( @query ); # warn $uri->dump; # Get the referent (the referred to object) my $rft = $uri->referent; # Get the metadata given for the referent my %md = $rft->metadata; # Set up a new search expression # NB I'm not worrying about filtering because this script will only # redirect? my $ds = $session->get_repository->get_dataset( "archive" ); my $searchexp = new EPrints::Search( keep_cache => 1, session => $session, dataset => $ds, satisfy_all => 1, ); # Fill in the search expression, mapping OpenURL terms to eprint fields if( $md{ "aulast" } ) { $searchexp->add_field( $ds->get_field( "creators_name" ), $md{ "aulast" } ); } if( defined($rft->id) ) { my $oai_id = $session->get_repository->get_conf( "oai" )->{ "v2" }->{ "archive_id" }; if( defined($rft->id) and $rft->id =~ /^(?:info:ofi\/nam:info:)?oai:$oai_id:(\d+)$/ ) { $searchexp->add_field( $ds->get_field( "eprintid" ), $1 ); } else { $searchexp->add_field( $ds->get_field( "official_url" ), scalar($rft->id) ); } } my %FREE_TEXT = qw( title atitle publication title ); while(my( $epf, $ouf ) = each %FREE_TEXT) { next unless defined($md{ $ouf }) and length($md{ $ouf }); $searchexp->add_field( $ds->get_field( $epf ), $md{ $ouf }, "IN" ); } my %EXACT_TERMS = qw( volume volume number number series series date date pagerange pages ); while(my( $epf, $ouf ) = each %EXACT_TERMS) { next unless defined($md{ $ouf }) and length($md{ $ouf }); $searchexp->add_field( $ds->get_field( $epf ), $md{ $ouf } ); } # Urg, either the query was empty or we couldn't use the query given if( $searchexp->is_blank ) { not_found( $session, $uri, "empty_query" ); } # Perform the search, but we're only interested in the first match # that comes back (perhaps we should error on more than one match?) my $list = $searchexp->perform_search(); my( $eprint ) = $list->get_records( 0, 1 ); # No match found for the given query unless( $eprint ) { not_found( $session, $uri, "no_match" ); } my $svc = $uri->serviceType; my %svc_md = $svc->metadata; # OAI-PMH if( $svc->val_fmt and $svc->val_fmt eq 'info:ofi/fmt:kev:mtx:oai_pmh' ) { # Location of the OAI-PMH interface my $url = $repository->get_conf( "base_url" ); $url .= "/cgi/oai2"; $url = URI->new( $url ); # Get the OAI identifier for this eprint my $oai_id = $session->get_repository->get_conf( "oai", "v2", "archive_id" ); $oai_id = EPrints::OpenArchives::to_oai_identifier( $oai_id, $eprint->get_id ); # Add the OAI-PMH arguments my %args = %svc_md; my $verb = $args{verb} || ''; if( $verb eq 'GetRecord' || $verb eq 'ListMetadataFormats' ) { $args{identifier} = $oai_id; } $url->query_form( %args ); $session->redirect( $url ); } # Scholarly Service elsif( $svc_md{ "fulltext" } and $svc_md{ "fulltext" } eq 'yes' ) { # Redirect to the main document (if possible) my @docs = $eprint->get_all_documents(); if( @docs ) { my $url = $docs[0]->get_url(); $session->redirect( $url ); } } # Default to redirecting to the abstract page else { # Redirect to the abstract page my $url = $eprint->get_url; $session->redirect( $url ); } $session->terminate; sub not_found { my( $session, $uri, $message ) = @_; $session->not_found( undef ); # Don't print the default 404! my %pins = $uri->query_form; $_ = $session->make_text($_) for values %pins; $session->build_page( $session->html_phrase( "cgi/openurl:${message}_title" ), $session->html_phrase( "cgi/openurl:${message}_blurb", %pins ), "plain_404" ); $session->send_page(); exit(0); }