1 package OpenILS::Application::Trigger::Event;
2 use OpenSRF::EX qw/:try/;
4 use OpenSRF::Utils::Logger qw/:level/;
6 use OpenILS::Utils::Fieldmapper;
7 use OpenILS::Utils::CStoreEditor q/:funcs/;
8 use OpenILS::Application::Trigger::ModRunner;
10 my $log = 'OpenSRF::Utils::Logger';
15 $class = ref($class) || $class;
17 my $self = bless { id => $id, editor => new_editor() } => $class;
26 return $self if ($self->event);
29 $self->environment( {} );
31 return $self if (!$self->id);
34 $self->editor->retrieve_action_trigger_event([
38 atev => [ 'event_def' ],
39 atevdef => [ qw/hook validator reactor cleanup_success cleanup_failure/ ]
45 my $class = $self->_fm_class_by_hint( $self->event->event_def->hook->core_type );
47 my $meth = "retreive_" . $class;
48 $meth =~ s/Fieldmapper:://;
51 $self->target( $self->editor->$meth( $self->event->target ) );
59 if (defined $self->reacted) {
60 $self->update_state( 'cleaning') || die 'Unable to update event state';
62 my $cleanup = $self->reacted ? $self->event->event_def->cleanup_success : $self->event->event_def->cleanup_failure;
64 OpenILS::Application::Trigger::ModRunner::Cleanup
65 ->new( $cleanup, $self->environment )
70 $log->error( shift() );
71 $self->update_state( 'error' ) || die 'Unable to update event state';
74 if ($self->cleanedup) {
75 $self->update_state( 'complete' ) || die 'Unable to update event state';
77 $self->update_state( 'error' ) || die 'Unable to update event state';
81 $self->{cleanedup} = undef;
90 if ($self->event->event_def->group_field) { # can't react individually to a grouped definition
91 $self->{reacted} = undef;
93 $self->update_state( 'reacting') || die 'Unable to update event state';
96 OpenILS::Application::Trigger::ModRunner::Reactor
97 ->new( $self->event->event_def->reactor, $self->environment )
102 $log->error( shift() );
103 $self->update_state( 'error' ) || die 'Unable to update event state';
106 if (defined $self->reacted) {
107 $self->update_state( 'reacted' ) || die 'Unable to update event state';
109 $self->update_state( 'error' ) || die 'Unable to update event state';
113 $self->{reacted} = undef;
121 return $self if (defined $self->valid);
123 if ($self->build_environment->environment->{complete}) {
124 $self->update_state( 'validating') || die 'Unable to update event state';
127 OpenILS::Application::Trigger::ModRunner::Validator
128 ->new( $self->event->event_def->validator, $self->environment )
133 $log->error( shift() );
134 $self->update_state( 'error' ) || die 'Unable to update event state';
137 if (defined $self->valid) {
139 $self->update_state( 'valid' ) || die 'Unable to update event state';
141 $self->update_state( 'invalid' ) || die 'Unable to update event state';
144 $self->update_state( 'error' ) || die 'Unable to update event state';
147 $self->{valid} = undef
155 return undef unless (ref $self);
158 $self->{cleanedup} = $c if (defined $c);
159 return $self->{cleanedup};
164 return undef unless (ref $self);
167 $self->{reacted} = $r if (defined $r);
168 return $self->{reacted};
173 return undef unless (ref $self);
176 $self->{valid} = $v if (defined $v);
177 return $self->{valid};
182 return undef unless (ref $self);
185 $self->{event} = $e if (defined $e);
186 return $self->{event};
191 return undef unless (ref $self);
194 $self->{id} = $i if (defined $i);
200 return undef unless (ref $self);
203 $self->{environment} = $e if (defined $e);
204 return $self->{environment};
209 return undef unless (ref $self);
212 $self->{editor} = $e if (defined $e);
213 return $self->{editor};
218 return undef unless (ref $self);
221 $self->{target} = $t if (defined $t);
222 return $self->{target};
227 return undef unless ($self && ref $self);
230 return undef unless ($state);
232 $self->editor->xact_begin || return undef;
234 my $e = $self->editor->retrieve_action_trigger_event( $self->id );
235 $e->update_time( 'now' );
236 $e->update_process( $$ );
238 $self->editor->update_action_trigger_event( $e );
240 return $self->editor->xact_commit || undef;
243 sub build_environment {
245 return $self if ($self->environment->{complete});
247 $self->update_state( 'collecting') || die 'Unable to update event state';
251 $self->environment->{target} = $self->target;
252 $self->environment->{event} = $self->event;
253 $self->environment->{template} = $self->event->event_def->template;
255 my @env_list = $self->editor->search_action_trigger_environment([
256 { event_def => $self->event->event_def },
257 { flesh => 1, flesh_fields => ['collector'] }
259 my @param_list = $self->editor->search_action_trigger_params( { event_def => $self->event->event_def } );
261 $self->environment->{params}{ $_->param } = eval $_->value for ( @param_list );
263 for my $e ( @env_list ) {
265 @path = split('.', $e->path) if ($e->path);
266 @label = split('.', $e->label) if ($e->label);
268 $self->_object_by_path( $self->event->target, $e->collector, \@label, \@path );
271 $self->environment->{complete} = 1;
273 $log->error( shift() );
274 $self->update_state( 'error' ) || die 'Unable to update event state';
277 if ($self->environment->{complete}) {
278 $self->update_state( 'collected' ) || die 'Unable to update event state';
280 $self->update_state( 'error' ) || die 'Unable to update event state';
286 sub _fm_class_by_hint {
291 Fieldmapper->publish_fieldmapper->{$_}->{hint} eq $hint
292 } keys %{ Fieldmapper->publish_fieldmapper };
297 sub _object_by_path {
300 my $collector = shift;
304 my $step = shift(@$path);
306 my $fhint = Fieldmapper->publish_fieldmapper->{$context->class_name}{links}{$step}{class};
307 my $fclass = $self->_fm_class_by_hint( $fhint );
309 my $ffield = Fieldmapper->publish_fieldmapper->{$context->class_name}{links}{$step}{key};
310 my $rtype = Fieldmapper->publish_fieldmapper->{$context->class_name}{links}{$step}{reltype};
312 my $meth = 'retrieve_';
315 if ($rtype eq 'has_many') {
318 $lfield = $context->Identity;
322 $meth =~ s/Fieldmapper:://;
325 my $obj = $self->editor->$meth( { $ffield => $context->$lfield() } );
331 $obj_list = [$obj] if ($obj);
336 $self->_object_by_path( $_, $collector, $label, $path ) for (@$obj_list);
338 $obj = $$obj_list[0] if (!$multi);
339 $context->$step( $obj ) if ($obj && !$label);
344 my $obj_list = [$obj] if ($obj && !$multi);
345 $obj_list = $obj if ($multi);
348 for my $o ( @$obj_list ) {
350 OpenILS::Application::Trigger::ModRunner::Collector
351 ->new( $collector, $o )
357 $obj = $new_obj_list[0];
359 $obj = \@new_obj_list;
364 my $node = $self->environment;
365 my $i = 0; my $max = scalar(@$label) - 1;
366 for (; $i < $max; $i++) {
367 my $part = $$label[$i];
368 $$node{$part} ||= {};
369 $node = $$node{$part};
371 $$node{$$label[-1]} = $obj;
373 $context->$step( $obj ) if ($obj);