1 package OpenILS::Application::Trigger;
2 use OpenILS::Application;
3 use base qw/OpenILS::Application/;
5 use OpenSRF::EX qw/:try/;
7 use OpenSRF::AppSession;
8 use OpenSRF::Utils::SettingsClient;
9 use OpenSRF::Utils::Logger qw/:level/;
11 use OpenILS::Utils::Fieldmapper;
12 use OpenILS::Utils::CStoreEditor q/:funcs/;
13 use OpenILS::Application::Trigger::ModRunner;
16 my $log = 'OpenSRF::Utils::Logger';
23 my $environment = shift || {};
24 my $cstore = new_editor();
26 my $def = $cstore->retrieve_action_trigger_event_definition( $event->event_def );
27 my $hook = $cstore->retrieve_action_trigger_hook( $def->hook );
28 my $class = _fm_class_by_hint( $hook->core_type );
30 my $meth = "retreive_" . $class;
31 $meth =~ s/Fieldmapper:://;
34 my $target = $cstore->$meth( $event->target );
35 $$environment{target} = $target;
36 $$environment{event} = $event->to_bare_hash;
38 my @env_list = $cstore->search_action_trigger_environment( { event_def => $event->event_def } );
39 my @param_list = $cstore->search_action_trigger_params( { event_def => $event->event_def } );
41 $$environment{params}{ $_->param } = eval $_->value for ( @param_list );
43 for my $e ( @env_list ) {
45 @path = split('.', $e->path) if ($e->path);
46 @label = split('.', $e->label) if ($e->label);
48 my $collector = $e->collector;
49 _object_by_path( $cstore, $target, $collector, \@label, $environment, @path );
55 sub _fm_class_by_hint {
59 OpenILS::Utils::Fieldmapper->publish_fieldmapper->{$_}->{hint} eq $hint
60 } keys %{ OpenILS::Utils::Fieldmapper->publish_fieldmapper };
68 my $collector = shift;
73 my $step = shift(@path);
75 my $fhint = OpenILS::Utils::Fieldmapper->publish_fieldmapper->{$context->class_name}{links}{$step}{class};
76 my $fclass = _fm_class_by_hint( $fhint );
78 my $ffield = OpenILS::Utils::Fieldmapper->publish_fieldmapper->{$context->class_name}{links}{$step}{key};
79 my $rtype = OpenILS::Utils::Fieldmapper->publish_fieldmapper->{$context->class_name}{links}{$step}{reltype};
81 my $meth = 'retrieve_';
84 if ($rtype eq 'has_many') {
87 $lfield = $context->Identity;
91 $meth =~ s/Fieldmapper:://;
94 my $obj = $cstore->$meth( { $ffield => $context->$lfield() } );
100 $obj_list = [$obj] if ($obj);
105 _object_by_path( $cstore, $_, $collector, $label, $env, @path ) for (@$obj_list);
107 $obj = $$obj_list[0] if (!$multi);
108 $context->$step( $obj ) if ($obj && !$label);
113 my $obj_list = [$obj] if ($obj && !$multi);
114 $obj_list = $obj if ($multi);
117 for my $o ( @$obj_list ) {
119 OpenILS::Application::Trigger::ModRunner
120 ->new( $collector, $o )
126 $obj = $new_obj_list[0];
128 $obj = \@new_obj_list;
134 my $i = 0; my $max = scalar(@$label) - 1;
135 for (; $i < $max; $i++) {
136 my $part = $$label[$i];
137 $$node{$part} ||= {};
138 $node = $$node{$part};
140 $$node{$$label[-1]} = $obj;
142 $context->$step( $obj ) if ($obj);