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,102 @@
|
|
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/merge'
|
27
|
+
|
28
|
+
|
29
|
+
module Ruote::Exp
|
30
|
+
|
31
|
+
#
|
32
|
+
# Restores the fields of the current workitem. That means usually copying
|
33
|
+
# them from a saved version in a variable or in a separate field.
|
34
|
+
#
|
35
|
+
# restore :from_var => 'v'
|
36
|
+
#
|
37
|
+
# or
|
38
|
+
#
|
39
|
+
# restore :from_f => 'customer.address.street', :to_f => 'delivery.street'
|
40
|
+
#
|
41
|
+
# (yes, this sets the field 'street' inside of the field 'delivery')
|
42
|
+
#
|
43
|
+
# == set_fields
|
44
|
+
#
|
45
|
+
# This expressions has a 'set_fields' alias. It can be handy (and readable)
|
46
|
+
# to set a bunch of workitem fields in one sweep somewhere in a process :
|
47
|
+
#
|
48
|
+
# Ruote.process_definition :name => 'working hard' do
|
49
|
+
# sequence do
|
50
|
+
# set_fields :val => { 'customer' => { 'name' => 'Fred', 'age' => 40 } }
|
51
|
+
# participant :ref => 'delivery'
|
52
|
+
# participant :ref => 'invoincing'
|
53
|
+
# end
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
class RestoreExpression < FlowExpression
|
57
|
+
|
58
|
+
include MergeMixin
|
59
|
+
# still have to implement something about merge...
|
60
|
+
|
61
|
+
names :restore, :set_fields
|
62
|
+
|
63
|
+
def apply
|
64
|
+
|
65
|
+
from =
|
66
|
+
has_attribute(*%w[ v var variable ].map { |k| "from_#{k}" }) ||
|
67
|
+
has_attribute(*%w[ f fld field ].map { |k| "from_#{k}" }) ||
|
68
|
+
has_attribute(*%w[ val value ])
|
69
|
+
|
70
|
+
_, to_f = determine_tos
|
71
|
+
# note : to_v is discarded (the underscore)
|
72
|
+
|
73
|
+
from = 'from_var' if from == 'from_v'
|
74
|
+
|
75
|
+
afrom = attribute(from)
|
76
|
+
|
77
|
+
fields = if from.match(/var/)
|
78
|
+
lookup_variable(afrom)
|
79
|
+
elsif from.match(/f/)
|
80
|
+
Ruote.lookup(h.applied_workitem['fields'], afrom)
|
81
|
+
else # val
|
82
|
+
afrom
|
83
|
+
end
|
84
|
+
|
85
|
+
if to_f
|
86
|
+
Ruote.set(h.applied_workitem['fields'], to_f, fields)
|
87
|
+
else
|
88
|
+
h.applied_workitem['fields'] = fields
|
89
|
+
end
|
90
|
+
|
91
|
+
# TODO : merge strategies
|
92
|
+
|
93
|
+
reply_to_parent(h.applied_workitem)
|
94
|
+
end
|
95
|
+
|
96
|
+
def reply(workitem)
|
97
|
+
|
98
|
+
# empty, never called
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
@@ -0,0 +1,72 @@
|
|
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
|
+
# Saves the current workitem fields into a variable or into a field.
|
30
|
+
#
|
31
|
+
# save :to_field => 'old_workitem'
|
32
|
+
# # or
|
33
|
+
# save :to => 'f:old_workitem'
|
34
|
+
# #
|
35
|
+
# # saves a copy of the fields of the current workitem into itself,
|
36
|
+
# # in the field named 'old_workitem'
|
37
|
+
#
|
38
|
+
# save :to_variable => '/wix'
|
39
|
+
# # or
|
40
|
+
# save :to => 'v:/wix'
|
41
|
+
# #
|
42
|
+
# # saves a copy of the current workitem in the varialbe 'wix' at
|
43
|
+
# # the root of the process
|
44
|
+
#
|
45
|
+
# See also the 'restore' expression (Ruote::Exp::RestoreExpression).
|
46
|
+
#
|
47
|
+
class SaveExpression < FlowExpression
|
48
|
+
|
49
|
+
names :save
|
50
|
+
|
51
|
+
def apply
|
52
|
+
|
53
|
+
to_v, to_f = determine_tos
|
54
|
+
|
55
|
+
if to_v
|
56
|
+
set_variable(to_v, h.applied_workitem['fields'])
|
57
|
+
elsif to_f
|
58
|
+
set_f(to_f, Ruote.fulldup(h.applied_workitem['fields']))
|
59
|
+
#else
|
60
|
+
# do nothing
|
61
|
+
end
|
62
|
+
|
63
|
+
reply_to_parent(h.applied_workitem)
|
64
|
+
end
|
65
|
+
|
66
|
+
def reply(workitem)
|
67
|
+
|
68
|
+
# empty, never called
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -0,0 +1,59 @@
|
|
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
|
+
# The plain 'sequence' expression.
|
30
|
+
#
|
31
|
+
# sequence do
|
32
|
+
# participant 'alpha'
|
33
|
+
# participant 'bravo'
|
34
|
+
# participant 'charly'
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
class SequenceExpression < FlowExpression
|
38
|
+
|
39
|
+
names :sequence
|
40
|
+
|
41
|
+
def apply
|
42
|
+
|
43
|
+
reply(h.applied_workitem)
|
44
|
+
end
|
45
|
+
|
46
|
+
def reply(workitem)
|
47
|
+
|
48
|
+
position = workitem['fei'] == h.fei ?
|
49
|
+
0 : Ruote::FlowExpressionId.new(workitem['fei']).child_id + 1
|
50
|
+
|
51
|
+
if position < tree_children.size
|
52
|
+
apply_child(position, workitem)
|
53
|
+
else
|
54
|
+
reply_to_parent(workitem)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
@@ -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
|
+
|
26
|
+
module Ruote::Exp
|
27
|
+
|
28
|
+
#
|
29
|
+
# Setting a workitem field or a process variable.
|
30
|
+
#
|
31
|
+
# sequence do
|
32
|
+
# set :field => 'subject', :value => 'food and beverage'
|
33
|
+
# set :field => 'date', :val => 'tomorrow'
|
34
|
+
# participant :ref => 'attendees'
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# :field can be abbreviated to :f or :fld. :variable can be abbreviated to
|
38
|
+
# :v or :var. Likewise, :val and :value are interchangeable.
|
39
|
+
#
|
40
|
+
# == field_value, variable_value
|
41
|
+
#
|
42
|
+
# Usually, grabbing a value from a field or a value will look like
|
43
|
+
#
|
44
|
+
# set :f => 'my_field', :value => '${v:my_variable}'
|
45
|
+
#
|
46
|
+
# But doing those ${} substitutions always result in a string result. What
|
47
|
+
# if the variable or the field holds a non-string value ?
|
48
|
+
#
|
49
|
+
# set :f => 'my_field', :var_value => 'my_variable'
|
50
|
+
#
|
51
|
+
# Is the way to go then. 'set' understands v_value, var_value, variable_value
|
52
|
+
# and f_value, fld_value and field_value.
|
53
|
+
#
|
54
|
+
# == :escape
|
55
|
+
#
|
56
|
+
# If the value to insert contains ${} stuff but this has to be preserved,
|
57
|
+
# setting the attribute :escape to true will do the trick.
|
58
|
+
#
|
59
|
+
# set :f => 'my_field', :value => 'oh and ${whatever}', :escape => true
|
60
|
+
#
|
61
|
+
# == ruote 2.0's shorter form
|
62
|
+
#
|
63
|
+
# Ruote 2.0 introduces a shorter form for the 'set' expression :
|
64
|
+
#
|
65
|
+
# sequence do
|
66
|
+
# set :field => 'f', :value => 'val0'
|
67
|
+
# set :variable => 'v', :value => 'val1'
|
68
|
+
# set :field => 'f_${v:v}', :value => 'val2'
|
69
|
+
# end
|
70
|
+
#
|
71
|
+
# can be rewritten as
|
72
|
+
#
|
73
|
+
# sequence do
|
74
|
+
# set 'f:f' => 'val0'
|
75
|
+
# set 'v:v' => 'val1'
|
76
|
+
# set 'f:f_${v:v}' => 'val2'
|
77
|
+
# end
|
78
|
+
#
|
79
|
+
# since 'f:' is the default for the 'dollar notation', the shortest form
|
80
|
+
# becomes
|
81
|
+
#
|
82
|
+
# sequence do
|
83
|
+
# set 'f' => 'val0'
|
84
|
+
# set 'v:v' => 'val1'
|
85
|
+
# set 'f_${v:v}' => 'val2'
|
86
|
+
# end
|
87
|
+
#
|
88
|
+
# == set and rset
|
89
|
+
#
|
90
|
+
# Some gems (Sinatra) for example may provide a set method that hides calls
|
91
|
+
# to set when building process definitions (see http://groups.google.com/group/openwferu-users/browse_thread/thread/9ac606e30ada686e)
|
92
|
+
#
|
93
|
+
# A workaround is to write 'rset' instead of 'set'.
|
94
|
+
#
|
95
|
+
# rset 'customer' => 'Jeff'
|
96
|
+
#
|
97
|
+
#
|
98
|
+
# == unset
|
99
|
+
#
|
100
|
+
# 'unset' is the counterpart to 'set', it removes a field (or a variable)
|
101
|
+
#
|
102
|
+
# unset :field => 'customer_name'
|
103
|
+
# unset :f => 'customer_name'
|
104
|
+
# unset :variable => 'vx'
|
105
|
+
# unset :var => 'vx'
|
106
|
+
# unset :v => 'vx'
|
107
|
+
#
|
108
|
+
# or simply
|
109
|
+
#
|
110
|
+
# unset 'f:customer_name'
|
111
|
+
# unset 'customer_name' # yes, it's field by default
|
112
|
+
# unset 'v:vx'
|
113
|
+
#
|
114
|
+
class SetExpression < FlowExpression
|
115
|
+
|
116
|
+
names :rset, :set, :unset
|
117
|
+
|
118
|
+
def apply
|
119
|
+
|
120
|
+
opts = { :escape => attribute(:escape) }
|
121
|
+
|
122
|
+
value = lookup_val(opts)
|
123
|
+
# a nil value is totally OK
|
124
|
+
|
125
|
+
if var_key = has_attribute(:v, :var, :variable)
|
126
|
+
|
127
|
+
set_v(attribute(var_key), value, name == 'unset')
|
128
|
+
|
129
|
+
elsif field_key = has_attribute(:f, :fld, :field)
|
130
|
+
|
131
|
+
set_f(attribute(field_key), value, name == 'unset')
|
132
|
+
|
133
|
+
elsif value == nil && kv = expand_atts(opts).find { |k, v| k != 'escape' }
|
134
|
+
|
135
|
+
kv << (name == 'unset')
|
136
|
+
|
137
|
+
set_vf(*kv)
|
138
|
+
|
139
|
+
else
|
140
|
+
|
141
|
+
raise ArgumentError.new(
|
142
|
+
"missing a variable or field target in #{tree.inspect}")
|
143
|
+
end
|
144
|
+
|
145
|
+
reply_to_parent(h.applied_workitem)
|
146
|
+
end
|
147
|
+
|
148
|
+
def reply(workitem)
|
149
|
+
|
150
|
+
# never called
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
@@ -0,0 +1,211 @@
|
|
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/util/subprocess'
|
26
|
+
|
27
|
+
|
28
|
+
module Ruote::Exp
|
29
|
+
|
30
|
+
#
|
31
|
+
# An expression for invoking a subprocess.
|
32
|
+
#
|
33
|
+
# pdef = Ruote.process_definition do
|
34
|
+
# sequence do
|
35
|
+
# subprocess :ref => 'delivering'
|
36
|
+
# subprocess 'invoicing'
|
37
|
+
# refill_stock :if => '${v:stock_size} < 10'
|
38
|
+
# end
|
39
|
+
# define 'delivering' do
|
40
|
+
# # ...
|
41
|
+
# end
|
42
|
+
# define 'invoicing' do
|
43
|
+
# # ...
|
44
|
+
# end
|
45
|
+
# define 'refill_stock' do
|
46
|
+
# # ...
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
#
|
51
|
+
# == passing attributes as variables
|
52
|
+
#
|
53
|
+
# The attributes of the subprocess expression are passed as variables of
|
54
|
+
# the new subprocess instance.
|
55
|
+
#
|
56
|
+
# Ruote.process_definition do
|
57
|
+
# subprocess 'sub0', :a => 'A', :b => 'B'
|
58
|
+
# define :sub0 do
|
59
|
+
# echo '${v:a}:${v:b}'
|
60
|
+
# end
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# This example (and useless) process example will output "A:B" to STDOUT.
|
64
|
+
#
|
65
|
+
#
|
66
|
+
# == passing 'blocks' to subprocesses
|
67
|
+
#
|
68
|
+
# When the subprocess expression has children, the first of them is passed
|
69
|
+
# to the subprocess instance as the 'tree' variable, readily available for
|
70
|
+
# an 'apply' expression.
|
71
|
+
#
|
72
|
+
# Ruote.process_definition :name => 'double review' do
|
73
|
+
# sequence do
|
74
|
+
# sub0 do
|
75
|
+
# review_board
|
76
|
+
# end
|
77
|
+
# sub0 do
|
78
|
+
# review_board
|
79
|
+
# end
|
80
|
+
# end
|
81
|
+
# define 'sub0' do
|
82
|
+
# concurrence do
|
83
|
+
# apply :i => 0
|
84
|
+
# apply :i => 1
|
85
|
+
# apply :i => 2
|
86
|
+
# end
|
87
|
+
# end
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
# This example will send 2 x 3 concurrent workitems to the participant
|
91
|
+
# named 'review_board' (note that it could also be the name of another
|
92
|
+
# subprocess).
|
93
|
+
#
|
94
|
+
#
|
95
|
+
# == passing 'parameters' to subprocess
|
96
|
+
#
|
97
|
+
# Ruote.process_definition :name => 'whatever' do
|
98
|
+
#
|
99
|
+
# call :who => 'the cops', :when => 'if I\'m not back at 3'
|
100
|
+
#
|
101
|
+
# process_definition 'call' do
|
102
|
+
# participant :ref => '${v:who}', :msg => 'this is a call'
|
103
|
+
# end
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# This binds the variables 'who' and 'when' in the subprocess instance.
|
107
|
+
#
|
108
|
+
# Of course you can combine parameters and blocks passing.
|
109
|
+
#
|
110
|
+
#
|
111
|
+
# == pointing to subprocesses via their URI
|
112
|
+
#
|
113
|
+
# It's OK to invoke subprocesses via a URI
|
114
|
+
#
|
115
|
+
# subprocess :ref => 'pdefs/definition1.rb'
|
116
|
+
#
|
117
|
+
# or
|
118
|
+
#
|
119
|
+
# subprocess :ref => 'http://pdefs.example.org/account/def1.xml'
|
120
|
+
#
|
121
|
+
# Remember that the 'remote_definition_allowed' option of the engine has
|
122
|
+
# to be set to true for the latter to work, else the engine will refuse
|
123
|
+
# to load definitions over HTTP.
|
124
|
+
#
|
125
|
+
# Shorter :
|
126
|
+
#
|
127
|
+
# subprocess 'http://pdefs.example.org/account/def1.xml'
|
128
|
+
#
|
129
|
+
#
|
130
|
+
# == subprocess URIs bound at engine level
|
131
|
+
#
|
132
|
+
# There is a class of variables accessible to process instances in read-only
|
133
|
+
# mode : engine level variables.
|
134
|
+
#
|
135
|
+
# They can be set via the engine's initialization code (or later) like in
|
136
|
+
# this example :
|
137
|
+
#
|
138
|
+
# engine.variables['inventory_check'] = 'http://pdefs.example.com/ic0.rb'
|
139
|
+
#
|
140
|
+
# All the process instance in the engine may then trigger this process in
|
141
|
+
# these 3 ways :
|
142
|
+
#
|
143
|
+
# subprocess :ref => 'inventory_check'
|
144
|
+
# subprocess 'inventory_check'
|
145
|
+
# inventory_check
|
146
|
+
#
|
147
|
+
# The latter may make process definitions quite readable (but blur the
|
148
|
+
# distinction between expressions, call to participants or to subprocesses).
|
149
|
+
#
|
150
|
+
#
|
151
|
+
# == subprocess trees bound at engine level
|
152
|
+
#
|
153
|
+
# It's OK to place a process tree directly in an engine variable :
|
154
|
+
#
|
155
|
+
# engine.variables['inventory_check'] = Ruote.process_definition do
|
156
|
+
# cursor do
|
157
|
+
# manager :task => 'hire inventory team'
|
158
|
+
# floor_manager :task => 'lead inventory'
|
159
|
+
# manager :task => 'check results'
|
160
|
+
# rewind :unless => '${inventory_successful}'
|
161
|
+
# end
|
162
|
+
# end
|
163
|
+
#
|
164
|
+
# Then, from the main process :
|
165
|
+
#
|
166
|
+
# sequence do
|
167
|
+
# # ...
|
168
|
+
# inventory_check
|
169
|
+
# # ...
|
170
|
+
# end
|
171
|
+
#
|
172
|
+
class SubprocessExpression < FlowExpression
|
173
|
+
|
174
|
+
names :subprocess
|
175
|
+
|
176
|
+
def apply
|
177
|
+
|
178
|
+
return invoke_engine_participant if attribute(:engine)
|
179
|
+
|
180
|
+
ref = attribute(:ref) || attribute_text
|
181
|
+
|
182
|
+
raise "no subprocess referred in #{tree}" unless ref
|
183
|
+
|
184
|
+
pos, subtree = Ruote.lookup_subprocess(self, ref)
|
185
|
+
|
186
|
+
vars = compile_atts
|
187
|
+
vars.merge!('tree' => tree_children.first)
|
188
|
+
# NOTE : we're taking the first child here...
|
189
|
+
|
190
|
+
launch_sub(pos, subtree, :variables => vars)
|
191
|
+
end
|
192
|
+
|
193
|
+
protected
|
194
|
+
|
195
|
+
def invoke_engine_participant
|
196
|
+
|
197
|
+
atts = tree[1]
|
198
|
+
|
199
|
+
if ref = atts.find { |k, v| v.nil? }
|
200
|
+
ref = ref.first
|
201
|
+
atts.delete(ref)
|
202
|
+
end
|
203
|
+
atts['pdef'] = atts['ref'] || ref
|
204
|
+
atts['ref'] = atts.delete('engine')
|
205
|
+
|
206
|
+
@h['name'] = 'participant'
|
207
|
+
Ruote::Exp::ParticipantExpression.new(@context, @h).apply
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|