| CGI/AppBuilder/Message.pm | |||
|---|---|---|---|
| Criterion | Covered | Total | % |
| statement | 13 | 15 | 86.6 |
| branch | n/a | ||
| condition | n/a | ||
| subroutine | 5 | 5 | 100.0 |
| pod | n/a | ||
| total | 18 | 20 | 90.0 |
| line | stmt | bran | cond | sub | pod | time | code |
|---|---|---|---|---|---|---|---|
| 1 | package CGI::AppBuilder::Message; | ||||||
| 2 | |||||||
| 3 | 1 | 1 | 23697 | use warnings; | |||
| 1 | 2 | ||||||
| 1 | 33 | ||||||
| 4 | 1 | 1 | 5 | use Carp; | |||
| 1 | 2 | ||||||
| 1 | 98 | ||||||
| 5 | 1 | 1 | 1006 | use IO::File; | |||
| 1 | 11635 | ||||||
| 1 | 165 | ||||||
| 6 | 1 | 1 | 1068 | use POSIX qw(strftime); | |||
| 1 | 6321 | ||||||
| 1 | 6 | ||||||
| 7 | 1 | 1 | 3211 | use CGI::AppBuilder; | |||
| 0 | |||||||
| 0 | |||||||
| 8 | |||||||
| 9 | # require Exporter; | ||||||
| 10 | @ISA = qw(Exporter CGI::AppBuilder); | ||||||
| 11 | our @EXPORT = qw(); | ||||||
| 12 | our @EXPORT_OK = qw(disp_param set_param echo_msg debug_level echoMSG | ||||||
| 13 | debug | ||||||
| 14 | ); | ||||||
| 15 | our %EXPORT_TAGS = ( | ||||||
| 16 | all => [@EXPORT_OK], | ||||||
| 17 | echo_msg => [qw(disp_param echo_msg debug_level)], | ||||||
| 18 | ); | ||||||
| 19 | $CGI::AppBuilder::Message::VERSION = 0.12; | ||||||
| 20 | |||||||
| 21 | =head1 NAME | ||||||
| 22 | |||||||
| 23 | CGI::AppBuilder::Message - Display debug messages based on levels | ||||||
| 24 | |||||||
| 25 | =head1 SYNOPSIS | ||||||
| 26 | |||||||
| 27 | my $self = bless {}, "main"; | ||||||
| 28 | use CGI::AppBuilder::Message; | ||||||
| 29 | $self->debug_level(2); # set debug level to 2 | ||||||
| 30 | # The level 3 message will not be displayed | ||||||
| 31 | $self->echo_msg("This is level 1 message.", 1); | ||||||
| 32 | $self->echo_msg("This is level 2 message.", 2); | ||||||
| 33 | $self->echo_msg("This is level 3 message.", 3); | ||||||
| 34 | |||||||
| 35 | =head1 DESCRIPTION | ||||||
| 36 | |||||||
| 37 | The package contains the modules can be used for debuging or displaying | ||||||
| 38 | contents of your runtime state. You would first define the level of | ||||||
| 39 | each message in your program, then define a debug level that you would | ||||||
| 40 | like to see in your runtime. | ||||||
| 41 | |||||||
| 42 | =head2 new (ifn => 'file.cfg', opt => 'hvS:') | ||||||
| 43 | |||||||
| 44 | This is a inherited method from CGI::AppBuilder. See the same method | ||||||
| 45 | in CGI::AppBuilder for more details. | ||||||
| 46 | |||||||
| 47 | =cut | ||||||
| 48 | |||||||
| 49 | sub new { | ||||||
| 50 | my ($s, %args) = @_; | ||||||
| 51 | return $s->SUPER::new(%args); | ||||||
| 52 | } | ||||||
| 53 | |||||||
| 54 | =head2 debug_level($n) | ||||||
| 55 | |||||||
| 56 | Input variables: | ||||||
| 57 | |||||||
| 58 | $n - a number between 0 and 100. It specifies the | ||||||
| 59 | level of messages that you would like to | ||||||
| 60 | display. The higher the number, the more | ||||||
| 61 | detailed messages that you will get. | ||||||
| 62 | |||||||
| 63 | Variables used or routines called: None. | ||||||
| 64 | |||||||
| 65 | How to use: | ||||||
| 66 | |||||||
| 67 | $self->debug_level(2); # set the message level to 2 | ||||||
| 68 | print $self->debug_level; # print current message level | ||||||
| 69 | |||||||
| 70 | Return: the debug level or set the debug level. | ||||||
| 71 | |||||||
| 72 | =cut | ||||||
| 73 | |||||||
| 74 | *debug = \&CGI::AppBuilder::Message::debug_level; | ||||||
| 75 | |||||||
| 76 | sub debug_level { | ||||||
| 77 | # my ($c_pkg,$c_fn,$c_ln) = caller; | ||||||
| 78 | # my $s = ref($_[0])?shift:(bless {}, $c_pkg); | ||||||
| 79 | my $s = shift; | ||||||
| 80 | croak "ERR: Too many args to debug_level." if @_ > 1; | ||||||
| 81 | @_ ? ($s->{_debug_level}=shift) : return $s->{_debug_level}; | ||||||
| 82 | } | ||||||
| 83 | |||||||
| 84 | =head2 echo_msg($msg, $lvl, $fh) | ||||||
| 85 | |||||||
| 86 | Input variables: | ||||||
| 87 | |||||||
| 88 | $msg - the message to be displayed. No newline | ||||||
| 89 | is needed in the end of the message. It | ||||||
| 90 | will add the newline code at the end of | ||||||
| 91 | the message. | ||||||
| 92 | $lvl - the message level is assigned to the message. | ||||||
| 93 | If it is higher than the debug level, then | ||||||
| 94 | the message will not be displayed. | ||||||
| 95 | $fh - file handler, or set the file hanlder in this parameter | ||||||
| 96 | $ENV{FH_DEBUG_LOG} | ||||||
| 97 | |||||||
| 98 | Variables used or routines called: | ||||||
| 99 | |||||||
| 100 | debug_level - get debug level. | ||||||
| 101 | |||||||
| 102 | How to use: | ||||||
| 103 | |||||||
| 104 | # default msg level to 0 | ||||||
| 105 | $self->echo_msg('This is a test"); | ||||||
| 106 | # set the msg level to 2 | ||||||
| 107 | $self->echo_msg('This is a test", 2); | ||||||
| 108 | |||||||
| 109 | Return: None. | ||||||
| 110 | |||||||
| 111 | This method will display message or a hash array based on | ||||||
| 112 | I |
||||||
| 113 | or array will be displayed. If I |
||||||
| 114 | will only display the message level ($lvl) is less than or equal | ||||||
| 115 | to '2'. If you call this method without providing a message level, | ||||||
| 116 | the message level ($lvl) is default to '0'. Of course, if no message | ||||||
| 117 | is provided to the method, it will be quietly returned. | ||||||
| 118 | |||||||
| 119 | This is how you can call I |
||||||
| 120 | |||||||
| 121 | my $df = DataFax->new; | ||||||
| 122 | $df->echo_msg("This is a test"); # default the msg to level 0 | ||||||
| 123 | $df->echo_msg("This is a test",1); # assign the msg as level 1 msg | ||||||
| 124 | $df->echo_msg("Test again",2); # assign the msg as level 2 msg | ||||||
| 125 | $df->echo_msg($hrf,1); # assign $hrf as level 1 msg | ||||||
| 126 | $df->echo_msg($hrf,2); # assign $hrf as level 2 msg | ||||||
| 127 | |||||||
| 128 | If I |
||||||
| 129 | level, i.e., 0, and '1' will be displayed. The higher level messages | ||||||
| 130 | will not be displayed. | ||||||
| 131 | |||||||
| 132 | This method displays or writes the message based on debug level. | ||||||
| 133 | The filehandler is provided through $fh or $ENV{FH_DEBUG_LOG}, and | ||||||
| 134 | the outputs are written to the file. | ||||||
| 135 | |||||||
| 136 | =cut | ||||||
| 137 | |||||||
| 138 | *echoMSG = \&CGI::AppBuilder::Message::echo_msg; | ||||||
| 139 | |||||||
| 140 | sub echo_msg { | ||||||
| 141 | # my ($c_pkg,$c_fn,$c_ln) = caller; | ||||||
| 142 | # my $self = ref($_[0])?shift:(bless {},$c_pkg); | ||||||
| 143 | my $self = shift; | ||||||
| 144 | my ($msg,$lvl, $fh) = @_; | ||||||
| 145 | $fh = (exists $ENV{FH_DEBUG_LOG})?$ENV{FH_DEBUG_LOG}:""; | ||||||
| 146 | $fh = "" if !$fh || ($fh && ref($fh) !~ /(IO::File|GLOB)/); | ||||||
| 147 | if (!defined($msg)) { return; } # return if no msg | ||||||
| 148 | if (!defined($lvl)) { $lvl = 0; } # default level to 0 | ||||||
| 149 | my $class = ref($self)||$self; # get class name | ||||||
| 150 | my $dbg = $self->debug_level; # get debug level | ||||||
| 151 | if (!$dbg) { return; } # return if not debug | ||||||
| 152 | my $ref = ref($msg); | ||||||
| 153 | if ($ref eq $class || $ref =~ /(ARRAY|HASH)/) { | ||||||
| 154 | if ($lvl <= $dbg) { $self->disp_param($msg); } | ||||||
| 155 | return; | ||||||
| 156 | } | ||||||
| 157 | my $wbf = (exists $ENV{QUERY_STRING}||exists $ENV{HTTP_HOST})?1:0; | ||||||
| 158 | $msg = "$msg" if $wbf && $msg =~ /^\s*\d+\.\s+\w+/; |
||||||
| 159 | $msg =~ s/\/(\w+)\@/\/****\@/g if $msg =~ /(\w+)\/(\w+)\@(\w+)/; | ||||||
| 160 | $msg = "$msg\n"; | ||||||
| 161 | $msg =~ s/\n/ \n/gm if $wbf; |
||||||
| 162 | if ($lvl <= $dbg) { | ||||||
| 163 | if ($fh) { print $fh $msg; } else { print $msg; } | ||||||
| 164 | } | ||||||
| 165 | } | ||||||
| 166 | |||||||
| 167 | =head2 disp_param($arf,$lzp, $fh) | ||||||
| 168 | |||||||
| 169 | Input variables: | ||||||
| 170 | |||||||
| 171 | $arf - array reference | ||||||
| 172 | $lzp - number of blank space indented in left | ||||||
| 173 | $fh - file handler | ||||||
| 174 | |||||||
| 175 | Variables used or routines called: | ||||||
| 176 | |||||||
| 177 | echo_msg - print debug messages | ||||||
| 178 | debug_level - set debug level | ||||||
| 179 | disp_param - recusively called | ||||||
| 180 | |||||||
| 181 | How to use: | ||||||
| 182 | |||||||
| 183 | use CGI::AppBuilder::Message qw(:echo_msg); | ||||||
| 184 | my $self= bless {}, "main"; | ||||||
| 185 | $self->disp_param($arf); | ||||||
| 186 | |||||||
| 187 | Return: Display the content of the array. | ||||||
| 188 | |||||||
| 189 | This method recursively displays the contents of an array. If a | ||||||
| 190 | filehandler is provided through $fh or $ENV{FH_DEBUG_LOG}, the outputs | ||||||
| 191 | are written to the file. | ||||||
| 192 | |||||||
| 193 | =cut | ||||||
| 194 | |||||||
| 195 | sub disp_param { | ||||||
| 196 | my ($self, $hrf, $lzp, $fh) = @_; | ||||||
| 197 | $self->echo_msg(" -- displaying parameters..."); | ||||||
| 198 | $fh = (exists $ENV{FH_DEBUG_LOG})?$ENV{FH_DEBUG_LOG}:""; | ||||||
| 199 | $fh = "" if !$fh || ($fh && ref($fh) !~ /(IO::File|GLOB)/); | ||||||
| 200 | if (!$lzp) { $lzp = 15; } else { $lzp +=4; } | ||||||
| 201 | my $fmt; | ||||||
| 202 | if (exists $ENV{QUERY_STRING}) { | ||||||
| 203 | # $fmt = "%${lzp}s = %-30s \n"; |
||||||
| 204 | $fmt = (" " x $lzp) . "%s = %-30s \n"; |
||||||
| 205 | } else { | ||||||
| 206 | $fmt = "%${lzp}s = %-30s\n"; | ||||||
| 207 | } | ||||||
| 208 | if (!$hrf) { | ||||||
| 209 | print "Please specify an array ref.\n"; | ||||||
| 210 | return; | ||||||
| 211 | } | ||||||
| 212 | # print join "|", $self, "HRF", $hrf, ref($hrf), "\n"; | ||||||
| 213 | my ($v); | ||||||
| 214 | if (ref($hrf) eq 'HASH'|| $hrf =~ /.*=HASH/) { | ||||||
| 215 | foreach my $k (sort keys %{$hrf}) { | ||||||
| 216 | if (!defined(${$hrf}{$k})) { $v = ""; | ||||||
| 217 | } else { $v = ${$hrf}{$k}; } | ||||||
| 218 | if ($v =~ /([-\w_]+)\/(\w+)\@(\w+)/) { | ||||||
| 219 | $v =~ s{(\w+)/(\w+)\@}{$1/\*\*\*\@}g; | ||||||
| 220 | } | ||||||
| 221 | chomp $v; | ||||||
| 222 | if ($fh) { printf $fh $fmt, $k, $v; | ||||||
| 223 | } else { printf $fmt, $k, $v; } | ||||||
| 224 | if (ref($v) =~ /^(HASH|ARRAY)$/ || | ||||||
| 225 | $v =~ /.*=(HASH|ARRAY)/) { | ||||||
| 226 | my $db1 = $self->debug_level; | ||||||
| 227 | $self->debug_level(0); | ||||||
| 228 | # print "$k = ${$hrf}{$k}: @{${$hrf}{$k}}\n"; | ||||||
| 229 | $self->disp_param(${$hrf}{$k},$lzp); | ||||||
| 230 | $self->debug_level($db1); | ||||||
| 231 | if ($fh) { print $fh "\n"; } else { print "\n"; } | ||||||
| 232 | } | ||||||
| 233 | } | ||||||
| 234 | } elsif (ref($hrf) eq 'ARRAY' || $hrf =~ /.*=ARRAY/) { | ||||||
| 235 | foreach my $i (0..$#{$hrf}) { | ||||||
| 236 | if (!defined(${$hrf}[$i])) { $v = ""; | ||||||
| 237 | } else { $v = ${$hrf}[$i]; } | ||||||
| 238 | if ($v =~ /([-\w_]+)\/(\w+)\@(\w+)/) { | ||||||
| 239 | $v =~ s{(\w+)/(\w+)\@}{$1/\*\*\*\@}g; | ||||||
| 240 | } | ||||||
| 241 | chomp $v; | ||||||
| 242 | if ($fh) { printf $fh $fmt, $i, $v; | ||||||
| 243 | } else { printf $fmt, $i, $v; } | ||||||
| 244 | if (ref($v) =~ /^(HASH|ARRAY)$/ || | ||||||
| 245 | $v =~ /.*=(HASH|ARRAY)/) { | ||||||
| 246 | my $db1 = $self->debug_level; | ||||||
| 247 | $self->debug_level(0); | ||||||
| 248 | $self->disp_param(${$hrf}[$i],$lzp); | ||||||
| 249 | $self->debug_level($db1); | ||||||
| 250 | if ($fh) { print $fh "\n"; } else { print "\n"; } | ||||||
| 251 | } | ||||||
| 252 | } | ||||||
| 253 | } | ||||||
| 254 | } | ||||||
| 255 | |||||||
| 256 | =head2 set_param($var, $ar[,$val]) | ||||||
| 257 | |||||||
| 258 | Input variables: | ||||||
| 259 | |||||||
| 260 | $var - variable name | ||||||
| 261 | $ar - parameter hash or array ref | ||||||
| 262 | $val - value to be added or assigned | ||||||
| 263 | |||||||
| 264 | Variables used or routines called: | ||||||
| 265 | |||||||
| 266 | None | ||||||
| 267 | |||||||
| 268 | How to use: | ||||||
| 269 | |||||||
| 270 | use CGI::AppBuilder::Message qw(set_param); | ||||||
| 271 | my $ar = {a=>1,b=>25}; | ||||||
| 272 | my $br = [1,2,5,10]; | ||||||
| 273 | # for hash ref | ||||||
| 274 | my $va = $self->set_param('a',$ar); # set $va = 1 | ||||||
| 275 | my $v1 = $self->set_param('v1',$ar); # set $v1 = "" | ||||||
| 276 | my $v2 = $self->set_param('b',$ar); # set $v2 = 25 | ||||||
| 277 | # for array ref | ||||||
| 278 | my $v3 = $self->set_param(0,$br); # set $v3 = 1 | ||||||
| 279 | my $v4 = $self->set_param(3,$br); # set $v4 = 10 | ||||||
| 280 | # add or assign values and return array ref | ||||||
| 281 | $self->set_param('c',$ar,30); # set $ar->{c} = 30 | ||||||
| 282 | $self->set_param(5,$br,50); # set $br->[5] = 50 | ||||||
| 283 | |||||||
| 284 | Return: $r - the value in the hash or empty string or array ref. | ||||||
| 285 | |||||||
| 286 | =cut | ||||||
| 287 | |||||||
| 288 | sub set_param { | ||||||
| 289 | my ($s, $v, $r) = @_; | ||||||
| 290 | # return blank if no $v or $r is not array, hash nor object | ||||||
| 291 | return "" if $v =~ /^\s*$/ || ! ref($r); | ||||||
| 292 | if ($#_>2) { # there is a third input | ||||||
| 293 | $r->[$v] = $_[3] if $v =~ /^\d+$/ && ref($r) =~ /ARRAY/; | ||||||
| 294 | $r->{$v} = $_[3] if ref($r) =~ /HASH/ || ref $r; | ||||||
| 295 | return ; | ||||||
| 296 | } | ||||||
| 297 | return "" if $v !~ /^\d+$/ && ref($r) =~ /ARRAY/; | ||||||
| 298 | return (exists $r->[$v])?$r->[$v]:"" if ref($r) =~ /^ARRAY/; | ||||||
| 299 | # if $r = $s, then ref $r will make it sure to catch that as well | ||||||
| 300 | return (exists $r->{$v})?$r->{$v}:"" if ref($r) =~ /^HASH/||ref $r; | ||||||
| 301 | return ""; # catch all | ||||||
| 302 | } | ||||||
| 303 | |||||||
| 304 | 1; | ||||||
| 305 | |||||||
| 306 | =head1 CODING HISTORY | ||||||
| 307 | |||||||
| 308 | =over 4 | ||||||
| 309 | |||||||
| 310 | =item * Version 0.10 | ||||||
| 311 | |||||||
| 312 | Extracted methods debug_level, echo_msg, disp_param, and set_param | ||||||
| 313 | from Debug::EchoMessage. | ||||||
| 314 | |||||||
| 315 | =item * Version 0.11 | ||||||
| 316 | |||||||
| 317 | Some minor changes to echo_msg. | ||||||
| 318 | |||||||
| 319 | =back | ||||||
| 320 | |||||||
| 321 | =head1 FUTURE IMPLEMENTATION | ||||||
| 322 | |||||||
| 323 | =over 4 | ||||||
| 324 | |||||||
| 325 | =item * no plan yet | ||||||
| 326 | |||||||
| 327 | =back | ||||||
| 328 | |||||||
| 329 | =head1 AUTHOR | ||||||
| 330 | |||||||
| 331 | Copyright (c) 2004 Hanming Tu. All rights reserved. | ||||||
| 332 | |||||||
| 333 | This package is free software and is provided "as is" without express | ||||||
| 334 | or implied warranty. It may be used, redistributed and/or modified | ||||||
| 335 | under the terms of the Perl Artistic License (see | ||||||
| 336 | http://www.perl.com/perl/misc/Artistic.html) | ||||||
| 337 | |||||||
| 338 | =cut | ||||||
| 339 |