Receive observer - how to get the applied_workitem

33 views
Skip to first unread message

Danny Fullerton

unread,
Apr 9, 2013, 10:37:04 PM4/9/13
to openwfe...@googlegroups.com
Hello ruote-list,

I'm trying to create an audit trail for each process launched.

Without going into details, I have to provide a complete map of the
process (i.e. all the possible paths), the actual path taken (time and
order) and the value added/modified/deleted from the workitem by each
participant.

My idea so far is to use a msg_launch observer, add the interpreted
structure of the process (msg['tree']) within the storage itself and
secondly, compare the applied_workitem with the current workitem and
save any participant's modification back in this structure using a
msg_receive observer (i.e. identifing the actual path taken by the
process and any change). Finally, the structure would be stored in it's
real/final database using a msg_terminated observer.

The only problem I face so far is putting my hand on the
applied_workitem from within the receiver observer. I'm pretty sure it's
easy but I fail miserably...

I tried the Receiver Mixin, Ruote class directly (e.g.
Ruote::Exp::FlowExpression::fetch(@context, msg['fei'])) and poking
around the storage but just can't put my hands on it. It seems like
whenever my msg_receive observer capture the workitem, the
applied_workitem is save in the previous fei expression (e.g. 0_0_0 ->
0_0 or 0_0_1 -> 0_0_0).

Here's my code so far.
````
def on_msg_launch(msg)
doc = {
'type' => 'audit_trail',
'_id' => msg['wfid'],
'trail' => msg['tree']
}

@context.storage.put(doc)
end

def on_msg_receive(msg)
return unless accept?(msg)

doc = @context.storage.get('audit_trail', msg['wfid'])

# workitem = msg['workitem']
# applied_workitem = ??applied_workitem??
diff = recursive_diff(applied_workitem, workitem)
# put the diff at the proper location within the trail struct (i.e.
based on expid)
doc = {
'type' => 'audit_trail',
'_id' => msg['wfid'],
'trail' => doc['tree']
}

@context.storage.put(doc)
end

def on_msg_terminated(msg)
doc = @context.storage.get('audit_trail', msg['wfid'])

if doc
trail = {
'id' => msg['wfid'],
'name' => msg['wf_name'],
'version' => msg['wf_revision'],
'at' => msg['wf_launched_at'],
'trail' => doc['trail']
}

#db.save(trail)
@context.storage.delete(doc)
end
end
````

Any idea?

Also, any advice? Is there a better way of doing this is or does it
sounds good? Any help would be appreciated.

p.s. I hope I'll be able to extract this to a gem.

--
Danny Fullerton
Founder
Mantor Organization


signature.asc

John Mettraux

unread,
Apr 10, 2013, 12:21:55 AM4/10/13
to openwfe...@googlegroups.com

On Tue, Apr 09, 2013 at 10:37:04PM -0400, Danny Fullerton wrote:
>
> (...)
>
> The only problem I face so far is putting my hand on the
> applied_workitem from within the receiver observer. I'm pretty sure it's
> easy but I fail miserably...

Hello Danny,

would that help:

https://github.com/jmettraux/ruote/commit/69c338af5a53248c6c097

?

It uses observer#on_pre_msg_receive(msg) instead of #on_msg_receive(msg).


> p.s. I hope I'll be able to extract this to a gem.

That'd be great!


Best regards,

--
John Mettraux - http://lambda.io/jmettraux

Reply all
Reply to author
Forward
0 new messages