Difference between revisions of "Contribute: Plugins/ImportPluginsAWS"
(→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
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; #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;