Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/DB/Biblio/soap.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/DB/Biblio/soap.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,558 @@ +# $Id: soap.pm,v 1.5 2002/10/22 07:45:14 lapp Exp $ +# +# BioPerl module Bio::DB::Biblio::soap.pm +# +# Cared for by Martin Senger <senger@ebi.ac.uk> +# For copyright and disclaimer see below. + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::DB::Biblio::soap - A SOAP-based access to a bibliographic query service + +=head1 SYNOPSIS + +Do not use this object directly, it is recommended to access it and use +it through the I<Bio::Biblio> module: + + use Bio::Biblio; + my $biblio = new Bio::Biblio (-access => 'soap'); + +=head1 DESCRIPTION + +This object contains the real implementation of a Bibliographic Query +Service as defined in L<Bio::DB::BiblioI> - using a SOAP protocol +to access a WebService (a remote server) that represents a +bibliographic repository. + +=head1 FEEDBACK + +=head2 Mailing Lists + +User feedback is an integral part of the evolution of this and other +Bioperl modules. Send your comments and suggestions preferably to +the Bioperl mailing list. Your participation is much appreciated. + + bioperl-l@bioperl.org - General discussion + http://bioperl.org/MailList.shtml - About the mailing lists + +=head2 Reporting Bugs + +Report bugs to the Bioperl bug tracking system to help us keep track +of the bugs and their resolution. Bug reports can be submitted via +email or the web: + + bioperl-bugs@bioperl.org + http://bugzilla.bioperl.org/ + +=head1 AUTHOR + +Martin Senger (senger@ebi.ac.uk) + +=head1 COPYRIGHT + +Copyright (c) 2002 European Bioinformatics Institute. All Rights Reserved. + +This module is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=head1 DISCLAIMER + +This software is provided "as is" without warranty of any kind. + +=head1 BUGS AND LIMITATIONS + +=over + +=item * + +Methods returning a boolean value (I<has_next>, I<exists> and +I<contains>) can be used only with SOAP::Lite version 0.52 and newer +(probably due to a bug in the older SOAP::Lite). + +=item * + +It does not use WSDL. Coming soon... + +=item * + +There is an open question to discuss: should the service return +citations as type I<string> or rather as type I<base64>? What is +faster? What is better for keeping non-ASCII characters untouched? How +the decision would be influenced if the transparent compression +support is introduced? + +=item * + +More testing and debugging needed to ensure that returned citations +are properly transferred even if they contain foreign characters. + +=back + +=head1 APPENDIX + +The main documentation details are to be found in +L<Bio::DB::BiblioI>. + +Here is the rest of the object methods. Internal methods are preceded +with an underscore _. + +=cut + + +# Let the code begin... + + +package Bio::DB::Biblio::soap; +use vars qw(@ISA $VERSION $Revision $DEFAULT_SERVICE $DEFAULT_NAMESPACE); +use strict; + +use Bio::Biblio; # TBD: ?? WHY SHOULD I DO THIS ?? +use SOAP::Lite + on_fault => sub { + my $soap = shift; + my $res = shift; + my $msg = + ref $res ? "--- SOAP FAULT ---\n" . $res->faultcode . " " . $res->faultstring + : "--- TRANSPORT ERROR ---\n" . $soap->transport->status; + Bio::DB::Biblio::soap->throw ( -text => $msg ); + } +; + +@ISA = qw(Bio::Biblio); + +BEGIN { + # set the version for version checking + $VERSION = do { my @r = (q$Revision: 1.5 $ =~ /\d+/g); sprintf "%d.%-02d", @r }; + $Revision = q$Id: soap.pm,v 1.5 2002/10/22 07:45:14 lapp Exp $; + + # where to go... + $DEFAULT_SERVICE = 'http://industry.ebi.ac.uk/soap/openBQS'; + + # ...and what to find there + $DEFAULT_NAMESPACE = 'http://industry.ebi.ac.uk/openBQS'; +} + +# ----------------------------------------------------------------------------- + +=head2 _initialize + + Usage : my $obj = new Bio::Biblio (-access => 'soap' ...); + (_initialize is internally called from this constructor) + Returns : nothing interesting + Args : This module recognises and uses following arguments: + + -namespace => 'urn' + The namespace used by the WebService that is being + accessed. It is a string which guarantees its world-wide + uniqueness - therefore it often has a style of a URL - + but it does not mean that such pseudo-URL really exists. + + Default is 'http://industry.ebi.ac.uk/openBQS' + (which well corresponds with the default '-location' - + see module Bio::Biblio). + + -destroy_on_exit => '0' + Default value is '1' which means that all Bio::Biblio + objects - when being finalised - will send a request + to the remote WebService to forget the query collections + they represent. + + If you change it to '0' make sure that you know the + query collection identification - otherwise you will + not be able to re-established connection with it. + This can be done by calling method get_collection_id. + + -collection_id => '...' + It defines what query collection will this object work + with. Use this argument when you know a collection ID + of an existing query collection and when you wish to + re-established connection with it. + + By default, the collection IDs are set automatically + by the query methods - they return Bio::Biblio objects + already having a collection ID. + + A missing or undefined collection ID means that the + object represents the whole bibliographic repository + (which again means that some methods, like get_all, + will be probably refused). + + -soap => a SOAP::Lite object + Usually all Bio::Biblio objects share an instance of + the underlying SOAP::Lite module. But you are free + to have more - perhaps with different characteristics. + + See the code for attributes of the default SOAP::Lite + object. + + -httpproxy => 'http://server:port' + In addition to the 'location' parameter, you may need + to specify also a location/URL of a HTTP proxy server + (if your site requires one). + + Additionally, the main module Bio::Biblio recognises + also: + -access => '...' + -location => '...' + +It populates calling object with the given arguments, and then - for +some attributes and only if they are not yet populated - it assigns +some default values. + +This is an actual new() method (except for the real object creation +and its blessing which is done in the parent class Bio::Root::Root in +method _create_object). + +Note that this method is called always as an I<object> method (never as +a I<class> method) - and that the object who calls this method may +already be partly initiated (from Bio::Biblio::new method); so if you +need to do some tricks with the 'class invocation' you need to change +Bio::Biblio::new method, not this one. + +=cut + +sub _initialize { + my ($self, @args) = @_; + + # make a hashtable from @args + my %param = @args; + @param { map { lc $_ } keys %param } = values %param; # lowercase keys + + # copy all @args into this object (overwriting what may already be + # there) - changing '-key' into '_key' + my $new_key; + foreach my $key (keys %param) { + ($new_key = $key) =~ s/^-/_/; + $self->{ $new_key } = $param { $key }; + } + + # finally add default values for those keys who have default value + # and who are not yet in the object + $self->{'_location'} = $DEFAULT_SERVICE unless $self->{'_location'}; + $self->{'_namespace'} = $DEFAULT_NAMESPACE unless $self->{'_namespace'}; + $self->{'_destroy_on_exit'} = 1 unless defined $self->{'_destroy_on_exit'}; + unless ($self->{'_soap'}) { + if (defined $self->{'_httpproxy'}) { + $self->{'_soap'} = SOAP::Lite + -> uri ($self->{'_namespace'}) + -> proxy ($self->{'_location'}, + proxy => ['http' => $self->{'_httpproxy'}]); + } else { + $self->{'_soap'} = SOAP::Lite + -> uri ($self->{'_namespace'}) + -> proxy ($self->{'_location'}); + } + } +} + +# ----------------------------------------------------------------------------- + +# +# objects representing query collections are being destroyed if they +# have attribute '_destroy_on_exit' set to true - which is a default +# value +# +sub DESTROY { + my $self = shift; + my $soap = $self->{'_soap'}; + my $destroy = $self->{'_destroy_on_exit'}; + return unless $destroy; + my $collection_id = $self->{'_collection_id'}; + return unless $collection_id; + + # ignore all errors here + eval { + $soap->destroy (SOAP::Data->type (string => $collection_id)); + } +} + +# +# some methods must be called with an argument containing a collection +# ID; here we return a proper error message explaining it +# +sub _no_id_msg { + my $self = shift; + my $package = ref $self; + my $method = (caller(1))[3]; + my $strip_method = $method; + $strip_method =~ s/^$package\:\://; + + return <<"END_OF_MSG"; +Method '$method' works only if its object has a query collection ID. +Perhaps you need to use: +\tnew Bio::Biblio (-collection_id => '1234567')->$strip_method; +or to obtain a collection ID indirectly from a query method: +\tnew Bio::Biblio->find ('keyword')->$strip_method; +END_OF_MSG +} + +# +# some methods do not work with older SOAP::Lite version; here we +#return message explaining it +# +sub _old_version_msg { + my $self = shift; + my $method = (caller(1))[3]; + + return <<"END_OF_MSG"; +Method '$method' works only with SOAP::Lite +version 0.52 and newer (the problem is with returning a boolean value from the server). +END_OF_MSG +} + +# +# some controlled vocabulary methods needs two parameters; here we +# return message explaining it +# +sub _two_params_msg { + my $self = shift; + my $method = (caller(1))[3]; + + return <<"END_OF_MSG"; +Method '$method' expects two parameters: vocabulary name and a value. +END_OF_MSG +} + +# +# some controlled vocabulary methods needs a vocabulary name; here we +# return message explaining it +# +sub _missing_name_msg { + my $self = shift; + my $method = (caller(1))[3]; + + return <<"END_OF_MSG"; +Method '$method' expects vocabulary name as parameter. +END_OF_MSG +} + +# +# return a copy of a given array, with all its elements replaced +# with the SOAP-Data objects defining elements type as 'string' +# +sub _as_strings { + my ($ref_input_array) = @_; + my (@result) = map { SOAP::Data->new (type => 'string', value => $_) } @$ref_input_array; + return \@result; +} + +# --------------------------------------------------------------------- +# +# Here are the methods implementing Bio::DB::BiblioI interface +# (documentation is in Bio::DB::BiblioI) +# +# --------------------------------------------------------------------- + +sub get_collection_id { + my ($self) = @_; + $self->{'_collection_id'}; +} + +sub get_count { + my ($self) = @_; + my $soap = $self->{'_soap'}; + my ($collection_id) = $self->{'_collection_id'}; + if ($collection_id) { + $soap->getBibRefCount (SOAP::Data->type (string => $collection_id))->result; + } else { + $soap->getBibRefCount->result; + } +} + +# try: 94033980 +sub get_by_id { + my ($self, $citation_id) = @_; + $self->throw ("Citation ID is expected as a parameter of method 'get_by_id'.") + unless $citation_id; + my $soap = $self->{'_soap'}; + $soap->getById (SOAP::Data->type (string => $citation_id))->result; +} + +sub find { + my ($self, $keywords, $attrs) = @_; + my (@keywords, @attrs); + + # $keywords can be a comma-delimited scalar or a reference to an array + if ($keywords) { + my $ref = ref $keywords; + @keywords = split (/,/, $keywords) unless $ref; + @keywords = @$keywords if $ref =~ /ARRAY/; + } + $self->throw ("No keywords given in 'find' method.\n") + unless (@keywords); + + # ...and the same with $attrs + if ($attrs) { + my $ref = ref $attrs; + @attrs = split (/,/, $attrs) unless $ref; + @attrs = @$attrs if $ref =~ /ARRAY/; + } + + my $soap = $self->{'_soap'}; + my $collection_id = $self->{'_collection_id'}; + my $new_id; + if ($collection_id) { + if (@attrs) { + $new_id = $soap->find (SOAP::Data->type (string => $collection_id), + &_as_strings (\@keywords), + &_as_strings (\@attrs))->result; + } else { + $new_id = $soap->find (SOAP::Data->type (string => $collection_id), + &_as_strings (\@keywords))->result; + } + } else { + if (@attrs) { + $new_id = $soap->find (&_as_strings (\@keywords), + &_as_strings (\@attrs))->result; + + + } else { + $new_id = $soap->find (&_as_strings (\@keywords))->result; + } + } + + # clone itself but change the collection ID to a new one + return $self->new (-collection_id => $new_id, + -parent_collection_d => $collection_id); +} + +sub get_all_ids { + my ($self) = @_; + my $soap = $self->{'_soap'}; + my ($collection_id) = $self->{'_collection_id'}; + $self->throw ($self->_no_id_msg) unless $collection_id; + $soap->getAllIDs (SOAP::Data->type (string => $collection_id))->result; +} + +sub get_all { + my ($self) = @_; + my $soap = $self->{'_soap'}; + my ($collection_id) = $self->{'_collection_id'}; + $self->throw ($self->_no_id_msg) unless $collection_id; + $soap->getAllBibRefs (SOAP::Data->type (string => $collection_id))->result; +} + +sub has_next { + my ($self) = @_; + my $soap = $self->{'_soap'}; + my ($collection_id) = $self->{'_collection_id'}; + $self->throw ($self->_no_id_msg) unless $collection_id; + $self->throw ($self->_old_version_msg) if $SOAP::Lite::VERSION < 0.52; + $soap->hasNext (SOAP::Data->type (string => $collection_id))->result; +} + +sub get_next { + my ($self) = @_; + my $soap = $self->{'_soap'}; + my ($collection_id) = $self->{'_collection_id'}; + $self->throw ($self->_no_id_msg) unless $collection_id; + my $ra = $soap->getNext (SOAP::Data->type (string => $collection_id))->result; + $self->{'_collection_id'} = shift @{ $ra }; + shift @{ $ra }; +} + +sub get_more { + my ($self, $how_many) = @_; + my $soap = $self->{'_soap'}; + my $collection_id = $self->{'_collection_id'}; + $self->throw ($self->_no_id_msg) unless $collection_id; + + unless (defined ($how_many) and $how_many =~ /^\d+$/) { + warn ("Method 'get_more' expects a numeric argument. Changing to 1.\n"); + $how_many = 1; + } + unless ($how_many > 0) { + warn ("Method 'get_more' expects a positive argument. Changing to 1.\n"); + $how_many = 1; + } + + my $ra = $soap->getMore (SOAP::Data->type (string => $collection_id), + SOAP::Data->type (int => $how_many))->result; + $self->{'_collection_id'} = shift @{ $ra }; + $ra; +} + +sub reset_retrieval { + my ($self) = @_; + my $soap = $self->{'_soap'}; + my ($collection_id) = $self->{'_collection_id'}; + $self->throw ($self->_no_id_msg) unless $collection_id; + $self->{'_collection_id'} = $soap->resetRetrieval (SOAP::Data->type (string => $collection_id))->result; +} + +sub exists { + my ($self) = @_; + my $soap = $self->{'_soap'}; + my ($collection_id) = $self->{'_collection_id'}; + $self->throw ($self->_no_id_msg) unless $collection_id; + $self->throw ($self->_old_version_msg) if $SOAP::Lite::VERSION < 0.52; + $soap->exists (SOAP::Data->type (string => $collection_id))->result; +} + +sub destroy { + my ($self) = @_; + my $soap = $self->{'_soap'}; + my ($collection_id) = $self->{'_collection_id'}; + $self->throw ($self->_no_id_msg) unless $collection_id; + $soap->destroy (SOAP::Data->type (string => $collection_id)); +} + +sub get_vocabulary_names { + my ($self) = @_; + my $soap = $self->{'_soap'}; + $soap->getAllVocabularyNames->result; +} + +sub contains { + my ($self, $vocabulary_name, $value) = @_; + my $soap = $self->{'_soap'}; + $self->throw ($self->_old_version_msg) if $SOAP::Lite::VERSION < 0.52; + $self->throw ($self->_two_params_msg) + unless defined $vocabulary_name and defined $value; + $soap->contains (SOAP::Data->type (string => $vocabulary_name), + SOAP::Data->type (string => $value))->result; +} + +sub get_entry_description { + my ($self, $vocabulary_name, $value) = @_; + my $soap = $self->{'_soap'}; + $self->throw ($self->_two_params_msg) + unless defined $vocabulary_name and defined $value; + $soap->getEntryDescription (SOAP::Data->type (string => $vocabulary_name), + SOAP::Data->type (string => $value))->result; +} + +sub get_all_values { + my ($self, $vocabulary_name) = @_; + my $soap = $self->{'_soap'}; + $self->throw ($self->_missing_name_msg) + unless defined $vocabulary_name; + $soap->getAllValues (SOAP::Data->type (string => $vocabulary_name))->result; +} + +sub get_all_entries { + my ($self, $vocabulary_name) = @_; + my $soap = $self->{'_soap'}; + $self->throw ($self->_missing_name_msg) + unless defined $vocabulary_name; + $soap->getAllEntries (SOAP::Data->type (string => $vocabulary_name))->result; +} + +=head2 VERSION and Revision + + Usage : print $Bio::DB::Biblio::soap::VERSION; + print $Bio::DB::Biblio::soap::Revision; + +=cut + +=head2 Defaults + + Usage : print $Bio::DB::Biblio::soap::DEFAULT_SERVICE; + print $Bio::DB::Biblio::soap::DEFAULT_NAMESPACE; + +=cut + +1; +__END__