| File: | /home/mik/work/module/Tivoli/AccessManager/Admin/Response.pm |
| Coverage: | 98.8% |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package Tivoli::AccessManager::Admin::Response; | ||||||
| 2 | 15 15 15 | 155 59 144 | use strict; | ||||
| 3 | 15 15 15 | 184 58 154 | use warnings; | ||||
| 4 | 15 15 15 | 188 61 220 | use Carp; | ||||
| 5 | #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ||||||
| 6 | # $Id: Response.pm 305 2006-09-28 19:18:01Z mik $ | ||||||
| 7 | #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= | ||||||
| 8 | $Tivoli::AccessManager::Admin::Response::VERSION = '0.04'; | ||||||
| 9 | 15 | 239 | use Inline(C => 'DATA', | ||||
| 10 | INC => '-I/opt/PolicyDirector/include', | ||||||
| 11 | LIBS => ' -lpthread -lpdadminapi -lstdc++', | ||||||
| 12 | CCFLAGS => '-g -Wall', | ||||||
| 13 | # VERSION => '0.04', | ||||||
| 14 | NAME => 'Tivoli::AccessManager::Admin::Response', | ||||||
| 15 | 15 15 | 294 86 | ); | ||||
| 16 | |||||||
| 17 | my %codes = ( | ||||||
| 18 | INFO => 0, | ||||||
| 19 | WARNING => 1, | ||||||
| 20 | ERROR => 2, | ||||||
| 21 | ); | ||||||
| 22 | |||||||
| 23 | sub _get_type { | ||||||
| 24 | 23 | 148 | my $self = shift; | ||||
| 25 | 23 | 126 | my $type = shift; | ||||
| 26 | |||||||
| 27 | 23 | 482 | return 0 unless ( $self->{used} ); | ||||
| 28 | for ( my $i = 0; $i < $self->response_getcount(); $i++ ) { | ||||||
| 29 | 1 | 44 | if ( $self->response_getmodifier( $i ) == $codes{$type} ) { | ||||
| 30 | 1 | 15 | return 1; | ||||
| 31 | } | ||||||
| 32 | 11 | 67 | } | ||||
| 33 | 10 | 256 | return 0; | ||||
| 34 | } | ||||||
| 35 | |||||||
| 36 | sub new { | ||||||
| 37 | 1433 | 1 | 8618 | my $class = shift; | |||
| 38 | 1433 | 8989 | my $self = {}; | ||||
| 39 | |||||||
| 40 | 1433 | 15876 | bless $self, $class; | ||||
| 41 | |||||||
| 42 | 1433 | 15725 | $self->_response(); | ||||
| 43 | 1433 | 8333 | $self->{isok} = 1; | ||||
| 44 | 1433 | 8894 | $self->{iswarning} = 0; | ||||
| 45 | 1433 | 6744 | $self->{iserror} = 0; | ||||
| 46 | 1433 | 7539 | $self->{used} = 0; | ||||
| 47 | 1433 | 12194 | $self->{value}[0] = undef; | ||||
| 48 | 1433 | 7173 | $self->{value}[1] = undef; | ||||
| 49 | |||||||
| 50 | 1433 | 12372 | return $self; | ||||
| 51 | } | ||||||
| 52 | |||||||
| 53 | sub value { | ||||||
| 54 | 432 | 1 | 7638 | my $self = shift; | |||
| 55 | |||||||
| 56 | 432 | 3064 | return undef unless $self->isok; | ||||
| 57 | |||||||
| 58 | 429 | 2845 | if ( wantarray ) { | ||||
| 59 | 81 74 | 759 1672 | return @{$self->{value}[1]} if defined($self->{value}[1]); | ||||
| 60 | 7 | 66 | return (); | ||||
| 61 | } | ||||||
| 62 | else { | ||||||
| 63 | 348 | 7019 | return $self->{value}[0] if defined($self->{value}[0]); | ||||
| 64 | 13 9 | 108 154 | return scalar(@{$self->{value}[1]}) if defined($self->{value}[1]); | ||||
| 65 | 4 | 49 | return undef; | ||||
| 66 | } | ||||||
| 67 | } | ||||||
| 68 | |||||||
| 69 | sub messages { | ||||||
| 70 | 10 | 1 | 149 | my $self = shift; | |||
| 71 | 10 | 60 | my @message = (); | ||||
| 72 | |||||||
| 73 | 10 | 81 | if ( defined $self->{messages} ) { | ||||
| 74 | 6 6 | 20 71 | @message = @{$self->{messages}}; | ||||
| 75 | } | ||||||
| 76 | |||||||
| 77 | 10 | 73 | if ($self->{used} ) { | ||||
| 78 | 6 | 126 | my $count = $self->response_getcount(); | ||||
| 79 | for ( my $foo = 0; $foo < $count; $foo++ ) { | ||||||
| 80 | 1 | 475 | push @message, $self->response_getmessage( $foo ); | ||||
| 81 | 6 | 24 | } | ||||
| 82 | } | ||||||
| 83 | 10 | 219 | return wantarray ? @message : $message[0]; | ||||
| 84 | } | ||||||
| 85 | |||||||
| 86 | sub codes { | ||||||
| 87 | 4 | 1 | 34 | my $self = shift; | |||
| 88 | 4 | 11 | my @code; | ||||
| 89 | |||||||
| 90 | 4 | 39 | return 0 unless $self->{used}; | ||||
| 91 | 3 | 21 | if ( wantarray ) { | ||||
| 92 | for ( my $i = 0; $i < $self->response_getcount(); $i++ ) { | ||||||
| 93 | 1 | 46 | push @code, $self->response_getcode($i); | ||||
| 94 | 2 | 5 | } | ||||
| 95 | 2 | 21 | return @code; | ||||
| 96 | } | ||||||
| 97 | else { | ||||||
| 98 | 1 | 17 | return $self->response_getcode(0); | ||||
| 99 | } | ||||||
| 100 | } | ||||||
| 101 | |||||||
| 102 | sub isok { | ||||||
| 103 | 2256 | 1 | 27685 | my $self = shift; | |||
| 104 | |||||||
| 105 | 2256 | 19813 | if ( $self->{used} ) { | ||||
| 106 | 1756 | 3892014 | return $self->response_getok() && $self->{isok}; | ||||
| 107 | } | ||||||
| 108 | else { | ||||||
| 109 | 500 | 6645 | return $self->{isok}; | ||||
| 110 | } | ||||||
| 111 | } | ||||||
| 112 | |||||||
| 113 | sub DESTROY { | ||||||
| 114 | 1433 | 9413 | my $self = shift; | ||||
| 115 | |||||||
| 116 | 1433 | 18276 | $self->response_free(); | ||||
| 117 | } | ||||||
| 118 | |||||||
| 119 | sub set_value { | ||||||
| 120 | 752 | 1 | 5700 | my $self = shift; | |||
| 121 | |||||||
| 122 | # I think I want to clear everything out before I start setting it. I | ||||||
| 123 | # think. | ||||||
| 124 | 752 752 | 3447 7618 | @{$self->{value}} = (); | ||||
| 125 | |||||||
| 126 | # Pay close attention to the last two conditions -- they are different. | ||||||
| 127 | # The first condition performs a straight assignment between the values | ||||||
| 128 | # array and what I was sent. The second one dumps the entire contents of | ||||||
| 129 | # @_ into value[1]. Very different. | ||||||
| 130 | 752 | 7812 | if ( @_ == 1 ) { | ||||
| 131 | 713 | 3628 | my $foo = shift; | ||||
| 132 | 713 | 7674 | $self->{value}[ref($foo) eq 'ARRAY'] = $foo; | ||||
| 133 | } | ||||||
| 134 | elsif ( @_ == 2 and ref($_[1]) eq 'ARRAY' ) { | ||||||
| 135 | 37 37 | 169 342 | @{$self->{value}} = @_; | ||||
| 136 | } | ||||||
| 137 | elsif ( @_ >= 2 ) { | ||||||
| 138 | 1 1 | 4 10 | @{$self->{value}[1]} = @_; | ||||
| 139 | } | ||||||
| 140 | else { | ||||||
| 141 | 1 | 8 | return 0; | ||||
| 142 | } | ||||||
| 143 | 751 | 9449 | return 1; | ||||
| 144 | } | ||||||
| 145 | |||||||
| 146 | sub set_message { | ||||||
| 147 | 290 | 1 | 1578 | my $self = shift; | |||
| 148 | 290 | 2027 | my @mesgs = @_; | ||||
| 149 | |||||||
| 150 | 290 290 | 1094 4111 | push @{$self->{messages}}, @mesgs; | ||||
| 151 | } | ||||||
| 152 | |||||||
| 153 | 265 | 1 | 2488 | sub set_isok { $_[0]->{isok} = $_[1]; } | |||
| 154 | 27 | 1 | 294 | sub set_iswarning { $_[0]->{iswarning} = $_[1]; } | |||
| 155 | 1 | 1 | 16 | sub set_iserror { $_[0]->{iserror} = $_[1]; } | |||
| 156 | 3 | 1 | 32 | sub iserror { $_[0]->_get_type( "ERROR" ) || $_[0]->{iserror}; } | |||
| 157 | 19 | 1 | 567 | sub iswarning { $_[0]->_get_type( "WARNING" ) || $_[0]->{iswarning}; } | |||
| 158 | 1 | 1 | 7 | sub isinfo { $_[0]->_get_type( "INFO" ); } | |||
| 159 | |||||||
| 160 | 1; | ||||||
| 161 | |||||||
| 162 - 372 | =head1 NAME
Tivoli::AccessManager::Admin::Response
=head1 SYNOPSIS
use Tivoli::AccessManager::Admin;
$resp = Tivoli::AccessManager::Admin::Response->new;
$resp->iserror and die $resp->messages;
$resp->set_isok(0);
$resp->set_message("Line1", "Line2", "Line3");
$resp->set_iswarning(1);
$resp->set_value( "foo" );
print $resp->value;
=head1 DESCRIPTION
L<Tivoli::AccessManager::Admin::Response> is the general purpose object returned by just about
every other method. It handles the response structures returned from the TAM
API and provides a fair amount of other manipulations.
=head1 CONSTRUCTOR
=head2 new()
Allocates space for the response structure and does the necessary magic to
make it work.
=head3 Parameters
None
=head3 Returns
A fully blessed L<Tivoli::AccessManager::Admin::Response> object.
=head1 METHODS
=head2 value
Retrieves the value stored in the Response object. It is, as you may suspect,
a read-only method. As every method in the TAM namespace returns an object of
this type, you will likely only use isok more often.
=head3 Returns
The return should DWYM. It can return a scalar in scalar context, an array in
list context and undef otherwise. It tries hard to guess what you meant. If
you call it in list context and the response object has an array ref, the
right thing happens.
=head2 isok
Indicates if the Response object is .. well, okay. If the underlying TAM
Response structure has been used, L</"isok"> will return the value of
ivadmin_response_isok logically anded with internal isok value. If the
structure hasn't been used, L</"isok"> will return the value of its internal isok
flag.
I am still not certain that isok = ! error.
=head3 Returns
True if the flags are so aligned :)
=head2 iserror, iswarning, isinfo
These are read-only methods which return true if the Response object is
flagged as an error, warning or informational respectively
=head3 Returns
True if the response is an error, a warning or informational.
=head2 messages
Returns the messages in the Response object. This is a read-only method.
=head3 Returns
If used in scalar context, only the first message in the message array is
returned. If used in array context, the full message array will be returned.
=head2 codes
Retrieves the error codes associated with the Response object. This is a
read-only method.
=head3 Returns
If used in scalar context, only the first code in the code array is
returned. If used in array context, the full code array will be returned.
=head2 set_value( VALUE | VALUE,ARRAYREF | ARRAY )
Sets the returned value, but does it weirdly.
If you just send a single parameter, the value will be returned when the
response object is used in scalar context.
If you send a value and an array reference, the value will be returned in
scalar context and the list from the array ref will be returned in list
context.
If you send more than two parameters, the entire list is stored and will be
returned in list context. Scalar context will give you the number of
elements.
=head2 set_message( STRING[,...] )
Sets the message(s) in the Response object. You can send any number of
strings to be included in the message.
=head3 Parameters
=over 4
=item STRING[,...]
The message you want to store.
=back
=head3 Returns
I honestly have no idea what it returns.
=head2 set_isok( 0 | 1 )
Sets the isok flag to true or false.
=head3 Parameters
=over 4
=item 0 or 1
Do you want the isok flag to be false or true?
=back
=head3 Returns
The new value of the isok flag although you will likely never need to actually
test the return value
=head2 set_iswarning( 0|1 )
Sets the iswarning flag to false or true.
=head3 Parameters
=over 4
=item 0 or 1
Do you want the iswarning flag to be false or true?
=back
=head3 Returns
The new value of the iswarning flag, although you will likely never need to
actually test the return value
=head2 set_iserror( 0|1 )
Sets the iswarning flag to false or true.
=head3 Parameters
=over 4
=item 0 or 1
Do you want the iserror flag to be false or true?
=back
=head3 Returns
The new value of the iserror flag, although you will likely never need to
actually test the return value
=head1 ACKNOWLEDGEMENTS
See L<Tivoli::AccessManager::Admin> for the list of all the people I am indebted to for their
help while writing these modules.
=head1 BUGS
None known yet.
=head1 AUTHOR
Mik Firestone E<lt>mikfire@gmail.comE<gt>
=head1 COPYRIGHT
Copyright (c) 2004-2011 Mik Firestone. All rights reserved. This program is
free software; you can redistibute it and/or modify it under the same terms as
Perl itself.
All references to TAM, Tivoli Access Manager, etc are copyrighted by IBM.
=cut | ||||||
| 373 | |||||||