Mercurial > repos > willmclaren > ensembl_vep
comparison variant_effect_predictor/Bio/DB/Query/WebQuery.pm @ 0:21066c0abaf5 draft
Uploaded
author | willmclaren |
---|---|
date | Fri, 03 Aug 2012 10:04:48 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:21066c0abaf5 |
---|---|
1 # $Id: WebQuery.pm,v 1.5 2002/12/05 13:46:32 heikki Exp $ | |
2 # | |
3 # BioPerl module for Bio::DB::WebQuery.pm | |
4 # | |
5 # Cared for by Lincoln Stein <lstein@cshl.org> | |
6 # | |
7 # Copyright Lincoln Stein | |
8 # | |
9 # You may distribute this module under the same terms as perl itself | |
10 # | |
11 # POD documentation - main docs before the code | |
12 # | |
13 | |
14 =head1 NAME | |
15 | |
16 Bio::DB::Query::WebQuery - Helper class for web-based sequence queryies | |
17 | |
18 =head1 SYNOPSIS | |
19 | |
20 Do not use this class directly. See Bio::DB::QueryI and one of the | |
21 implementor classes (such as Bio::DB::GenBankQuery) for information. | |
22 | |
23 | |
24 =head1 DESCRIPTION | |
25 | |
26 Do not use this class directly. See Bio::DB::QueryI and one of the | |
27 implementor classes (such as Bio::DB::GenBankQuery) for information. | |
28 | |
29 Those writing subclasses must define _get_params() and | |
30 _parse_response(), and possibly override _request_method(). | |
31 | |
32 =head1 FEEDBACK | |
33 | |
34 =head2 Mailing Lists | |
35 | |
36 User feedback is an integral part of the | |
37 evolution of this and other Bioperl modules. Send | |
38 your comments and suggestions preferably to one | |
39 of the Bioperl mailing lists. Your participation | |
40 is much appreciated. | |
41 | |
42 bioperl-l@bioperl.org - General discussion | |
43 http://bioperl.org/MailList.shtml - About the mailing lists | |
44 | |
45 =head2 Reporting Bugs | |
46 | |
47 Report bugs to the Bioperl bug tracking system to | |
48 help us keep track the bugs and their resolution. | |
49 Bug reports can be submitted via email or the | |
50 web: | |
51 | |
52 bioperl-bugs@bio.perl.org | |
53 http://bugzilla.bioperl.org/ | |
54 | |
55 =head1 AUTHOR - Lincoln Stein | |
56 | |
57 Email lstein@cshl.org | |
58 | |
59 =head1 APPENDIX | |
60 | |
61 The rest of the documentation details each of the | |
62 object methods. Internal methods are usually | |
63 preceded with a _ | |
64 | |
65 =cut | |
66 | |
67 # Let the code begin... | |
68 | |
69 package Bio::DB::Query::WebQuery; | |
70 use strict; | |
71 use URI; | |
72 use LWP::UserAgent; | |
73 use HTTP::Request::Common; | |
74 use Bio::Root::Root; | |
75 use Bio::DB::QueryI; | |
76 | |
77 use vars qw(@ISA $VERSION); | |
78 | |
79 @ISA = qw(Bio::Root::Root Bio::DB::QueryI); | |
80 $VERSION = '0.1'; | |
81 | |
82 =head2 new | |
83 | |
84 Title : new | |
85 Usage : $db = Bio::DB::WebQuery->new(@args) | |
86 Function: create new query object | |
87 Returns : new query object | |
88 Args : -db database (e.g. 'protein') | |
89 -ids array ref of ids (overrides query) | |
90 -verbose turn on verbose debugging | |
91 | |
92 This method creates a new query object. Typically you will specify a | |
93 -db and a -query argument. The value of -query is a database-specific | |
94 string. | |
95 | |
96 If you provide an array reference of IDs in -ids, the query will be | |
97 ignored and the list of IDs will be used when the query is passed to | |
98 the database. | |
99 | |
100 =cut | |
101 | |
102 # Borrowed shamelessly from WebDBSeqI. Some of this code should be | |
103 # refactored. | |
104 sub new { | |
105 my $class = shift; | |
106 my $self = $class->SUPER::new(@_); | |
107 | |
108 my ($query,$ids,$verbose) = $self->_rearrange(['QUERY','IDS','VERBOSE'],@_); | |
109 $self->throw('must provide one of the the -query or -ids arguments') | |
110 unless defined($query) || defined($ids); | |
111 $query ||= join ',',ref($ids) ? @$ids : $ids; | |
112 $query && $self->query($query); | |
113 $verbose && $self->verbose($verbose); | |
114 | |
115 my $ua = new LWP::UserAgent; | |
116 $ua->agent(ref($self) ."/$VERSION"); | |
117 $self->ua($ua); | |
118 $self->{'_authentication'} = []; | |
119 $self; | |
120 } | |
121 | |
122 =head2 ua | |
123 | |
124 Title : ua | |
125 Usage : my $ua = $self->ua or | |
126 $self->ua($ua) | |
127 Function: Get/Set a LWP::UserAgent for use | |
128 Returns : reference to LWP::UserAgent Object | |
129 Args : $ua - must be a LWP::UserAgent | |
130 | |
131 =cut | |
132 | |
133 sub ua { | |
134 my ($self, $ua) = @_; | |
135 my $d = $self->{'_ua'}; | |
136 if( defined $ua && $ua->isa("LWP::UserAgent") ) { | |
137 $self->{'_ua'} = $ua; | |
138 } | |
139 $d; | |
140 } | |
141 | |
142 =head2 proxy | |
143 | |
144 Title : proxy | |
145 Usage : $httpproxy = $db->proxy('http') or | |
146 $db->proxy(['http','ftp'], 'http://myproxy' ) | |
147 Function: Get/Set a proxy for use of proxy | |
148 Returns : a string indicating the proxy | |
149 Args : $protocol : an array ref of the protocol(s) to set/get | |
150 $proxyurl : url of the proxy to use for the specified protocol | |
151 $username : username (if proxy requires authentication) | |
152 $password : password (if proxy requires authentication) | |
153 | |
154 =cut | |
155 | |
156 sub proxy { | |
157 my ($self,$protocol,$proxy,$username,$password) = @_; | |
158 return undef if ( !defined $self->ua || !defined $protocol | |
159 || !defined $proxy ); | |
160 $self->authentication($username, $password) | |
161 if ($username && $password); | |
162 return $self->ua->proxy($protocol,$proxy); | |
163 } | |
164 | |
165 =head2 authentication | |
166 | |
167 Title : authentication | |
168 Usage : $db->authentication($user,$pass) | |
169 Function: Get/Set authentication credentials | |
170 Returns : Array of user/pass | |
171 Args : Array or user/pass | |
172 | |
173 | |
174 =cut | |
175 | |
176 sub authentication{ | |
177 my ($self,$u,$p) = @_; | |
178 | |
179 if( defined $u && defined $p ) { | |
180 $self->{'_authentication'} = [ $u,$p]; | |
181 } | |
182 return @{$self->{'_authentication'}}; | |
183 } | |
184 | |
185 =head2 ids | |
186 | |
187 Title : ids | |
188 Usage : @ids = $db->ids([@ids]) | |
189 Function: get/set matching ids | |
190 Returns : array of sequence ids | |
191 Args : (optional) array ref with new set of ids | |
192 | |
193 =cut | |
194 | |
195 sub ids { | |
196 my $self = shift; | |
197 if (@_) { | |
198 my $d = $self->{'_ids'}; | |
199 my $arg = shift; | |
200 $self->{'_ids'} = ref $arg ? $arg : [$arg]; | |
201 return $d ? @$d : (); | |
202 } else { | |
203 $self->_fetch_ids; | |
204 return @{$self->{'_ids'}}; | |
205 } | |
206 } | |
207 | |
208 =head2 query | |
209 | |
210 Title : query | |
211 Usage : $query = $db->query([$query]) | |
212 Function: get/set query string | |
213 Returns : string | |
214 Args : (optional) new query string | |
215 | |
216 =cut | |
217 | |
218 sub query { | |
219 my $self = shift; | |
220 my $d = $self->{'_query'}; | |
221 $self->{'_query'} = shift if @_; | |
222 $d; | |
223 } | |
224 | |
225 =head2 _fetch_ids | |
226 | |
227 Title : _fetch_ids | |
228 Usage : @ids = $db->_fetch_ids | |
229 Function: run query, get ids | |
230 Returns : array of sequence ids | |
231 Args : none | |
232 | |
233 =cut | |
234 | |
235 sub _fetch_ids { | |
236 my $self = shift; | |
237 $self->_run_query; | |
238 $self->_run_query(1) if $self->_truncated; | |
239 $self->throw('Id list has been truncated even after maxids requested') | |
240 if $self->_truncated; | |
241 return @{$self->{'_ids'}} if $self->{'_ids'}; | |
242 } | |
243 | |
244 =head2 _run_query | |
245 | |
246 Title : _run_query | |
247 Usage : $success = $db->_run_query | |
248 Function: run query, parse results | |
249 Returns : true if successful | |
250 Args : none | |
251 | |
252 =cut | |
253 | |
254 sub _run_query { | |
255 my $self = shift; | |
256 my $force = shift; | |
257 | |
258 # allow the query to be run one extra time if truncated | |
259 return $self->{'_ran_query'} if $self->{'_ran_query'}++ && !$force; | |
260 | |
261 my $request = $self->_get_request; | |
262 $self->debug("request is ".$request->url) if $self->verbose; | |
263 my $response = $self->ua->request($request); | |
264 return unless $response->is_success; | |
265 $self->debug("response is ".$response->content) if $self->verbose; | |
266 $self->_parse_response($response->content); | |
267 1; | |
268 } | |
269 | |
270 =head2 _truncated | |
271 | |
272 Title : _truncated | |
273 Usage : $flag = $db->_truncated([$newflag]) | |
274 Function: get/set truncation flag | |
275 Returns : boolean | |
276 Args : new flag | |
277 | |
278 Some databases will truncate output unless explicitly asked | |
279 not to. This flag allows a "two probe" attempt. | |
280 | |
281 =cut | |
282 | |
283 sub _truncated { | |
284 my $self = shift; | |
285 my $d = $self->{'_truncated'}; | |
286 $self->{'_truncated'} = shift if @_; | |
287 $d; | |
288 } | |
289 | |
290 =head2 _get_request | |
291 | |
292 Title : _get_request | |
293 Usage : $http_request = $db->_get_request(@params) | |
294 Function: create an HTTP::Request with indicated parameters | |
295 Returns : HTTP::Request object | |
296 Args : CGI parameter list | |
297 | |
298 =cut | |
299 | |
300 sub _get_request { | |
301 my $self = shift; | |
302 my ($method,$base,@params) = $self->_request_parameters; | |
303 my $uri = URI->new($base); | |
304 my $request; | |
305 if ($method eq 'get') { | |
306 $uri->query_form(@params); | |
307 $request = GET $uri; | |
308 } else { | |
309 $request = POST $uri,\@params; | |
310 } | |
311 | |
312 $request->proxy_authorization_basic($self->authentication) | |
313 if $self->authentication; | |
314 $request; | |
315 } | |
316 | |
317 =head2 _parse_response | |
318 | |
319 Title : _parse_response | |
320 Usage : $db->_parse_response($content) | |
321 Function: parse out response | |
322 Returns : empty | |
323 Args : none | |
324 Throws : 'unparseable output exception' | |
325 | |
326 NOTE: This method must be implemented by subclass. | |
327 | |
328 =cut | |
329 | |
330 sub _parse_response { | |
331 my $self = shift; | |
332 my $content = shift; | |
333 $self->throw_not_implemented; | |
334 } | |
335 | |
336 =head2 _request_parameters | |
337 | |
338 Title : _request_parameters | |
339 Usage : ($method,$base,@params = $db->_request_parameters | |
340 Function: return information needed to construct the request | |
341 Returns : list of method, url base and key=>value pairs | |
342 Args : none | |
343 | |
344 NOTE: This method must be implemented by subclass. | |
345 | |
346 =cut | |
347 | |
348 sub _request_parameters { | |
349 my $self = shift; | |
350 $self->throw_not_implemented; | |
351 } | |
352 | |
353 1; |