]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm
return the underlying atev, which was the original intention
[Evergreen.git] / Open-ILS / src / perlmods / OpenILS / Application / Trigger / EventGroup.pm
1 package OpenILS::Application::Trigger::EventGroup;
2 use strict; use warnings;
3 use OpenILS::Application::Trigger::Event;
4 use base 'OpenILS::Application::Trigger::Event';
5 use OpenSRF::EX qw/:try/;
6
7 use OpenSRF::Utils::Logger qw/:level/;
8
9 use OpenILS::Utils::Fieldmapper;
10 use OpenILS::Utils::CStoreEditor q/:funcs/;
11 use OpenILS::Application::Trigger::ModRunner;
12
13 my $log = 'OpenSRF::Utils::Logger';
14
15 sub new {
16     my $class = shift;
17     my @ids = @_;
18     $class = ref($class) || $class;
19
20     my $editor = new_editor(xact=>1);
21
22     my $self = bless {
23         environment => {},
24         events      => [
25             map {
26                 ref($_) ?
27                     do { $_->standalone(0); $_->editor($editor); $_ } :
28                     OpenILS::Application::Trigger::Event->new($_, $editor)
29             } @ids
30         ],
31         ids         => \@ids,
32         editor      => $editor
33     } => $class;
34
35
36     $self->editor->xact_commit; # flush out those updates
37     $self->editor->xact_begin;
38
39     return $self;
40 }
41
42 sub react {
43     my $self = shift;
44
45     return $self if (defined $self->reacted);
46
47     if ($self->valid) {
48         $self->update_state( 'reacting') || die 'Unable to update event group state';
49         $self->build_environment;
50
51         try {
52             $self->reacted(
53                 OpenILS::Application::Trigger::ModRunner::Reactor
54                     ->new( $self->event->event_def->reactor, $self->environment )
55                     ->run
56                     ->final_result
57             );
58         } otherwise {
59             $log->error( shift() );
60             $self->update_state( 'error' ) || die 'Unable to update event group state';
61         };
62
63         if (defined $self->reacted) {
64             $self->update_state( 'reacted' ) || die 'Unable to update event group state';
65         } else {
66             $self->update_state( 'error' ) || die 'Unable to update event group state';
67         }
68     } else {
69         $self->{reacted} = undef;
70     }
71     return $self;
72 }
73
74 sub validate {
75     my $self = shift;
76
77     return $self if (defined $self->valid);
78
79     $self->update_state( 'validating') || die 'Unable to update event group state';
80     $self->editor->xact_begin;
81
82     my @valid_events;
83     try {
84         for my $event ( @{ $self->events } ) {
85             $event->validate;
86             push @valid_events, $event if ($event->valid);
87         }
88         $self->valid(1) if (@valid_events);
89         $self->{events} = \@valid_events;
90         $self->editor->xact_commit;
91     } otherwise {
92         $log->error( shift() );
93         $self->editor->xact_rollback;
94         $self->update_state( 'error' ) || die 'Unable to update event group state';
95     };
96
97     return $self;
98 }
99  
100 sub cleanedup {
101     my $self = shift;
102     return undef unless (ref $self);
103
104     my $c = shift;
105     $self->{cleanedup} = $c if (defined $c);
106     return $self->{cleanedup};
107 }
108
109 sub reacted {
110     my $self = shift;
111     return undef unless (ref $self);
112
113     my $r = shift;
114     $self->{reacted} = $r if (defined $r);
115     return $self->{reacted};
116 }
117
118 sub valid {
119     my $self = shift;
120     return undef unless (ref $self);
121
122     my $v = shift;
123     $self->{valid} = $v if (defined $v);
124     return $self->{valid};
125 }
126
127 sub event {
128     my $self = shift;
129     return undef unless (ref $self);
130
131     return $self->{events}[0]->event;
132 }
133
134 sub events {
135     my $self = shift;
136     return undef unless (ref $self);
137
138     return $self->{events};
139 }
140
141 sub ids {
142     my $self = shift;
143     return undef unless (ref $self);
144
145     return $self->{ids};
146 }
147
148 sub environment {
149     my $self = shift;
150     return undef unless (ref $self);
151
152     my $e = shift;
153     $self->{environment} = $e if (defined $e);
154     return $self->{environment};
155 }
156
157 sub editor {
158     my $self = shift;
159     return undef unless (ref $self);
160
161     my $e = shift;
162     $self->{editor} = $e if (defined $e);
163     return $self->{editor};
164 }
165
166 sub unfind {
167     my $self = shift;
168     return undef unless (ref $self);
169
170     die 'Cannot unfind a reacted event group' if (defined $self->reacted);
171
172     $self->update_state( 'pending' ) || die 'Unable to update event group state';
173     $self->{events} = undef;
174     return $self;
175 }
176
177 sub update_state {
178     my $self = shift;
179     return undef unless ($self && ref $self);
180
181     my $state = shift;
182     return undef unless ($state);
183
184     $self->editor->xact_begin || return undef;
185
186     my @oks;
187     my $ok;
188     for my $event ( @{ $self->events } ) {
189         my $e = $self->editor->retrieve_action_trigger_event( $event->id );
190         $e->start_time( 'now' ) unless $e->start_time;
191         $e->update_time( 'now' );
192         $e->update_process( $$ );
193         $e->state( $state );
194     
195         $e->clear_start_time() if ($e->state eq 'pending');
196     
197         my $ok = $self->editor->update_action_trigger_event( $e );
198         if ($ok) {
199             push @oks, $ok;
200         }
201     }
202
203     if (scalar(@oks) < scalar(@{ $self->ids })) {
204         $self->editor->xact_rollback;
205         return undef;
206     } else {
207         $ok = $self->editor->xact_commit;
208     }
209
210     if ($ok) {
211         for my $event ( @{ $self->events } ) {
212             my $updated = $self->editor->data;
213             $event->start_time( $updated->start_time );
214             $event->update_time( $updated->update_time );
215             $event->update_process( $updated->update_process );
216             $event->state( $updated->state );
217         }
218     }
219
220     return $ok || undef;
221 }
222
223 sub build_environment {
224     my $self = shift;
225     my $env = $self->environment;
226
227     $$env{target} = [];
228     $$env{event} = [];
229     for my $e ( @{ $self->events } ) {
230         for my $env_part ( keys %{ $e->environment } ) {
231             if ($env_part eq 'target') {
232                 push @{ $$env{target} }, $e->environment->{target};
233             } elsif ($env_part eq 'event') {
234                 push @{ $$env{event} }, $e->environment->{event};
235             } else {
236                 $$env{$env_part} = $e->environment->{$env_part};
237             }
238         }
239     }
240
241     return $self;
242 }
243
244 1;