ruote 2.2.0 → 2.3.0
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 +166 -1
- data/CREDITS.txt +36 -17
- data/LICENSE.txt +1 -1
- data/README.rdoc +1 -7
- data/Rakefile +38 -29
- data/TODO.txt +93 -52
- data/lib/ruote-fs.rb +3 -0
- data/lib/ruote.rb +5 -1
- data/lib/ruote/context.rb +140 -35
- data/lib/ruote/dashboard.rb +1247 -0
- data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
- data/lib/ruote/dboard/process_status.rb +587 -0
- data/lib/ruote/engine.rb +6 -871
- data/lib/ruote/exp/command.rb +7 -2
- data/lib/ruote/exp/commanded.rb +2 -2
- data/lib/ruote/exp/condition.rb +38 -13
- data/lib/ruote/exp/fe_add_branches.rb +1 -1
- data/lib/ruote/exp/fe_apply.rb +1 -1
- data/lib/ruote/exp/fe_await.rb +357 -0
- data/lib/ruote/exp/fe_cancel_process.rb +17 -3
- data/lib/ruote/exp/fe_command.rb +8 -4
- data/lib/ruote/exp/fe_concurrence.rb +218 -18
- data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
- data/lib/ruote/exp/fe_cron.rb +3 -10
- data/lib/ruote/exp/fe_cursor.rb +14 -4
- data/lib/ruote/exp/fe_define.rb +3 -1
- data/lib/ruote/exp/fe_echo.rb +1 -1
- data/lib/ruote/exp/fe_equals.rb +1 -1
- data/lib/ruote/exp/fe_error.rb +1 -1
- data/lib/ruote/exp/fe_filter.rb +163 -4
- data/lib/ruote/exp/fe_forget.rb +21 -4
- data/lib/ruote/exp/fe_given.rb +1 -1
- data/lib/ruote/exp/fe_if.rb +1 -1
- data/lib/ruote/exp/fe_inc.rb +102 -35
- data/lib/ruote/exp/fe_iterator.rb +47 -12
- data/lib/ruote/exp/fe_listen.rb +96 -11
- data/lib/ruote/exp/fe_lose.rb +31 -4
- data/lib/ruote/exp/fe_noop.rb +1 -1
- data/lib/ruote/exp/fe_on_error.rb +109 -0
- data/lib/ruote/exp/fe_once.rb +10 -19
- data/lib/ruote/exp/fe_participant.rb +90 -28
- data/lib/ruote/exp/fe_read.rb +69 -0
- data/lib/ruote/exp/fe_redo.rb +3 -2
- data/lib/ruote/exp/fe_ref.rb +57 -27
- data/lib/ruote/exp/fe_registerp.rb +1 -3
- data/lib/ruote/exp/fe_reserve.rb +1 -1
- data/lib/ruote/exp/fe_restore.rb +6 -6
- data/lib/ruote/exp/fe_save.rb +12 -19
- data/lib/ruote/exp/fe_sequence.rb +38 -2
- data/lib/ruote/exp/fe_set.rb +143 -40
- data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
- data/lib/ruote/exp/fe_subprocess.rb +8 -2
- data/lib/ruote/exp/fe_that.rb +1 -1
- data/lib/ruote/exp/fe_undo.rb +40 -4
- data/lib/ruote/exp/fe_unregisterp.rb +1 -3
- data/lib/ruote/exp/fe_wait.rb +12 -25
- data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
- data/lib/ruote/exp/iterator.rb +2 -2
- data/lib/ruote/exp/merge.rb +78 -17
- data/lib/ruote/exp/ro_attributes.rb +46 -36
- data/lib/ruote/exp/ro_filters.rb +34 -8
- data/lib/ruote/exp/ro_on_x.rb +431 -0
- data/lib/ruote/exp/ro_persist.rb +19 -7
- data/lib/ruote/exp/ro_timers.rb +123 -0
- data/lib/ruote/exp/ro_variables.rb +90 -29
- data/lib/ruote/fei.rb +57 -3
- data/lib/ruote/fs.rb +3 -0
- data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
- data/lib/ruote/id/wfid_generator.rb +17 -38
- data/lib/ruote/log/default_history.rb +23 -9
- data/lib/ruote/log/fancy_printing.rb +265 -0
- data/lib/ruote/log/storage_history.rb +23 -13
- data/lib/ruote/log/wait_logger.rb +224 -17
- data/lib/ruote/observer.rb +82 -0
- data/lib/ruote/part/block_participant.rb +65 -28
- data/lib/ruote/part/code_participant.rb +81 -0
- data/lib/ruote/part/engine_participant.rb +7 -2
- data/lib/ruote/part/local_participant.rb +221 -21
- data/lib/ruote/part/no_op_participant.rb +1 -1
- data/lib/ruote/part/null_participant.rb +1 -1
- data/lib/ruote/part/participant.rb +50 -0
- data/lib/ruote/part/rev_participant.rb +178 -0
- data/lib/ruote/part/smtp_participant.rb +2 -2
- data/lib/ruote/part/storage_participant.rb +228 -60
- data/lib/ruote/part/template.rb +1 -1
- data/lib/ruote/participant.rb +2 -0
- data/lib/ruote/reader.rb +205 -68
- data/lib/ruote/reader/json.rb +49 -0
- data/lib/ruote/reader/radial.rb +303 -0
- data/lib/ruote/reader/ruby_dsl.rb +44 -9
- data/lib/ruote/reader/xml.rb +11 -8
- data/lib/ruote/receiver/base.rb +98 -45
- data/lib/ruote/storage/base.rb +104 -35
- data/lib/ruote/storage/composite_storage.rb +50 -60
- data/lib/ruote/storage/fs_storage.rb +25 -34
- data/lib/ruote/storage/hash_storage.rb +38 -36
- data/lib/ruote/svc/dispatch_pool.rb +104 -35
- data/lib/ruote/svc/dollar_sub.rb +10 -8
- data/lib/ruote/svc/error_handler.rb +108 -52
- data/lib/ruote/svc/expression_map.rb +3 -3
- data/lib/ruote/svc/participant_list.rb +160 -55
- data/lib/ruote/svc/tracker.rb +31 -31
- data/lib/ruote/svc/treechecker.rb +28 -16
- data/lib/ruote/tree_dot.rb +1 -1
- data/lib/ruote/util/deep.rb +143 -0
- data/lib/ruote/util/filter.rb +125 -18
- data/lib/ruote/util/hashdot.rb +15 -13
- data/lib/ruote/util/look.rb +1 -1
- data/lib/ruote/util/lookup.rb +60 -22
- data/lib/ruote/util/misc.rb +63 -18
- data/lib/ruote/util/mpatch.rb +53 -0
- data/lib/ruote/util/ometa.rb +1 -2
- data/lib/ruote/util/process_observer.rb +177 -0
- data/lib/ruote/util/subprocess.rb +1 -1
- data/lib/ruote/util/time.rb +2 -2
- data/lib/ruote/util/tree.rb +64 -2
- data/lib/ruote/version.rb +3 -2
- data/lib/ruote/worker.rb +421 -92
- data/lib/ruote/workitem.rb +157 -22
- data/ruote.gemspec +15 -9
- data/test/bm/ci.rb +0 -2
- data/test/bm/ici.rb +0 -2
- data/test/bm/load_26c.rb +0 -3
- data/test/bm/mega.rb +0 -2
- data/test/functional/base.rb +57 -43
- data/test/functional/concurrent_base.rb +16 -13
- data/test/functional/ct_0_concurrence.rb +7 -11
- data/test/functional/ct_1_iterator.rb +9 -11
- data/test/functional/ct_2_cancel.rb +28 -17
- data/test/functional/eft_0_flow_expression.rb +35 -0
- data/test/functional/eft_10_cancel_process.rb +1 -1
- data/test/functional/eft_11_wait.rb +13 -13
- data/test/functional/eft_12_listen.rb +199 -66
- data/test/functional/eft_13_iterator.rb +95 -29
- data/test/functional/eft_14_cursor.rb +74 -24
- data/test/functional/eft_15_loop.rb +7 -7
- data/test/functional/eft_16_if.rb +1 -1
- data/test/functional/eft_17_equals.rb +1 -1
- data/test/functional/eft_18_concurrent_iterator.rb +156 -68
- data/test/functional/eft_19_reserve.rb +15 -15
- data/test/functional/eft_1_echo.rb +1 -1
- data/test/functional/eft_20_save.rb +51 -9
- data/test/functional/eft_21_restore.rb +1 -1
- data/test/functional/eft_22_noop.rb +1 -1
- data/test/functional/eft_23_apply.rb +1 -1
- data/test/functional/eft_24_add_branches.rb +7 -8
- data/test/functional/eft_25_command.rb +1 -1
- data/test/functional/eft_26_error.rb +11 -11
- data/test/functional/eft_27_inc.rb +111 -67
- data/test/functional/eft_28_once.rb +16 -16
- data/test/functional/eft_29_cron.rb +9 -9
- data/test/functional/eft_2_sequence.rb +23 -4
- data/test/functional/eft_30_ref.rb +36 -24
- data/test/functional/eft_31_registerp.rb +24 -24
- data/test/functional/eft_32_lose.rb +46 -20
- data/test/functional/eft_34_given.rb +1 -1
- data/test/functional/eft_35_filter.rb +161 -7
- data/test/functional/eft_36_read.rb +97 -0
- data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
- data/test/functional/eft_38_on_error.rb +195 -0
- data/test/functional/eft_39_stall.rb +35 -0
- data/test/functional/eft_3_participant.rb +77 -22
- data/test/functional/eft_40_await.rb +297 -0
- data/test/functional/eft_4_set.rb +110 -11
- data/test/functional/eft_5_subprocess.rb +27 -5
- data/test/functional/eft_6_concurrence.rb +299 -60
- data/test/functional/eft_7_forget.rb +24 -22
- data/test/functional/eft_8_undo.rb +52 -15
- data/test/functional/eft_9_redo.rb +18 -20
- data/test/functional/ft_0_worker.rb +122 -13
- data/test/functional/ft_10_dollar.rb +77 -16
- data/test/functional/ft_11_recursion.rb +9 -9
- data/test/functional/ft_12_launchitem.rb +7 -9
- data/test/functional/ft_13_variables.rb +125 -22
- data/test/functional/ft_14_re_apply.rb +112 -56
- data/test/functional/ft_15_timeout.rb +64 -33
- data/test/functional/ft_16_participant_params.rb +59 -6
- data/test/functional/ft_17_conditional.rb +68 -2
- data/test/functional/ft_18_kill.rb +48 -30
- data/test/functional/ft_19_participant_code.rb +67 -0
- data/test/functional/ft_1_process_status.rb +222 -150
- data/test/functional/ft_20_storage_participant.rb +445 -44
- data/test/functional/ft_21_forget.rb +21 -26
- data/test/functional/ft_22_process_definitions.rb +8 -6
- data/test/functional/ft_23_load_defs.rb +29 -5
- data/test/functional/ft_24_block_participant.rb +199 -20
- data/test/functional/ft_25_receiver.rb +98 -46
- data/test/functional/ft_26_participant_rtimeout.rb +34 -26
- data/test/functional/ft_27_var_indirection.rb +40 -5
- data/test/functional/ft_28_null_noop_participants.rb +5 -5
- data/test/functional/ft_29_part_template.rb +2 -2
- data/test/functional/ft_2_errors.rb +106 -74
- data/test/functional/ft_30_smtp_participant.rb +7 -7
- data/test/functional/ft_31_part_blocking.rb +11 -11
- data/test/functional/ft_32_scope.rb +50 -0
- data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
- data/test/functional/ft_34_cursor_rewind.rb +14 -14
- data/test/functional/ft_35_add_service.rb +67 -9
- data/test/functional/ft_36_storage_history.rb +92 -24
- data/test/functional/ft_37_default_history.rb +35 -23
- data/test/functional/ft_38_participant_more.rb +189 -32
- data/test/functional/ft_39_wait_for.rb +25 -25
- data/test/functional/ft_3_participant_registration.rb +235 -107
- data/test/functional/ft_40_wait_logger.rb +105 -18
- data/test/functional/ft_41_participants.rb +13 -12
- data/test/functional/ft_42_storage_copy.rb +12 -12
- data/test/functional/ft_43_participant_on_reply.rb +85 -11
- data/test/functional/ft_44_var_participant.rb +5 -5
- data/test/functional/ft_45_participant_accept.rb +3 -3
- data/test/functional/ft_46_launch_single.rb +17 -17
- data/test/functional/ft_47_wfids.rb +41 -0
- data/test/functional/ft_48_lose.rb +19 -25
- data/test/functional/ft_49_engine_on_error.rb +54 -70
- data/test/functional/ft_4_cancel.rb +84 -26
- data/test/functional/ft_50_engine_config.rb +4 -4
- data/test/functional/ft_51_misc.rb +12 -12
- data/test/functional/ft_52_case.rb +17 -17
- data/test/functional/ft_53_engine_on_terminate.rb +18 -21
- data/test/functional/ft_54_patterns.rb +18 -16
- data/test/functional/ft_55_engine_participant.rb +55 -55
- data/test/functional/ft_56_filter_attribute.rb +90 -52
- data/test/functional/ft_57_rev_participant.rb +252 -0
- data/test/functional/ft_58_workitem.rb +150 -0
- data/test/functional/ft_59_pause.rb +329 -0
- data/test/functional/ft_5_on_error.rb +430 -77
- data/test/functional/ft_60_code_participant.rb +65 -0
- data/test/functional/ft_61_trailing_fields.rb +34 -0
- data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
- data/test/functional/ft_63_participants_221.rb +458 -0
- data/test/functional/ft_64_stash.rb +41 -0
- data/test/functional/ft_65_timers.rb +313 -0
- data/test/functional/ft_66_flank.rb +133 -0
- data/test/functional/ft_67_radial_misc.rb +34 -0
- data/test/functional/ft_68_reput.rb +72 -0
- data/test/functional/ft_69_worker_info.rb +56 -0
- data/test/functional/ft_6_on_cancel.rb +189 -36
- data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
- data/test/functional/ft_71_retries.rb +144 -0
- data/test/functional/ft_72_on_terminate.rb +60 -0
- data/test/functional/ft_73_raise_msg.rb +107 -0
- data/test/functional/ft_74_respark.rb +106 -0
- data/test/functional/ft_75_context.rb +66 -0
- data/test/functional/ft_76_observer.rb +53 -0
- data/test/functional/ft_77_process_observer.rb +157 -0
- data/test/functional/ft_78_part_participant.rb +37 -0
- data/test/functional/ft_7_tags.rb +238 -50
- data/test/functional/ft_8_participant_consumption.rb +27 -21
- data/test/functional/ft_9_subprocesses.rb +48 -18
- data/test/functional/restart_base.rb +4 -6
- data/test/functional/rt_0_wait.rb +10 -10
- data/test/functional/rt_1_listen.rb +6 -6
- data/test/functional/rt_2_errors.rb +12 -12
- data/test/functional/rt_3_once.rb +17 -12
- data/test/functional/rt_4_cron.rb +17 -17
- data/test/functional/rt_5_timeout.rb +13 -13
- data/test/functional/signals.rb +103 -0
- data/test/functional/storage.rb +730 -0
- data/test/functional/storage_helper.rb +48 -35
- data/test/functional/test.rb +6 -2
- data/test/misc/idle.rb +21 -0
- data/test/misc/light.rb +29 -0
- data/test/path_helper.rb +1 -1
- data/test/test.rb +2 -5
- data/test/test_helper.rb +13 -0
- data/test/unit/test.rb +1 -4
- data/test/unit/ut_0_ruby_reader.rb +25 -9
- data/test/unit/ut_10_participants.rb +47 -0
- data/test/unit/ut_11_lookup.rb +59 -2
- data/test/unit/ut_12_wait_logger.rb +123 -0
- data/test/unit/ut_14_is_uri.rb +1 -1
- data/test/unit/ut_15_util.rb +1 -1
- data/test/unit/ut_16_reader.rb +136 -14
- data/test/unit/ut_17_merge.rb +155 -0
- data/test/unit/ut_19_part_template.rb +1 -1
- data/test/unit/ut_1_fei.rb +11 -2
- data/test/unit/ut_20_composite_storage.rb +27 -1
- data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
- data/test/unit/ut_22_filter.rb +231 -10
- data/test/unit/ut_23_svc_tracker.rb +48 -0
- data/test/unit/ut_24_radial_reader.rb +458 -0
- data/test/unit/ut_25_process_status.rb +143 -0
- data/test/unit/ut_26_deep.rb +131 -0
- data/test/unit/ut_2_dashboard.rb +114 -0
- data/test/unit/ut_3_worker.rb +54 -0
- data/test/unit/ut_4_expmap.rb +1 -1
- data/test/unit/ut_5_tree.rb +23 -23
- data/test/unit/ut_6_condition.rb +71 -29
- data/test/unit/ut_7_workitem.rb +18 -4
- data/test/unit/ut_8_tree_to_dot.rb +1 -1
- data/test/unit/ut_9_xml_reader.rb +1 -1
- metadata +142 -63
- data/jruby_issue.txt +0 -32
- data/lib/ruote/engine/process_status.rb +0 -403
- data/lib/ruote/log/pretty.rb +0 -165
- data/lib/ruote/log/test_logger.rb +0 -204
- data/lib/ruote/util/serializer.rb +0 -103
- data/phil.txt +0 -14
- data/test/functional/eft_33_let.rb +0 -31
- data/test/functional/ft_19_alias.rb +0 -33
- data/test/functional/ft_47_wfid_generator.rb +0 -54
- data/test/unit/storage.rb +0 -403
- data/test/unit/storages.rb +0 -37
- data/test/unit/ut_13_serializer.rb +0 -65
- data/test/unit/ut_18_engine.rb +0 -47
- data/test/unit/ut_3_wait_logger.rb +0 -39
data/lib/ruote/exp/fe_once.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -149,7 +149,6 @@ module Ruote::Exp
|
|
|
149
149
|
|
|
150
150
|
h.frequency = attribute(:frequency) || attribute(:freq) || '10s'
|
|
151
151
|
h.triggered = false
|
|
152
|
-
h.job_id = nil
|
|
153
152
|
|
|
154
153
|
reply(h.applied_workitem)
|
|
155
154
|
end
|
|
@@ -164,37 +163,29 @@ module Ruote::Exp
|
|
|
164
163
|
|
|
165
164
|
h.triggered = true
|
|
166
165
|
|
|
167
|
-
@context.storage.delete_schedule(h.
|
|
166
|
+
@context.storage.delete_schedule(h.schedule_id)
|
|
168
167
|
# especially for a cron...
|
|
169
168
|
|
|
170
|
-
if tree_children[0]
|
|
171
|
-
|
|
172
|
-
# trigger first child
|
|
173
|
-
#
|
|
169
|
+
if tree_children[0] # trigger first child
|
|
170
|
+
|
|
174
171
|
apply_child(0, workitem)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
#
|
|
172
|
+
|
|
173
|
+
else # blocking case
|
|
174
|
+
|
|
179
175
|
reply_to_parent(workitem)
|
|
180
176
|
end
|
|
177
|
+
|
|
181
178
|
else
|
|
182
179
|
|
|
183
180
|
reschedule
|
|
184
181
|
end
|
|
185
182
|
end
|
|
186
183
|
|
|
187
|
-
def cancel(flavour)
|
|
188
|
-
|
|
189
|
-
@context.storage.delete_schedule(h.job_id)
|
|
190
|
-
super
|
|
191
|
-
end
|
|
192
|
-
|
|
193
184
|
protected
|
|
194
185
|
|
|
195
186
|
def reschedule
|
|
196
187
|
|
|
197
|
-
h.
|
|
188
|
+
h.schedule_id = @context.storage.put_schedule(
|
|
198
189
|
'cron',
|
|
199
190
|
h.fei,
|
|
200
191
|
h.frequency,
|
|
@@ -202,7 +193,7 @@ module Ruote::Exp
|
|
|
202
193
|
'fei' => h.fei,
|
|
203
194
|
'workitem' => h.applied_workitem)
|
|
204
195
|
|
|
205
|
-
@context.storage.delete_schedule(h.
|
|
196
|
+
@context.storage.delete_schedule(h.schedule_id) if try_persist
|
|
206
197
|
#
|
|
207
198
|
# if the persist failed, immediately unschedule
|
|
208
199
|
# the just scheduled job
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -117,7 +117,7 @@ module Ruote::Exp
|
|
|
117
117
|
|
|
118
118
|
names :participant
|
|
119
119
|
|
|
120
|
-
# Should
|
|
120
|
+
# Should yield true when the dispatch was successful.
|
|
121
121
|
#
|
|
122
122
|
h_reader :dispatched
|
|
123
123
|
|
|
@@ -131,32 +131,44 @@ module Ruote::Exp
|
|
|
131
131
|
h.participant_name = (attribute(:ref) || attribute_text).to_s
|
|
132
132
|
|
|
133
133
|
raise ArgumentError.new(
|
|
134
|
-
|
|
134
|
+
'no participant name specified'
|
|
135
135
|
) if h.participant_name == ''
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
h.participant ||
|
|
137
|
+
h.participant ||=
|
|
139
138
|
@context.plist.lookup_info(h.participant_name, h.applied_workitem)
|
|
140
139
|
|
|
141
|
-
unless participant_info.respond_to?(:consume)
|
|
142
|
-
h.participant = participant_info
|
|
143
|
-
end
|
|
144
|
-
|
|
145
140
|
raise(ArgumentError.new(
|
|
146
141
|
"no participant named #{h.participant_name.inspect}")
|
|
147
|
-
) if
|
|
142
|
+
) if h.participant.nil?
|
|
148
143
|
|
|
149
144
|
#
|
|
150
|
-
# participant
|
|
145
|
+
# trigger on_apply if the participant sports it
|
|
151
146
|
|
|
152
|
-
|
|
147
|
+
pa = @context.plist.instantiate(
|
|
148
|
+
h.participant, :if_respond_to? => :on_apply)
|
|
149
|
+
|
|
150
|
+
Ruote.participant_send(
|
|
151
|
+
pa, :on_apply, 'workitem' => Ruote::Workitem.new(h.applied_workitem)
|
|
152
|
+
) if pa
|
|
153
153
|
|
|
154
154
|
#
|
|
155
155
|
# dispatch to participant
|
|
156
156
|
|
|
157
157
|
h.applied_workitem['participant_name'] = h.participant_name
|
|
158
|
+
|
|
158
159
|
h.applied_workitem['fields']['params'] = compile_atts
|
|
159
160
|
|
|
161
|
+
h.applied_workitem['fields'].delete('t')
|
|
162
|
+
h.applied_workitem['fields'].delete('__result__')
|
|
163
|
+
|
|
164
|
+
h.applied_workitem['re_dispatch_count'] = 0
|
|
165
|
+
|
|
166
|
+
if tree.last.any?
|
|
167
|
+
h.applied_workitem['fields']['params']['__children__'] = dsub(tree.last)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
consider_participant_timers(h.participant)
|
|
171
|
+
|
|
160
172
|
persist_or_raise
|
|
161
173
|
|
|
162
174
|
@context.storage.put_msg(
|
|
@@ -169,6 +181,8 @@ module Ruote::Exp
|
|
|
169
181
|
|
|
170
182
|
def cancel(flavour)
|
|
171
183
|
|
|
184
|
+
cancel_flanks(flavour)
|
|
185
|
+
|
|
172
186
|
return reply_to_parent(h.applied_workitem) unless h.participant_name
|
|
173
187
|
# no participant, reply immediately
|
|
174
188
|
|
|
@@ -194,7 +208,9 @@ module Ruote::Exp
|
|
|
194
208
|
|
|
195
209
|
pa = @context.plist.instantiate(pinfo, :if_respond_to? => :on_reply)
|
|
196
210
|
|
|
197
|
-
|
|
211
|
+
Ruote.participant_send(
|
|
212
|
+
pa, :on_reply, 'workitem' => Ruote::Workitem.new(workitem)
|
|
213
|
+
) if pa
|
|
198
214
|
|
|
199
215
|
super(workitem)
|
|
200
216
|
end
|
|
@@ -222,32 +238,78 @@ module Ruote::Exp
|
|
|
222
238
|
# let's not care if it fails...
|
|
223
239
|
end
|
|
224
240
|
|
|
225
|
-
# Overriden with an empty behaviour. The work is now done a bit later
|
|
226
|
-
# via the #schedule_timeout method.
|
|
227
|
-
#
|
|
228
|
-
def consider_timeout
|
|
229
|
-
end
|
|
230
|
-
|
|
231
241
|
# Determines and schedules timeout if any.
|
|
232
242
|
#
|
|
233
243
|
# Note that process definition timeout has priority over participant
|
|
234
244
|
# specified timeout.
|
|
235
245
|
#
|
|
236
|
-
def
|
|
246
|
+
def consider_participant_timers(p_info)
|
|
247
|
+
|
|
248
|
+
return if h.has_timers
|
|
249
|
+
# process definition takes precedence over participant defined timers.
|
|
250
|
+
|
|
251
|
+
timers = nil
|
|
252
|
+
|
|
253
|
+
[ :rtimers, :timers, :rtimeout ].each do |meth|
|
|
254
|
+
|
|
255
|
+
pa = @context.plist.instantiate(p_info, :if_respond_to? => meth)
|
|
256
|
+
|
|
257
|
+
next unless pa
|
|
237
258
|
|
|
238
|
-
|
|
259
|
+
timers = Ruote.participant_send(
|
|
260
|
+
pa, meth, 'workitem' => Ruote::Workitem.new(h.applied_workitem))
|
|
239
261
|
|
|
240
|
-
|
|
262
|
+
break if timers
|
|
263
|
+
end
|
|
241
264
|
|
|
242
|
-
|
|
265
|
+
return unless timers
|
|
243
266
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
267
|
+
timers = if timers.index(':')
|
|
268
|
+
timers.split(/,/)
|
|
269
|
+
else
|
|
270
|
+
[ "#{timers}: timeout" ]
|
|
248
271
|
end
|
|
249
272
|
|
|
250
|
-
|
|
273
|
+
schedule_timers(timers)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
def do_pause(msg)
|
|
277
|
+
|
|
278
|
+
return if h.state != nil
|
|
279
|
+
|
|
280
|
+
h['state'] = 'paused'
|
|
281
|
+
h['breakpoint'] = true if msg['breakpoint']
|
|
282
|
+
|
|
283
|
+
do_persist || return
|
|
284
|
+
|
|
285
|
+
@context.storage.put_msg(
|
|
286
|
+
'dispatch_pause',
|
|
287
|
+
'fei' => h.fei,
|
|
288
|
+
'participant_name' => h.participant_name,
|
|
289
|
+
'participant' => h.participant
|
|
290
|
+
) unless msg['breakpoint']
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def do_resume(msg)
|
|
294
|
+
|
|
295
|
+
return if h.state != 'paused'
|
|
296
|
+
|
|
297
|
+
h['state'] = nil
|
|
298
|
+
replies = h.delete('paused_replies') || []
|
|
299
|
+
|
|
300
|
+
do_persist || return
|
|
301
|
+
|
|
302
|
+
if replies.empty?
|
|
303
|
+
@context.storage.put_msg(
|
|
304
|
+
'dispatch_resume',
|
|
305
|
+
'fei' => h.fei,
|
|
306
|
+
'participant_name' => h.participant_name,
|
|
307
|
+
'participant' => h.participant
|
|
308
|
+
) unless h['breakpoint']
|
|
309
|
+
else
|
|
310
|
+
replies.each { |m| @context.storage.put_msg(m.delete('action'), m) }
|
|
311
|
+
# trigger replies
|
|
312
|
+
end
|
|
251
313
|
end
|
|
252
314
|
end
|
|
253
315
|
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
|
+
#
|
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
# furnished to do so, subject to the following conditions:
|
|
10
|
+
#
|
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
|
12
|
+
# all copies or substantial portions of the Software.
|
|
13
|
+
#
|
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
20
|
+
# THE SOFTWARE.
|
|
21
|
+
#
|
|
22
|
+
# Made in Japan.
|
|
23
|
+
#++
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
module Ruote::Exp
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Reads the content of a local file or a file reachable over http and places
|
|
30
|
+
# the content in a [process] variable or a [workitem] field.
|
|
31
|
+
#
|
|
32
|
+
# Always attempts to parse the content as JSON. If the parsing fails, simply
|
|
33
|
+
# considers as plain text.
|
|
34
|
+
#
|
|
35
|
+
# Ruote.process_definition do
|
|
36
|
+
# read 'http://defs.example.org/filters/filter1.json', :to => 'x'
|
|
37
|
+
# read 'http://defs.example.org/filters/filter1.json', :to => 'f:x'
|
|
38
|
+
# read 'http://defs.example.org/filters/filter2.json', :to => 'v:y'
|
|
39
|
+
# read 'filters/filter3.json', :to => 'f:y'
|
|
40
|
+
# read 'texts/greetings${f:greeting_index}.txt', :to => 'f:greetings'
|
|
41
|
+
# # ...
|
|
42
|
+
# end
|
|
43
|
+
#
|
|
44
|
+
class ReadExpression < FlowExpression
|
|
45
|
+
|
|
46
|
+
names :read
|
|
47
|
+
|
|
48
|
+
def apply
|
|
49
|
+
|
|
50
|
+
to = attribute('to')
|
|
51
|
+
from = attribute('from') || attribute_text
|
|
52
|
+
|
|
53
|
+
content = open(from).read rescue nil
|
|
54
|
+
# should this happen in the worker loop ? thread out ?
|
|
55
|
+
|
|
56
|
+
content = Rufus::Json.decode(content) rescue content
|
|
57
|
+
|
|
58
|
+
set_vf(to, content)
|
|
59
|
+
|
|
60
|
+
reply_to_parent(h.applied_workitem)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def reply(workitem)
|
|
64
|
+
|
|
65
|
+
# empty, never called
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
data/lib/ruote/exp/fe_redo.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -63,7 +63,8 @@ module Ruote::Exp
|
|
|
63
63
|
|
|
64
64
|
if tag && Ruote.is_a_fei?(tag)
|
|
65
65
|
|
|
66
|
-
@context.storage.put_msg(
|
|
66
|
+
@context.storage.put_msg(
|
|
67
|
+
'cancel', 'fei' => tag, 're_apply' => { 'workitem' => 'applied' })
|
|
67
68
|
|
|
68
69
|
reply_to_parent(h.applied_workitem) unless ancestor?(tag)
|
|
69
70
|
|
data/lib/ruote/exp/fe_ref.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -42,7 +42,7 @@ module Ruote::Exp
|
|
|
42
42
|
#
|
|
43
43
|
# Subprocesses have the priority over participants.
|
|
44
44
|
#
|
|
45
|
-
# Note
|
|
45
|
+
# Note: this expression is used by the worker when substituting unknown
|
|
46
46
|
# expression names with participant or subprocess refs.
|
|
47
47
|
#
|
|
48
48
|
class RefExpression < FlowExpression
|
|
@@ -58,6 +58,9 @@ module Ruote::Exp
|
|
|
58
58
|
tree[1]['ref'] = key
|
|
59
59
|
end
|
|
60
60
|
|
|
61
|
+
key = dsub(key)
|
|
62
|
+
# see test/functional/ft_62_
|
|
63
|
+
|
|
61
64
|
key2, value = iterative_var_lookup(key)
|
|
62
65
|
|
|
63
66
|
tree[1]['ref'] = key2 if key2
|
|
@@ -65,7 +68,7 @@ module Ruote::Exp
|
|
|
65
68
|
|
|
66
69
|
unless value
|
|
67
70
|
#
|
|
68
|
-
# seems like it's participant
|
|
71
|
+
# seems like it's a participant
|
|
69
72
|
|
|
70
73
|
@h['participant'] =
|
|
71
74
|
@context.plist.lookup_info(tree[1]['ref'], h.applied_workitem)
|
|
@@ -73,14 +76,54 @@ module Ruote::Exp
|
|
|
73
76
|
value = key2 if ( ! @h['participant']) && (key2 != key)
|
|
74
77
|
end
|
|
75
78
|
|
|
76
|
-
|
|
79
|
+
new_exp_name, new_exp_class = nil
|
|
80
|
+
|
|
81
|
+
# warning: abusing on 'then' in order to have [somehow] more readability
|
|
82
|
+
|
|
83
|
+
if
|
|
84
|
+
value.is_a?(String)
|
|
85
|
+
then
|
|
86
|
+
|
|
87
|
+
if
|
|
88
|
+
@context['participant_in_variable_enabled'] &&
|
|
89
|
+
value.match(/\bdef consume\(/) &&
|
|
90
|
+
(Rufus::TreeChecker.parse(value) rescue false)
|
|
91
|
+
then
|
|
92
|
+
#
|
|
93
|
+
# participant code passed
|
|
94
|
+
|
|
95
|
+
@h['participant'] = [ 'Ruote::CodeParticipant', { 'code' => value } ]
|
|
96
|
+
tree[1]['ref'] = key
|
|
97
|
+
|
|
98
|
+
elsif klass = @context.expmap.expression_class(tree[1]['ref'])
|
|
99
|
+
#
|
|
100
|
+
# aliased expression
|
|
101
|
+
|
|
102
|
+
new_exp_name = value
|
|
103
|
+
new_exp_class = klass
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
elsif
|
|
107
|
+
@context['participant_in_variable_enabled'] &&
|
|
108
|
+
value.is_a?(Hash) &&
|
|
109
|
+
value['on_workitem']
|
|
110
|
+
then
|
|
77
111
|
#
|
|
78
112
|
# participant 'defined' in var
|
|
79
113
|
|
|
114
|
+
@h['participant'] = [ 'Ruote::BlockParticipant', value ]
|
|
115
|
+
|
|
116
|
+
elsif
|
|
117
|
+
value.is_a?(Array) &&
|
|
118
|
+
value.size == 2 && value.last.is_a?(Hash)
|
|
119
|
+
then
|
|
120
|
+
#
|
|
121
|
+
# participant 'registered' in var
|
|
122
|
+
|
|
80
123
|
@h['participant'] = value
|
|
81
124
|
end
|
|
82
125
|
|
|
83
|
-
|
|
126
|
+
if value == nil && @h['participant'] == nil
|
|
84
127
|
#
|
|
85
128
|
# unknown participant or subprocess
|
|
86
129
|
|
|
@@ -90,37 +133,24 @@ module Ruote::Exp
|
|
|
90
133
|
raise("unknown participant or subprocess '#{tree[1]['ref']}'")
|
|
91
134
|
end
|
|
92
135
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
tree[0] = 'participant'
|
|
99
|
-
@h['name'] = 'participant'
|
|
100
|
-
Ruote::Exp::ParticipantExpression.new(@context, @h)
|
|
136
|
+
new_exp_name, new_exp_class = if new_exp_name
|
|
137
|
+
[ new_exp_name, new_exp_class ]
|
|
138
|
+
elsif @h['participant']
|
|
139
|
+
[ 'participant', Ruote::Exp::ParticipantExpression ]
|
|
101
140
|
else
|
|
102
|
-
|
|
103
|
-
tree[0] = 'subprocess'
|
|
104
|
-
@h['name'] = 'subprocess'
|
|
105
|
-
Ruote::Exp::SubprocessExpression.new(@context, @h)
|
|
141
|
+
[ 'subprocess', Ruote::Exp::SubprocessExpression ]
|
|
106
142
|
end
|
|
107
143
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
# for subprocess expressions
|
|
144
|
+
tree[0] = new_exp_name
|
|
145
|
+
@h['name'] = new_exp_name
|
|
146
|
+
|
|
147
|
+
new_exp = new_exp_class.new(@context, @h)
|
|
113
148
|
|
|
114
149
|
#new_exp.initial_persist
|
|
115
150
|
# not necessary
|
|
116
151
|
|
|
117
152
|
new_exp.apply
|
|
118
153
|
end
|
|
119
|
-
|
|
120
|
-
def consider_timeout
|
|
121
|
-
|
|
122
|
-
# neutralized
|
|
123
|
-
end
|
|
124
154
|
end
|
|
125
155
|
end
|
|
126
156
|
|