Difference between revisions of "Contribute: Plugins/ImportPluginsAWS"
(→In More Detail) |
(→input_fh) |
||
Line 187: | Line 187: | ||
=== input_fh === | === input_fh === | ||
<pre> | <pre> | ||
− | |||
− | |||
− | |||
my @ids; | my @ids; | ||
+ | </pre> | ||
+ | <pre> | ||
my $fh = $opts{fh}; | my $fh = $opts{fh}; | ||
my @records = <$fh>; | my @records = <$fh>; | ||
+ | </pre> | ||
+ | |||
+ | <pre> | ||
foreach my $input_data (@records) | foreach my $input_data (@records) | ||
{ | { | ||
Line 205: | Line 207: | ||
} | } | ||
} | } | ||
+ | </pre> | ||
+ | <pre> | ||
return EPrints::List->new( | return EPrints::List->new( | ||
dataset => $opts{dataset}, | dataset => $opts{dataset}, | ||
session => $plugin->{session}, | session => $plugin->{session}, | ||
ids=>\@ids ); | ids=>\@ids ); | ||
− | |||
</pre> | </pre> | ||
Revision as of 16:03, 25 September 2007
Contents
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
use URI::Escape;
my $endpoint = "http://ecs.amazonaws.co.uk/onca/xml"; my $accesskey = '<YOURAMAZONWSKEY>'; my $service = "AWSECommerceService"; my $operation = "ItemLookup"; my $version = "2007-07-16";
Constructor
$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.'; }
Input
input_fh
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 );
convert_input
$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;