|
| 1 | +# |
| 2 | +# Extension of client module to add client-side logic. |
| 3 | +# |
| 4 | + |
| 5 | +package Bio::KBase::AppService::ClientExt; |
| 6 | + |
| 7 | +use Data::Dumper; |
| 8 | +use strict; |
| 9 | +use base 'Bio::KBase::AppService::Client'; |
| 10 | + |
| 11 | +sub await_task_completion |
| 12 | +{ |
| 13 | + my($self, $task_ids, $query_frequency, $timeout) = @_; |
| 14 | + |
| 15 | + die "await_task_completion: invalid task IDs" if ref($task_ids) ne 'ARRAY'; |
| 16 | + return [] if @$task_ids == 00; |
| 17 | + |
| 18 | + # Handle case where a list of tasks is passed. |
| 19 | + if (ref($task_ids->[0]) eq 'HASH') |
| 20 | + { |
| 21 | + $task_ids = [ map { $_->{id} } @$task_ids]; |
| 22 | + } |
| 23 | + |
| 24 | + $query_frequency //= 10; |
| 25 | + |
| 26 | + my %final_states = map { $_ => 1 } qw(failed suspend completed user_skipped skipped passed deleted); |
| 27 | + |
| 28 | + my $end_time; |
| 29 | + if ($timeout) |
| 30 | + { |
| 31 | + my $end_time = time + $timeout; |
| 32 | + } |
| 33 | + |
| 34 | + my %order; |
| 35 | + for my $i (0..$#$task_ids) |
| 36 | + { |
| 37 | + $order{$task_ids->[$i]} = $i; |
| 38 | + } |
| 39 | + |
| 40 | + my %remaining = map { $_ => 1 } @$task_ids; |
| 41 | + |
| 42 | + my $result = []; |
| 43 | + print Dumper(\%remaining); |
| 44 | + while (%remaining && (!$end_time || (time < $end_time))) |
| 45 | + { |
| 46 | + my $qtasks = $self->query_tasks([keys %remaining]); |
| 47 | + while (my($qid, $qtask) = each %$qtasks) |
| 48 | + { |
| 49 | + my $status = $qtask->{status}; |
| 50 | + print "Queried status = $status: " . Dumper($qtask); |
| 51 | + if ($final_states{$status}) |
| 52 | + { |
| 53 | + # |
| 54 | + # This task is done; fill in result and remove from query list. |
| 55 | + # |
| 56 | + $result->[$order{$qid}] = $qtask; |
| 57 | + delete $remaining{$qid}; |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + sleep($query_frequency); |
| 62 | + } |
| 63 | + return $result; |
| 64 | +} |
| 65 | + |
| 66 | +1; |
0 commit comments