ruote 2.1.10 → 2.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.txt +51 -1
- data/CREDITS.txt +9 -0
- data/README.rdoc +13 -0
- data/Rakefile +50 -21
- data/TODO.txt +42 -4
- data/examples/pong.rb +37 -0
- data/lib/ruote/context.rb +19 -9
- data/lib/ruote/engine/process_error.rb +10 -0
- data/lib/ruote/engine/process_status.rb +140 -41
- data/lib/ruote/engine.rb +394 -27
- data/lib/ruote/exp/command.rb +2 -0
- data/lib/ruote/exp/fe_concurrence.rb +8 -0
- data/lib/ruote/exp/fe_concurrent_iterator.rb +3 -0
- data/lib/ruote/exp/fe_cursor.rb +48 -4
- data/lib/ruote/exp/fe_iterator.rb +40 -0
- data/lib/ruote/exp/fe_listen.rb +3 -3
- data/lib/ruote/exp/fe_participant.rb +30 -12
- data/lib/ruote/exp/fe_ref.rb +126 -0
- data/lib/ruote/exp/fe_subprocess.rb +20 -1
- data/lib/ruote/exp/fe_wait.rb +4 -1
- data/lib/ruote/exp/fe_when.rb +7 -10
- data/lib/ruote/exp/flowexpression.rb +23 -12
- data/lib/ruote/exp/ro_attributes.rb +5 -8
- data/lib/ruote/exp/ro_variables.rb +4 -2
- data/lib/ruote/fei.rb +2 -0
- data/lib/ruote/id/wfid_generator.rb +1 -1
- data/lib/ruote/log/pretty.rb +137 -0
- data/lib/ruote/log/storage_history.rb +1 -1
- data/lib/ruote/log/test_logger.rb +51 -126
- data/lib/ruote/log/wait_logger.rb +8 -13
- data/lib/ruote/parser/ruby_dsl.rb +4 -4
- data/lib/ruote/parser.rb +2 -2
- data/lib/ruote/part/block_participant.rb +1 -1
- data/lib/ruote/part/engine_participant.rb +1 -1
- data/lib/ruote/part/storage_participant.rb +27 -28
- data/lib/ruote/part/template.rb +8 -3
- data/lib/ruote/receiver/base.rb +24 -6
- data/lib/ruote/storage/base.rb +76 -11
- data/lib/ruote/storage/fs_storage.rb +10 -0
- data/lib/ruote/storage/hash_storage.rb +19 -8
- data/lib/ruote/{part → svc}/dispatch_pool.rb +3 -2
- data/lib/ruote/svc/dollar_sub.rb +265 -0
- data/lib/ruote/{error_handler.rb → svc/error_handler.rb} +6 -1
- data/lib/ruote/{exp → svc}/expression_map.rb +31 -37
- data/lib/ruote/{part → svc}/participant_list.rb +165 -25
- data/lib/ruote/{evt → svc}/tracker.rb +0 -0
- data/lib/ruote/{util → svc}/treechecker.rb +0 -0
- data/lib/ruote/util/look.rb +4 -1
- data/lib/ruote/util/ometa.rb +21 -5
- data/lib/ruote/{subprocess.rb → util/subprocess.rb} +0 -0
- data/lib/ruote/version.rb +1 -1
- data/lib/ruote/worker.rb +29 -69
- data/lib/ruote/workitem.rb +28 -1
- data/ruote.gemspec +26 -22
- data/test/functional/base.rb +3 -0
- data/test/functional/concurrent_base.rb +1 -0
- data/test/functional/crunner.sh +1 -1
- data/test/functional/ct_0_concurrence.rb +6 -0
- data/test/functional/ct_1_iterator.rb +3 -0
- data/test/functional/ct_2_cancel.rb +5 -0
- data/test/functional/eft_13_iterator.rb +39 -4
- data/test/functional/eft_14_cursor.rb +39 -0
- data/test/functional/eft_30_ref.rb +140 -0
- data/test/functional/eft_3_participant.rb +25 -23
- data/test/functional/ft_10_dollar.rb +17 -1
- data/test/functional/ft_14_re_apply.rb +76 -0
- data/test/functional/ft_1_process_status.rb +170 -29
- data/test/functional/ft_20_storage_participant.rb +14 -0
- data/test/functional/ft_24_block_participants.rb +1 -1
- data/test/functional/ft_26_participant_timeout.rb +93 -0
- data/test/functional/ft_2_errors.rb +24 -17
- data/test/functional/ft_30_smtp_participant.rb +7 -2
- data/test/functional/ft_38_participant_more.rb +15 -0
- data/test/functional/ft_39_wait_for.rb +34 -1
- data/test/functional/ft_3_participant_registration.rb +270 -2
- data/test/functional/ft_40_wait_logger.rb +61 -0
- data/test/functional/ft_42_storage_copy.rb +4 -0
- data/test/functional/{ft_40_participant_on_reply.rb → ft_43_participant_on_reply.rb} +17 -0
- data/test/functional/ft_44_var_participant.rb +35 -0
- data/test/functional/ft_45_participant_accept.rb +64 -0
- data/test/functional/ft_46_launch_single.rb +49 -0
- data/test/functional/ft_5_on_error.rb +39 -1
- data/test/functional/storage_helper.rb +7 -1
- data/test/test_helper.rb +1 -1
- data/test/unit/storage.rb +105 -32
- data/test/unit/ut_0_ruby_parser.rb +31 -1
- data/test/unit/ut_16_parser.rb +20 -0
- data/test/unit/ut_19_part_template.rb +11 -1
- data/test/unit/ut_20_composite_storage.rb +1 -1
- data/test/unit/ut_4_expmap.rb +1 -1
- data/test/unit/ut_6_condition.rb +2 -2
- metadata +112 -74
- data/lib/ruote/exp/raw.rb +0 -44
- data/lib/ruote/util/dollar.rb +0 -193
@@ -31,6 +31,10 @@ module Ruote
|
|
31
31
|
#
|
32
32
|
# Tracking participants to [business] processes.
|
33
33
|
#
|
34
|
+
# The methods here are mostly called via the engine (registering /
|
35
|
+
# unregistering participants) and via the dispatch_pool (when handing
|
36
|
+
# workitems to participants).
|
37
|
+
#
|
34
38
|
class ParticipantList
|
35
39
|
|
36
40
|
attr_reader :instantiated_participants
|
@@ -41,20 +45,16 @@ module Ruote
|
|
41
45
|
@instantiated_participants = {}
|
42
46
|
end
|
43
47
|
|
44
|
-
# Registers
|
45
|
-
#
|
46
|
-
# Called by the register_participant method of the engine.
|
48
|
+
# Registers a participant. Called by Engine#register_participant.
|
47
49
|
#
|
48
|
-
def register (name, participant, options, block
|
49
|
-
|
50
|
-
list ||= get_list
|
50
|
+
def register (name, participant, options, block)
|
51
51
|
|
52
52
|
options = options.inject({}) { |h, (k, v)|
|
53
53
|
h[k.to_s] = v.is_a?(Symbol) ? v.to_s : v
|
54
54
|
h
|
55
55
|
}
|
56
56
|
|
57
|
-
entry = if participant.is_a?(Class)
|
57
|
+
entry = if participant.is_a?(Class) || participant.is_a?(String)
|
58
58
|
[ participant.to_s, options ]
|
59
59
|
else
|
60
60
|
"inpa_#{name.inspect}"
|
@@ -65,6 +65,8 @@ module Ruote
|
|
65
65
|
|
66
66
|
entry = [ key, entry ]
|
67
67
|
|
68
|
+
list = get_list
|
69
|
+
|
68
70
|
list['list'].delete_if { |e| e.first == key }
|
69
71
|
|
70
72
|
position = options['position'] || 'last'
|
@@ -104,12 +106,13 @@ module Ruote
|
|
104
106
|
# Removes a participant, given via its name or directly from this
|
105
107
|
# participant list.
|
106
108
|
#
|
107
|
-
|
108
|
-
|
109
|
-
|
109
|
+
# Called usually by Engine#unregister_participant.
|
110
|
+
#
|
111
|
+
def unregister (name_or_participant)
|
110
112
|
|
111
113
|
code = nil
|
112
114
|
entry = nil
|
115
|
+
list = get_list
|
113
116
|
|
114
117
|
if name_or_participant.is_a?(Symbol)
|
115
118
|
name_or_participant = name_or_participant.to_s
|
@@ -151,35 +154,75 @@ module Ruote
|
|
151
154
|
entry.first
|
152
155
|
end
|
153
156
|
|
154
|
-
|
157
|
+
# Returns a participant instance, or nil if there is no participant
|
158
|
+
# for the given participant name.
|
159
|
+
#
|
160
|
+
# Mostly a combination of #lookup_info and #instantiate.
|
161
|
+
#
|
162
|
+
def lookup (participant_name, workitem, opts={})
|
155
163
|
|
156
|
-
|
164
|
+
pinfo = participant_name
|
157
165
|
|
158
|
-
|
159
|
-
|
160
|
-
when String then @instantiated_participants[pa]
|
161
|
-
else pa
|
166
|
+
if participant_name.is_a?(String) && participant_name[0, 5] != 'inpa_'
|
167
|
+
pinfo = lookup_info(participant_name, workitem)
|
162
168
|
end
|
169
|
+
|
170
|
+
pinfo ? instantiate(pinfo, opts) : nil
|
163
171
|
end
|
164
172
|
|
165
|
-
|
173
|
+
# Given a participant name, returns
|
174
|
+
#
|
175
|
+
# Returns nil if there is no participant registered that covers the given
|
176
|
+
# participant name.
|
177
|
+
#
|
178
|
+
def lookup_info (pname, workitem)
|
179
|
+
|
180
|
+
get_list['list'].each do |regex, pinfo|
|
166
181
|
|
167
|
-
|
182
|
+
next unless pname.match(regex)
|
168
183
|
|
169
|
-
|
170
|
-
return opts[:on_reply] ? nil : pi unless pi.is_a?(Array)
|
184
|
+
pa = instantiate(pinfo, :if_respond_to? => :accept?)
|
171
185
|
|
172
|
-
|
186
|
+
return pinfo unless pa
|
187
|
+
|
188
|
+
return pinfo if pa.accept?(
|
189
|
+
Ruote::Workitem.new(workitem.merge('participant_name' => pname))
|
190
|
+
)
|
191
|
+
end
|
192
|
+
|
193
|
+
nil
|
194
|
+
end
|
195
|
+
|
196
|
+
# Returns an instance of a participant
|
197
|
+
#
|
198
|
+
def instantiate (pinfo, opts={})
|
199
|
+
|
200
|
+
irt = opts[:if_respond_to?]
|
201
|
+
|
202
|
+
pinfo = @instantiated_participants[pinfo] if pinfo.is_a?(String)
|
203
|
+
|
204
|
+
if pinfo.respond_to?(:consume)
|
205
|
+
return (pinfo.respond_to?(irt) ? pinfo : nil) if irt
|
206
|
+
return pinfo
|
207
|
+
end
|
208
|
+
|
209
|
+
return nil unless pinfo
|
210
|
+
|
211
|
+
pa_class_name, options = pinfo
|
173
212
|
|
174
213
|
if rp = options['require_path']
|
175
214
|
require(rp)
|
176
215
|
end
|
216
|
+
if lp = options['load_path']
|
217
|
+
load(lp)
|
218
|
+
end
|
177
219
|
|
178
|
-
pa_class = Ruote.constantize(
|
220
|
+
pa_class = Ruote.constantize(pa_class_name)
|
179
221
|
pa_m = pa_class.instance_methods
|
180
222
|
|
181
|
-
|
182
|
-
|
223
|
+
if irt && ! (pa_m.include?(irt.to_s) || pa_m.include?(irt.to_sym))
|
224
|
+
return nil
|
225
|
+
end
|
183
226
|
|
184
227
|
pa = if pa_class.instance_method(:initialize).arity > 0
|
185
228
|
pa_class.new(options)
|
@@ -195,7 +238,7 @@ module Ruote
|
|
195
238
|
#
|
196
239
|
def names
|
197
240
|
|
198
|
-
get_list['list'].
|
241
|
+
get_list['list'].collect { |re, pa| re }
|
199
242
|
end
|
200
243
|
|
201
244
|
# Shuts down the 'instantiated participants' (engine worker participants)
|
@@ -208,8 +251,40 @@ module Ruote
|
|
208
251
|
}
|
209
252
|
end
|
210
253
|
|
254
|
+
# Used by Engine#participant_list
|
255
|
+
#
|
256
|
+
# Returns a representation of this participant list as an array of
|
257
|
+
# ParticipantEntry instances.
|
258
|
+
#
|
259
|
+
def list
|
260
|
+
|
261
|
+
get_list['list'].collect { |e| ParticipantEntry.new(e) }
|
262
|
+
end
|
263
|
+
|
264
|
+
# Used by Engine#participant_list=
|
265
|
+
#
|
266
|
+
# Takes as input an array of ParticipantEntry instances and updates
|
267
|
+
# this participant list with it.
|
268
|
+
#
|
269
|
+
# See ParticipantList#list
|
270
|
+
#
|
271
|
+
def list= (pl)
|
272
|
+
|
273
|
+
list = get_list
|
274
|
+
list['list'] = pl.collect { |e| ParticipantEntry.read(e) }
|
275
|
+
|
276
|
+
if r = @context.storage.put(list)
|
277
|
+
#
|
278
|
+
# put failed, have to redo it
|
279
|
+
#
|
280
|
+
list= (pl)
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
211
284
|
protected
|
212
285
|
|
286
|
+
# Fetches and returns the participant list in the storage.
|
287
|
+
#
|
213
288
|
def get_list
|
214
289
|
|
215
290
|
@context.storage.get_configuration('participant_list') ||
|
@@ -217,6 +292,71 @@ module Ruote
|
|
217
292
|
'_id' => 'participant_list',
|
218
293
|
'list' => [] }
|
219
294
|
end
|
295
|
+
|
296
|
+
#--
|
297
|
+
# Returns an array of all the classes in the ObjectSpace that include the
|
298
|
+
# Ruote::LocalParticipant module.
|
299
|
+
#
|
300
|
+
#def local_participant_classes
|
301
|
+
# ObjectSpace.each_object(Class).inject([]) { |a, c|
|
302
|
+
# a << c if c.include?(Ruote::LocalParticipant)
|
303
|
+
# a
|
304
|
+
# }
|
305
|
+
#end
|
306
|
+
#++
|
307
|
+
end
|
308
|
+
|
309
|
+
#
|
310
|
+
# A helper class, for ParticipantList#list, which returns a list (order
|
311
|
+
# matters) of ParticipantEntry instances.
|
312
|
+
#
|
313
|
+
# See Engine#participant_list
|
314
|
+
#
|
315
|
+
class ParticipantEntry
|
316
|
+
|
317
|
+
attr_accessor :regex, :classname, :options
|
318
|
+
|
319
|
+
def initialize (a)
|
320
|
+
@regex = a.first
|
321
|
+
if a.last.is_a?(Array)
|
322
|
+
@classname = a.last.first
|
323
|
+
@options = a.last.last
|
324
|
+
else
|
325
|
+
@classname = a.last
|
326
|
+
@options = nil
|
327
|
+
end
|
328
|
+
end
|
329
|
+
|
330
|
+
def to_a
|
331
|
+
@classname[0, 5] == 'inpa_' ?
|
332
|
+
[ @regex, @classname ] :
|
333
|
+
[ @regex, [ @classname, @options ] ]
|
334
|
+
end
|
335
|
+
|
336
|
+
def to_s
|
337
|
+
"/#{@regex}/ ==> #{@classname} #{@options.inspect}"
|
338
|
+
end
|
339
|
+
|
340
|
+
def self.read (elt)
|
341
|
+
|
342
|
+
if elt.is_a?(ParticipantEntry)
|
343
|
+
return elt.to_a
|
344
|
+
end
|
345
|
+
|
346
|
+
if elt.is_a?(Hash)
|
347
|
+
return elt['classname'][0, 5] == 'inpa_' ?
|
348
|
+
[ elt['regex'], elt['classname'] ] :
|
349
|
+
[ elt['regex'], [ elt['classname'], elt['options'] ] ]
|
350
|
+
end
|
351
|
+
|
352
|
+
# else elt is a Array
|
353
|
+
|
354
|
+
if elt.size == 3
|
355
|
+
return [ elt[0], [ elt[1], elt[2] ] ]
|
356
|
+
end
|
357
|
+
|
358
|
+
elt
|
359
|
+
end
|
220
360
|
end
|
221
361
|
end
|
222
362
|
|
File without changes
|
File without changes
|
data/lib/ruote/util/look.rb
CHANGED
data/lib/ruote/util/ometa.rb
CHANGED
@@ -29,9 +29,9 @@
|
|
29
29
|
|
30
30
|
module Ruote
|
31
31
|
|
32
|
+
# meta a la lucky stiff
|
33
|
+
#
|
32
34
|
module WithMeta
|
33
|
-
#
|
34
|
-
# meta a la lucky stiff
|
35
35
|
|
36
36
|
def self.included(target)
|
37
37
|
|
@@ -40,16 +40,32 @@ module Ruote
|
|
40
40
|
self
|
41
41
|
end
|
42
42
|
end
|
43
|
-
def target.meta_eval
|
43
|
+
def target.meta_eval(&block)
|
44
44
|
metaclass.instance_eval(&block)
|
45
45
|
end
|
46
|
-
def target.meta_def
|
46
|
+
def target.meta_def(method_name, &block)
|
47
47
|
meta_eval { define_method method_name, &block }
|
48
48
|
end
|
49
|
-
def class_def
|
49
|
+
def class_def(method_name, &block)
|
50
50
|
class_eval { define_method name, &block }
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
54
|
+
|
55
|
+
# A blank slate of a class
|
56
|
+
#
|
57
|
+
class BlankSlate
|
58
|
+
|
59
|
+
instance_methods.each do |m|
|
60
|
+
|
61
|
+
next if %w[
|
62
|
+
method_missing respond_to? instance_eval object_id
|
63
|
+
].include?(m.to_s)
|
64
|
+
|
65
|
+
next if m.to_s.match(/^__/)
|
66
|
+
|
67
|
+
undef_method(m)
|
68
|
+
end
|
69
|
+
end
|
54
70
|
end
|
55
71
|
|
File without changes
|
data/lib/ruote/version.rb
CHANGED
data/lib/ruote/worker.rb
CHANGED
@@ -39,6 +39,7 @@ module Ruote
|
|
39
39
|
# 'receive' is a ParticipantExpression alias for 'reply'
|
40
40
|
|
41
41
|
PROC_ACTIONS = %w[ cancel_process kill_process ]
|
42
|
+
DISP_ACTIONS = %w[ dispatch dispatch_cancel ]
|
42
43
|
|
43
44
|
attr_reader :storage
|
44
45
|
attr_reader :context
|
@@ -64,13 +65,16 @@ module Ruote
|
|
64
65
|
@sleep_time = 0.000
|
65
66
|
end
|
66
67
|
|
68
|
+
# Runs the worker in the current thread. See #run_in_thread for running
|
69
|
+
# in a dedicated thread.
|
70
|
+
#
|
67
71
|
def run
|
68
72
|
|
69
|
-
while
|
70
|
-
step
|
71
|
-
end
|
73
|
+
step while @running
|
72
74
|
end
|
73
75
|
|
76
|
+
# Triggers the run method of the worker in a dedicated thread.
|
77
|
+
#
|
74
78
|
def run_in_thread
|
75
79
|
|
76
80
|
Thread.abort_on_exception = true
|
@@ -81,6 +85,14 @@ module Ruote
|
|
81
85
|
@run_thread = Thread.new { run }
|
82
86
|
end
|
83
87
|
|
88
|
+
# Joins the run thread of this worker (if there is no such thread, this
|
89
|
+
# method will return immediately, without any effect).
|
90
|
+
#
|
91
|
+
def join
|
92
|
+
|
93
|
+
@run_thread.join if @run_thread
|
94
|
+
end
|
95
|
+
|
84
96
|
def subscribe (actions, subscriber)
|
85
97
|
|
86
98
|
@subscribers << [ actions, subscriber ]
|
@@ -101,10 +113,9 @@ module Ruote
|
|
101
113
|
# Returns true if the engine system is inactive, ie if all the process
|
102
114
|
# instances are terminated or are stuck in an error.
|
103
115
|
#
|
104
|
-
# NOTE : for now, if a branch of a process is in
|
105
|
-
# still running, this
|
106
|
-
#
|
107
|
-
# inactive).
|
116
|
+
# NOTE : for now, if a branch of a process is in error while another is
|
117
|
+
# still running, this method will consider the process instance inactive
|
118
|
+
# (and it will return true if all the processes are considered inactive).
|
108
119
|
#
|
109
120
|
def inactive?
|
110
121
|
|
@@ -116,11 +127,11 @@ module Ruote
|
|
116
127
|
|
117
128
|
wfids = @context.storage.get_many('expressions').collect { |exp|
|
118
129
|
exp['fei']['wfid']
|
119
|
-
}
|
130
|
+
}
|
120
131
|
|
121
132
|
error_wfids = @context.storage.get_many('errors').collect { |err|
|
122
133
|
err['fei']['wfid']
|
123
|
-
}
|
134
|
+
}
|
124
135
|
|
125
136
|
(wfids - error_wfids == [])
|
126
137
|
end
|
@@ -213,7 +224,7 @@ module Ruote
|
|
213
224
|
|
214
225
|
Ruote::Exp::FlowExpression.do_action(@context, msg)
|
215
226
|
|
216
|
-
elsif
|
227
|
+
elsif DISP_ACTIONS.include?(action)
|
217
228
|
|
218
229
|
@context.dispatch_pool.handle(msg)
|
219
230
|
|
@@ -283,78 +294,27 @@ module Ruote
|
|
283
294
|
|
284
295
|
if not exp_class
|
285
296
|
|
286
|
-
exp_class
|
297
|
+
exp_class = Ruote::Exp::RefExpression
|
298
|
+
|
299
|
+
#elsif msg['action'] == 'launch' && exp_class == Ruote::Exp::DefineExpression
|
300
|
+
elsif is_launch?(msg, exp_class)
|
287
301
|
|
288
|
-
elsif msg['action'] == 'launch' && exp_class == Ruote::Exp::DefineExpression
|
289
302
|
def_name, tree = Ruote::Exp::DefineExpression.reorganize(tree)
|
290
303
|
variables[def_name] = [ '0', tree ] if def_name
|
291
304
|
exp_class = Ruote::Exp::SequenceExpression
|
292
305
|
end
|
293
306
|
|
294
|
-
if exp_class == Ruote::Exp::SubprocessExpression && tree[1]['engine']
|
295
|
-
#
|
296
|
-
# the subprocess has to be transformed into an EngineParticipant...
|
297
|
-
|
298
|
-
exp_class = Ruote::Exp::ParticipantExpression
|
299
|
-
|
300
|
-
atts = tree[1]
|
301
|
-
|
302
|
-
if ref = atts.find { |k, v| v.nil? }
|
303
|
-
ref = ref.first
|
304
|
-
atts.delete(ref)
|
305
|
-
end
|
306
|
-
|
307
|
-
atts['pdef'] = atts['ref'] || ref
|
308
|
-
atts['ref'] = atts.delete('engine')
|
309
|
-
end
|
310
|
-
|
311
|
-
raise_unknown_expression_error(exp_hash) unless exp_class
|
312
|
-
|
313
307
|
exp = exp_class.new(@context, exp_hash.merge!('original_tree' => tree))
|
314
308
|
|
315
309
|
exp.initial_persist
|
316
310
|
exp.do_apply
|
317
311
|
end
|
318
312
|
|
319
|
-
def
|
320
|
-
|
321
|
-
exp_hash['state'] = 'failed'
|
322
|
-
#exp_hash['has_error'] = true
|
323
|
-
|
324
|
-
Ruote::Exp::RawExpression.new(@context, exp_hash).persist_or_raise
|
325
|
-
# undigested expression is stored
|
326
|
-
|
327
|
-
raise "unknown expression '#{exp_hash['original_tree'].first}'"
|
328
|
-
end
|
329
|
-
|
330
|
-
def lookup_subprocess_or_participant (exp_hash)
|
331
|
-
|
332
|
-
tree = exp_hash['original_tree']
|
333
|
-
|
334
|
-
key, value = Ruote::Exp::FlowExpression.new(
|
335
|
-
@context, exp_hash.merge('name' => 'temporary')
|
336
|
-
).iterative_var_lookup(tree[0])
|
337
|
-
|
338
|
-
sub = value
|
339
|
-
part = @context.plist.lookup_info(key)
|
313
|
+
def is_launch? (msg, exp_class)
|
340
314
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
if sub or part
|
345
|
-
|
346
|
-
tree[1]['ref'] = key
|
347
|
-
tree[1]['original_ref'] = tree[0] if key != tree[0]
|
348
|
-
|
349
|
-
if sub
|
350
|
-
[ Ruote::Exp::SubprocessExpression, [ 'subprocess', *tree[1..2] ] ]
|
351
|
-
else
|
352
|
-
[ Ruote::Exp::ParticipantExpression, [ 'participant', *tree[1..2] ] ]
|
353
|
-
end
|
354
|
-
else
|
355
|
-
|
356
|
-
[ nil, tree ]
|
357
|
-
end
|
315
|
+
return false if exp_class != Ruote::Exp::DefineExpression
|
316
|
+
return true if msg['action'] == 'launch'
|
317
|
+
(msg['trigger'] == 'on_re_apply')
|
358
318
|
end
|
359
319
|
|
360
320
|
def cancel_process (msg)
|
data/lib/ruote/workitem.rb
CHANGED
@@ -144,7 +144,7 @@ module Ruote
|
|
144
144
|
|
145
145
|
# When was this workitem dispatched ?
|
146
146
|
#
|
147
|
-
def
|
147
|
+
def dispatched_at
|
148
148
|
|
149
149
|
fields['dispatched_at']
|
150
150
|
end
|
@@ -234,6 +234,33 @@ module Ruote
|
|
234
234
|
|
235
235
|
@h['fields']['params']
|
236
236
|
end
|
237
|
+
|
238
|
+
# (advanced)
|
239
|
+
#
|
240
|
+
# Shortcut for wi.fields['__command__']
|
241
|
+
#
|
242
|
+
# __command__ is read by the 'cursor' and the 'iterator' expressions
|
243
|
+
# when a workitem reaches it (apply and reply).
|
244
|
+
#
|
245
|
+
def commmand
|
246
|
+
|
247
|
+
@h['fields']['__command__']
|
248
|
+
end
|
249
|
+
|
250
|
+
# (advanced)
|
251
|
+
#
|
252
|
+
# Shortcut for wi.fields['__command__'] = x
|
253
|
+
#
|
254
|
+
# __command__ is read by the 'cursor' and the 'iterator' expressions
|
255
|
+
# when a workitem reaches it (apply and reply).
|
256
|
+
#
|
257
|
+
def command= (com)
|
258
|
+
|
259
|
+
com = com.is_a?(Array) ? com : com.split(' ')
|
260
|
+
com[1] = com[1].to_i if com[1]
|
261
|
+
|
262
|
+
@h['fields']['__command__'] = com
|
263
|
+
end
|
237
264
|
end
|
238
265
|
end
|
239
266
|
|