ruote 2.1.11 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.txt +60 -0
- data/CREDITS.txt +22 -4
- data/LICENSE.txt +1 -1
- data/README.rdoc +6 -7
- data/Rakefile +58 -59
- data/TODO.txt +137 -65
- data/couch_url.txt +1 -0
- data/jruby_issue.txt +32 -0
- data/lib/ruote.rb +1 -1
- data/lib/ruote/context.rb +12 -10
- data/lib/ruote/engine.rb +280 -145
- data/lib/ruote/engine/process_error.rb +5 -5
- data/lib/ruote/engine/process_status.rb +47 -28
- data/lib/ruote/exp/command.rb +7 -10
- data/lib/ruote/exp/commanded.rb +2 -2
- data/lib/ruote/exp/condition.rb +130 -43
- data/lib/ruote/exp/fe_add_branches.rb +2 -2
- data/lib/ruote/exp/fe_apply.rb +1 -1
- data/lib/ruote/exp/fe_cancel_process.rb +3 -3
- data/lib/ruote/exp/fe_command.rb +3 -3
- data/lib/ruote/exp/fe_concurrence.rb +4 -4
- data/lib/ruote/exp/fe_concurrent_iterator.rb +17 -5
- data/lib/ruote/exp/fe_cron.rb +3 -3
- data/lib/ruote/exp/fe_cursor.rb +5 -5
- data/lib/ruote/exp/fe_define.rb +3 -3
- data/lib/ruote/exp/fe_echo.rb +3 -3
- data/lib/ruote/exp/fe_equals.rb +2 -2
- data/lib/ruote/exp/fe_error.rb +2 -2
- data/lib/ruote/exp/fe_filter.rb +519 -0
- data/lib/ruote/exp/fe_forget.rb +9 -2
- data/lib/ruote/exp/fe_given.rb +154 -0
- data/lib/ruote/exp/fe_if.rb +16 -13
- data/lib/ruote/exp/fe_inc.rb +3 -3
- data/lib/ruote/exp/fe_iterator.rb +4 -4
- data/lib/ruote/exp/fe_let.rb +75 -0
- data/lib/ruote/exp/fe_listen.rb +68 -12
- data/lib/ruote/exp/fe_lose.rb +110 -0
- data/lib/ruote/exp/fe_noop.rb +1 -1
- data/lib/ruote/exp/{fe_when.rb → fe_once.rb} +25 -21
- data/lib/ruote/exp/fe_participant.rb +14 -17
- data/lib/ruote/exp/fe_redo.rb +10 -6
- data/lib/ruote/exp/fe_ref.rb +1 -1
- data/lib/ruote/exp/fe_registerp.rb +112 -0
- data/lib/ruote/exp/fe_reserve.rb +3 -3
- data/lib/ruote/exp/fe_restore.rb +2 -2
- data/lib/ruote/exp/fe_save.rb +2 -2
- data/lib/ruote/exp/fe_sequence.rb +3 -4
- data/lib/ruote/exp/fe_set.rb +16 -7
- data/lib/ruote/exp/fe_subprocess.rb +23 -1
- data/lib/ruote/exp/fe_that.rb +92 -0
- data/lib/ruote/exp/fe_undo.rb +3 -3
- data/lib/ruote/exp/fe_unregisterp.rb +71 -0
- data/lib/ruote/exp/fe_wait.rb +2 -2
- data/lib/ruote/exp/flowexpression.rb +153 -78
- data/lib/ruote/exp/iterator.rb +2 -2
- data/lib/ruote/exp/merge.rb +2 -2
- data/lib/ruote/exp/ro_attributes.rb +14 -12
- data/lib/ruote/exp/ro_filters.rb +136 -0
- data/lib/ruote/exp/ro_persist.rb +51 -35
- data/lib/ruote/exp/ro_variables.rb +18 -27
- data/lib/ruote/fei.rb +73 -33
- data/lib/ruote/id/mnemo_wfid_generator.rb +1 -1
- data/lib/ruote/id/wfid_generator.rb +11 -4
- data/lib/ruote/log/default_history.rb +122 -0
- data/lib/ruote/log/pretty.rb +36 -8
- data/lib/ruote/log/storage_history.rb +37 -5
- data/lib/ruote/log/test_logger.rb +26 -24
- data/lib/ruote/log/wait_logger.rb +5 -3
- data/lib/ruote/part/block_participant.rb +22 -11
- data/lib/ruote/part/engine_participant.rb +6 -7
- data/lib/ruote/part/local_participant.rb +6 -12
- data/lib/ruote/part/no_op_participant.rb +4 -4
- data/lib/ruote/part/null_participant.rb +4 -4
- data/lib/ruote/part/smtp_participant.rb +4 -4
- data/lib/ruote/part/storage_participant.rb +40 -20
- data/lib/ruote/part/template.rb +4 -4
- data/lib/ruote/participant.rb +0 -1
- data/lib/ruote/{parser.rb → reader.rb} +30 -25
- data/lib/ruote/{parser → reader}/ruby_dsl.rb +28 -11
- data/lib/ruote/{parser → reader}/xml.rb +6 -5
- data/lib/ruote/receiver/base.rb +35 -13
- data/lib/ruote/storage/base.rb +20 -18
- data/lib/ruote/storage/composite_storage.rb +10 -10
- data/lib/ruote/storage/fs_storage.rb +17 -10
- data/lib/ruote/storage/hash_storage.rb +29 -18
- data/lib/ruote/svc/dispatch_pool.rb +41 -14
- data/lib/ruote/svc/dollar_sub.rb +50 -17
- data/lib/ruote/svc/error_handler.rb +19 -11
- data/lib/ruote/svc/expression_map.rb +4 -4
- data/lib/ruote/svc/participant_list.rb +105 -100
- data/lib/ruote/svc/tracker.rb +58 -18
- data/lib/ruote/svc/treechecker.rb +51 -24
- data/lib/ruote/tree_dot.rb +4 -4
- data/lib/ruote/util/filter.rb +440 -0
- data/lib/ruote/util/hashdot.rb +4 -4
- data/lib/ruote/util/look.rb +2 -6
- data/lib/ruote/util/lookup.rb +9 -7
- data/lib/ruote/util/misc.rb +40 -8
- data/lib/ruote/util/ometa.rb +1 -1
- data/lib/ruote/util/serializer.rb +4 -4
- data/lib/ruote/util/subprocess.rb +29 -9
- data/lib/ruote/util/time.rb +4 -4
- data/lib/ruote/util/tree.rb +3 -3
- data/lib/ruote/version.rb +2 -2
- data/lib/ruote/worker.rb +55 -32
- data/lib/ruote/workitem.rb +64 -11
- data/ruote.gemspec +31 -302
- data/test/bm/launch_bench.rb +37 -0
- data/test/functional/base.rb +60 -18
- data/test/functional/concurrent_base.rb +2 -2
- data/test/functional/ct_0_concurrence.rb +1 -1
- data/test/functional/ct_1_iterator.rb +1 -1
- data/test/functional/ct_2_cancel.rb +1 -1
- data/test/functional/eft_0_process_definition.rb +2 -2
- data/test/functional/eft_10_cancel_process.rb +1 -1
- data/test/functional/eft_11_wait.rb +19 -11
- data/test/functional/eft_12_listen.rb +79 -13
- data/test/functional/eft_13_iterator.rb +13 -10
- data/test/functional/eft_14_cursor.rb +98 -9
- data/test/functional/eft_15_loop.rb +6 -4
- data/test/functional/eft_16_if.rb +12 -0
- data/test/functional/eft_18_concurrent_iterator.rb +31 -32
- data/test/functional/eft_19_reserve.rb +4 -4
- data/test/functional/eft_1_echo.rb +9 -0
- data/test/functional/eft_20_save.rb +4 -4
- data/test/functional/{eft_28_when.rb → eft_28_once.rb} +33 -7
- data/test/functional/eft_30_ref.rb +17 -2
- 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 +269 -0
- data/test/functional/eft_3_participant.rb +4 -6
- data/test/functional/eft_4_set.rb +16 -2
- data/test/functional/eft_5_subprocess.rb +2 -4
- data/test/functional/eft_6_concurrence.rb +29 -29
- data/test/functional/eft_8_undo.rb +39 -3
- data/test/functional/eft_9_redo.rb +94 -2
- data/test/functional/ft_10_dollar.rb +81 -2
- data/test/functional/ft_11_recursion.rb +13 -17
- data/test/functional/ft_12_launchitem.rb +9 -5
- data/test/functional/ft_13_variables.rb +7 -9
- data/test/functional/ft_14_re_apply.rb +6 -9
- data/test/functional/ft_15_timeout.rb +18 -18
- data/test/functional/ft_16_participant_params.rb +1 -3
- data/test/functional/ft_17_conditional.rb +25 -2
- data/test/functional/ft_18_kill.rb +65 -12
- data/test/functional/ft_1_process_status.rb +147 -71
- data/test/functional/ft_20_storage_participant.rb +0 -1
- data/test/functional/ft_21_forget.rb +82 -1
- data/test/functional/{ft_24_block_participants.rb → ft_24_block_participant.rb} +42 -11
- data/test/functional/ft_25_receiver.rb +47 -17
- data/test/functional/{ft_26_participant_timeout.rb → ft_26_participant_rtimeout.rb} +56 -19
- data/test/functional/ft_29_part_template.rb +6 -5
- data/test/functional/ft_2_errors.rb +21 -37
- data/test/functional/ft_30_smtp_participant.rb +1 -1
- data/test/functional/ft_31_part_blocking.rb +8 -6
- data/test/functional/ft_34_cursor_rewind.rb +13 -10
- data/test/functional/ft_35_add_service.rb +1 -1
- data/test/functional/ft_36_storage_history.rb +24 -1
- data/test/functional/ft_37_default_history.rb +109 -0
- data/test/functional/ft_38_participant_more.rb +10 -10
- data/test/functional/ft_39_wait_for.rb +12 -9
- data/test/functional/ft_3_participant_registration.rb +111 -32
- data/test/functional/ft_40_wait_logger.rb +2 -1
- data/test/functional/ft_41_participants.rb +30 -4
- data/test/functional/ft_43_participant_on_reply.rb +6 -23
- data/test/functional/ft_45_participant_accept.rb +4 -4
- data/test/functional/ft_46_launch_single.rb +36 -2
- 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 +66 -6
- 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_37_engine_participant.rb → ft_55_engine_participant.rb} +4 -5
- data/test/functional/ft_56_filter_attribute.rb +259 -0
- data/test/functional/ft_5_on_error.rb +77 -30
- data/test/functional/ft_6_on_cancel.rb +66 -11
- data/test/functional/ft_7_tags.rb +94 -5
- data/test/functional/ft_8_participant_consumption.rb +36 -5
- data/test/functional/ft_9_subprocesses.rb +10 -10
- data/test/functional/rt_1_listen.rb +3 -3
- data/test/functional/{rt_3_when.rb → rt_3_once.rb} +4 -4
- data/test/functional/storage_helper.rb +15 -13
- data/test/functional/test.rb +1 -3
- data/test/test_helper.rb +0 -8
- data/test/unit/storage.rb +154 -10
- data/test/unit/{ut_0_ruby_parser.rb → ut_0_ruby_reader.rb} +61 -11
- data/test/unit/ut_11_lookup.rb +7 -0
- data/test/unit/ut_13_serializer.rb +1 -1
- data/test/unit/ut_15_util.rb +23 -0
- data/test/unit/{ut_16_parser.rb → ut_16_reader.rb} +11 -13
- data/test/unit/ut_1_fei.rb +57 -10
- data/test/unit/ut_20_composite_storage.rb +25 -11
- data/test/unit/ut_21_participant_list.rb +47 -0
- data/test/unit/ut_22_filter.rb +903 -0
- data/test/unit/ut_3_wait_logger.rb +2 -6
- data/test/unit/ut_6_condition.rb +164 -17
- data/test/unit/ut_7_workitem.rb +28 -0
- data/test/unit/ut_8_tree_to_dot.rb +1 -1
- data/test/unit/{ut_9_xml_parser.rb → ut_9_xml_reader.rb} +5 -5
- metadata +108 -84
- data/.gitignore +0 -4
- data/examples/barley.rb +0 -391
- data/examples/flickr_report.rb +0 -107
- data/examples/pong.rb +0 -37
- data/examples/ruote_quickstart.rb +0 -43
- data/examples/web_first_page.rb +0 -68
- data/lib/ruote/part/hash_participant.rb +0 -91
- data/test/README.rdoc +0 -15
- data/test/functional/crunner.sh +0 -19
- data/test/pdef.xml +0 -7
- data/test/unit/ut_2_wfidgen.rb +0 -21
data/lib/ruote/exp/iterator.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -56,7 +56,7 @@ module Ruote::Exp
|
|
|
56
56
|
split_list(lookup_val_prefix('on'))
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
def split_list
|
|
59
|
+
def split_list(list)
|
|
60
60
|
|
|
61
61
|
if list.is_a?(String)
|
|
62
62
|
|
data/lib/ruote/exp/merge.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -41,7 +41,7 @@ module Ruote::Exp
|
|
|
41
41
|
# in the target workitem. The name of this field is the child_id of the
|
|
42
42
|
# source workitem (a string from '0' to '99999' and beyond)
|
|
43
43
|
#
|
|
44
|
-
def merge_workitems
|
|
44
|
+
def merge_workitems(index, target, source, type)
|
|
45
45
|
|
|
46
46
|
return source if type == 'override'
|
|
47
47
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
module Ruote::Exp
|
|
27
27
|
|
|
28
28
|
#
|
|
29
|
-
# Those methods are
|
|
29
|
+
# Those methods are added in FlowExpression. They were put here to offload
|
|
30
30
|
# FlowExpression and especially, to gather them around their attribute topic.
|
|
31
31
|
#
|
|
32
32
|
class FlowExpression
|
|
@@ -34,7 +34,7 @@ module Ruote::Exp
|
|
|
34
34
|
# Given a list of attribute names, returns the first attribute name for
|
|
35
35
|
# which there is a value.
|
|
36
36
|
#
|
|
37
|
-
def has_attribute
|
|
37
|
+
def has_attribute(*args)
|
|
38
38
|
|
|
39
39
|
args.each { |a| a = a.to_s; return a if attributes[a] != nil }
|
|
40
40
|
|
|
@@ -45,7 +45,7 @@ module Ruote::Exp
|
|
|
45
45
|
|
|
46
46
|
# Looks up the value for attribute n.
|
|
47
47
|
#
|
|
48
|
-
def attribute
|
|
48
|
+
def attribute(n, workitem=h.applied_workitem, options={})
|
|
49
49
|
|
|
50
50
|
n = n.to_s
|
|
51
51
|
|
|
@@ -72,7 +72,7 @@ module Ruote::Exp
|
|
|
72
72
|
# in the array list 'values'. If not, the default value is returned.
|
|
73
73
|
# By default, the default value is the first element of 'values'.
|
|
74
74
|
#
|
|
75
|
-
def att
|
|
75
|
+
def att(key, values, opts={})
|
|
76
76
|
|
|
77
77
|
default = opts[:default] || values.first
|
|
78
78
|
|
|
@@ -92,7 +92,7 @@ module Ruote::Exp
|
|
|
92
92
|
# prefix = 'on' => will lookup on, on_val, on_value, on_v, on_var,
|
|
93
93
|
# on_variable, on_f, on_fld, on_field...
|
|
94
94
|
#
|
|
95
|
-
def lookup_val_prefix
|
|
95
|
+
def lookup_val_prefix(prefix, att_options={})
|
|
96
96
|
|
|
97
97
|
lval(
|
|
98
98
|
[ prefix ] + [ 'val', 'value' ].map { |s| "#{prefix}_#{s}" },
|
|
@@ -101,7 +101,7 @@ module Ruote::Exp
|
|
|
101
101
|
att_options)
|
|
102
102
|
end
|
|
103
103
|
|
|
104
|
-
def lookup_val
|
|
104
|
+
def lookup_val(att_options={})
|
|
105
105
|
|
|
106
106
|
lval(
|
|
107
107
|
VV,
|
|
@@ -113,7 +113,7 @@ module Ruote::Exp
|
|
|
113
113
|
# Returns a Hash containing all attributes set for an expression with
|
|
114
114
|
# their values resolved.
|
|
115
115
|
#
|
|
116
|
-
def compile_atts
|
|
116
|
+
def compile_atts(opts={})
|
|
117
117
|
|
|
118
118
|
attributes.keys.inject({}) { |r, k|
|
|
119
119
|
r[k] = attribute(k, h.applied_workitem, opts)
|
|
@@ -127,7 +127,7 @@ module Ruote::Exp
|
|
|
127
127
|
#
|
|
128
128
|
# set "f:${v:field_name}" => "${v:that_variable}"
|
|
129
129
|
#
|
|
130
|
-
def expand_atts
|
|
130
|
+
def expand_atts(opts={})
|
|
131
131
|
|
|
132
132
|
attributes.keys.inject({}) { |r, k|
|
|
133
133
|
kk = @context.dollar_sub.s(k, self, h.applied_workitem)
|
|
@@ -148,7 +148,9 @@ module Ruote::Exp
|
|
|
148
148
|
#
|
|
149
149
|
# will yield 'alpha'.
|
|
150
150
|
#
|
|
151
|
-
|
|
151
|
+
# Note : an empty text returns '', not the nil value.
|
|
152
|
+
#
|
|
153
|
+
def attribute_text(workitem=h.applied_workitem)
|
|
152
154
|
|
|
153
155
|
text = attributes.keys.find { |k| attributes[k] == nil }
|
|
154
156
|
|
|
@@ -167,12 +169,12 @@ module Ruote::Exp
|
|
|
167
169
|
#
|
|
168
170
|
VV = %w[ val value ]
|
|
169
171
|
|
|
170
|
-
def s_cartesian
|
|
172
|
+
def s_cartesian(a0, a1)
|
|
171
173
|
|
|
172
174
|
a0.inject([]) { |a, e0| a + a1.collect { |e1| "#{e0}_#{e1}" } }
|
|
173
175
|
end
|
|
174
176
|
|
|
175
|
-
def lval
|
|
177
|
+
def lval(vals, vars, flds, att_options)
|
|
176
178
|
|
|
177
179
|
if k = has_att(*vals)
|
|
178
180
|
|
|
@@ -0,0 +1,136 @@
|
|
|
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 methods about the :filter attribute are placed in FlowExpression
|
|
30
|
+
# from here.
|
|
31
|
+
#
|
|
32
|
+
class FlowExpression
|
|
33
|
+
|
|
34
|
+
protected
|
|
35
|
+
|
|
36
|
+
# The :filter attribute work is done here, at apply (in) and at reply (out).
|
|
37
|
+
#
|
|
38
|
+
def filter(workitem=nil)
|
|
39
|
+
|
|
40
|
+
filter = lookup_filter(workitem)
|
|
41
|
+
|
|
42
|
+
return unless filter
|
|
43
|
+
|
|
44
|
+
unless filter.is_a?(Array)
|
|
45
|
+
#
|
|
46
|
+
# filter is a participant
|
|
47
|
+
|
|
48
|
+
def filter.receive(wi); end
|
|
49
|
+
# making sure the participant never replies to the engine
|
|
50
|
+
|
|
51
|
+
hwi = workitem || h.applied_workitem
|
|
52
|
+
|
|
53
|
+
if filter.respond_to?(:filter)
|
|
54
|
+
hwi['fields'] = filter.filter(hwi['fields'], workitem ? 'out' : 'in')
|
|
55
|
+
else
|
|
56
|
+
hwi['fields']['__filter_direction__'] = workitem ? 'out' : 'in'
|
|
57
|
+
filter.consume(Ruote::Workitem.new(hwi))
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
hwi['fields'].delete('__filter_direction__')
|
|
61
|
+
|
|
62
|
+
return
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# filter is a not a participnat
|
|
67
|
+
|
|
68
|
+
unless workitem # in
|
|
69
|
+
|
|
70
|
+
h.fields_pre_filter =
|
|
71
|
+
Rufus::Json.dup(h.applied_workitem['fields'])
|
|
72
|
+
h.applied_workitem['fields'] =
|
|
73
|
+
Ruote.filter(filter, h.applied_workitem['fields'], {})
|
|
74
|
+
|
|
75
|
+
else # out
|
|
76
|
+
|
|
77
|
+
workitem['fields'] =
|
|
78
|
+
Ruote.filter(
|
|
79
|
+
filter, workitem['fields'], :double_tilde => h.fields_pre_filter)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Used by #filter, deals with the various ways to pass filters
|
|
84
|
+
# (directly, via a variable, via a participant, in and out, ...)
|
|
85
|
+
#
|
|
86
|
+
# Returns nil, if there is no filter. Raises an ArgumentError if the
|
|
87
|
+
# filter is not usable. Returns the instantiated participant if the
|
|
88
|
+
# filter points to one.
|
|
89
|
+
#
|
|
90
|
+
def lookup_filter(workitem)
|
|
91
|
+
|
|
92
|
+
f = attribute(:filter)
|
|
93
|
+
|
|
94
|
+
return nil unless f
|
|
95
|
+
|
|
96
|
+
3.times { f = narrow_filter(f, workitem) }
|
|
97
|
+
|
|
98
|
+
raise ArgumentError.new(
|
|
99
|
+
"found no filter corresponding to '#{f}'"
|
|
100
|
+
) unless f
|
|
101
|
+
|
|
102
|
+
f
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Called successively to dig for the filter (Array or Participant).
|
|
106
|
+
#
|
|
107
|
+
def narrow_filter(fi, workitem)
|
|
108
|
+
|
|
109
|
+
if fi.is_a?(Array) or fi.respond_to?(:consume) or fi.respond_to?(:filter)
|
|
110
|
+
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
elsif fi.is_a?(Hash)
|
|
114
|
+
|
|
115
|
+
workitem ? fi['out'] || fi['reply'] : fi['in'] || fi['apply']
|
|
116
|
+
|
|
117
|
+
elsif fi.is_a?(String)
|
|
118
|
+
|
|
119
|
+
filter =
|
|
120
|
+
lookup_variable(fi) ||
|
|
121
|
+
@context.plist.lookup(fi, workitem || h.applied_workitem)
|
|
122
|
+
|
|
123
|
+
if filter.respond_to?(:consume) or filter.respond_to?(:filter)
|
|
124
|
+
(workitem || h.applied_workitem)['participant_name'] = fi
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
filter
|
|
128
|
+
|
|
129
|
+
else
|
|
130
|
+
|
|
131
|
+
nil
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
data/lib/ruote/exp/ro_persist.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -42,12 +42,11 @@ module Ruote::Exp
|
|
|
42
42
|
|
|
43
43
|
r = @context.storage.put(@h, :update_rev => true)
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
) if r != nil
|
|
45
|
+
#t = Thread.current.object_id.to_s[-3..-1]
|
|
46
|
+
#puts "+ per #{h.fei['expid']} #{tree[0]} r#{h._rev} t#{t} -> #{r.class}"
|
|
47
|
+
#Ruote.p_caller('+ per')
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
raise_or_return('initial_persist failed', r)
|
|
51
50
|
end
|
|
52
51
|
|
|
53
52
|
def try_persist
|
|
@@ -55,8 +54,8 @@ module Ruote::Exp
|
|
|
55
54
|
r = @context.storage.put(@h)
|
|
56
55
|
|
|
57
56
|
#t = Thread.current.object_id.to_s[-3..-1]
|
|
58
|
-
#puts "+ per #{h.fei['expid']} #{tree
|
|
59
|
-
#Ruote.p_caller('+ per')
|
|
57
|
+
#puts "+ per #{h.fei['expid']} #{tree[0]} r#{h._rev} t#{t} -> #{r.class}"
|
|
58
|
+
#Ruote.p_caller('+ per')
|
|
60
59
|
|
|
61
60
|
r
|
|
62
61
|
end
|
|
@@ -66,8 +65,8 @@ module Ruote::Exp
|
|
|
66
65
|
r = @context.storage.delete(@h)
|
|
67
66
|
|
|
68
67
|
#t = Thread.current.object_id.to_s[-3..-1]
|
|
69
|
-
#puts "- unp #{h.fei['expid']} #{tree
|
|
70
|
-
#Ruote.p_caller('- unp')
|
|
68
|
+
#puts "- unp #{h.fei['expid']} #{tree[0]} r#{h._rev} t#{t} -> #{r.class}"
|
|
69
|
+
#Ruote.p_caller('- unp')
|
|
71
70
|
|
|
72
71
|
return r if r
|
|
73
72
|
|
|
@@ -81,56 +80,73 @@ module Ruote::Exp
|
|
|
81
80
|
nil
|
|
82
81
|
end
|
|
83
82
|
|
|
84
|
-
#--
|
|
85
|
-
# duplication ahead
|
|
86
|
-
#++
|
|
87
|
-
|
|
88
83
|
def persist_or_raise
|
|
89
84
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
raise(
|
|
93
|
-
"persist failed for " +
|
|
94
|
-
"#{Ruote.to_storage_id(h.fei)} #{tree.first} #{r.class}"
|
|
95
|
-
) if r
|
|
85
|
+
p_or_raise(true)
|
|
96
86
|
end
|
|
97
87
|
|
|
98
88
|
def unpersist_or_raise
|
|
99
89
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
raise(
|
|
103
|
-
"unpersist failed for " +
|
|
104
|
-
"#{Ruote.to_storage_id(h.fei)} #{tree.first} #{r.class}"
|
|
105
|
-
) if r
|
|
90
|
+
p_or_raise(false)
|
|
106
91
|
end
|
|
107
92
|
|
|
108
|
-
alias
|
|
109
|
-
alias
|
|
93
|
+
alias persist persist_or_raise
|
|
94
|
+
alias unpersist unpersist_or_raise
|
|
110
95
|
|
|
111
96
|
def do_persist
|
|
112
97
|
|
|
113
|
-
do_p(
|
|
98
|
+
do_p(true)
|
|
114
99
|
end
|
|
115
100
|
|
|
116
101
|
def do_unpersist
|
|
117
102
|
|
|
118
|
-
do_p(
|
|
103
|
+
do_p(false)
|
|
119
104
|
end
|
|
120
105
|
|
|
121
106
|
protected
|
|
122
107
|
|
|
123
|
-
def
|
|
108
|
+
def raise_or_return(msg, r)
|
|
109
|
+
|
|
110
|
+
msg = msg.is_a?(String) ?
|
|
111
|
+
msg : (msg ? 'persist' : 'unpersist') + ' failed'
|
|
112
|
+
|
|
113
|
+
raise(
|
|
114
|
+
"#{msg} for " +
|
|
115
|
+
"#{Ruote.to_storage_id(h.fei)} #{tree[0]} #{tree[1].inspect} " +
|
|
116
|
+
'r(' + (r == true ? 'gone' : "rev : #{r['_rev']}") + ')'
|
|
117
|
+
) if r
|
|
118
|
+
|
|
119
|
+
r
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Does persist or unpersist, returns nothing in particular.
|
|
123
|
+
#
|
|
124
|
+
# Will raise a runtime error if it fails (ie if it happens, there
|
|
125
|
+
# is something wrong with the storage implementation or the engine).
|
|
126
|
+
#
|
|
127
|
+
def p_or_raise(pers)
|
|
128
|
+
|
|
129
|
+
r = pers ? try_persist : try_unpersist
|
|
130
|
+
|
|
131
|
+
raise_or_return(pers, r)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Does persist or unpersist, if successful then return true. If the
|
|
135
|
+
# expression is gone, return false.
|
|
136
|
+
# If there is a 'fresher' version of the expression, re-attempt and return
|
|
137
|
+
# false.
|
|
138
|
+
#
|
|
139
|
+
def do_p(pers)
|
|
124
140
|
|
|
125
|
-
case r =
|
|
141
|
+
case r = pers ? try_persist : try_unpersist
|
|
126
142
|
when true
|
|
127
|
-
false #
|
|
143
|
+
false # do not go on
|
|
128
144
|
when Hash
|
|
129
145
|
self.h = r
|
|
130
146
|
self.send("do_#{@msg['action']}", @msg)
|
|
131
|
-
false #
|
|
147
|
+
false # do not go on
|
|
132
148
|
else
|
|
133
|
-
true # success,
|
|
149
|
+
true # success, do go on
|
|
134
150
|
end
|
|
135
151
|
end
|
|
136
152
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2005-
|
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
|
3
3
|
#
|
|
4
4
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
# of this software and associated documentation files (the "Software"), to deal
|
|
@@ -52,7 +52,7 @@ module Ruote::Exp
|
|
|
52
52
|
# Looks up the value of a variable in expression tree
|
|
53
53
|
# (seen from a leaf, it looks more like a stack than a tree)
|
|
54
54
|
#
|
|
55
|
-
def lookup_variable
|
|
55
|
+
def lookup_variable(var, prefix=nil)
|
|
56
56
|
|
|
57
57
|
var, prefix = split_prefix(var, prefix)
|
|
58
58
|
|
|
@@ -91,31 +91,20 @@ module Ruote::Exp
|
|
|
91
91
|
# Sets a variable to a given value.
|
|
92
92
|
# (will set at the appropriate level).
|
|
93
93
|
#
|
|
94
|
-
def set_variable
|
|
94
|
+
def set_variable(var, val)
|
|
95
95
|
|
|
96
96
|
fexp, v = locate_var(var)
|
|
97
97
|
|
|
98
|
-
|
|
99
|
-
ArgumentError.new("cannot set var at engine level : #{var}")
|
|
100
|
-
) if fexp.nil?
|
|
101
|
-
|
|
102
|
-
fexp.un_set_variable(:set, v, val, true)
|
|
98
|
+
fexp.un_set_variable(:set, v, val, (fexp.h.fei != h.fei)) if fexp
|
|
103
99
|
end
|
|
104
100
|
|
|
105
101
|
# Unbinds a variables.
|
|
106
102
|
#
|
|
107
|
-
def unset_variable
|
|
103
|
+
def unset_variable(var)
|
|
108
104
|
|
|
109
105
|
fexp, v = locate_var(var)
|
|
110
106
|
|
|
111
|
-
|
|
112
|
-
ArgumentError.new("cannot set var at engine level : #{var}")
|
|
113
|
-
) if fexp.nil?
|
|
114
|
-
|
|
115
|
-
should_persist = (fexp.h.fei != h.fei)
|
|
116
|
-
# don't use a ticket when expression wants to modify its own vars
|
|
117
|
-
|
|
118
|
-
fexp.un_set_variable(:unset, v, nil, should_persist)
|
|
107
|
+
fexp.un_set_variable(:unset, v, nil, (fexp.h.fei != h.fei)) if fexp
|
|
119
108
|
end
|
|
120
109
|
|
|
121
110
|
# TODO : redoc rewrite needed
|
|
@@ -123,7 +112,7 @@ module Ruote::Exp
|
|
|
123
112
|
# This method is mostly used by the worker when looking up
|
|
124
113
|
# a process name or participant name bound under a variable.
|
|
125
114
|
#
|
|
126
|
-
def iterative_var_lookup
|
|
115
|
+
def iterative_var_lookup(k)
|
|
127
116
|
|
|
128
117
|
v = lookup_variable(k)
|
|
129
118
|
|
|
@@ -138,7 +127,7 @@ module Ruote::Exp
|
|
|
138
127
|
#
|
|
139
128
|
# val should be nil in case of 'unset'.
|
|
140
129
|
#
|
|
141
|
-
def un_set_variable
|
|
130
|
+
def un_set_variable(op, var, val, should_persist)
|
|
142
131
|
|
|
143
132
|
if op == :set
|
|
144
133
|
Ruote.set(h.variables, var, val)
|
|
@@ -146,14 +135,12 @@ module Ruote::Exp
|
|
|
146
135
|
Ruote.unset(h.variables, var)
|
|
147
136
|
end
|
|
148
137
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if r = try_persist # persist failed, have to retry
|
|
138
|
+
if should_persist && r = try_persist # persist failed, have to retry
|
|
152
139
|
|
|
153
140
|
@h = r
|
|
154
141
|
un_set_variable(op, var, val, true)
|
|
155
142
|
|
|
156
|
-
else # success
|
|
143
|
+
else # success (even when should_persist == false)
|
|
157
144
|
|
|
158
145
|
@context.storage.put_msg("variable_#{op}", 'var' => var, 'fei' => h.fei)
|
|
159
146
|
end
|
|
@@ -164,7 +151,7 @@ module Ruote::Exp
|
|
|
164
151
|
# Used by lookup_variable and set_variable to extract the
|
|
165
152
|
# prefix in a variable name
|
|
166
153
|
#
|
|
167
|
-
def split_prefix
|
|
154
|
+
def split_prefix(var, prefix)
|
|
168
155
|
|
|
169
156
|
if prefix.nil?
|
|
170
157
|
var = var.to_s
|
|
@@ -179,7 +166,7 @@ module Ruote::Exp
|
|
|
179
166
|
# Returns the flow expression that owns a variable (or the one
|
|
180
167
|
# that should own it) and the var without its potential / prefixes.
|
|
181
168
|
#
|
|
182
|
-
def locate_var
|
|
169
|
+
def locate_var(var, prefix=nil)
|
|
183
170
|
|
|
184
171
|
var, prefix = split_prefix(var, prefix)
|
|
185
172
|
|
|
@@ -189,9 +176,13 @@ module Ruote::Exp
|
|
|
189
176
|
# no prefix...
|
|
190
177
|
|
|
191
178
|
return [ self, var ] if h.variables
|
|
192
|
-
return parent.locate_var(var, prefix) if h.parent_id
|
|
193
179
|
|
|
194
|
-
|
|
180
|
+
if par = parent
|
|
181
|
+
return parent.locate_var(var, prefix) rescue nil
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
#raise "uprooted var lookup, something went wrong"
|
|
185
|
+
[ nil, nil ]
|
|
195
186
|
end
|
|
196
187
|
end
|
|
197
188
|
end
|