Difference between revisions of "Contribute: Plugins/ImportPluginsAWS"

From EPrints Documentation
Jump to: navigation, search
(AWS.pm)
(In More Detail)
Line 173: Line 173:
 
= In More Detail =
 
= In More Detail =
 
<pre>
 
<pre>
 +
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;
 
</pre>
 
</pre>
  
 
= Testing Your Plugin =
 
= Testing Your Plugin =

Revision as of 11:30, 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;

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

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