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,69 @@
|
|
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
|
+
# 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
|
+
|
@@ -0,0 +1,82 @@
|
|
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
|
+
# Undoes and the redoes (re-applies) an expression identified by a tag.
|
30
|
+
#
|
31
|
+
# pdef = Ruote.process_definition do
|
32
|
+
# sequence :tag => 'kilroy' do
|
33
|
+
# alpha
|
34
|
+
# _redo :ref => 'kilroy', :unless => '${f:ok} == true'
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# will redo at tag 'kilroy' if the field 'ok' is not set to true.
|
39
|
+
#
|
40
|
+
# (redo is escaped as _redo not to conflict with the "redo" Ruby keyword)
|
41
|
+
#
|
42
|
+
# Maybe this case is better served by a cursor/rewind combination
|
43
|
+
#
|
44
|
+
# pdef = Ruote.process_definition do
|
45
|
+
# cursor do
|
46
|
+
# alpha
|
47
|
+
# rewind :unless => '${f:ok} == true'
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# (There is a big difference though, a redo will restart with the workitem
|
52
|
+
# as it was when the workitem entered the tagged region, while the rewind
|
53
|
+
# keeps the workitem as is)
|
54
|
+
#
|
55
|
+
class RedoExpression < FlowExpression
|
56
|
+
|
57
|
+
names :redo
|
58
|
+
|
59
|
+
def apply
|
60
|
+
|
61
|
+
ref = attribute(:ref) || attribute_text
|
62
|
+
tag = ref ? lookup_variable(ref) : nil
|
63
|
+
|
64
|
+
if tag && Ruote.is_a_fei?(tag)
|
65
|
+
|
66
|
+
@context.storage.put_msg('cancel', 'fei' => tag, 're_apply' => true)
|
67
|
+
|
68
|
+
reply_to_parent(h.applied_workitem) unless ancestor?(tag)
|
69
|
+
|
70
|
+
else
|
71
|
+
|
72
|
+
reply_to_parent(h.applied_workitem)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def reply(workitem)
|
77
|
+
|
78
|
+
# never called
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
@@ -0,0 +1,152 @@
|
|
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
|
+
# Sometimes you don't know at 'design time', if you want to trigger a
|
30
|
+
# participant or subprocess.
|
31
|
+
#
|
32
|
+
# Ruote.process_definition do
|
33
|
+
# sequence do
|
34
|
+
# participant 'alice'
|
35
|
+
# ref '${solver}'
|
36
|
+
# participant 'charlie'
|
37
|
+
# end
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# In this process, solver's name could be a participant name or a subprocess
|
41
|
+
# name.
|
42
|
+
#
|
43
|
+
# Subprocesses have the priority over participants.
|
44
|
+
#
|
45
|
+
# Note : this expression is used by the worker when substituting unknown
|
46
|
+
# expression names with participant or subprocess refs.
|
47
|
+
#
|
48
|
+
class RefExpression < FlowExpression
|
49
|
+
|
50
|
+
names :ref
|
51
|
+
|
52
|
+
def apply
|
53
|
+
|
54
|
+
key = (attribute(:ref) || attribute_text).to_s
|
55
|
+
|
56
|
+
if name != 'ref'
|
57
|
+
key = name
|
58
|
+
tree[1]['ref'] = key
|
59
|
+
end
|
60
|
+
|
61
|
+
key = @context.dollar_sub.s(key, self, h.applied_workitem)
|
62
|
+
# see test/functional/ft_62_
|
63
|
+
|
64
|
+
key2, value = iterative_var_lookup(key)
|
65
|
+
|
66
|
+
tree[1]['ref'] = key2 if key2
|
67
|
+
tree[1]['original_ref'] = key if key2 != key
|
68
|
+
|
69
|
+
unless value
|
70
|
+
#
|
71
|
+
# seems like it's a participant
|
72
|
+
|
73
|
+
@h['participant'] =
|
74
|
+
@context.plist.lookup_info(tree[1]['ref'], h.applied_workitem)
|
75
|
+
|
76
|
+
value = key2 if ( ! @h['participant']) && (key2 != key)
|
77
|
+
end
|
78
|
+
|
79
|
+
new_exp_name, new_exp_class = nil
|
80
|
+
|
81
|
+
if value.is_a?(String)
|
82
|
+
|
83
|
+
if value.index("def consume(") && (Rufus::TreeChecker.parse(value) rescue false)
|
84
|
+
#
|
85
|
+
# participant code passed
|
86
|
+
|
87
|
+
@h['participant'] = [ 'Ruote::CodeParticipant', { 'code' => value } ]
|
88
|
+
tree[1]['ref'] = key
|
89
|
+
|
90
|
+
elsif klass = @context.expmap.expression_class(tree[1]['ref'])
|
91
|
+
#
|
92
|
+
# aliased expression
|
93
|
+
|
94
|
+
new_exp_name = value
|
95
|
+
new_exp_class = klass
|
96
|
+
end
|
97
|
+
|
98
|
+
elsif value.is_a?(Hash) && value['on_workitem']
|
99
|
+
#
|
100
|
+
# participant 'defined' in var
|
101
|
+
|
102
|
+
@h['participant'] = [ 'Ruote::BlockParticipant', value ]
|
103
|
+
|
104
|
+
elsif value.is_a?(Array) && value.size == 2 && value.last.is_a?(Hash)
|
105
|
+
#
|
106
|
+
# participant 'registered' in var
|
107
|
+
|
108
|
+
@h['participant'] = value
|
109
|
+
end
|
110
|
+
|
111
|
+
if value == nil and @h['participant'] == nil
|
112
|
+
#
|
113
|
+
# unknown participant or subprocess
|
114
|
+
|
115
|
+
@h['state'] = 'failed'
|
116
|
+
persist_or_raise
|
117
|
+
|
118
|
+
raise("unknown participant or subprocess '#{tree[1]['ref']}'")
|
119
|
+
end
|
120
|
+
|
121
|
+
new_exp_name, new_exp_class = if new_exp_name
|
122
|
+
[ new_exp_name, new_exp_class ]
|
123
|
+
elsif @h['participant']
|
124
|
+
[ 'participant', Ruote::Exp::ParticipantExpression ]
|
125
|
+
else
|
126
|
+
[ 'subprocess', Ruote::Exp::SubprocessExpression ]
|
127
|
+
end
|
128
|
+
|
129
|
+
tree[0] = new_exp_name
|
130
|
+
@h['name'] = new_exp_name
|
131
|
+
|
132
|
+
new_exp = new_exp_class.new(@context, @h)
|
133
|
+
|
134
|
+
do_schedule_timeout(attribute(:timeout)) if new_exp_name == 'subprocess'
|
135
|
+
#
|
136
|
+
# since ref neutralizes consider_timeout because participant expressions
|
137
|
+
# handle timeout by themselves, we have to force timeout consideration
|
138
|
+
# for subprocess expressions
|
139
|
+
|
140
|
+
#new_exp.initial_persist
|
141
|
+
# not necessary
|
142
|
+
|
143
|
+
new_exp.apply
|
144
|
+
end
|
145
|
+
|
146
|
+
def consider_timeout
|
147
|
+
|
148
|
+
# neutralized
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
@@ -0,0 +1,110 @@
|
|
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
|
+
# This expressions lets one register participants directly from a process
|
30
|
+
# definition.
|
31
|
+
#
|
32
|
+
# pdef = Ruote.define do
|
33
|
+
#
|
34
|
+
# registerp 'alpha', :class => 'MyParticipant', :target => 'mail'
|
35
|
+
# # register participant named 'alpha' with the given class
|
36
|
+
# # and some attributes
|
37
|
+
#
|
38
|
+
# registerp /^user_.+/, :class => 'MyParticipant'
|
39
|
+
# registerp :regex => '^user_.+', :class => 'MyParticipant'
|
40
|
+
# # register participant with a given regular expression
|
41
|
+
#
|
42
|
+
# registerp 'admin', :class => 'MyParticipant', :position => -2
|
43
|
+
# # register participant 'admin' as second to last in participant list
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# Participant info can be given as attributes to the expression (see code
|
47
|
+
# above) or via the workitem.
|
48
|
+
#
|
49
|
+
# pdef = Ruote.define do
|
50
|
+
#
|
51
|
+
# registerp :participant => 'participant'
|
52
|
+
# # participant info is found in the field 'participant'
|
53
|
+
#
|
54
|
+
# registerp :participants => 'participants'
|
55
|
+
# # an array of participant info is found in the field 'participants'
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# The expression 'unregisterp' can be used to remove participants from the
|
59
|
+
# participant list.
|
60
|
+
#
|
61
|
+
class RegisterpExpression < FlowExpression
|
62
|
+
|
63
|
+
names :registerp
|
64
|
+
|
65
|
+
def apply
|
66
|
+
|
67
|
+
registerp_allowed?
|
68
|
+
|
69
|
+
if pa = attribute('participant')
|
70
|
+
|
71
|
+
register_participant(h.applied_workitem['fields'][pa])
|
72
|
+
|
73
|
+
elsif pas = attribute('participants')
|
74
|
+
|
75
|
+
h.applied_workitem['fields'][pas].each do |part|
|
76
|
+
register_participant(part)
|
77
|
+
end
|
78
|
+
|
79
|
+
else
|
80
|
+
|
81
|
+
register_participant(attributes)
|
82
|
+
end
|
83
|
+
|
84
|
+
reply_to_parent(h.applied_workitem)
|
85
|
+
end
|
86
|
+
|
87
|
+
def reply(workitem)
|
88
|
+
|
89
|
+
# never called
|
90
|
+
end
|
91
|
+
|
92
|
+
protected
|
93
|
+
|
94
|
+
def registerp_allowed?
|
95
|
+
|
96
|
+
raise ArgumentError.new(
|
97
|
+
"'registerp_allowed' is set to false, cannot [un]register " +
|
98
|
+
"participants from process definitions"
|
99
|
+
) if context['registerp_allowed'] != true
|
100
|
+
end
|
101
|
+
|
102
|
+
def register_participant(info)
|
103
|
+
|
104
|
+
name, (klass, opts) = Ruote::ParticipantEntry.read(info)
|
105
|
+
|
106
|
+
context.engine.register_participant(name, klass, opts)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
@@ -0,0 +1,126 @@
|
|
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
|
+
# Prevents two process branches from executing at the same time.
|
30
|
+
#
|
31
|
+
# pdef = Ruote.process_definition :name => 'test' do
|
32
|
+
# concurrence do
|
33
|
+
# reserve :mutex => 'a' do
|
34
|
+
# alpha
|
35
|
+
# end
|
36
|
+
# reserve 'a' do
|
37
|
+
# alpha
|
38
|
+
# end
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# (Nice and tiny example, turns a concurrence into a sequence...)
|
43
|
+
#
|
44
|
+
class ReserveExpression < FlowExpression
|
45
|
+
|
46
|
+
names :reserve
|
47
|
+
|
48
|
+
def apply
|
49
|
+
|
50
|
+
return reply_to_parent(h.applied_workitem) if tree_children.empty?
|
51
|
+
|
52
|
+
h.mutex_name = attribute(:mutex) || attribute_text
|
53
|
+
h.mutex_name = 'reserve' if h.mutex_name.strip == ''
|
54
|
+
|
55
|
+
raise(
|
56
|
+
ArgumentError.new("can't bind reserve mutex at engine level")
|
57
|
+
) if h.mutex_name.match(/^\/\//)
|
58
|
+
|
59
|
+
set_mutex
|
60
|
+
end
|
61
|
+
|
62
|
+
def reply(workitem)
|
63
|
+
|
64
|
+
release_mutex
|
65
|
+
|
66
|
+
reply_to_parent(workitem)
|
67
|
+
end
|
68
|
+
|
69
|
+
def cancel(flavour)
|
70
|
+
|
71
|
+
super
|
72
|
+
|
73
|
+
release_mutex
|
74
|
+
end
|
75
|
+
|
76
|
+
def enter
|
77
|
+
|
78
|
+
apply_child(0, h.applied_workitem)
|
79
|
+
end
|
80
|
+
|
81
|
+
protected
|
82
|
+
|
83
|
+
def set_mutex
|
84
|
+
|
85
|
+
target, var = locate_var(h.mutex_name)
|
86
|
+
|
87
|
+
val = target.variables[var]
|
88
|
+
|
89
|
+
# [ 'mutex', name, [ fei0, fei1, ... ] ]
|
90
|
+
|
91
|
+
mutex = val ? val : [ 'mutex', var, [] ]
|
92
|
+
|
93
|
+
mutex.last << h.fei
|
94
|
+
|
95
|
+
target.variables[var] = mutex
|
96
|
+
|
97
|
+
r = target.try_persist
|
98
|
+
|
99
|
+
return set_mutex if r != nil
|
100
|
+
|
101
|
+
if mutex.last.first == h.fei
|
102
|
+
enter
|
103
|
+
else
|
104
|
+
persist_or_raise
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def release_mutex
|
109
|
+
|
110
|
+
target, var = locate_var(h.mutex_name)
|
111
|
+
|
112
|
+
mutex = target.variables[var]
|
113
|
+
|
114
|
+
mutex.last.shift
|
115
|
+
|
116
|
+
r = target.try_persist
|
117
|
+
|
118
|
+
return release_mutex if r != nil
|
119
|
+
|
120
|
+
next_fei = mutex.last.first
|
121
|
+
|
122
|
+
Ruote::Exp::FlowExpression.fetch(@context, next_fei).enter if next_fei
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|