[open-ils-commits] r15026 - in trunk/Open-ILS: examples src/perlmods/OpenILS/Application src/perlmods/OpenILS/Application/Trigger src/sql/Pg src/sql/Pg/upgrade (miker)

svn at svn.open-ils.org svn at svn.open-ils.org
Wed Nov 25 13:07:17 EST 2009


Author: miker
Date: 2009-11-25 13:07:13 -0500 (Wed, 25 Nov 2009)
New Revision: 15026

Added:
   trunk/Open-ILS/src/sql/Pg/upgrade/0092.schema.action_trigger.event.user_data.sql
Modified:
   trunk/Open-ILS/examples/fm_IDL.xml
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm
   trunk/Open-ILS/src/sql/Pg/002.functions.config.sql
   trunk/Open-ILS/src/sql/Pg/002.schema.config.sql
   trunk/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql
Log:
Adding support for an opaque user_data field on Action/Trigger events:

* New column on action_trigger.event and fieldmapper field (user_data) to hold json-encoded data blob
* New optional param to event creation calls to pass said data blob
   (related, added a granularity param to targeted event creator -- pass undef in that position to ignore def granularity, as before)
* New grouped event environment array, called user_data, carrying the peer user_data fields to target and event
* New grouped event method, environment.EventProcessor.findEvent(), for grabbing a specific Event instance (fully fleshed)



Modified: trunk/Open-ILS/examples/fm_IDL.xml
===================================================================
--- trunk/Open-ILS/examples/fm_IDL.xml	2009-11-25 16:49:13 UTC (rev 15025)
+++ trunk/Open-ILS/examples/fm_IDL.xml	2009-11-25 18:07:13 UTC (rev 15026)
@@ -730,6 +730,7 @@
 			<field reporter:label="Update Time" name="update_time" reporter:datatype="timestamp"/>
 			<field reporter:label="Complete Time" name="complete_time" reporter:datatype="timestamp"/>
 			<field reporter:label="State" name="state" reporter:datatype="text"/>
+			<field reporter:label="User Data" name="user_data" reporter:datatype="text"/>
 			<field reporter:label="Template Output" name="template_output" reporter:datatype="link"/>
 			<field reporter:label="Error Output" name="error_output" reporter:datatype="text"/>
 			<field reporter:label="Asynchronous Output" name="async_output" reporter:datatype="link"/>

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm	2009-11-25 16:49:13 UTC (rev 15025)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm	2009-11-25 18:07:13 UTC (rev 15026)
@@ -1,6 +1,7 @@
 package OpenILS::Application::Trigger::Event;
 use strict; use warnings;
 use OpenSRF::EX qw/:try/;
+use OpenSRF::Utils::JSON;
 
 use OpenSRF::Utils::Logger qw/$logger/;
 
@@ -56,6 +57,9 @@
         ])
     );
 
+    $self->user_data(OpenSRF::Utils::JSON->JSON2perl( $self->event->user_data ))
+        if (defined( $self->event->user_data ));
+
     if ($self->event->state eq 'valid') {
         $self->valid(1);
     } elsif ($self->event->state eq 'invalid') {
@@ -208,6 +212,15 @@
     return $self->{cleanedup};
 }
 
+sub user_data {
+    my $self = shift;
+    return undef unless (ref $self);
+
+    my $r = shift;
+    $self->{user_data} = $r if (defined $r);
+    return $self->{user_data};
+}
+
 sub reacted {
     my $self = shift;
     return undef unless (ref $self);
@@ -368,8 +381,9 @@
         $self->environment->{target} = $self->target;
         $self->environment->{event} = $self->event;
         $self->environment->{template} = $self->event->event_def->template;
+        $self->environment->{user_data} = $self->user_data;
 
-	$current_environment = $self->environment;
+        $current_environment = $self->environment;
 
         $self->environment->{params}{ $_->param } = $compartment->reval($_->value) for ( @{$self->event->event_def->params} );
     

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm	2009-11-25 16:49:13 UTC (rev 15025)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm	2009-11-25 18:07:13 UTC (rev 15026)
@@ -230,6 +230,17 @@
     return $ok || undef;
 }
 
+sub findEvent {
+    my $self = shift;
+    my $member = shift;
+
+    $member = $member->id if (ref($member));
+
+    my @list = grep { $member == $_->id } @{ $self->events };
+
+    return shift(@list);
+}
+
 sub build_environment {
     my $self = shift;
     my $env = $self->environment;
@@ -237,6 +248,7 @@
     $$env{EventProcessor} = $self;
     $$env{target} = [];
     $$env{event} = [];
+    $$env{user_data} = [];
     for my $e ( @{ $self->events } ) {
         for my $env_part ( keys %{ $e->environment } ) {
             next if ($env_part eq 'EventProcessor');
@@ -244,6 +256,8 @@
                 push @{ $$env{target} }, $e->environment->{target};
             } elsif ($env_part eq 'event') {
                 push @{ $$env{event} }, $e->environment->{event};
+            } elsif ($env_part eq 'user_data') {
+                push @{ $$env{user_data} }, $e->environment->{user_data};
             } else {
                 $$env{$env_part} = $e->environment->{$env_part};
             }

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm	2009-11-25 16:49:13 UTC (rev 15025)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm	2009-11-25 18:07:13 UTC (rev 15026)
@@ -4,6 +4,7 @@
 use base qw/OpenILS::Application/;
 
 use OpenSRF::EX qw/:try/;
+use OpenSRF::Utils::JSON;
 
 use OpenSRF::AppSession;
 use OpenSRF::Utils::SettingsClient;
@@ -30,6 +31,8 @@
     my $key = shift;
     my $target = shift;
     my $location = shift;
+    my $granularity = shift;
+    my $user_data = shift;
 
     my $ident = $target->Identity;
     my $ident_value = $target->$ident();
@@ -58,6 +61,7 @@
     );
 
     for my $def ( @$defs ) {
+        next if ($granularity && $def->granularity ne $granularity );
 
         if ($def->usr_field && $def->opt_in_setting) {
             my $ufield = $def->usr_field;
@@ -93,6 +97,7 @@
         $event->target( $ident_value );
         $event->event_def( $def->id );
         $event->run_time( $date->strftime( '%F %T%z' ) );
+        $event->user_data( OpenSRF::Utils::JSON->perl2JSON($user_data) ) if (defined($user_data));
 
         $editor->create_action_trigger_event( $event );
 
@@ -117,6 +122,7 @@
     my $definitions = shift;
     my $target = shift;
     my $location = shift;
+    my $user_data = shift;
 
     my $ident = $target->Identity;
     my $ident_value = $target->$ident();
@@ -177,6 +183,7 @@
         $event->target( $ident_value );
         $event->event_def( $def->id );
         $event->run_time( $date->strftime( '%F %T%z' ) );
+        $event->user_data( OpenSRF::Utils::JSON->perl2JSON($user_data) ) if (defined($user_data));
 
         $editor->create_action_trigger_event( $event );
 
@@ -373,6 +380,7 @@
     my $location_field = shift; # where to look for event_def.owner filtering ... circ_lib, for instance, where hook.core_type = circ
     my $filter = shift || {};
     my $granularity = shift;
+    my $user_data = shift;
 
     my $active = ($self->api_name =~ /active/o) ? 1 : 0;
     if ($active && !keys(%$filter)) {
@@ -481,6 +489,7 @@
             $event->target( $o_id );
             $event->event_def( $def->id );
             $event->run_time( $run_time );
+            $event->user_data( OpenSRF::Utils::JSON->perl2JSON($user_data) ) if (defined($user_data));
 
             $editor->create_action_trigger_event( $event );
 

Modified: trunk/Open-ILS/src/sql/Pg/002.functions.config.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/002.functions.config.sql	2009-11-25 16:49:13 UTC (rev 15025)
+++ trunk/Open-ILS/src/sql/Pg/002.functions.config.sql	2009-11-25 18:07:13 UTC (rev 15026)
@@ -116,5 +116,12 @@
     SELECT $2;
 $$ LANGUAGE SQL;
 
+CREATE OR REPLACE FUNCTION is_json (TEXT) RETURNS BOOL AS $func$
+    use JSON::XS;
+    my $json = shift();
+    eval { decode_json( $json ) };
+    return $@ ? 0 : 1;
+$func$ LANGUAGE PLPERLU;
+
 COMMIT;
 

Modified: trunk/Open-ILS/src/sql/Pg/002.schema.config.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/002.schema.config.sql	2009-11-25 16:49:13 UTC (rev 15025)
+++ trunk/Open-ILS/src/sql/Pg/002.schema.config.sql	2009-11-25 18:07:13 UTC (rev 15026)
@@ -51,7 +51,7 @@
     install_date    TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW()
 );
 
-INSERT INTO config.upgrade_log (version) VALUES ('0091'); -- berick
+INSERT INTO config.upgrade_log (version) VALUES ('0092'); -- miker
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,

Modified: trunk/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql	2009-11-25 16:49:13 UTC (rev 15025)
+++ trunk/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql	2009-11-25 18:07:13 UTC (rev 15026)
@@ -155,6 +155,7 @@
     complete_time   TIMESTAMPTZ,
     update_process  INT,
     state           TEXT        NOT NULL DEFAULT 'pending' CHECK (state IN ('pending','invalid','found','collecting','collected','validating','valid','reacting','reacted','cleaning','complete','error')),
+    user_data       TEXT        CHECK (user_data IS NULL OR is_json( user_data )),
     template_output BIGINT      REFERENCES action_trigger.event_output (id),
     error_output    BIGINT      REFERENCES action_trigger.event_output (id),
     async_output    BIGINT      REFERENCES action_trigger.event_output (id)

Added: trunk/Open-ILS/src/sql/Pg/upgrade/0092.schema.action_trigger.event.user_data.sql
===================================================================
--- trunk/Open-ILS/src/sql/Pg/upgrade/0092.schema.action_trigger.event.user_data.sql	                        (rev 0)
+++ trunk/Open-ILS/src/sql/Pg/upgrade/0092.schema.action_trigger.event.user_data.sql	2009-11-25 18:07:13 UTC (rev 15026)
@@ -0,0 +1,8 @@
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0092'); -- miker
+
+ALTER TABLE action_trigger.event ADD COLUMN user_data TEXT CHECK (user_data IS NULL OR is_json( user_data ));
+
+COMMIT;
+



More information about the open-ils-commits mailing list