1 package OpenILS::Application::Trigger::EventGroup;
2 use OpenILS::Application::Trigger::Event;
3 use base 'OpenILS::Application::Trigger::Event';
4 use strict; use warnings;
5 use OpenSRF::EX qw/:try/;
7 use OpenSRF::Utils::Logger qw/:logger/;
9 use OpenILS::Utils::Fieldmapper;
10 use OpenILS::Utils::CStoreEditor q/:funcs/;
11 use OpenILS::Application::Trigger::ModRunner;
13 my $log = 'OpenSRF::Utils::Logger';
18 $class = ref($class) || $class;
20 my $editor = new_editor(xact=>1);
27 do { $_->standalone(0); $_->editor($editor); $_ } :
28 OpenILS::Application::Trigger::Event->new($_, $editor)
36 $self->editor->xact_commit; # flush out those updates
37 $self->editor->xact_begin;
45 return $self if (defined $self->reacted);
48 $self->update_state( 'reacting') || die 'Unable to update event group state';
49 $self->build_environment;
53 OpenILS::Application::Trigger::ModRunner::Reactor
54 ->new( $self->event->event_def->reactor, $self->environment )
59 $log->error( shift() );
60 $self->update_state( 'error' ) || die 'Unable to update event group state';
63 if (defined $self->reacted) {
64 $self->update_state( 'reacted' ) || die 'Unable to update event group state';
66 $self->update_state( 'error' ) || die 'Unable to update event group state';
69 $self->{reacted} = undef;
77 return $self if (defined $self->valid);
79 $self->update_state( 'validating') || die 'Unable to update event group state';
80 $self->editor->xact_begin;
84 for my $event ( @{ $self->events } ) {
86 push @valid_events, $event if ($event->valid);
88 $self->valid(1) if (@valid_events);
89 $self->{events} = \@valid_events;
90 $self->editor->xact_commit;
92 $log->error( shift() );
93 $self->editor->xact_rollback;
94 $self->update_state( 'error' ) || die 'Unable to update event group state';
102 return undef unless (ref $self);
105 $self->{cleanedup} = $c if (defined $c);
106 return $self->{cleanedup};
111 return undef unless (ref $self);
114 $self->{reacted} = $r if (defined $r);
115 return $self->{reacted};
120 return undef unless (ref $self);
123 $self->{valid} = $v if (defined $v);
124 return $self->{valid};
129 return undef unless (ref $self);
131 return $self->{events}[0];
136 return undef unless (ref $self);
138 return $self->{events};
143 return undef unless (ref $self);
150 return undef unless (ref $self);
153 $self->{environment} = $e if (defined $e);
154 return $self->{environment};
159 return undef unless (ref $self);
162 $self->{editor} = $e if (defined $e);
163 return $self->{editor};
168 return undef unless (ref $self);
170 die 'Cannot unfind a reacted event group' if (defined $self->reacted);
172 $self->update_state( 'pending' ) || die 'Unable to update event group state';
173 $self->{events} = undef;
179 return undef unless ($self && ref $self);
182 return undef unless ($state);
184 $self->editor->xact_begin || return undef;
187 for my $event ( @{ $self->events } ) {
188 my $e = $self->editor->retrieve_action_trigger_event( $event->id );
189 $e->start_time( 'now' ) unless $e->start_time;
190 $e->update_time( 'now' );
191 $e->update_process( $$ );
194 $e->clear_start_time() if ($e->state eq 'pending');
196 my $ok = $self->editor->update_action_trigger_event( $e );
202 if (scalar(@oks) < scalar(@{ $self->ids })) {
203 $self->editor->xact_rollback;
206 $ok = $self->editor->xact_commit;
210 for my $event ( @{ $self->events } ) {
211 my $updated = $self->editor->data;
212 $event->start_time( $updated->start_time );
213 $event->update_time( $updated->update_time );
214 $event->update_process( $updated->update_process );
215 $event->state( $updated->state );
222 sub build_environment {
224 my $env = $self->environment;
228 for my $e ( @{ $self->events } ) {
229 for my $evn_part ( keys %{ $e->environment } ) {
230 if ($env_part eq 'target') {
231 push @{ $$evn{target} }, $e->environment->{target};
232 } elsif ($env_part eq 'event') {
233 push @{ $$evn{event} }, $e->environment->{event};
235 $$evn{$evn_part} = $e->environment->{$evn_part};