ruote-maestrodev 2.2.1
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 +290 -0
- data/CREDITS.txt +99 -0
- data/LICENSE.txt +21 -0
- data/README.rdoc +88 -0
- data/Rakefile +108 -0
- data/TODO.txt +488 -0
- data/lib/ruote.rb +7 -0
- data/lib/ruote/context.rb +194 -0
- data/lib/ruote/engine.rb +1062 -0
- data/lib/ruote/engine/process_error.rb +122 -0
- data/lib/ruote/engine/process_status.rb +448 -0
- data/lib/ruote/exp/command.rb +87 -0
- data/lib/ruote/exp/commanded.rb +69 -0
- data/lib/ruote/exp/condition.rb +227 -0
- data/lib/ruote/exp/fe_add_branches.rb +138 -0
- data/lib/ruote/exp/fe_apply.rb +154 -0
- data/lib/ruote/exp/fe_cancel_process.rb +78 -0
- data/lib/ruote/exp/fe_command.rb +156 -0
- data/lib/ruote/exp/fe_concurrence.rb +321 -0
- data/lib/ruote/exp/fe_concurrent_iterator.rb +219 -0
- data/lib/ruote/exp/fe_cron.rb +141 -0
- data/lib/ruote/exp/fe_cursor.rb +324 -0
- data/lib/ruote/exp/fe_define.rb +112 -0
- data/lib/ruote/exp/fe_echo.rb +60 -0
- data/lib/ruote/exp/fe_equals.rb +115 -0
- data/lib/ruote/exp/fe_error.rb +82 -0
- data/lib/ruote/exp/fe_filter.rb +648 -0
- data/lib/ruote/exp/fe_forget.rb +88 -0
- data/lib/ruote/exp/fe_given.rb +154 -0
- data/lib/ruote/exp/fe_if.rb +127 -0
- data/lib/ruote/exp/fe_inc.rb +205 -0
- data/lib/ruote/exp/fe_iterator.rb +234 -0
- data/lib/ruote/exp/fe_let.rb +75 -0
- data/lib/ruote/exp/fe_listen.rb +304 -0
- data/lib/ruote/exp/fe_lose.rb +110 -0
- data/lib/ruote/exp/fe_noop.rb +45 -0
- data/lib/ruote/exp/fe_once.rb +215 -0
- data/lib/ruote/exp/fe_participant.rb +287 -0
- data/lib/ruote/exp/fe_read.rb +69 -0
- data/lib/ruote/exp/fe_redo.rb +82 -0
- data/lib/ruote/exp/fe_ref.rb +152 -0
- data/lib/ruote/exp/fe_registerp.rb +110 -0
- data/lib/ruote/exp/fe_reserve.rb +126 -0
- data/lib/ruote/exp/fe_restore.rb +102 -0
- data/lib/ruote/exp/fe_save.rb +72 -0
- data/lib/ruote/exp/fe_sequence.rb +59 -0
- data/lib/ruote/exp/fe_set.rb +154 -0
- data/lib/ruote/exp/fe_subprocess.rb +211 -0
- data/lib/ruote/exp/fe_that.rb +92 -0
- data/lib/ruote/exp/fe_undo.rb +67 -0
- data/lib/ruote/exp/fe_unregisterp.rb +69 -0
- data/lib/ruote/exp/fe_wait.rb +95 -0
- data/lib/ruote/exp/flowexpression.rb +886 -0
- data/lib/ruote/exp/iterator.rb +81 -0
- data/lib/ruote/exp/merge.rb +118 -0
- data/lib/ruote/exp/ro_attributes.rb +212 -0
- data/lib/ruote/exp/ro_filters.rb +136 -0
- data/lib/ruote/exp/ro_persist.rb +154 -0
- data/lib/ruote/exp/ro_variables.rb +189 -0
- data/lib/ruote/exp/ro_vf.rb +68 -0
- data/lib/ruote/fei.rb +260 -0
- data/lib/ruote/id/mnemo_wfid_generator.rb +43 -0
- data/lib/ruote/id/wfid_generator.rb +81 -0
- data/lib/ruote/log/default_history.rb +122 -0
- data/lib/ruote/log/pretty.rb +176 -0
- data/lib/ruote/log/storage_history.rb +159 -0
- data/lib/ruote/log/test_logger.rb +208 -0
- data/lib/ruote/log/wait_logger.rb +64 -0
- data/lib/ruote/part/block_participant.rb +137 -0
- data/lib/ruote/part/code_participant.rb +81 -0
- data/lib/ruote/part/engine_participant.rb +189 -0
- data/lib/ruote/part/local_participant.rb +138 -0
- data/lib/ruote/part/no_op_participant.rb +60 -0
- data/lib/ruote/part/null_participant.rb +54 -0
- data/lib/ruote/part/rev_participant.rb +169 -0
- data/lib/ruote/part/smtp_participant.rb +116 -0
- data/lib/ruote/part/storage_participant.rb +392 -0
- data/lib/ruote/part/template.rb +84 -0
- data/lib/ruote/participant.rb +7 -0
- data/lib/ruote/reader.rb +278 -0
- data/lib/ruote/reader/json.rb +49 -0
- data/lib/ruote/reader/radial.rb +290 -0
- data/lib/ruote/reader/ruby_dsl.rb +186 -0
- data/lib/ruote/reader/xml.rb +99 -0
- data/lib/ruote/receiver/base.rb +212 -0
- data/lib/ruote/storage/base.rb +364 -0
- data/lib/ruote/storage/composite_storage.rb +121 -0
- data/lib/ruote/storage/fs_storage.rb +139 -0
- data/lib/ruote/storage/hash_storage.rb +211 -0
- data/lib/ruote/svc/dispatch_pool.rb +158 -0
- data/lib/ruote/svc/dollar_sub.rb +298 -0
- data/lib/ruote/svc/error_handler.rb +138 -0
- data/lib/ruote/svc/expression_map.rb +97 -0
- data/lib/ruote/svc/participant_list.rb +397 -0
- data/lib/ruote/svc/tracker.rb +172 -0
- data/lib/ruote/svc/treechecker.rb +141 -0
- data/lib/ruote/tree_dot.rb +85 -0
- data/lib/ruote/util/filter.rb +525 -0
- data/lib/ruote/util/hashdot.rb +79 -0
- data/lib/ruote/util/look.rb +128 -0
- data/lib/ruote/util/lookup.rb +127 -0
- data/lib/ruote/util/misc.rb +167 -0
- data/lib/ruote/util/ometa.rb +71 -0
- data/lib/ruote/util/serializer.rb +103 -0
- data/lib/ruote/util/subprocess.rb +88 -0
- data/lib/ruote/util/time.rb +100 -0
- data/lib/ruote/util/tree.rb +58 -0
- data/lib/ruote/version.rb +29 -0
- data/lib/ruote/worker.rb +386 -0
- data/lib/ruote/workitem.rb +394 -0
- data/phil.txt +14 -0
- data/ruote.gemspec +44 -0
- data/test/bm/ci.rb +55 -0
- data/test/bm/ici.rb +71 -0
- data/test/bm/juuman.rb +54 -0
- data/test/bm/launch_bench.rb +37 -0
- data/test/bm/load_26c.rb +97 -0
- data/test/bm/mega.rb +64 -0
- data/test/bm/seq_thousand.rb +31 -0
- data/test/bm/t.rb +35 -0
- data/test/functional/base.rb +247 -0
- data/test/functional/concurrent_base.rb +98 -0
- data/test/functional/crunner.rb +31 -0
- data/test/functional/ct_0_concurrence.rb +65 -0
- data/test/functional/ct_1_iterator.rb +67 -0
- data/test/functional/ct_2_cancel.rb +81 -0
- data/test/functional/eft_0_process_definition.rb +65 -0
- data/test/functional/eft_10_cancel_process.rb +46 -0
- data/test/functional/eft_11_wait.rb +109 -0
- data/test/functional/eft_12_listen.rb +500 -0
- data/test/functional/eft_13_iterator.rb +342 -0
- data/test/functional/eft_14_cursor.rb +456 -0
- data/test/functional/eft_15_loop.rb +69 -0
- data/test/functional/eft_16_if.rb +183 -0
- data/test/functional/eft_17_equals.rb +55 -0
- data/test/functional/eft_18_concurrent_iterator.rb +410 -0
- data/test/functional/eft_19_reserve.rb +136 -0
- data/test/functional/eft_1_echo.rb +68 -0
- data/test/functional/eft_20_save.rb +116 -0
- data/test/functional/eft_21_restore.rb +61 -0
- data/test/functional/eft_22_noop.rb +28 -0
- data/test/functional/eft_23_apply.rb +168 -0
- data/test/functional/eft_24_add_branches.rb +98 -0
- data/test/functional/eft_25_command.rb +28 -0
- data/test/functional/eft_26_error.rb +77 -0
- data/test/functional/eft_27_inc.rb +280 -0
- data/test/functional/eft_28_once.rb +135 -0
- data/test/functional/eft_29_cron.rb +64 -0
- data/test/functional/eft_2_sequence.rb +58 -0
- data/test/functional/eft_30_ref.rb +155 -0
- data/test/functional/eft_31_registerp.rb +130 -0
- data/test/functional/eft_32_lose.rb +93 -0
- data/test/functional/eft_33_let.rb +31 -0
- data/test/functional/eft_34_given.rb +123 -0
- data/test/functional/eft_35_filter.rb +375 -0
- data/test/functional/eft_36_read.rb +95 -0
- data/test/functional/eft_3_participant.rb +149 -0
- data/test/functional/eft_4_set.rb +296 -0
- data/test/functional/eft_5_subprocess.rb +163 -0
- data/test/functional/eft_6_concurrence.rb +304 -0
- data/test/functional/eft_7_forget.rb +61 -0
- data/test/functional/eft_8_undo.rb +114 -0
- data/test/functional/eft_9_redo.rb +138 -0
- data/test/functional/ft_0_worker.rb +65 -0
- data/test/functional/ft_10_dollar.rb +304 -0
- data/test/functional/ft_11_recursion.rb +109 -0
- data/test/functional/ft_12_launchitem.rb +43 -0
- data/test/functional/ft_13_variables.rb +151 -0
- data/test/functional/ft_14_re_apply.rb +324 -0
- data/test/functional/ft_15_timeout.rb +226 -0
- data/test/functional/ft_16_participant_params.rb +98 -0
- data/test/functional/ft_17_conditional.rb +102 -0
- data/test/functional/ft_18_kill.rb +138 -0
- data/test/functional/ft_19_participant_code.rb +67 -0
- data/test/functional/ft_1_process_status.rb +796 -0
- data/test/functional/ft_20_storage_participant.rb +543 -0
- data/test/functional/ft_21_forget.rb +153 -0
- data/test/functional/ft_22_process_definitions.rb +90 -0
- data/test/functional/ft_23_load_defs.rb +79 -0
- data/test/functional/ft_24_block_participant.rb +235 -0
- data/test/functional/ft_25_receiver.rb +207 -0
- data/test/functional/ft_26_participant_rtimeout.rb +179 -0
- data/test/functional/ft_27_var_indirection.rb +128 -0
- data/test/functional/ft_28_null_noop_participants.rb +51 -0
- data/test/functional/ft_29_part_template.rb +60 -0
- data/test/functional/ft_2_errors.rb +380 -0
- data/test/functional/ft_30_smtp_participant.rb +122 -0
- data/test/functional/ft_31_part_blocking.rb +72 -0
- data/test/functional/ft_33_participant_subprocess_priority.rb +32 -0
- data/test/functional/ft_34_cursor_rewind.rb +101 -0
- data/test/functional/ft_35_add_service.rb +56 -0
- data/test/functional/ft_36_storage_history.rb +150 -0
- data/test/functional/ft_37_default_history.rb +109 -0
- data/test/functional/ft_38_participant_more.rb +193 -0
- data/test/functional/ft_39_wait_for.rb +136 -0
- data/test/functional/ft_3_participant_registration.rb +574 -0
- data/test/functional/ft_40_wait_logger.rb +62 -0
- data/test/functional/ft_41_participants.rb +91 -0
- data/test/functional/ft_42_storage_copy.rb +71 -0
- data/test/functional/ft_43_participant_on_reply.rb +87 -0
- data/test/functional/ft_44_var_participant.rb +35 -0
- data/test/functional/ft_45_participant_accept.rb +64 -0
- data/test/functional/ft_46_launch_single.rb +83 -0
- data/test/functional/ft_47_wfid_generator.rb +54 -0
- data/test/functional/ft_48_lose.rb +112 -0
- data/test/functional/ft_49_engine_on_error.rb +201 -0
- data/test/functional/ft_4_cancel.rb +132 -0
- data/test/functional/ft_50_engine_config.rb +22 -0
- data/test/functional/ft_51_misc.rb +67 -0
- data/test/functional/ft_52_case.rb +134 -0
- data/test/functional/ft_53_engine_on_terminate.rb +95 -0
- data/test/functional/ft_54_patterns.rb +104 -0
- data/test/functional/ft_55_engine_participant.rb +303 -0
- data/test/functional/ft_56_filter_attribute.rb +259 -0
- data/test/functional/ft_57_rev_participant.rb +252 -0
- data/test/functional/ft_58_workitem.rb +69 -0
- data/test/functional/ft_59_pause.rb +343 -0
- data/test/functional/ft_5_on_error.rb +384 -0
- data/test/functional/ft_60_code_participant.rb +45 -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_6_on_cancel.rb +221 -0
- data/test/functional/ft_7_tags.rb +177 -0
- data/test/functional/ft_8_participant_consumption.rb +124 -0
- data/test/functional/ft_9_subprocesses.rb +146 -0
- data/test/functional/restart_base.rb +34 -0
- data/test/functional/rt_0_wait.rb +55 -0
- data/test/functional/rt_1_listen.rb +56 -0
- data/test/functional/rt_2_errors.rb +56 -0
- data/test/functional/rt_3_once.rb +70 -0
- data/test/functional/rt_4_cron.rb +64 -0
- data/test/functional/rt_5_timeout.rb +60 -0
- data/test/functional/rtest.rb +8 -0
- data/test/functional/storage_helper.rb +93 -0
- data/test/functional/test.rb +44 -0
- data/test/functional/vertical.rb +46 -0
- data/test/path_helper.rb +15 -0
- data/test/test.rb +13 -0
- data/test/test_helper.rb +28 -0
- data/test/unit/storage.rb +428 -0
- data/test/unit/storages.rb +37 -0
- data/test/unit/test.rb +28 -0
- data/test/unit/ut_0_ruby_reader.rb +223 -0
- data/test/unit/ut_11_lookup.rb +122 -0
- data/test/unit/ut_13_serializer.rb +65 -0
- data/test/unit/ut_14_is_uri.rb +28 -0
- data/test/unit/ut_15_util.rb +57 -0
- data/test/unit/ut_16_reader.rb +225 -0
- data/test/unit/ut_18_engine.rb +47 -0
- data/test/unit/ut_19_part_template.rb +86 -0
- data/test/unit/ut_1_fei.rb +165 -0
- data/test/unit/ut_20_composite_storage.rb +74 -0
- data/test/unit/ut_21_svc_participant_list.rb +46 -0
- data/test/unit/ut_22_filter.rb +1094 -0
- data/test/unit/ut_23_svc_tracker.rb +48 -0
- data/test/unit/ut_24_radial_reader.rb +332 -0
- data/test/unit/ut_25_merge.rb +113 -0
- data/test/unit/ut_3_wait_logger.rb +39 -0
- data/test/unit/ut_4_expmap.rb +20 -0
- data/test/unit/ut_5_tree.rb +54 -0
- data/test/unit/ut_6_condition.rb +303 -0
- data/test/unit/ut_7_workitem.rb +99 -0
- data/test/unit/ut_8_tree_to_dot.rb +72 -0
- data/test/unit/ut_9_xml_reader.rb +61 -0
- metadata +504 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2005-2011, 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
|
+
# Forgets all of its children.
|
30
|
+
#
|
31
|
+
# This expression is somehow deprecated in favour of the :forget attribute
|
32
|
+
# that any expression understands.
|
33
|
+
#
|
34
|
+
# sequence do
|
35
|
+
# participant 'alpha'
|
36
|
+
# forget do
|
37
|
+
# sequence do
|
38
|
+
# participant 'bravo'
|
39
|
+
# participant 'charly'
|
40
|
+
# end
|
41
|
+
# end
|
42
|
+
# participant 'delta'
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# In this example above, the flow goes from alpha to bravo and delta. The
|
46
|
+
# bravo-charly segment is independent of the main process flow. Charly's
|
47
|
+
# reply will be forgotten.
|
48
|
+
#
|
49
|
+
# Now the equivalent process definition, but using the :forget attribute :
|
50
|
+
#
|
51
|
+
# sequence do
|
52
|
+
# participant 'alpha'
|
53
|
+
# sequence :forget => true do
|
54
|
+
# participant 'bravo'
|
55
|
+
# participant 'charly'
|
56
|
+
# end
|
57
|
+
# participant 'delta'
|
58
|
+
# end
|
59
|
+
#
|
60
|
+
# This expression can be useful for fire-and-forget parallelism in processes.
|
61
|
+
#
|
62
|
+
# == forget vs lose
|
63
|
+
#
|
64
|
+
# forget : replies to parent expression immediately, is not cancellable
|
65
|
+
# (not reachable).
|
66
|
+
#
|
67
|
+
# lose : never replies to parent expression, is cancellable.
|
68
|
+
#
|
69
|
+
class ForgetExpression < FlowExpression
|
70
|
+
|
71
|
+
names :forget
|
72
|
+
|
73
|
+
def apply
|
74
|
+
|
75
|
+
tree_children.each_with_index do |t, index|
|
76
|
+
apply_child(index, Ruote.fulldup(h.applied_workitem), true)
|
77
|
+
end
|
78
|
+
|
79
|
+
reply_to_parent(h.applied_workitem)
|
80
|
+
end
|
81
|
+
|
82
|
+
def reply(workitem)
|
83
|
+
|
84
|
+
# never gets called
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
@@ -0,0 +1,154 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2005-2011, 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
|
+
require 'ruote/exp/fe_sequence'
|
26
|
+
|
27
|
+
|
28
|
+
module Ruote::Exp
|
29
|
+
|
30
|
+
#
|
31
|
+
# This expressions corresponds to a "case" statement in Ruby or a "switch"
|
32
|
+
# in other languages.
|
33
|
+
#
|
34
|
+
# It accepts two variants "given that" and "given an x of".
|
35
|
+
#
|
36
|
+
# 'given' works in conjunction with the 'that' / 'of' expression.
|
37
|
+
#
|
38
|
+
#
|
39
|
+
# == "given that"
|
40
|
+
#
|
41
|
+
# given do
|
42
|
+
# that "${location} == paris" do
|
43
|
+
# subprocess "notify_and_wait_for_pickup"
|
44
|
+
# end
|
45
|
+
# that "${state} == ready" do
|
46
|
+
# subprocess "deliver"
|
47
|
+
# end
|
48
|
+
# # else...
|
49
|
+
# subprocess "do_something_else"
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
#
|
53
|
+
# == "given an x of"
|
54
|
+
#
|
55
|
+
# given "${status}" do
|
56
|
+
# of "ordered" do
|
57
|
+
# participant "alpha"
|
58
|
+
# end
|
59
|
+
# of "delivered" do
|
60
|
+
# participant "alpha"
|
61
|
+
# end
|
62
|
+
# # else...
|
63
|
+
# subprocess "do_something_else"
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# This variant also accepts regular expressions :
|
67
|
+
#
|
68
|
+
# given "${target}" do
|
69
|
+
# of "/-manager$/" do
|
70
|
+
# # ...
|
71
|
+
# end
|
72
|
+
# of /^user-/ do
|
73
|
+
# # ...
|
74
|
+
# end
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# == mixing 'that' and 'of'
|
78
|
+
#
|
79
|
+
# It's OK to use a "that" inside a "given an x" :
|
80
|
+
#
|
81
|
+
# given '${target}' do
|
82
|
+
# that "${location} == paris" do
|
83
|
+
# subprocess "notify_and_wait_for_pickup"
|
84
|
+
# end
|
85
|
+
# of "home" do
|
86
|
+
# subprocess "return_procedure"
|
87
|
+
# end
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
#
|
91
|
+
# == the else part
|
92
|
+
#
|
93
|
+
# Anything that comes after the serie of 'that' and 'of' is considered in
|
94
|
+
# the 'else' zone and is executed if none of the 'that' or 'of' triggered.
|
95
|
+
#
|
96
|
+
# given '${target}' do
|
97
|
+
# that "${location} == paris" do
|
98
|
+
# subprocess "notify_and_wait_for_pickup"
|
99
|
+
# end
|
100
|
+
# of "home" do
|
101
|
+
# subprocess "return_procedure"
|
102
|
+
# end
|
103
|
+
# subprocess "do_this"
|
104
|
+
# subprocess "and_then_that"
|
105
|
+
# end
|
106
|
+
#
|
107
|
+
# Yes, two 'else' subprocesses will get executed one after the other (the
|
108
|
+
# 'given' acting like a 'sequence' for them.
|
109
|
+
#
|
110
|
+
# Interestingly :
|
111
|
+
#
|
112
|
+
# given '${target}' do
|
113
|
+
# of "home" do
|
114
|
+
# subprocess "return_procedure"
|
115
|
+
# end
|
116
|
+
# subprocess "do_this"
|
117
|
+
# of "office" do
|
118
|
+
# subprocess "go_to_work"
|
119
|
+
# end
|
120
|
+
# subprocess "and_then_that"
|
121
|
+
# end
|
122
|
+
#
|
123
|
+
# If the workitem field 'target' is set to 'home' only the 'return_procedure'
|
124
|
+
# subprocess will get called.
|
125
|
+
#
|
126
|
+
# If the workitem field 'target' is set to 'office', the 'do_this'
|
127
|
+
# subprocess, then the 'go_to_work' one will get called.
|
128
|
+
#
|
129
|
+
class GivenExpression < SequenceExpression
|
130
|
+
|
131
|
+
names :given
|
132
|
+
|
133
|
+
def reply(workitem)
|
134
|
+
|
135
|
+
if given = attribute(:t) || attribute_text
|
136
|
+
workitem['fields']['__given__'] = given
|
137
|
+
end
|
138
|
+
|
139
|
+
# as soon as one child says true, reply to the parent expression
|
140
|
+
|
141
|
+
if workitem['fields']['__result__'].to_s == 'true'
|
142
|
+
|
143
|
+
workitem['fields'].delete('__given__')
|
144
|
+
workitem['fields'].delete('__result__')
|
145
|
+
reply_to_parent(workitem)
|
146
|
+
|
147
|
+
else
|
148
|
+
|
149
|
+
super
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
@@ -0,0 +1,127 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2005-2011, 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
|
+
# Here are examples of the 'if' expression in use :
|
30
|
+
#
|
31
|
+
# _if do
|
32
|
+
# equals :field_value => 'customer', :other_value => 'British Petroleum'
|
33
|
+
# participant :ref => 'Allister'
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# and :
|
37
|
+
#
|
38
|
+
# _if :test => '${f:customer} == British Petroleum' do
|
39
|
+
# participant :ref => 'Allister'
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# An else clause is accepted :
|
43
|
+
#
|
44
|
+
# _if do
|
45
|
+
# equals :field_value => 'customer', :other_value => 'British Petroleum'
|
46
|
+
# participant :ref => 'Allister'
|
47
|
+
# participant :ref => 'Bernardo'
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# or :
|
51
|
+
#
|
52
|
+
# _if :test => '${f:customer} == British Petroleum' do
|
53
|
+
# participant :ref => 'Allister'
|
54
|
+
# participant :ref => 'Bernardo'
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# Note that any expression accepts an :if attribute :
|
58
|
+
#
|
59
|
+
# participant :ref => 'Al', :if => '${f:customer} == British Petroleum'
|
60
|
+
#
|
61
|
+
#
|
62
|
+
# == shorter
|
63
|
+
#
|
64
|
+
# The :test can be shortened to a :t :
|
65
|
+
#
|
66
|
+
# _if :t => '${f:customer.name} == Fred' do
|
67
|
+
# subprocess 'premium_course'
|
68
|
+
# subprocess 'regular_course'
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# When using Ruby to generate the process definition tree, you can simply do :
|
72
|
+
#
|
73
|
+
# _if '${f:customer.name} == Fred' do
|
74
|
+
# subprocess 'premium_course'
|
75
|
+
# subprocess 'regular_course'
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
class IfExpression < FlowExpression
|
79
|
+
|
80
|
+
names :if
|
81
|
+
|
82
|
+
def apply
|
83
|
+
|
84
|
+
reply(h.applied_workitem)
|
85
|
+
end
|
86
|
+
|
87
|
+
# called by 'else', 'then' or perhaps 'equals'
|
88
|
+
#
|
89
|
+
def reply(workitem)
|
90
|
+
|
91
|
+
if workitem['fei'] == h.fei # apply --> reply
|
92
|
+
|
93
|
+
h.test = attribute(:test)
|
94
|
+
h.test = attribute(:t) if h.test.nil?
|
95
|
+
h.test = attribute_text if h.test.nil?
|
96
|
+
h.test = nil if h.test == ''
|
97
|
+
|
98
|
+
offset = (h.test.nil? || Condition.true?(h.test)) ? 0 : 1
|
99
|
+
|
100
|
+
apply_child(offset, workitem)
|
101
|
+
|
102
|
+
else # reply from a child
|
103
|
+
|
104
|
+
if h.test != nil || Ruote::FlowExpressionId.child_id(workitem['fei']) != 0
|
105
|
+
|
106
|
+
reply_to_parent(workitem)
|
107
|
+
|
108
|
+
else
|
109
|
+
|
110
|
+
apply_child(workitem['fields']['__result__'] == true ? 1 : 2, workitem)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
protected
|
116
|
+
|
117
|
+
def apply_child(index, workitem)
|
118
|
+
|
119
|
+
if tree_children[index]
|
120
|
+
super
|
121
|
+
else
|
122
|
+
reply_to_parent(workitem)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
@@ -0,0 +1,205 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2005-2011, 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
|
+
require 'ruote/exp/fe_set'
|
27
|
+
|
28
|
+
|
29
|
+
module Ruote::Exp
|
30
|
+
|
31
|
+
#
|
32
|
+
# Increments or decrements the value found in a process variable or
|
33
|
+
# a workitem field.
|
34
|
+
#
|
35
|
+
# One points to a var or a field in these various ways :
|
36
|
+
#
|
37
|
+
# sequence do
|
38
|
+
# inc :var => 'counter'
|
39
|
+
# inc :field => 'counter'
|
40
|
+
# inc 'v:counter'
|
41
|
+
# inc 'f:counter'
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# 'inc' and 'dec' work with two types of values : numbers (the default) and
|
45
|
+
# arrays.
|
46
|
+
#
|
47
|
+
#
|
48
|
+
# == numbers
|
49
|
+
#
|
50
|
+
# The vanilla case of inc/dec is increasing/decreasing a value by 1.
|
51
|
+
#
|
52
|
+
# dec :var => 'x'
|
53
|
+
#
|
54
|
+
# will decrease the value in variable 'x' by 1.
|
55
|
+
#
|
56
|
+
# inc/dec works with two kind of numbers, integers and floats.
|
57
|
+
#
|
58
|
+
# If the target var or field is not set, it will be assumed to be at zero.
|
59
|
+
#
|
60
|
+
# The default increment is 1 (or 1.0 for floats). It can be changed by
|
61
|
+
# passing a value to the inc/dec expression.
|
62
|
+
#
|
63
|
+
# inc 'v:x', :val => 3
|
64
|
+
# inc 'v:y', :val => 2.4
|
65
|
+
#
|
66
|
+
#
|
67
|
+
# == arrays
|
68
|
+
#
|
69
|
+
# inc/dec can be used to push/pop elements in arrays held in process variables
|
70
|
+
# or workitem fields.
|
71
|
+
#
|
72
|
+
# This fragment of process definition
|
73
|
+
#
|
74
|
+
# sequence do
|
75
|
+
# set 'v:x' => %w[ a b c d ]
|
76
|
+
# repeat do
|
77
|
+
# dec 'v:x', :pos => 'head'
|
78
|
+
# _break :unless => '${v:d}'
|
79
|
+
# participant '${v:d}'
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
#
|
83
|
+
# is equivalent to
|
84
|
+
#
|
85
|
+
# iterator :on => 'a, b, c, d', :to_var => 'x' do
|
86
|
+
# participant '${v:x}'
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# More details : the inc expression expects a value and it will place it
|
90
|
+
# at the end of the current array. The :pos or :position attribute can
|
91
|
+
# be set to 'head' to let the inc expression place the value at the head
|
92
|
+
# of the array.
|
93
|
+
#
|
94
|
+
# set 'v:x' => [ 'alfred', 'bryan' ]
|
95
|
+
# set 'v:customer_name' => 'charles'
|
96
|
+
#
|
97
|
+
# inc 'v:x', :val => '${v:customer_name}'
|
98
|
+
# # the variable 'x' now holds [ 'alfred', 'bryan', 'charles' ]
|
99
|
+
# inc 'v:y', :val => '${v:customer_name}', :pos => 'head'
|
100
|
+
# # the variable 'x' now holds [ 'charles', 'alfred', 'bryan', 'charles' ]
|
101
|
+
#
|
102
|
+
# The 'dec' / 'decrement' variant of the expression will remove the tail
|
103
|
+
# value (by default) of the array, or the head value if :pos is set to 'head'.
|
104
|
+
#
|
105
|
+
# It's also possible to remove a specific value by passing it to 'dec' :
|
106
|
+
#
|
107
|
+
# set 'v:x' => [ 'alfred', 'bryan', 'carl' ]
|
108
|
+
# dec 'v:x', :val => 'bryan'
|
109
|
+
# # the variable 'x' now holds [ 'alfred', 'carl' ]
|
110
|
+
#
|
111
|
+
# 'dec' places the removed value in the local variable named 'd'. This trick
|
112
|
+
# was used in the above iterator example.
|
113
|
+
#
|
114
|
+
# A specific variable or field can be specified via the :to_var / :to_field
|
115
|
+
# attributes :
|
116
|
+
#
|
117
|
+
# dec 'v:x', :to_v => 'a'
|
118
|
+
# participant :ref => '${v:a}'
|
119
|
+
#
|
120
|
+
class IncExpression < SetExpression
|
121
|
+
|
122
|
+
names :inc, :dec, :increment, :decrement
|
123
|
+
|
124
|
+
def apply
|
125
|
+
|
126
|
+
if var_key = has_attribute(:v, :var, :variable)
|
127
|
+
|
128
|
+
var = attribute(var_key)
|
129
|
+
set_v(var, new_value(:var, var))
|
130
|
+
|
131
|
+
elsif field_key = has_attribute(:f, :fld, :field)
|
132
|
+
|
133
|
+
field = attribute(field_key)
|
134
|
+
set_f(field, new_value(:field, field))
|
135
|
+
|
136
|
+
else
|
137
|
+
|
138
|
+
k = attribute_text
|
139
|
+
|
140
|
+
raise(
|
141
|
+
ArgumentError.new('no variable or field to increment/decrement')
|
142
|
+
) if k.length < 1
|
143
|
+
|
144
|
+
set_vf(k, new_value(nil, k))
|
145
|
+
|
146
|
+
#else
|
147
|
+
# raise ArgumentError.new(
|
148
|
+
# "missing a variable or field target in #{tree.inspect}")
|
149
|
+
end
|
150
|
+
|
151
|
+
reply_to_parent(h.applied_workitem)
|
152
|
+
end
|
153
|
+
|
154
|
+
def reply(workitem)
|
155
|
+
|
156
|
+
# never called
|
157
|
+
end
|
158
|
+
|
159
|
+
protected
|
160
|
+
|
161
|
+
def new_value(type, key)
|
162
|
+
|
163
|
+
dec = name.match(/^dec/)
|
164
|
+
|
165
|
+
if type == nil && m = PREFIX_REGEX.match(key)
|
166
|
+
type = (m[1][0, 1] == 'f' ? :field : :var)
|
167
|
+
key = m[2]
|
168
|
+
end
|
169
|
+
|
170
|
+
delta = lookup_val
|
171
|
+
|
172
|
+
ndelta = Ruote.narrow_to_number(delta || 1)
|
173
|
+
ndelta = -ndelta if dec && ndelta
|
174
|
+
|
175
|
+
value = type == :var ?
|
176
|
+
lookup_variable(key) :
|
177
|
+
Ruote.lookup(h.applied_workitem['fields'], key)
|
178
|
+
|
179
|
+
pos = attribute(:position) || attribute(:pos)
|
180
|
+
|
181
|
+
return ((value || 0) + ndelta) if ndelta && (not value.is_a?(Array))
|
182
|
+
|
183
|
+
pos ||= 'tail'
|
184
|
+
value ||= []
|
185
|
+
|
186
|
+
return (pos == 'tail' ? value + [ delta ] : [ delta ] + value) unless dec
|
187
|
+
|
188
|
+
to_v, to_f = determine_tos
|
189
|
+
to_v = 'd' if to_v.nil? && to_f.nil?
|
190
|
+
|
191
|
+
car, cdr = if delta != nil
|
192
|
+
(value.delete(delta) != nil ) ? [ delta, value ] : [ nil, value ]
|
193
|
+
elsif pos == 'tail'
|
194
|
+
[ value[-1], value[0..-2] ]
|
195
|
+
else
|
196
|
+
[ value[0], value[1..-1] ]
|
197
|
+
end
|
198
|
+
|
199
|
+
to_v ? set_v(to_v, car) : set_f(to_f, car)
|
200
|
+
|
201
|
+
cdr
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|