diff variant_effect_predictor/Bio/DB/Query/WebQuery.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/Query/WebQuery.pm	Thu Apr 11 02:01:53 2013 -0400
@@ -0,0 +1,353 @@
+# $Id: WebQuery.pm,v 1.5 2002/12/05 13:46:32 heikki Exp $
+#
+# BioPerl module for Bio::DB::WebQuery.pm
+#
+# Cared for by Lincoln Stein <lstein@cshl.org>
+#
+# Copyright Lincoln Stein
+#
+# You may distribute this module under the same terms as perl itself
+#
+# POD documentation - main docs before the code
+#
+
+=head1 NAME
+
+Bio::DB::Query::WebQuery - Helper class for web-based sequence queryies
+
+=head1 SYNOPSIS
+
+Do not use this class directly.  See Bio::DB::QueryI and one of the
+implementor classes (such as Bio::DB::GenBankQuery) for information.
+
+
+=head1 DESCRIPTION
+
+Do not use this class directly.  See Bio::DB::QueryI and one of the
+implementor classes (such as Bio::DB::GenBankQuery) for information.
+
+Those writing subclasses must define _get_params() and
+_parse_response(), and possibly override _request_method().
+
+=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 one
+of the Bioperl mailing lists. 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 the bugs and their resolution.
+Bug reports can be submitted via email or the
+web:
+
+  bioperl-bugs@bio.perl.org
+  http://bugzilla.bioperl.org/
+
+=head1 AUTHOR - Lincoln Stein
+
+Email lstein@cshl.org
+
+=head1 APPENDIX
+
+The rest of the documentation details each of the
+object methods. Internal methods are usually
+preceded with a _
+
+=cut
+
+# Let the code begin...
+
+package Bio::DB::Query::WebQuery;
+use strict;
+use URI;
+use LWP::UserAgent;
+use HTTP::Request::Common;
+use Bio::Root::Root;
+use Bio::DB::QueryI;
+
+use vars qw(@ISA $VERSION);
+
+@ISA = qw(Bio::Root::Root Bio::DB::QueryI);
+$VERSION = '0.1';
+
+=head2 new
+
+ Title   : new
+ Usage   : $db = Bio::DB::WebQuery->new(@args)
+ Function: create new query object
+ Returns : new query object
+ Args    : -db       database (e.g. 'protein')
+           -ids      array ref of ids (overrides query)
+           -verbose  turn on verbose debugging
+
+This method creates a new query object.  Typically you will specify a
+-db and a -query argument.  The value of -query is a database-specific
+string.
+
+If you provide an array reference of IDs in -ids, the query will be
+ignored and the list of IDs will be used when the query is passed to
+the database.
+
+=cut
+
+# Borrowed shamelessly from WebDBSeqI.  Some of this code should be
+# refactored.
+sub new {
+  my $class = shift;
+  my $self  = $class->SUPER::new(@_);
+
+  my ($query,$ids,$verbose) = $self->_rearrange(['QUERY','IDS','VERBOSE'],@_);
+  $self->throw('must provide one of the the -query or -ids arguments')
+    unless defined($query) || defined($ids);
+  $query ||= join ',',ref($ids) ? @$ids : $ids;
+  $query && $self->query($query);
+  $verbose && $self->verbose($verbose);
+
+  my $ua = new LWP::UserAgent;
+  $ua->agent(ref($self) ."/$VERSION");
+  $self->ua($ua);
+  $self->{'_authentication'} = [];
+  $self;
+}
+
+=head2 ua
+
+ Title   : ua
+ Usage   : my $ua = $self->ua or 
+           $self->ua($ua)
+ Function: Get/Set a LWP::UserAgent for use
+ Returns : reference to LWP::UserAgent Object
+ Args    : $ua - must be a LWP::UserAgent
+
+=cut
+
+sub ua {
+   my ($self, $ua) = @_;
+   my $d = $self->{'_ua'};
+   if( defined $ua && $ua->isa("LWP::UserAgent") ) {
+      $self->{'_ua'} = $ua;
+   }
+   $d;
+}
+
+=head2 proxy
+
+ Title   : proxy
+ Usage   : $httpproxy = $db->proxy('http')  or 
+           $db->proxy(['http','ftp'], 'http://myproxy' )
+ Function: Get/Set a proxy for use of proxy
+ Returns : a string indicating the proxy
+ Args    : $protocol : an array ref of the protocol(s) to set/get
+           $proxyurl : url of the proxy to use for the specified protocol
+           $username : username (if proxy requires authentication)
+           $password : password (if proxy requires authentication)
+
+=cut
+
+sub proxy {
+    my ($self,$protocol,$proxy,$username,$password) = @_;
+    return undef if ( !defined $self->ua || !defined $protocol 
+		      || !defined $proxy );
+    $self->authentication($username, $password) 	
+	if ($username && $password);
+    return $self->ua->proxy($protocol,$proxy);
+}
+
+=head2 authentication
+
+ Title   : authentication
+ Usage   : $db->authentication($user,$pass)
+ Function: Get/Set authentication credentials
+ Returns : Array of user/pass 
+ Args    : Array or user/pass
+
+
+=cut
+
+sub authentication{
+   my ($self,$u,$p) = @_;
+
+   if( defined $u && defined $p ) {
+       $self->{'_authentication'} = [ $u,$p];
+   }
+   return @{$self->{'_authentication'}};
+}
+
+=head2 ids
+
+ Title   : ids
+ Usage   : @ids = $db->ids([@ids])
+ Function: get/set matching ids
+ Returns : array of sequence ids
+ Args    : (optional) array ref with new set of ids
+
+=cut
+
+sub ids     {
+  my $self = shift;
+  if (@_) {
+    my $d = $self->{'_ids'};
+    my $arg = shift;
+    $self->{'_ids'} = ref $arg ? $arg : [$arg];
+    return $d ? @$d : ();
+  } else {
+    $self->_fetch_ids;
+    return @{$self->{'_ids'}};
+  }
+}
+
+=head2 query
+
+ Title   : query
+ Usage   : $query = $db->query([$query])
+ Function: get/set query string
+ Returns : string
+ Args    : (optional) new query string
+
+=cut
+
+sub query   {
+  my $self = shift;
+  my $d    = $self->{'_query'};
+  $self->{'_query'} = shift if @_;
+  $d;
+}
+
+=head2 _fetch_ids
+
+ Title   : _fetch_ids
+ Usage   : @ids = $db->_fetch_ids
+ Function: run query, get ids
+ Returns : array of sequence ids
+ Args    : none
+
+=cut
+
+sub _fetch_ids     {
+  my $self = shift;
+  $self->_run_query;
+  $self->_run_query(1) if $self->_truncated;
+  $self->throw('Id list has been truncated even after maxids requested')
+    if $self->_truncated;
+  return @{$self->{'_ids'}} if $self->{'_ids'};
+}
+
+=head2 _run_query
+
+ Title   : _run_query
+ Usage   : $success = $db->_run_query
+ Function: run query, parse results
+ Returns : true if successful
+ Args    : none
+
+=cut
+
+sub _run_query {
+  my $self   = shift;
+  my $force  = shift;
+
+  # allow the query to be run one extra time if truncated
+  return $self->{'_ran_query'} if $self->{'_ran_query'}++ && !$force;
+
+  my $request = $self->_get_request;
+  $self->debug("request is ".$request->url)     if $self->verbose;
+  my $response = $self->ua->request($request);
+  return unless $response->is_success;
+  $self->debug("response is ".$response->content) if $self->verbose;
+  $self->_parse_response($response->content);
+  1;
+}
+
+=head2 _truncated
+
+ Title   : _truncated
+ Usage   : $flag = $db->_truncated([$newflag])
+ Function: get/set truncation flag
+ Returns : boolean
+ Args    : new flag
+
+Some databases will truncate output unless explicitly asked
+not to.  This flag allows a "two probe" attempt.
+
+=cut
+
+sub _truncated {
+  my $self = shift;
+  my $d = $self->{'_truncated'};
+  $self->{'_truncated'} = shift if @_;
+  $d;
+}
+
+=head2 _get_request
+
+ Title   : _get_request
+ Usage   : $http_request = $db->_get_request(@params)
+ Function: create an HTTP::Request with indicated parameters
+ Returns : HTTP::Request object
+ Args    : CGI parameter list
+
+=cut
+
+sub _get_request {
+  my $self   = shift;
+  my ($method,$base,@params) = $self->_request_parameters;
+  my $uri = URI->new($base);
+  my $request;
+  if ($method eq 'get') {
+    $uri->query_form(@params);
+    $request = GET $uri;
+  } else {
+    $request = POST $uri,\@params;
+  }
+
+  $request->proxy_authorization_basic($self->authentication)
+	if $self->authentication;
+  $request;
+}
+
+=head2 _parse_response
+
+ Title   : _parse_response
+ Usage   : $db->_parse_response($content)
+ Function: parse out response
+ Returns : empty
+ Args    : none
+ Throws  : 'unparseable output exception'
+
+NOTE: This method must be implemented by subclass.
+
+=cut
+
+sub _parse_response {
+  my $self    = shift;
+  my $content = shift;
+  $self->throw_not_implemented;
+}
+
+=head2 _request_parameters
+
+ Title   : _request_parameters
+ Usage   : ($method,$base,@params = $db->_request_parameters
+ Function: return information needed to construct the request
+ Returns : list of method, url base and key=>value pairs
+ Args    : none
+
+NOTE: This method must be implemented by subclass.
+
+=cut
+
+sub _request_parameters {
+  my $self = shift;
+  $self->throw_not_implemented;
+}
+
+1;