weel 1.2.6 → 1.99.2
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.
- checksums.yaml +4 -4
- data/lib/weel.rb +196 -152
- data/test/TestHandlerWrapper.rb +7 -0
- data/test/TestWorkflow.rb +6 -6
- data/test/basic/tc_choose.rb +10 -10
- data/test/basic/tc_codereplace.rb +12 -12
- data/test/basic/tc_parallel.rb +20 -20
- data/test/basic/tc_search.rb +7 -7
- data/test/basic/tc_state.rb +6 -5
- data/test/basic/tc_wf_control.rb +9 -9
- data/test/complex/tc_generalsynchonizingmerge_loopsearch.rb +12 -12
- data/test/complex/tc_parallel_stop.rb +4 -4
- data/test/exec/tc_exec.rb +25 -0
- data/test/simulation_v0.0.1.tgz +0 -0
- data/test/wfp_adv_branching/tc_generalsynchronizingmerge.rb +6 -6
- data/test/wfp_adv_branching/tc_localsynchronizingmerge.rb +5 -5
- data/test/wfp_adv_branching/tc_multichoice_structuredsynchronizingmerge.rb +6 -6
- data/test/wfp_adv_branching/tc_structured_discriminator.rb +3 -3
- data/test/wfp_adv_branching/tc_structured_partial_join.rb +6 -6
- data/test/wfp_basic/tc_exclusivechoice_simplemerge.rb +2 -2
- data/test/wfp_basic/tc_parallelsplit_synchronization.rb +3 -3
- data/test/wfp_basic/tc_sequence.rb +3 -3
- data/test/wfp_iteration/tc_structuredloop.rb +11 -11
- data/test/wfp_state_based/tc_deferredchoice.rb +4 -4
- data/test/wfp_state_based/tc_interleavedparallelrouting.rb +3 -3
- data/weel.gemspec +1 -1
- metadata +49 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 759696de1b4d59e435dbb6de3607281a78ae68b9
|
4
|
+
data.tar.gz: 56d4d1b419f47d5d5266c15b6f11ee907f8f3693
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ffd15f62145efb88c1c99b23241681b6ea0ee0ecb390260b44e480c47fe9d0725fcb66813e31b29a3c9dbfef734a4c10658fd1cf8f14d9b6cfc2c2e5253f521
|
7
|
+
data.tar.gz: 19789e82488739d93b2eb4b250afc900260ffe03901d575a30d378a4659ddf2b316975b3fb2a57a9e2a6978f7424225c037df04ce538ee11e427d4529eb8b876
|
data/lib/weel.rb
CHANGED
@@ -71,7 +71,22 @@ class WEEL
|
|
71
71
|
class NoLongerNecessary < Exception; end
|
72
72
|
end # }}}
|
73
73
|
|
74
|
-
class
|
74
|
+
class ReadStructure # {{{
|
75
|
+
def initialize(data,endpoints)
|
76
|
+
@__weel_data = data
|
77
|
+
@__weel_endpoints = endpoints
|
78
|
+
@changed_data = []
|
79
|
+
@changed_endpoints = []
|
80
|
+
end
|
81
|
+
|
82
|
+
def data
|
83
|
+
ReadHash.new(@__weel_data)
|
84
|
+
end
|
85
|
+
def endpoints
|
86
|
+
ReadHash.new(@__weel_endpoints)
|
87
|
+
end
|
88
|
+
end # }}}
|
89
|
+
class ManipulateStructure # {{{
|
75
90
|
def initialize(data,endpoints,status)
|
76
91
|
@__weel_data = data
|
77
92
|
@__weel_endpoints = endpoints
|
@@ -116,7 +131,6 @@ class WEEL
|
|
116
131
|
end
|
117
132
|
|
118
133
|
def method_missing(name,*args)
|
119
|
-
|
120
134
|
if args.empty? && @__weel_values.has_key?(name)
|
121
135
|
@__weel_values[name]
|
122
136
|
elsif name.to_s[-1..-1] == "=" && args.length == 1
|
@@ -164,7 +178,7 @@ class WEEL
|
|
164
178
|
class HandlerWrapperBase # {{{
|
165
179
|
def initialize(arguments,endpoint=nil,position=nil,continue=nil); end
|
166
180
|
|
167
|
-
def activity_handle(passthrough,
|
181
|
+
def activity_handle(passthrough, parameters); end
|
168
182
|
|
169
183
|
def activity_result_value; end
|
170
184
|
def activity_result_status; end
|
@@ -183,7 +197,7 @@ class WEEL
|
|
183
197
|
def inform_position_change(ipc); end
|
184
198
|
def inform_state_change(newstate); end
|
185
199
|
|
186
|
-
def vote_sync_before; true; end
|
200
|
+
def vote_sync_before(parameters=nil); true; end
|
187
201
|
def vote_sync_after; true; end
|
188
202
|
|
189
203
|
# type => activity, loop, parallel, choice
|
@@ -193,6 +207,9 @@ class WEEL
|
|
193
207
|
def simulate(type,nesting,eid,parent,parameters={}); end
|
194
208
|
|
195
209
|
def callback(result); end
|
210
|
+
|
211
|
+
def test_condition(code); true; end
|
212
|
+
def manipulate(mr,code,result=nil,status=nil); nil; end
|
196
213
|
end # }}}
|
197
214
|
|
198
215
|
class Position # {{{
|
@@ -277,148 +294,17 @@ class WEEL
|
|
277
294
|
attr_accessor :__weel_search_positions, :__weel_positions, :__weel_main, :__weel_data, :__weel_endpoints, :__weel_handlerwrapper, :__weel_handlerwrapper_args
|
278
295
|
attr_reader :__weel_state, :__weel_status
|
279
296
|
|
280
|
-
# DSL-
|
281
|
-
#
|
282
|
-
#
|
283
|
-
# - :manipulate - just yield a given block
|
284
|
-
# - :call - order the handlerwrapper to perform a service call
|
297
|
+
# DSL-Constructs for atomic calls to external services (calls) and pure context manipulations (manipulate).
|
298
|
+
# Calls can also manipulate context (after the invoking the external services)
|
299
|
+
# position: a unique identifier within the wf-description (may be used by the search to identify a starting point)
|
285
300
|
# endpoint: (only with :call) ep of the service
|
286
301
|
# parameters: (only with :call) service parameters
|
287
|
-
def
|
288
|
-
position
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
Thread.current[:continue] = Continue.new
|
295
|
-
handlerwrapper = @__weel_handlerwrapper.new @__weel_handlerwrapper_args, @__weel_endpoints[endpoint], position, Thread.current[:continue]
|
296
|
-
|
297
|
-
if __weel_sim
|
298
|
-
handlerwrapper.simulate(:activity,:none,position,Thread.current[:branch_sim_pos],:parameters=>parameters, :endpoint => endpoint, :type => type)
|
299
|
-
return
|
300
|
-
end
|
301
|
-
|
302
|
-
ipc = {}
|
303
|
-
if searchmode == :after
|
304
|
-
wp = WEEL::Position.new(position, :after, nil)
|
305
|
-
ipc[:after] = [wp.position]
|
306
|
-
else
|
307
|
-
if Thread.current[:branch_parent] && Thread.current[:branch_parent][:branch_position]
|
308
|
-
@__weel_positions.delete Thread.current[:branch_parent][:branch_position]
|
309
|
-
ipc[:unmark] ||= []
|
310
|
-
ipc[:unmark] << Thread.current[:branch_parent][:branch_position].position rescue nil
|
311
|
-
Thread.current[:branch_parent][:branch_position] = nil
|
312
|
-
end
|
313
|
-
if Thread.current[:branch_position]
|
314
|
-
@__weel_positions.delete Thread.current[:branch_position]
|
315
|
-
ipc[:unmark] ||= []
|
316
|
-
ipc[:unmark] << Thread.current[:branch_position].position rescue nil
|
317
|
-
end
|
318
|
-
wp = WEEL::Position.new(position, :at, nil)
|
319
|
-
ipc[:at] = [wp.position]
|
320
|
-
end
|
321
|
-
@__weel_positions << wp
|
322
|
-
Thread.current[:branch_position] = wp
|
323
|
-
|
324
|
-
handlerwrapper.inform_position_change(ipc)
|
325
|
-
|
326
|
-
# searchmode position is after, jump directly to vote_sync_after
|
327
|
-
raise Signal::Proceed if searchmode == :after
|
328
|
-
|
329
|
-
raise Signal::Stop unless handlerwrapper.vote_sync_before
|
330
|
-
|
331
|
-
case type
|
332
|
-
when :manipulate
|
333
|
-
if block_given?
|
334
|
-
handlerwrapper.inform_activity_manipulate
|
335
|
-
mr = ManipulateRealization.new(@__weel_data,@__weel_endpoints,@__weel_status)
|
336
|
-
status = nil
|
337
|
-
parameters.delete_if do |para|
|
338
|
-
status = para if para.is_a?(Status)
|
339
|
-
para.is_a?(Status)
|
340
|
-
end
|
341
|
-
case blk.arity
|
342
|
-
when 1; mr.instance_exec(parameters,&blk)
|
343
|
-
when 2; mr.instance_exec(parameters,status,&blk)
|
344
|
-
else
|
345
|
-
mr.instance_eval(&blk)
|
346
|
-
end
|
347
|
-
handlerwrapper.inform_manipulate_change(
|
348
|
-
(mr.changed_status ? @__weel_status : nil),
|
349
|
-
(mr.changed_data.any? ? mr.changed_data.uniq : nil),
|
350
|
-
(mr.changed_endpoints.any? ? mr.changed_endpoints.uniq : nil)
|
351
|
-
)
|
352
|
-
handlerwrapper.inform_activity_done
|
353
|
-
wp.detail = :after
|
354
|
-
handlerwrapper.inform_position_change :after => [wp.position]
|
355
|
-
end
|
356
|
-
when :call
|
357
|
-
params = { }
|
358
|
-
passthrough = @__weel_search_positions[position] ? @__weel_search_positions[position].passthrough : nil
|
359
|
-
parameters.each do |p|
|
360
|
-
if p.class == Hash && parameters.length == 1
|
361
|
-
params = p
|
362
|
-
else
|
363
|
-
if !p.is_a?(Symbol) || !@__weel_data.include?(p)
|
364
|
-
raise("not all passed parameters are data elements")
|
365
|
-
end
|
366
|
-
params[p] = @__weel_data[p]
|
367
|
-
end
|
368
|
-
end
|
369
|
-
# handshake call and wait until it finished
|
370
|
-
handlerwrapper.activity_handle passthrough, params
|
371
|
-
Thread.current[:continue].wait unless Thread.current[:nolongernecessary] || self.__weel_state == :stopping || self.__weel_state == :stopped
|
372
|
-
|
373
|
-
if Thread.current[:nolongernecessary]
|
374
|
-
handlerwrapper.activity_no_longer_necessary
|
375
|
-
raise Signal::NoLongerNecessary
|
376
|
-
end
|
377
|
-
if self.__weel_state == :stopping
|
378
|
-
handlerwrapper.activity_stop
|
379
|
-
wp.passthrough = handlerwrapper.activity_passthrough_value
|
380
|
-
end
|
381
|
-
|
382
|
-
if wp.passthrough.nil? && block_given?
|
383
|
-
handlerwrapper.inform_activity_manipulate
|
384
|
-
mr = ManipulateRealization.new(@__weel_data,@__weel_endpoints,@__weel_status)
|
385
|
-
status = handlerwrapper.activity_result_status
|
386
|
-
case blk.arity
|
387
|
-
when 1; mr.instance_exec(handlerwrapper.activity_result_value,&blk)
|
388
|
-
when 2; mr.instance_exec(handlerwrapper.activity_result_value,(status.is_a?(Status)?status:nil),&blk)
|
389
|
-
else
|
390
|
-
mr.instance_eval(&blk)
|
391
|
-
end
|
392
|
-
handlerwrapper.inform_manipulate_change(
|
393
|
-
(mr.changed_status ? @__weel_status : nil),
|
394
|
-
(mr.changed_data.any? ? mr.changed_data.uniq : nil),
|
395
|
-
(mr.changed_endpoints.any? ? mr.changed_endpoints.uniq : nil)
|
396
|
-
)
|
397
|
-
end
|
398
|
-
if wp.passthrough.nil?
|
399
|
-
handlerwrapper.inform_activity_done
|
400
|
-
wp.detail = :after
|
401
|
-
handlerwrapper.inform_position_change :after => [wp.position]
|
402
|
-
end
|
403
|
-
end
|
404
|
-
raise Signal::Proceed
|
405
|
-
rescue Signal::SkipManipulate, Signal::Proceed
|
406
|
-
if self.__weel_state != :stopping && !handlerwrapper.vote_sync_after
|
407
|
-
self.__weel_state = :stopping
|
408
|
-
wp.detail = :unmark
|
409
|
-
end
|
410
|
-
rescue Signal::NoLongerNecessary
|
411
|
-
@__weel_positions.delete wp
|
412
|
-
Thread.current[:branch_position] = nil
|
413
|
-
wp.detail = :unmark
|
414
|
-
handlerwrapper.inform_position_change :unmark => [wp.position]
|
415
|
-
rescue Signal::StopSkipManipulate, Signal::Stop
|
416
|
-
self.__weel_state = :stopping
|
417
|
-
rescue => err
|
418
|
-
handlerwrapper.inform_activity_failed err
|
419
|
-
self.__weel_state = :stopping
|
420
|
-
end
|
421
|
-
end # }}}
|
302
|
+
def call(position, endpoint, parameters={}, code=nil, &blk)
|
303
|
+
__weel_activity(position,:call,endpoint,parameters,code||blk)
|
304
|
+
end
|
305
|
+
def manipulate(position, code=nil, &blk)
|
306
|
+
__weel_activity(position,:manipulate,nil,{},code||blk)
|
307
|
+
end
|
422
308
|
|
423
309
|
# Parallel DSL-Construct
|
424
310
|
# Defines Workflow paths that can be executed parallel.
|
@@ -555,6 +441,10 @@ class WEEL
|
|
555
441
|
Thread.current[:mutex] ||= Mutex.new
|
556
442
|
Thread.current[:mutex].synchronize do
|
557
443
|
return if Thread.current[:alternative_mode] == :exclusive && Thread.current[:alternative_executed][-1] = true
|
444
|
+
if condition.is_a?(String) && !__weel_sim
|
445
|
+
handlerwrapper = @__weel_handlerwrapper.new @__weel_handlerwrapper_args
|
446
|
+
condition = handlerwrapper.test_condition(ReadStructure.new(@__weel_data,@__weel_endpoints),__condition)
|
447
|
+
end
|
558
448
|
Thread.current[:alternative_executed][-1] = true if condition
|
559
449
|
end
|
560
450
|
yield if __weel_is_in_search_mode || __weel_sim || condition
|
@@ -583,7 +473,7 @@ class WEEL
|
|
583
473
|
|
584
474
|
# Defines a Cycle (loop/iteration)
|
585
475
|
def loop(condition)# {{{
|
586
|
-
unless condition.is_a?(Array) && condition[0].is_a?(Proc) && [:pre_test,:post_test].include?(condition[1])
|
476
|
+
unless condition.is_a?(Array) && (condition[0].is_a?(Proc) || condition[0].is_a?(String)) && [:pre_test,:post_test].include?(condition[1])
|
587
477
|
raise "condition must be called pre_test{} or post_test{}"
|
588
478
|
end
|
589
479
|
return if self.__weel_state == :stopping || self.__weel_state == :stopped || Thread.current[:nolongernecessary]
|
@@ -596,20 +486,21 @@ class WEEL
|
|
596
486
|
yield
|
597
487
|
__weel_sim_stop(:loop,hw,pos,:testing=>condition[1])
|
598
488
|
return
|
599
|
-
end
|
489
|
+
end
|
490
|
+
handlerwrapper = @__weel_handlerwrapper.new @__weel_handlerwrapper_args unless condition[0].is_a?(Proc)
|
600
491
|
case condition[1]
|
601
492
|
when :pre_test
|
602
|
-
yield while condition[0].call && self.__weel_state != :stopping && self.__weel_state != :stopped
|
493
|
+
yield while (condition[0].is_a?(Proc) ? condition[0].call : handlerwrapper.test_condition(ReadStructure.new(@__weel_data,@__weel_endpoints),condition[0])) && self.__weel_state != :stopping && self.__weel_state != :stopped
|
603
494
|
when :post_test
|
604
|
-
begin; yield; end while condition[0].call && self.__weel_state != :stopping && self.__weel_state != :stopped
|
495
|
+
begin; yield; end while (condition[0].is_a?(Proc) ? condition[0].call : handlerwrapper.test_condition(ReadStructure.new(@__weel_data,@__weel_endpoints),condition[0])) && self.__weel_state != :stopping && self.__weel_state != :stopped
|
605
496
|
end
|
606
497
|
end # }}}
|
607
498
|
|
608
|
-
def pre_test(
|
609
|
-
[blk, :pre_test]
|
499
|
+
def pre_test(code=nil,&blk)# {{{
|
500
|
+
[code || blk, :pre_test]
|
610
501
|
end # }}}
|
611
|
-
def post_test(
|
612
|
-
[blk, :post_test]
|
502
|
+
def post_test(code=nil,&blk)# {{{
|
503
|
+
[code || blk, :post_test]
|
613
504
|
end # }}}
|
614
505
|
|
615
506
|
def status # {{{
|
@@ -623,6 +514,159 @@ class WEEL
|
|
623
514
|
end # }}}
|
624
515
|
|
625
516
|
private
|
517
|
+
def __weel_activity(position, type, endpoint, parameters, code)# {{{
|
518
|
+
position = __weel_position_test position
|
519
|
+
begin
|
520
|
+
searchmode = __weel_is_in_search_mode(position)
|
521
|
+
return if searchmode == true
|
522
|
+
return if self.__weel_state == :stopping || self.__weel_state == :stopped || Thread.current[:nolongernecessary]
|
523
|
+
|
524
|
+
Thread.current[:continue] = Continue.new
|
525
|
+
handlerwrapper = @__weel_handlerwrapper.new @__weel_handlerwrapper_args, @__weel_endpoints[endpoint], position, Thread.current[:continue]
|
526
|
+
|
527
|
+
if __weel_sim
|
528
|
+
handlerwrapper.simulate(:activity,:none,position,Thread.current[:branch_sim_pos],:parameters=>parameters, :endpoint => endpoint, :type => type)
|
529
|
+
return
|
530
|
+
end
|
531
|
+
|
532
|
+
ipc = {}
|
533
|
+
if searchmode == :after
|
534
|
+
wp = WEEL::Position.new(position, :after, nil)
|
535
|
+
ipc[:after] = [wp.position]
|
536
|
+
else
|
537
|
+
if Thread.current[:branch_parent] && Thread.current[:branch_parent][:branch_position]
|
538
|
+
@__weel_positions.delete Thread.current[:branch_parent][:branch_position]
|
539
|
+
ipc[:unmark] ||= []
|
540
|
+
ipc[:unmark] << Thread.current[:branch_parent][:branch_position].position rescue nil
|
541
|
+
Thread.current[:branch_parent][:branch_position] = nil
|
542
|
+
end
|
543
|
+
if Thread.current[:branch_position]
|
544
|
+
@__weel_positions.delete Thread.current[:branch_position]
|
545
|
+
ipc[:unmark] ||= []
|
546
|
+
ipc[:unmark] << Thread.current[:branch_position].position rescue nil
|
547
|
+
end
|
548
|
+
wp = WEEL::Position.new(position, :at, nil)
|
549
|
+
ipc[:at] = [wp.position]
|
550
|
+
end
|
551
|
+
@__weel_positions << wp
|
552
|
+
Thread.current[:branch_position] = wp
|
553
|
+
|
554
|
+
handlerwrapper.inform_position_change(ipc)
|
555
|
+
|
556
|
+
# searchmode position is after, jump directly to vote_sync_after
|
557
|
+
raise Signal::Proceed if searchmode == :after
|
558
|
+
|
559
|
+
case type
|
560
|
+
when :manipulate
|
561
|
+
raise Signal::Stop unless handlerwrapper.vote_sync_before
|
562
|
+
|
563
|
+
if code.is_a?(Proc) || code.is_a?(String)
|
564
|
+
handlerwrapper.inform_activity_manipulate
|
565
|
+
if code.is_a?(Proc)
|
566
|
+
mr = ManipulateStructure.new(@__weel_data,@__weel_endpoints,@__weel_status)
|
567
|
+
mr.instance_eval(&code)
|
568
|
+
elsif code.is_a?(String)
|
569
|
+
mr = ManipulateStructure.new(@__weel_data,@__weel_endpoints,@__weel_status)
|
570
|
+
handlerwrapper.manipulate(mr,code)
|
571
|
+
end
|
572
|
+
handlerwrapper.inform_manipulate_change(
|
573
|
+
((mr && mr.changed_status) ? @__weel_status : nil),
|
574
|
+
((mr && mr.changed_data.any?) ? mr.changed_data.uniq : nil),
|
575
|
+
((mr && mr.changed_endpoints.any?) ? mr.changed_endpoints.uniq : nil)
|
576
|
+
)
|
577
|
+
handlerwrapper.inform_activity_done
|
578
|
+
wp.detail = :after
|
579
|
+
handlerwrapper.inform_position_change :after => [wp.position]
|
580
|
+
end
|
581
|
+
when :call
|
582
|
+
params = { }
|
583
|
+
case parameters
|
584
|
+
when String
|
585
|
+
code = parameters
|
586
|
+
parameters = nil
|
587
|
+
when Hash
|
588
|
+
parameters.each do |k,p|
|
589
|
+
if p.is_a?(Symbol) && @__weel_data.include?(p)
|
590
|
+
params[k] = @__weel_data[p]
|
591
|
+
elsif k == :code && p.is_a?(String)
|
592
|
+
code = p
|
593
|
+
else
|
594
|
+
params[k] = p
|
595
|
+
end
|
596
|
+
end
|
597
|
+
when Array
|
598
|
+
parameters.each_with_index do |p,i|
|
599
|
+
if p.is_a?(Symbol) && @__weel_data.include?(p)
|
600
|
+
params[p] = @__weel_data[p]
|
601
|
+
else
|
602
|
+
params[i] = p
|
603
|
+
end
|
604
|
+
end
|
605
|
+
else
|
606
|
+
raise("invalid parameters")
|
607
|
+
end
|
608
|
+
raise Signal::Stop unless handlerwrapper.vote_sync_before(params)
|
609
|
+
|
610
|
+
passthrough = @__weel_search_positions[position] ? @__weel_search_positions[position].passthrough : nil
|
611
|
+
# handshake call and wait until it finished
|
612
|
+
handlerwrapper.activity_handle passthrough, params
|
613
|
+
Thread.current[:continue].wait unless Thread.current[:nolongernecessary] || self.__weel_state == :stopping || self.__weel_state == :stopped
|
614
|
+
|
615
|
+
if Thread.current[:nolongernecessary]
|
616
|
+
handlerwrapper.activity_no_longer_necessary
|
617
|
+
raise Signal::NoLongerNecessary
|
618
|
+
end
|
619
|
+
if self.__weel_state == :stopping
|
620
|
+
handlerwrapper.activity_stop
|
621
|
+
wp.passthrough = handlerwrapper.activity_passthrough_value
|
622
|
+
end
|
623
|
+
|
624
|
+
if wp.passthrough.nil? && (code.is_a?(Proc) || code.is_a?(String))
|
625
|
+
handlerwrapper.inform_activity_manipulate
|
626
|
+
status = handlerwrapper.activity_result_status
|
627
|
+
if code.is_a?(Proc)
|
628
|
+
mr = ManipulateStructure.new(@__weel_data,@__weel_endpoints,@__weel_status)
|
629
|
+
case code.arity
|
630
|
+
when 1; mr.instance_exec(handlerwrapper.activity_result_value,&code)
|
631
|
+
when 2; mr.instance_exec(handlerwrapper.activity_result_value,(status.is_a?(Status)?status:nil),&code)
|
632
|
+
else
|
633
|
+
mr.instance_eval(&code)
|
634
|
+
end
|
635
|
+
elsif code.is_a?(String)
|
636
|
+
mr = ManipulateStructure.new(@__weel_data,@__weel_endpoints,@__weel_status)
|
637
|
+
handlerwrapper.manipulate(mr,code,handlerwrapper.activity_result_value,(status.is_a?(Status)?status:nil))
|
638
|
+
end
|
639
|
+
handlerwrapper.inform_manipulate_change(
|
640
|
+
(mr.changed_status ? @__weel_status : nil),
|
641
|
+
(mr.changed_data.any? ? mr.changed_data.uniq : nil),
|
642
|
+
(mr.changed_endpoints.any? ? mr.changed_endpoints.uniq : nil)
|
643
|
+
)
|
644
|
+
end
|
645
|
+
if wp.passthrough.nil?
|
646
|
+
handlerwrapper.inform_activity_done
|
647
|
+
wp.detail = :after
|
648
|
+
handlerwrapper.inform_position_change :after => [wp.position]
|
649
|
+
end
|
650
|
+
end
|
651
|
+
raise Signal::Proceed
|
652
|
+
rescue Signal::SkipManipulate, Signal::Proceed
|
653
|
+
if self.__weel_state != :stopping && !handlerwrapper.vote_sync_after
|
654
|
+
self.__weel_state = :stopping
|
655
|
+
wp.detail = :unmark
|
656
|
+
end
|
657
|
+
rescue Signal::NoLongerNecessary
|
658
|
+
@__weel_positions.delete wp
|
659
|
+
Thread.current[:branch_position] = nil
|
660
|
+
wp.detail = :unmark
|
661
|
+
handlerwrapper.inform_position_change :unmark => [wp.position]
|
662
|
+
rescue Signal::StopSkipManipulate, Signal::Stop
|
663
|
+
self.__weel_state = :stopping
|
664
|
+
rescue => err
|
665
|
+
handlerwrapper.inform_activity_failed err
|
666
|
+
self.__weel_state = :stopping
|
667
|
+
end
|
668
|
+
end # }}}
|
669
|
+
|
626
670
|
def __weel_recursive_print(thread,indent='')# {{{
|
627
671
|
p "#{indent}#{thread}"
|
628
672
|
if thread[:branches]
|
data/test/TestHandlerWrapper.rb
CHANGED
@@ -85,4 +85,11 @@ class TestHandlerWrapper < WEEL::HandlerWrapperBase
|
|
85
85
|
$long_track += "---> STATE #{newstate}\n"
|
86
86
|
$short_track << "|#{newstate}|"
|
87
87
|
end
|
88
|
+
|
89
|
+
def manipulate(mr,code,result=nil,status=nil)
|
90
|
+
mr.instance_eval(code)
|
91
|
+
end
|
92
|
+
def test_condition(mr,code)
|
93
|
+
mr.instance_eval(code)
|
94
|
+
end
|
88
95
|
end
|
data/test/TestWorkflow.rb
CHANGED
@@ -10,26 +10,26 @@ class TestWorkflow < WEEL
|
|
10
10
|
data :x => 'begin_'
|
11
11
|
|
12
12
|
control flow do
|
13
|
-
|
13
|
+
call :a1_1, :endpoint1 do |result|
|
14
14
|
data.x += "#{result}"
|
15
15
|
end
|
16
16
|
parallel :wait => 2 do
|
17
17
|
parallel_branch do
|
18
|
-
|
18
|
+
call :a2_1_1, :endpoint1
|
19
19
|
end
|
20
20
|
parallel_branch do
|
21
|
-
|
21
|
+
call :a2_2_1, :endpoint1
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
24
|
+
manipulate :a3 do
|
25
25
|
data.x += '_end'
|
26
26
|
end
|
27
27
|
choose do
|
28
28
|
alternative data.x != nil do
|
29
|
-
|
29
|
+
call :a4a, :endpoint1
|
30
30
|
end
|
31
31
|
otherwise do
|
32
|
-
|
32
|
+
call :a4b, :endpoint1
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|