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