Difference between revisions of "Contribute: Plugins/ImportPluginsAWS"

From EPrints Documentation
Jump to: navigation, search
(In More Detail)
m (AWS.pm: Removed comments)
Line 69: Line 69:
 
         $input = $1;
 
         $input = $1;
  
        #Perform the request
 
 
         my $request =
 
         my $request =
 
                 "$endpoint?".
 
                 "$endpoint?".
Line 79: Line 78:
 
                 "ResponseGroup=Large,EditorialReview&";
 
                 "ResponseGroup=Large,EditorialReview&";
  
 
        #Send the request
 
 
         my $ua = LWP::UserAgent->new;
 
         my $ua = LWP::UserAgent->new;
 
         $ua->timeout(30);
 
         $ua->timeout(30);
 
         my $response = $ua->get($request);
 
         my $response = $ua->get($request);
  
        #Create domtree
 
 
         my $dom = EPrints::XML::parse_xml_string($response->content);
 
         my $dom = EPrints::XML::parse_xml_string($response->content);
  
        #Get and check Amazon Response
 
 
         my $rep =
 
         my $rep =
 
                 $dom->getElementsByTagName("Items")->item(0)->
 
                 $dom->getElementsByTagName("Items")->item(0)->
Line 113: Line 108:
 
         }
 
         }
  
        #Get Attribute Object
 
 
         my $attr = $item->getElementsByTagName("ItemAttributes")->item(0);
 
         my $attr = $item->getElementsByTagName("ItemAttributes")->item(0);
  
        #Check this is a book
 
 
         my $pg = EPrints::Utils::tree_to_utf8($attr->getElementsByTagName("ProductGroup")->item(0));
 
         my $pg = EPrints::Utils::tree_to_utf8($attr->getElementsByTagName("ProductGroup")->item(0));
  
Line 125: Line 118:
 
         }
 
         }
  
        #Populate Hash
 
 
         $output{type} = "book";
 
         $output{type} = "book";
 
         $output{refereed} = "FALSE";
 
         $output{refereed} = "FALSE";
 
         $output{ispublished} = "pub";
 
         $output{ispublished} = "pub";
  
        #Add Title
 
 
         my $title = $attr->getElementsByTagName("Title")->item(0);
 
         my $title = $attr->getElementsByTagName("Title")->item(0);
 
         $output{title} = EPrints::Utils::tree_to_utf8($title);
 
         $output{title} = EPrints::Utils::tree_to_utf8($title);
  
        #Add URL
 
 
         my $url = $item->getElementsByTagName("DetailPageURL")->item(0);
 
         my $url = $item->getElementsByTagName("DetailPageURL")->item(0);
 
         $output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url));
 
         $output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url));
  
        #Add ISBN
 
 
         my $isbn = $attr->getElementsByTagName("ISBN")->item(0);
 
         my $isbn = $attr->getElementsByTagName("ISBN")->item(0);
 
         if (defined $isbn)
 
         if (defined $isbn)
Line 145: Line 134:
 
         }
 
         }
  
        #Add Number of Pages
 
 
         my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0);
 
         my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0);
 
         if (defined $pages)
 
         if (defined $pages)
Line 152: Line 140:
 
         }
 
         }
  
        #Add Publisher/Publication Date
 
 
         my $publisher = $attr->getElementsByTagName("Publisher")->item(0);
 
         my $publisher = $attr->getElementsByTagName("Publisher")->item(0);
 
         if (defined $publisher)
 
         if (defined $publisher)

Revision as of 11:31, 25 September 2007

Import Plugin Tutorial 2: Amazon Web Services

Before You Start

AWS.pm

package EPrints::Plugin::Import::MyPlugins::AWS;

use EPrints::Plugin::Import::TextFile;
use strict;
use URI::Escape;

our @ISA = ('EPrints::Plugin::Import::TextFile');

my $endpoint = "http://ecs.amazonaws.co.uk/onca/xml";
my $accesskey = '<YOURAMAZONWSKEY>';
my $service = "AWSECommerceService";
my $operation = "ItemLookup";
my $version = "2007-07-16";

sub new
{
        my( $class, %params ) = @_;
        my $self = $class->SUPER::new( %params );

        $self->{name} = 'AWS';
        $self->{visible} = 'all';
        $self->{produce} = [ 'list/eprint' , 'dataobj/eprint'];

        my $rc = EPrints::Utils::require_if_exists('LWP::UserAgent');
        unless ($rc)
        {
                $self->{visible} = '';
                $self->{error} = 'Module LWP::UserAgent not found.';
        }

        return $self;
}

sub input_fh
{
        my( $plugin, %opts ) = @_;
        my @ids;
        my $fh = $opts{fh};

        my @records = <$fh>;
        foreach my $input_data (@records)
        {
                my $epdata = $plugin->convert_input($input_data);
                next unless defined $epdata;

                my $dataobj = $plugin->epdata_to_dataobj($opts{dataset},$epdata);
                if( defined $dataobj )
                {
                        push @ids, $dataobj->get_id;
                }
        }

        return EPrints::List->new(
                        dataset => $opts{dataset},
                        session => $plugin->{session},
                        ids=>\@ids );
}

sub convert_input
{
        my ($plugin, $input) = @_;
        my %output = ();

        $input =~ m/([0-9]+)/;
        $input = $1;

        my $request =
                "$endpoint?".
                "Service=$service&".
                "AWSAccessKeyId=$accesskey&".
                "Operation=$operation&".
                "ItemId=$input&".
                "Version=$version&".
                "ResponseGroup=Large,EditorialReview&";

        my $ua = LWP::UserAgent->new;
        $ua->timeout(30);
        my $response = $ua->get($request);

        my $dom = EPrints::XML::parse_xml_string($response->content);

        my $rep =
                $dom->getElementsByTagName("Items")->item(0)->
                getElementsByTagName("Request")->item(0);

        my $reptext =
                EPrints::Utils::tree_to_utf8($rep->getElementsByTagName("IsValid")->item(0));

        unless ($reptext eq 'True') 
        {
                $plugin->error("Invalid AWS Request");
                return undef;
        }

        #Get Item Object
        my $item =
                $dom->getElementsByTagName("Items")->item(0)->
                getElementsByTagName("Item")->item(0);

        unless (defined $item) 
        {
                $plugin->error("No Item element found");
                return undef;
        }

        my $attr = $item->getElementsByTagName("ItemAttributes")->item(0);

        my $pg = EPrints::Utils::tree_to_utf8($attr->getElementsByTagName("ProductGroup")->item(0));

        unless ($pg eq 'Book') 
        {
                $plugin->error("Product is not a book.");
                return undef;
        }

        $output{type} = "book";
        $output{refereed} = "FALSE";
        $output{ispublished} = "pub";

        my $title = $attr->getElementsByTagName("Title")->item(0);
        $output{title} = EPrints::Utils::tree_to_utf8($title);

        my $url = $item->getElementsByTagName("DetailPageURL")->item(0);
        $output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url));

        my $isbn = $attr->getElementsByTagName("ISBN")->item(0);
        if (defined $isbn)
        {
                $output{isbn} = EPrints::Utils::tree_to_utf8($isbn);
        }

        my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0);
        if (defined $pages)
        {
                $output{pages} = EPrints::Utils::tree_to_utf8($pages);
        }

        my $publisher = $attr->getElementsByTagName("Publisher")->item(0);
        if (defined $publisher)
        {
                $output{publisher} = EPrints::Utils::tree_to_utf8($publisher);
        }

        my $pubdate = $attr->getElementsByTagName("PublicationDate")->item(0);
        if (defined $pubdate)
        {
                $output{date} = EPrints::Utils::tree_to_utf8($pubdate);
        }

        return \%output;
}

1;

In More Detail

package EPrints::Plugin::Import::MyPlugins::AWS;

use EPrints::Plugin::Import::TextFile;
use strict;
use URI::Escape;

our @ISA = ('EPrints::Plugin::Import::TextFile');

my $endpoint = "http://ecs.amazonaws.co.uk/onca/xml";
my $accesskey = '<YOURAMAZONWSKEY>';
my $service = "AWSECommerceService";
my $operation = "ItemLookup";
my $version = "2007-07-16";

sub new
{
        my( $class, %params ) = @_;
        my $self = $class->SUPER::new( %params );

        $self->{name} = 'AWS';
        $self->{visible} = 'all';
        $self->{produce} = [ 'list/eprint' , 'dataobj/eprint'];

        my $rc = EPrints::Utils::require_if_exists('LWP::UserAgent');
        unless ($rc)
        {
                $self->{visible} = '';
                $self->{error} = 'Module LWP::UserAgent not found.';
        }

        return $self;
}

sub input_fh
{
        my( $plugin, %opts ) = @_;
        my @ids;
        my $fh = $opts{fh};

        my @records = <$fh>;
        foreach my $input_data (@records)
        {
                my $epdata = $plugin->convert_input($input_data);
                next unless defined $epdata;

                my $dataobj = $plugin->epdata_to_dataobj($opts{dataset},$epdata);
                if( defined $dataobj )
                {
                        push @ids, $dataobj->get_id;
                }
        }

        return EPrints::List->new(
                        dataset => $opts{dataset},
                        session => $plugin->{session},
                        ids=>\@ids );
}

sub convert_input
{
        my ($plugin, $input) = @_;
        my %output = ();

        $input =~ m/([0-9]+)/;
        $input = $1;

        #Perform the request
        my $request =
                "$endpoint?".
                "Service=$service&".
                "AWSAccessKeyId=$accesskey&".
                "Operation=$operation&".
                "ItemId=$input&".
                "Version=$version&".
                "ResponseGroup=Large,EditorialReview&";


        #Send the request
        my $ua = LWP::UserAgent->new;
        $ua->timeout(30);
        my $response = $ua->get($request);

        #Create domtree
        my $dom = EPrints::XML::parse_xml_string($response->content);

        #Get and check Amazon Response
        my $rep =
                $dom->getElementsByTagName("Items")->item(0)->
                getElementsByTagName("Request")->item(0);

        my $reptext =
                EPrints::Utils::tree_to_utf8($rep->getElementsByTagName("IsValid")->item(0));

        unless ($reptext eq 'True') 
        {
                $plugin->error("Invalid AWS Request");
                return undef;
        }

        #Get Item Object
        my $item =
                $dom->getElementsByTagName("Items")->item(0)->
                getElementsByTagName("Item")->item(0);

        unless (defined $item) 
        {
                $plugin->error("No Item element found");
                return undef;
        }

        #Get Attribute Object
        my $attr = $item->getElementsByTagName("ItemAttributes")->item(0);

        #Check this is a book
        my $pg = EPrints::Utils::tree_to_utf8($attr->getElementsByTagName("ProductGroup")->item(0));

        unless ($pg eq 'Book') 
        {
                $plugin->error("Product is not a book.");
                return undef;
        }

        #Populate Hash
        $output{type} = "book";
        $output{refereed} = "FALSE";
        $output{ispublished} = "pub";

        #Add Title
        my $title = $attr->getElementsByTagName("Title")->item(0);
        $output{title} = EPrints::Utils::tree_to_utf8($title);

        #Add URL
        my $url = $item->getElementsByTagName("DetailPageURL")->item(0);
        $output{official_url} = uri_unescape(EPrints::Utils::tree_to_utf8($url));

        #Add ISBN
        my $isbn = $attr->getElementsByTagName("ISBN")->item(0);
        if (defined $isbn)
        {
                $output{isbn} = EPrints::Utils::tree_to_utf8($isbn);
        }

        #Add Number of Pages
        my $pages = $attr->getElementsByTagName("NumberOfPages")->item(0);
        if (defined $pages)
        {
                $output{pages} = EPrints::Utils::tree_to_utf8($pages);
        }

        #Add Publisher/Publication Date
        my $publisher = $attr->getElementsByTagName("Publisher")->item(0);
        if (defined $publisher)
        {
                $output{publisher} = EPrints::Utils::tree_to_utf8($publisher);
        }

        my $pubdate = $attr->getElementsByTagName("PublicationDate")->item(0);
        if (defined $pubdate)
        {
                $output{date} = EPrints::Utils::tree_to_utf8($pubdate);
        }

        return \%output;
}

1;

Testing Your Plugin