openwferu 0.9.13 → 0.9.14
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/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
|
|