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