go one deeper in the caller stack so we're not repeating
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Event.pm
1 package OpenILS::Event;
2 # vim:noet:ts=4
3 use strict; use warnings;
4 use XML::LibXML;
5 use OpenSRF::Utils::SettingsClient;
6 use OpenSRF::Utils::Logger;
7 my $logger = "OpenSRF::Utils::Logger";
8
9
10 # Creates a new Event object.  
11 # The first param is the event name
12 # Following the first param is an optional hash of params:
13 #               perm => the name of the permission error for permimssion errors
14 #               permloc => the location of the permission error for permission errors
15 #               payload => the payload to be returned on successfull events
16
17
18 my $events = undef;
19 my $descs = undef;
20
21 sub new {
22         my( $class, $event, %params ) = @_;
23
24         _load_events() unless $events;
25
26         if( $event ne 'SUCCESS' ) {
27                 $logger->info("Returning non-success event object: $event ");  
28         }
29
30         my $e = $events->{$event};
31         throw OpenSRF::EX 
32                 ("No event defined with textcode: $event") unless defined $e;
33
34         my( $m, $f, $l ) = caller(0);
35         my( $mm, $ff, $ll ) = caller(1);
36         my( $mmm, $fff, $lll ) = caller(2);
37
38         $f  ||= "";
39         $l  ||= "";
40         $ff ||= "";
41         $ll ||= "";
42         $fff ||= "";
43         $lll ||= "";
44
45         my $lang = 'en-US'; # assume english for now
46
47         my $t = CORE::localtime();
48
49         return { 
50                 ilsevent                => $e, 
51                 textcode                => $event, 
52                 stacktrace      => "$f:$l $ff:$ll $fff:$lll", 
53                 desc                    => $descs->{$lang}->{$e},
54                 servertime      => $t,
55                 pid                     => $$, %params };
56 }
57
58 sub _load_events {
59         my $settings_client = OpenSRF::Utils::SettingsClient->new();
60         my $eventsxml =  $settings_client->config_value( "ils_events" );
61
62         if(!$eventsxml) { 
63                 throw OpenSRF::EX ("No ils_events file found in settings config"); 
64         }
65
66         $logger->info("Loading events xml file $eventsxml");
67
68         my $doc = XML::LibXML->new->parse_file($eventsxml);
69
70         my @nodes = $doc->documentElement->findnodes('//event');
71         for my $node (@nodes) {
72                 $events->{$node->getAttribute('textcode')} = 
73                         $node->getAttribute('code');
74         }
75
76         $descs = {};
77         my @desc = $doc->documentElement->findnodes('//desc');
78         for my $d (@desc) {
79                 my $lang = $d->getAttributeNS('http://www.w3.org/XML/1998/namespace', 'lang');
80                 my $code = $d->parentNode->getAttribute('code');
81                 unless ($descs && $lang && exists $descs->{$lang}) {
82                         $descs->{$lang} = {};
83                         if (!$descs) {
84                                 $logger->error("No error description nodes found in $eventsxml.");
85                         }
86                         if (!$lang) {
87                                 $logger->error("No xml:lang attribute found for node in $eventsxml.");
88                         }
89                 }
90                 $descs->{$lang}->{$code} = $d->textContent;
91         }
92 }
93
94
95
96
97 1;