openwferu 0.9.13 → 0.9.14
Sign up to get free protection for your applications and to get access to all the features.
- data/examples/bigflow.rb +19 -0
- data/examples/csv_weather.rb +23 -0
- data/examples/engine_template.rb +7 -0
- data/lib/openwfe/contextual.rb +0 -2
- data/lib/openwfe/engine/engine.rb +137 -34
- data/lib/openwfe/engine/file_persisted_engine.rb +0 -5
- data/lib/openwfe/exceptions.rb +0 -2
- data/lib/openwfe/expool/errorjournal.rb +83 -7
- data/lib/openwfe/expool/expressionpool.rb +279 -60
- data/lib/openwfe/expool/expstorage.rb +7 -6
- data/lib/openwfe/expool/yamlexpstorage.rb +17 -14
- data/lib/openwfe/expressions/condition.rb +10 -7
- data/lib/openwfe/expressions/environment.rb +11 -1
- data/lib/openwfe/expressions/fe_command.rb +14 -1
- data/lib/openwfe/expressions/fe_cron.rb +29 -14
- data/lib/openwfe/expressions/fe_define.rb +26 -1
- data/lib/openwfe/expressions/fe_iterator.rb +2 -0
- data/lib/openwfe/expressions/fe_losfor.rb +20 -15
- data/lib/openwfe/expressions/fe_misc.rb +0 -2
- data/lib/openwfe/expressions/fe_participant.rb +78 -24
- data/lib/openwfe/expressions/fe_reserve.rb +0 -2
- data/lib/openwfe/expressions/fe_sleep.rb +0 -4
- data/lib/openwfe/expressions/fe_subprocess.rb +34 -0
- data/lib/openwfe/expressions/fe_value.rb +46 -4
- data/lib/openwfe/expressions/fe_wait.rb +0 -2
- data/lib/openwfe/expressions/flowexpression.rb +39 -9
- data/lib/openwfe/expressions/raw.rb +73 -48
- data/lib/openwfe/expressions/raw_prog.rb +45 -15
- data/lib/openwfe/expressions/simplerep.rb +54 -7
- data/lib/openwfe/expressions/time.rb +5 -2
- data/lib/openwfe/expressions/timeout.rb +0 -2
- data/lib/openwfe/flowexpressionid.rb +26 -2
- data/lib/openwfe/participants/enoparticipants.rb +6 -1
- data/lib/openwfe/participants/participant.rb +0 -2
- data/lib/openwfe/participants/participantmap.rb +21 -7
- data/lib/openwfe/participants/participants.rb +29 -0
- data/lib/openwfe/rest/exception.rb +0 -2
- data/lib/openwfe/storage/yamlfilestorage.rb +4 -1
- data/lib/openwfe/util/dollar.rb +0 -2
- data/lib/openwfe/util/lru.rb +0 -2
- data/lib/openwfe/util/observable.rb +1 -1
- data/lib/openwfe/util/scheduler.rb +4 -4
- data/lib/openwfe/util/schedulers.rb +0 -2
- data/lib/openwfe/util/workqueue.rb +34 -91
- data/lib/openwfe/utils.rb +35 -28
- data/lib/openwfe/version.rb +1 -1
- data/lib/openwfe/workitem.rb +1 -1
- data/test/clone_test.rb +51 -0
- data/test/concurrence_test.rb +78 -0
- data/test/cron_test_2.rb +50 -0
- data/test/flowtestbase.rb +40 -12
- data/test/ft_21_cron.rb +32 -6
- data/test/ft_26_load.rb +8 -2
- data/test/ft_26c_load.rb +19 -0
- data/test/ft_27_getflowpos.rb +4 -4
- data/test/ft_2_concurrence.rb +14 -9
- data/test/ft_32_journal.rb +1 -1
- data/test/ft_32c_journal.rb +3 -2
- data/test/ft_32d_journal.rb +2 -1
- data/test/ft_34_cancelwfid.rb +7 -3
- data/test/ft_35_localdefs.rb +13 -0
- data/test/ft_38_tag.rb +8 -6
- data/test/ft_49_condition.rb +7 -1
- data/test/ft_55_ptimeout.rb +13 -14
- data/test/ft_57_a.rb +17 -0
- data/test/ft_58_ejournal.rb +3 -3
- data/test/ft_59_ps.rb +6 -6
- data/test/ft_60_ecancel.rb +3 -5
- data/test/ft_61_elsub.rb +2 -4
- data/test/ft_63_pause.rb +122 -0
- data/test/ft_64_alias.rb +102 -0
- data/test/ft_64_clone.rb +69 -0
- data/test/ft_65_stringlaunch.rb +61 -0
- data/test/ft_66_subforget.rb +70 -0
- data/test/ft_67_schedlaunch.rb +102 -0
- data/test/ft_68_ifparticipant.rb +70 -0
- data/test/ft_69_cancelmissing.rb +49 -0
- data/test/ft_6_lambda.rb +23 -3
- data/test/ft_70_lookupvar.rb +55 -0
- data/test/ft_7_lose.rb +1 -1
- data/test/ft_tests.rb +10 -1
- data/test/hparticipant_test.rb +6 -6
- data/test/param_test.rb +1 -1
- data/test/{rake_test.rb → rake_ltest.rb} +9 -2
- data/test/rake_qtest.rb +3 -1
- data/test/raw_prog_test.rb +11 -3
- data/test/restart_sleep_test.rb +44 -6
- data/test/ruby_procdef_test.rb +129 -0
- data/test/rutest_utils.rb +1 -0
- data/test/sec_test.rb +3 -3
- metadata +19 -4
@@ -90,11 +90,12 @@ module OpenWFE
|
|
90
90
|
class ExpressionPool
|
91
91
|
include ServiceMixin
|
92
92
|
include OwfeServiceLocator
|
93
|
-
include
|
93
|
+
include OwfeObservable
|
94
94
|
include WorkqueueMixin
|
95
95
|
include FeiMixin
|
96
96
|
include MonitorMixin
|
97
97
|
|
98
|
+
|
98
99
|
#
|
99
100
|
# code loaded from a remote URI will get evaluated with
|
100
101
|
# that security level
|
@@ -113,6 +114,9 @@ module OpenWFE
|
|
113
114
|
|
114
115
|
@stopped = false
|
115
116
|
|
117
|
+
engine_environment_id
|
118
|
+
# makes sure it's called now
|
119
|
+
|
116
120
|
start_workqueue
|
117
121
|
end
|
118
122
|
|
@@ -137,7 +141,7 @@ module OpenWFE
|
|
137
141
|
#
|
138
142
|
def get_monitor (fei)
|
139
143
|
|
140
|
-
|
144
|
+
@monitors[fei]
|
141
145
|
end
|
142
146
|
|
143
147
|
#
|
@@ -186,7 +190,10 @@ module OpenWFE
|
|
186
190
|
# Returns the FlowExpressionId instance of the root expression of
|
187
191
|
# the newly launched flow.
|
188
192
|
#
|
189
|
-
def launch (launchitem)
|
193
|
+
def launch (launchitem, options)
|
194
|
+
|
195
|
+
#
|
196
|
+
# prepare raw expression
|
190
197
|
|
191
198
|
raw_expression = prepare_raw_expression launchitem
|
192
199
|
#
|
@@ -199,10 +206,16 @@ module OpenWFE
|
|
199
206
|
# it has to have an environment for all the variables of
|
200
207
|
# the process instance
|
201
208
|
|
202
|
-
|
209
|
+
raw_expression = wrap_in_schedule(raw_expression, options) \
|
210
|
+
if options and options.size > 0
|
203
211
|
|
204
212
|
fei = raw_expression.fei
|
205
213
|
|
214
|
+
#
|
215
|
+
# apply prepared raw expression
|
216
|
+
|
217
|
+
wi = build_workitem launchitem
|
218
|
+
|
206
219
|
onotify :launch, fei, launchitem
|
207
220
|
|
208
221
|
apply raw_expression, wi
|
@@ -220,15 +233,15 @@ module OpenWFE
|
|
220
233
|
def prepare_from_template (
|
221
234
|
requesting_expression, sub_id, template, params=nil)
|
222
235
|
|
223
|
-
rawexp = if template.is_a?
|
236
|
+
rawexp = if template.is_a?(RawExpression)
|
224
237
|
template
|
225
|
-
elsif template.is_a?
|
238
|
+
elsif template.is_a?(FlowExpressionId)
|
226
239
|
fetch_expression(template)
|
227
240
|
else
|
228
241
|
build_raw_expression(nil, template)
|
229
242
|
end
|
230
243
|
|
231
|
-
#raise "did not find
|
244
|
+
#raise "did not find subprocess in : #{template.to_s}" \
|
232
245
|
# unless rawexp
|
233
246
|
|
234
247
|
rawexp = rawexp.dup()
|
@@ -239,13 +252,13 @@ module OpenWFE
|
|
239
252
|
rawexp.parent_id = nil
|
240
253
|
rawexp.fei.workflow_instance_id = get_wfid_generator.generate
|
241
254
|
|
242
|
-
elsif requesting_expression.kind_of?
|
255
|
+
elsif requesting_expression.kind_of?(FlowExpressionId)
|
243
256
|
|
244
257
|
rawexp.parent_id = requesting_expression
|
245
258
|
rawexp.fei.workflow_instance_id = \
|
246
259
|
"#{requesting_expression.workflow_instance_id}.#{sub_id}"
|
247
260
|
|
248
|
-
elsif requesting_expression.kind_of?
|
261
|
+
elsif requesting_expression.kind_of?(String)
|
249
262
|
|
250
263
|
rawexp.parent_id = nil
|
251
264
|
rawexp.fei.workflow_instance_id = \
|
@@ -312,7 +325,6 @@ module OpenWFE
|
|
312
325
|
#
|
313
326
|
def apply (exp, workitem)
|
314
327
|
|
315
|
-
#do_apply exp, workitem
|
316
328
|
queue_work :do_apply, exp, workitem
|
317
329
|
end
|
318
330
|
|
@@ -321,7 +333,6 @@ module OpenWFE
|
|
321
333
|
#
|
322
334
|
def reply (exp, workitem)
|
323
335
|
|
324
|
-
#do_reply exp, workitem
|
325
336
|
queue_work :do_reply, exp, workitem
|
326
337
|
end
|
327
338
|
|
@@ -407,6 +418,58 @@ module OpenWFE
|
|
407
418
|
ldebug { "forget() forgot #{fei}" }
|
408
419
|
end
|
409
420
|
|
421
|
+
#
|
422
|
+
# Pauses a process (sets its '/__paused__' variable to true).
|
423
|
+
#
|
424
|
+
def pause_process (wfid)
|
425
|
+
|
426
|
+
wfid = extract_wfid(wfid)
|
427
|
+
|
428
|
+
root_expression = fetch_root(wfid)
|
429
|
+
|
430
|
+
root_expression.set_variable(VAR_PAUSED, true)
|
431
|
+
end
|
432
|
+
|
433
|
+
#
|
434
|
+
# Restarts a process : removes its 'paused' flag (variable) and makes
|
435
|
+
# sure to 'replay' events (replies) that came for it while it was
|
436
|
+
# in pause.
|
437
|
+
#
|
438
|
+
def resume_process (wfid)
|
439
|
+
|
440
|
+
wfid = extract_wfid(wfid)
|
441
|
+
|
442
|
+
root_expression = fetch_root(wfid)
|
443
|
+
|
444
|
+
#
|
445
|
+
# remove 'paused' flag
|
446
|
+
|
447
|
+
root_expression.unset_variable(VAR_PAUSED)
|
448
|
+
|
449
|
+
#
|
450
|
+
# replay
|
451
|
+
|
452
|
+
journal = get_error_journal
|
453
|
+
|
454
|
+
# select PausedError instances in separate list
|
455
|
+
|
456
|
+
errors = journal.get_error_log(wfid)
|
457
|
+
error_class = PausedError.name
|
458
|
+
paused_errors = errors.select { |e| e.error_class == error_class }
|
459
|
+
|
460
|
+
return if paused_errors.size < 1
|
461
|
+
|
462
|
+
# remove them from current error journal
|
463
|
+
|
464
|
+
journal.remove_errors wfid, paused_errors
|
465
|
+
|
466
|
+
# replay select PausedError instances
|
467
|
+
|
468
|
+
paused_errors.each do |e|
|
469
|
+
journal.replay_at_error e
|
470
|
+
end
|
471
|
+
end
|
472
|
+
|
410
473
|
#
|
411
474
|
# Replies to the parent of the given expression.
|
412
475
|
#
|
@@ -552,6 +615,8 @@ module OpenWFE
|
|
552
615
|
#
|
553
616
|
def fetch_engine_environment ()
|
554
617
|
synchronize do
|
618
|
+
#
|
619
|
+
# synchronize to ensure that there's 1! engine env
|
555
620
|
|
556
621
|
eei = engine_environment_id
|
557
622
|
ee, fei = fetch(eei)
|
@@ -575,7 +640,7 @@ module OpenWFE
|
|
575
640
|
exp, _fei = fetch(exp) \
|
576
641
|
if exp.kind_of?(FlowExpressionId)
|
577
642
|
|
578
|
-
return
|
643
|
+
return unless exp
|
579
644
|
|
580
645
|
ldebug { "remove() fe #{exp.fei.to_debug_s}" }
|
581
646
|
|
@@ -603,18 +668,19 @@ module OpenWFE
|
|
603
668
|
|
604
669
|
t = OpenWFE::Timer.new
|
605
670
|
|
606
|
-
|
671
|
+
linfo { "reschedule() initiating..." }
|
607
672
|
|
608
673
|
get_expression_storage.each_of_kind(Schedulable) do |fe|
|
609
674
|
|
610
|
-
|
675
|
+
#linfo { "reschedule() for #{fe.fei.to_debug_s}..." }
|
676
|
+
linfo { "reschedule() for #{fe.fei.to_s}..." }
|
611
677
|
|
612
678
|
onotify :reschedule, fe.fei
|
613
679
|
|
614
680
|
fe.reschedule(get_scheduler)
|
615
681
|
end
|
616
682
|
|
617
|
-
|
683
|
+
linfo { "reschedule() done. (took #{t.duration} ms)" }
|
618
684
|
end
|
619
685
|
end
|
620
686
|
|
@@ -624,22 +690,22 @@ module OpenWFE
|
|
624
690
|
# 'singleton' method.
|
625
691
|
#
|
626
692
|
def engine_environment_id ()
|
627
|
-
synchronize do
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
end
|
693
|
+
#synchronize do
|
694
|
+
|
695
|
+
return @eei if @eei
|
696
|
+
|
697
|
+
@eei = FlowExpressionId.new
|
698
|
+
@eei.owfe_version = OPENWFERU_VERSION
|
699
|
+
@eei.engine_id = get_engine.service_name
|
700
|
+
@eei.initial_engine_id = @eei.engine_id
|
701
|
+
@eei.workflow_definition_url = 'ee'
|
702
|
+
@eei.workflow_definition_name = 'ee'
|
703
|
+
@eei.workflow_definition_revision = '0'
|
704
|
+
@eei.workflow_instance_id = '0'
|
705
|
+
@eei.expression_name = EN_ENVIRONMENT
|
706
|
+
@eei.expression_id = '0'
|
707
|
+
@eei
|
708
|
+
#end
|
643
709
|
end
|
644
710
|
|
645
711
|
#
|
@@ -716,32 +782,67 @@ module OpenWFE
|
|
716
782
|
list_processes(false, wfid)[0]
|
717
783
|
end
|
718
784
|
|
785
|
+
#
|
786
|
+
# This method is called when apply() or reply() failed for
|
787
|
+
# an expression.
|
788
|
+
# There are currently only two 'users', the ParticipantExpression
|
789
|
+
# class and the do_process_workelement method of this ExpressionPool
|
790
|
+
# class.
|
791
|
+
#
|
792
|
+
def notify_error (error, fei, message, workitem)
|
793
|
+
|
794
|
+
fei = extract_fei fei
|
795
|
+
# densha requires that... :(
|
796
|
+
|
797
|
+
se = OpenWFE::exception_to_s(error)
|
798
|
+
|
799
|
+
onotify :error, fei, message, workitem, error.class.name, se
|
800
|
+
|
801
|
+
#fei = extract_fei fei
|
802
|
+
|
803
|
+
if error.is_a?(PausedError)
|
804
|
+
lwarn do
|
805
|
+
"#{self.service_name} " +
|
806
|
+
"operation :#{message.to_s} on #{fei.to_s} " +
|
807
|
+
"delayed because process '#{fei.wfid}' is in pause"
|
808
|
+
end
|
809
|
+
else
|
810
|
+
lwarn do
|
811
|
+
"#{self.service_name} " +
|
812
|
+
"operation :#{message.to_s} on #{fei.to_s} " +
|
813
|
+
"failed with\n" + se
|
814
|
+
end
|
815
|
+
end
|
816
|
+
end
|
817
|
+
|
719
818
|
protected
|
720
819
|
|
820
|
+
#--
|
821
|
+
# Returns true if it's the fei of a participant
|
822
|
+
# (or of a subprocess ref)
|
823
|
+
#
|
824
|
+
#def is_participant? (fei)
|
825
|
+
# exp_name = fei.expression_name
|
826
|
+
# return true if exp_name == "participant"
|
827
|
+
# (get_expression_map.get_class(exp_name) == nil)
|
828
|
+
#end
|
829
|
+
#++
|
830
|
+
|
721
831
|
#
|
722
832
|
# This method is called by the workqueue when processing
|
723
833
|
# the atomic work operations.
|
724
834
|
#
|
725
835
|
def do_process_workelement elt
|
726
836
|
|
837
|
+
message, fei, workitem = elt
|
838
|
+
|
727
839
|
begin
|
728
840
|
|
729
|
-
message, fei, workitem = elt
|
730
841
|
send message, fei, workitem
|
731
842
|
|
732
843
|
rescue Exception => e
|
733
844
|
|
734
|
-
|
735
|
-
|
736
|
-
onotify :error, fei, message, workitem, se
|
737
|
-
|
738
|
-
fei = extract_fei fei
|
739
|
-
|
740
|
-
lwarn do
|
741
|
-
"#{self.service_name} " +
|
742
|
-
"operation :#{message.to_s} on #{fei.to_s} " +
|
743
|
-
"failed with\n" + se
|
744
|
-
end
|
845
|
+
notify_error(e, fei, message, workitem)
|
745
846
|
end
|
746
847
|
end
|
747
848
|
|
@@ -750,13 +851,18 @@ module OpenWFE
|
|
750
851
|
#
|
751
852
|
def do_apply (exp, workitem)
|
752
853
|
|
753
|
-
exp, fei = fetch(exp) if exp.kind_of?
|
854
|
+
exp, fei = fetch(exp) if exp.kind_of?(FlowExpressionId)
|
855
|
+
|
856
|
+
check_if_paused exp
|
754
857
|
|
755
858
|
#ldebug { "apply() '#{fei}' (#{fei.class})" }
|
756
859
|
|
757
860
|
if not exp
|
861
|
+
|
758
862
|
lwarn { "apply() cannot apply missing #{fei.to_debug_s}" }
|
759
863
|
return
|
864
|
+
|
865
|
+
#raise "apply() cannot apply missing #{fei.to_debug_s}"
|
760
866
|
end
|
761
867
|
|
762
868
|
#ldebug { "apply() #{fei.to_debug_s}" }
|
@@ -782,6 +888,8 @@ module OpenWFE
|
|
782
888
|
ldebug { "reply() to #{fei.to_debug_s}" }
|
783
889
|
ldebug { "reply() from #{workitem.last_expression_id.to_debug_s}" }
|
784
890
|
|
891
|
+
check_if_paused exp
|
892
|
+
|
785
893
|
if not exp
|
786
894
|
#raise "cannot reply to missing #{fei.to_debug_s}"
|
787
895
|
lwarn { "reply() cannot reply to missing #{fei.to_debug_s}" }
|
@@ -793,6 +901,91 @@ module OpenWFE
|
|
793
901
|
exp.reply(workitem)
|
794
902
|
end
|
795
903
|
|
904
|
+
#
|
905
|
+
# Will raise an exception if the expression belongs to a paused
|
906
|
+
# process.
|
907
|
+
#
|
908
|
+
def check_if_paused (expression)
|
909
|
+
|
910
|
+
return unless expression
|
911
|
+
|
912
|
+
raise PausedError.new(expression.fei.wfid) \
|
913
|
+
if expression.paused?
|
914
|
+
end
|
915
|
+
|
916
|
+
#
|
917
|
+
# if the launch method is called with a schedule option
|
918
|
+
# (like :at, :in, :cron and :every), this method takes care of
|
919
|
+
# wrapping the process with a sleep or a cron.
|
920
|
+
#
|
921
|
+
def wrap_in_schedule (raw_expression, options)
|
922
|
+
|
923
|
+
oat = options[:at]
|
924
|
+
oin = options[:in]
|
925
|
+
ocron = options[:cron]
|
926
|
+
oevery = options[:every]
|
927
|
+
|
928
|
+
fei = new_fei(nil, "schedlaunch", "0", "sequence")
|
929
|
+
|
930
|
+
# not very happy with this code, it builds custom
|
931
|
+
# wrapping processes manually, maybe there is
|
932
|
+
# a more elegant way, but for now, it's ok.
|
933
|
+
|
934
|
+
if oat or oin
|
935
|
+
|
936
|
+
seq = get_expression_map.get_class(:sequence)
|
937
|
+
seq = seq.new(fei, nil, nil, application_context, nil)
|
938
|
+
|
939
|
+
att = if oat
|
940
|
+
{ "until" => oat }
|
941
|
+
else #oin
|
942
|
+
{ "for" => oin }
|
943
|
+
end
|
944
|
+
|
945
|
+
sle = get_expression_map.get_class(:sleep)
|
946
|
+
sle = sle.new(fei.dup, fei, nil, application_context, att)
|
947
|
+
sle.fei.expression_id = "0.1"
|
948
|
+
sle.fei.expression_name = "sleep"
|
949
|
+
seq.children << sle.fei
|
950
|
+
seq.children << raw_expression.fei
|
951
|
+
|
952
|
+
seq.new_environment
|
953
|
+
sle.environment_id = seq.environment_id
|
954
|
+
|
955
|
+
sle.store_itself
|
956
|
+
seq.store_itself
|
957
|
+
|
958
|
+
raw_expression.store_itself
|
959
|
+
raw_expression = seq
|
960
|
+
|
961
|
+
elsif ocron or oevery
|
962
|
+
|
963
|
+
fei.expression_name = "cron"
|
964
|
+
|
965
|
+
att = if ocron
|
966
|
+
{ "tab" => ocron }
|
967
|
+
else #oevery
|
968
|
+
{ "every" => oevery }
|
969
|
+
end
|
970
|
+
att["name"] = "//cron_launch__#{fei.wfid}"
|
971
|
+
|
972
|
+
cro = get_expression_map.get_class(:cron)
|
973
|
+
cro = cro.new(fei, nil, nil, application_context, att)
|
974
|
+
|
975
|
+
cro.children << raw_expression.fei
|
976
|
+
|
977
|
+
cro.new_environment
|
978
|
+
|
979
|
+
cro.store_itself
|
980
|
+
|
981
|
+
raw_expression.store_itself
|
982
|
+
raw_expression = cro
|
983
|
+
end
|
984
|
+
# else, don't schedule at all
|
985
|
+
|
986
|
+
raw_expression
|
987
|
+
end
|
988
|
+
|
796
989
|
#
|
797
990
|
# Removes an environment, especially takes care of unbinding
|
798
991
|
# any special value it may contain.
|
@@ -803,6 +996,10 @@ module OpenWFE
|
|
803
996
|
|
804
997
|
env, fei = fetch(environment_id)
|
805
998
|
|
999
|
+
return unless env
|
1000
|
+
#
|
1001
|
+
# env already unbound and removed
|
1002
|
+
|
806
1003
|
env.unbind
|
807
1004
|
|
808
1005
|
#get_expression_storage().delete(environment_id)
|
@@ -891,16 +1088,12 @@ module OpenWFE
|
|
891
1088
|
#
|
892
1089
|
# else it's some ruby code to eval
|
893
1090
|
|
894
|
-
|
895
|
-
|
896
|
-
return o.do_make \
|
897
|
-
if o.is_a?(ProcessDefinition) or o.is_a?(Class)
|
898
|
-
|
899
|
-
o
|
1091
|
+
ProcessDefinition::eval_ruby_process_definition(
|
1092
|
+
param, SAFETY_LEVEL)
|
900
1093
|
end
|
901
1094
|
|
902
1095
|
#
|
903
|
-
# Builds a FlowExpressionId instance for process being
|
1096
|
+
# Builds a FlowExpressionId instance for a process being
|
904
1097
|
# launched.
|
905
1098
|
#
|
906
1099
|
def new_fei (launchitem, flow_name, flow_revision, exp_name)
|
@@ -953,6 +1146,41 @@ module OpenWFE
|
|
953
1146
|
end
|
954
1147
|
end
|
955
1148
|
|
1149
|
+
#
|
1150
|
+
# This error is raised when an expression belonging to a paused
|
1151
|
+
# process is applied or replied to.
|
1152
|
+
#
|
1153
|
+
class PausedError < RuntimeError
|
1154
|
+
|
1155
|
+
attr_reader :wfid
|
1156
|
+
|
1157
|
+
def initialize (wfid)
|
1158
|
+
|
1159
|
+
super "process '#{wfid}' is paused"
|
1160
|
+
@wfid = wfid
|
1161
|
+
end
|
1162
|
+
|
1163
|
+
#
|
1164
|
+
# Returns a hash for this PausedError instance.
|
1165
|
+
# (simply returns the hash of the paused process' wfid).
|
1166
|
+
#
|
1167
|
+
def hash
|
1168
|
+
|
1169
|
+
@wfid.hash
|
1170
|
+
end
|
1171
|
+
|
1172
|
+
#
|
1173
|
+
# Returns true if the other is a PausedError issued for the
|
1174
|
+
# same process instance (wfid).
|
1175
|
+
#
|
1176
|
+
def == (other)
|
1177
|
+
|
1178
|
+
return false unless other.is_a?(PausedError)
|
1179
|
+
|
1180
|
+
(@wfid == other.wfid)
|
1181
|
+
end
|
1182
|
+
end
|
1183
|
+
|
956
1184
|
#
|
957
1185
|
# a small help class for storing monitors provided on demand
|
958
1186
|
# to expressions that need them
|
@@ -972,15 +1200,6 @@ module OpenWFE
|
|
972
1200
|
synchronize do
|
973
1201
|
|
974
1202
|
(@monitors[key] ||= Monitor.new)
|
975
|
-
#if not mon
|
976
|
-
# #ldebug { "[] creating new Monitor for #{key}" }
|
977
|
-
# mon = Monitor.new
|
978
|
-
# @monitors[key] = mon
|
979
|
-
#else
|
980
|
-
# #ldebug { "[] already had Monitor for #{key}" }
|
981
|
-
#end
|
982
|
-
#
|
983
|
-
#mon
|
984
1203
|
end
|
985
1204
|
end
|
986
1205
|
|
@@ -30,8 +30,6 @@
|
|
30
30
|
# POSSIBILITY OF SUCH DAMAGE.
|
31
31
|
#++
|
32
32
|
#
|
33
|
-
# $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
|
34
|
-
#
|
35
33
|
|
36
34
|
#
|
37
35
|
# "made in Japan"
|
@@ -116,7 +114,7 @@ module OpenWFE
|
|
116
114
|
|
117
115
|
@cache[fei.hash] = fe
|
118
116
|
|
119
|
-
|
117
|
+
fe
|
120
118
|
end
|
121
119
|
|
122
120
|
def []= (fei, fe)
|
@@ -194,7 +192,7 @@ module OpenWFE
|
|
194
192
|
@real_storage =
|
195
193
|
@application_context[S_EXPRESSION_STORAGE + ".1"]
|
196
194
|
|
197
|
-
|
195
|
+
@real_storage
|
198
196
|
end
|
199
197
|
end
|
200
198
|
|
@@ -271,6 +269,8 @@ module OpenWFE
|
|
271
269
|
#
|
272
270
|
# a small help method for expression storages...
|
273
271
|
#
|
272
|
+
# TODO : put that in a module !
|
273
|
+
#
|
274
274
|
def expstorage_to_s (expstorage)
|
275
275
|
|
276
276
|
s = "\n\n==== #{expstorage.class} ===="
|
@@ -282,12 +282,13 @@ module OpenWFE
|
|
282
282
|
else
|
283
283
|
s << " "
|
284
284
|
end
|
285
|
-
s << v.to_s
|
285
|
+
#s << v.to_s
|
286
|
+
s << v.fei.to_s
|
286
287
|
s << " key/value mismatch !" if k != v.fei
|
287
288
|
end
|
288
289
|
s << "\n==== . ====\n"
|
289
290
|
|
290
|
-
|
291
|
+
s
|
291
292
|
end
|
292
293
|
|
293
294
|
end
|
@@ -75,15 +75,17 @@ module OpenWFE
|
|
75
75
|
|
76
76
|
return unless block
|
77
77
|
|
78
|
-
exp_names = get_expression_map.get_expression_names(kind)
|
79
|
-
|
80
78
|
each_object_path do |path|
|
81
79
|
|
82
80
|
#ldebug { "each_of_kind() path is #{path}" }
|
83
81
|
|
84
|
-
next unless matches(path,
|
82
|
+
#next unless matches(path, kind)
|
83
|
+
# was not OK in case of <bob activity="clean office" />
|
85
84
|
|
86
85
|
expression = load_object(path)
|
86
|
+
|
87
|
+
next unless expression.is_a?(kind)
|
88
|
+
|
87
89
|
expression.application_context = @application_context
|
88
90
|
|
89
91
|
block.call expression
|
@@ -179,19 +181,20 @@ module OpenWFE
|
|
179
181
|
fei.expression_name + ".yaml"
|
180
182
|
end
|
181
183
|
|
182
|
-
|
184
|
+
#--
|
183
185
|
# Returns true if the path points to a file containing an
|
184
|
-
# expression whose name is in
|
186
|
+
# expression whose name is in the list of expression names
|
187
|
+
# corresponding to the given kind (class) of expressions.
|
185
188
|
#
|
186
|
-
def matches (path,
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
189
|
+
#def matches (path, kind)
|
190
|
+
# exp_names = get_expression_map.get_expression_names(kind)
|
191
|
+
# exp_names.each do |exp_name|
|
192
|
+
# return true \
|
193
|
+
# if OpenWFE::ends_with(path, "_#{exp_name}.yaml")
|
194
|
+
# end
|
195
|
+
# false
|
196
|
+
#end
|
197
|
+
#++
|
195
198
|
end
|
196
199
|
|
197
200
|
#
|
@@ -30,8 +30,6 @@
|
|
30
30
|
# POSSIBILITY OF SUCH DAMAGE.
|
31
31
|
#++
|
32
32
|
#
|
33
|
-
# $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
|
34
|
-
#
|
35
33
|
|
36
34
|
#
|
37
35
|
# "made in Japan"
|
@@ -112,7 +110,7 @@ module OpenWFE
|
|
112
110
|
conditional = lookup_attribute(attname, workitem)
|
113
111
|
rconditional = lookup_attribute("r"+attname.to_s, workitem)
|
114
112
|
|
115
|
-
return do_eval(rconditional) \
|
113
|
+
return do_eval(rconditional, workitem) \
|
116
114
|
if rconditional and not conditional
|
117
115
|
|
118
116
|
return nil \
|
@@ -125,7 +123,7 @@ module OpenWFE
|
|
125
123
|
ldebug { "do_eval_condition() 1 for '#{conditional}'" }
|
126
124
|
|
127
125
|
begin
|
128
|
-
return to_boolean(do_eval(conditional))
|
126
|
+
return to_boolean(do_eval(conditional, workitem))
|
129
127
|
rescue Exception => e
|
130
128
|
# probably needs some quoting...
|
131
129
|
end
|
@@ -134,7 +132,7 @@ module OpenWFE
|
|
134
132
|
|
135
133
|
ldebug { "do_eval_condition() 2 for '#{conditional}'" }
|
136
134
|
|
137
|
-
to_boolean(do_eval(conditional))
|
135
|
+
to_boolean(do_eval(conditional, workitem))
|
138
136
|
end
|
139
137
|
|
140
138
|
private
|
@@ -195,8 +193,13 @@ module OpenWFE
|
|
195
193
|
# Runs the given given within an instance_eval() at a $SAFE
|
196
194
|
# level of 3.
|
197
195
|
#
|
198
|
-
def do_eval (s)
|
199
|
-
|
196
|
+
def do_eval (s, workitem)
|
197
|
+
|
198
|
+
#OpenWFE::instance_eval_safely(self, s, 3)
|
199
|
+
|
200
|
+
wi = workitem
|
201
|
+
fe = self
|
202
|
+
OpenWFE::eval_safely(s, 3, binding())
|
200
203
|
end
|
201
204
|
end
|
202
205
|
|