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,69 @@
1
+ #--
2
+ # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Ruote::Exp
27
+
28
+ #
29
+ # Reads the content of a local file or a file reachable over http and places
30
+ # the content in a [process] variable or a [workitem] field.
31
+ #
32
+ # Always attempts to parse the content as JSON. If the parsing fails, simply
33
+ # considers as plain text.
34
+ #
35
+ # Ruote.process_definition do
36
+ # read 'http://defs.example.org/filters/filter1.json', :to => 'x'
37
+ # read 'http://defs.example.org/filters/filter1.json', :to => 'f:x'
38
+ # read 'http://defs.example.org/filters/filter2.json', :to => 'v:y'
39
+ # read 'filters/filter3.json', :to => 'f:y'
40
+ # read 'texts/greetings${f:greeting_index}.txt', :to => 'f:greetings'
41
+ # # ...
42
+ # end
43
+ #
44
+ class ReadExpression < FlowExpression
45
+
46
+ names :read
47
+
48
+ def apply
49
+
50
+ to = attribute('to')
51
+ from = attribute('from') || attribute_text
52
+
53
+ content = open(from).read rescue nil
54
+ # should this happen in the worker loop ? thread out ?
55
+
56
+ content = Rufus::Json.decode(content) rescue content
57
+
58
+ set_vf(to, content)
59
+
60
+ reply_to_parent(h.applied_workitem)
61
+ end
62
+
63
+ def reply(workitem)
64
+
65
+ # empty, never called
66
+ end
67
+ end
68
+ end
69
+
@@ -0,0 +1,82 @@
1
+ #--
2
+ # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Ruote::Exp
27
+
28
+ #
29
+ # Undoes and the redoes (re-applies) an expression identified by a tag.
30
+ #
31
+ # pdef = Ruote.process_definition do
32
+ # sequence :tag => 'kilroy' do
33
+ # alpha
34
+ # _redo :ref => 'kilroy', :unless => '${f:ok} == true'
35
+ # end
36
+ # end
37
+ #
38
+ # will redo at tag 'kilroy' if the field 'ok' is not set to true.
39
+ #
40
+ # (redo is escaped as _redo not to conflict with the "redo" Ruby keyword)
41
+ #
42
+ # Maybe this case is better served by a cursor/rewind combination
43
+ #
44
+ # pdef = Ruote.process_definition do
45
+ # cursor do
46
+ # alpha
47
+ # rewind :unless => '${f:ok} == true'
48
+ # end
49
+ # end
50
+ #
51
+ # (There is a big difference though, a redo will restart with the workitem
52
+ # as it was when the workitem entered the tagged region, while the rewind
53
+ # keeps the workitem as is)
54
+ #
55
+ class RedoExpression < FlowExpression
56
+
57
+ names :redo
58
+
59
+ def apply
60
+
61
+ ref = attribute(:ref) || attribute_text
62
+ tag = ref ? lookup_variable(ref) : nil
63
+
64
+ if tag && Ruote.is_a_fei?(tag)
65
+
66
+ @context.storage.put_msg('cancel', 'fei' => tag, 're_apply' => true)
67
+
68
+ reply_to_parent(h.applied_workitem) unless ancestor?(tag)
69
+
70
+ else
71
+
72
+ reply_to_parent(h.applied_workitem)
73
+ end
74
+ end
75
+
76
+ def reply(workitem)
77
+
78
+ # never called
79
+ end
80
+ end
81
+ end
82
+
@@ -0,0 +1,152 @@
1
+ #--
2
+ # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Ruote::Exp
27
+
28
+ #
29
+ # Sometimes you don't know at 'design time', if you want to trigger a
30
+ # participant or subprocess.
31
+ #
32
+ # Ruote.process_definition do
33
+ # sequence do
34
+ # participant 'alice'
35
+ # ref '${solver}'
36
+ # participant 'charlie'
37
+ # end
38
+ # end
39
+ #
40
+ # In this process, solver's name could be a participant name or a subprocess
41
+ # name.
42
+ #
43
+ # Subprocesses have the priority over participants.
44
+ #
45
+ # Note : this expression is used by the worker when substituting unknown
46
+ # expression names with participant or subprocess refs.
47
+ #
48
+ class RefExpression < FlowExpression
49
+
50
+ names :ref
51
+
52
+ def apply
53
+
54
+ key = (attribute(:ref) || attribute_text).to_s
55
+
56
+ if name != 'ref'
57
+ key = name
58
+ tree[1]['ref'] = key
59
+ end
60
+
61
+ key = @context.dollar_sub.s(key, self, h.applied_workitem)
62
+ # see test/functional/ft_62_
63
+
64
+ key2, value = iterative_var_lookup(key)
65
+
66
+ tree[1]['ref'] = key2 if key2
67
+ tree[1]['original_ref'] = key if key2 != key
68
+
69
+ unless value
70
+ #
71
+ # seems like it's a participant
72
+
73
+ @h['participant'] =
74
+ @context.plist.lookup_info(tree[1]['ref'], h.applied_workitem)
75
+
76
+ value = key2 if ( ! @h['participant']) && (key2 != key)
77
+ end
78
+
79
+ new_exp_name, new_exp_class = nil
80
+
81
+ if value.is_a?(String)
82
+
83
+ if value.index("def consume(") && (Rufus::TreeChecker.parse(value) rescue false)
84
+ #
85
+ # participant code passed
86
+
87
+ @h['participant'] = [ 'Ruote::CodeParticipant', { 'code' => value } ]
88
+ tree[1]['ref'] = key
89
+
90
+ elsif klass = @context.expmap.expression_class(tree[1]['ref'])
91
+ #
92
+ # aliased expression
93
+
94
+ new_exp_name = value
95
+ new_exp_class = klass
96
+ end
97
+
98
+ elsif value.is_a?(Hash) && value['on_workitem']
99
+ #
100
+ # participant 'defined' in var
101
+
102
+ @h['participant'] = [ 'Ruote::BlockParticipant', value ]
103
+
104
+ elsif value.is_a?(Array) && value.size == 2 && value.last.is_a?(Hash)
105
+ #
106
+ # participant 'registered' in var
107
+
108
+ @h['participant'] = value
109
+ end
110
+
111
+ if value == nil and @h['participant'] == nil
112
+ #
113
+ # unknown participant or subprocess
114
+
115
+ @h['state'] = 'failed'
116
+ persist_or_raise
117
+
118
+ raise("unknown participant or subprocess '#{tree[1]['ref']}'")
119
+ end
120
+
121
+ new_exp_name, new_exp_class = if new_exp_name
122
+ [ new_exp_name, new_exp_class ]
123
+ elsif @h['participant']
124
+ [ 'participant', Ruote::Exp::ParticipantExpression ]
125
+ else
126
+ [ 'subprocess', Ruote::Exp::SubprocessExpression ]
127
+ end
128
+
129
+ tree[0] = new_exp_name
130
+ @h['name'] = new_exp_name
131
+
132
+ new_exp = new_exp_class.new(@context, @h)
133
+
134
+ do_schedule_timeout(attribute(:timeout)) if new_exp_name == 'subprocess'
135
+ #
136
+ # since ref neutralizes consider_timeout because participant expressions
137
+ # handle timeout by themselves, we have to force timeout consideration
138
+ # for subprocess expressions
139
+
140
+ #new_exp.initial_persist
141
+ # not necessary
142
+
143
+ new_exp.apply
144
+ end
145
+
146
+ def consider_timeout
147
+
148
+ # neutralized
149
+ end
150
+ end
151
+ end
152
+
@@ -0,0 +1,110 @@
1
+ #--
2
+ # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Ruote::Exp
27
+
28
+ #
29
+ # This expressions lets one register participants directly from a process
30
+ # definition.
31
+ #
32
+ # pdef = Ruote.define do
33
+ #
34
+ # registerp 'alpha', :class => 'MyParticipant', :target => 'mail'
35
+ # # register participant named 'alpha' with the given class
36
+ # # and some attributes
37
+ #
38
+ # registerp /^user_.+/, :class => 'MyParticipant'
39
+ # registerp :regex => '^user_.+', :class => 'MyParticipant'
40
+ # # register participant with a given regular expression
41
+ #
42
+ # registerp 'admin', :class => 'MyParticipant', :position => -2
43
+ # # register participant 'admin' as second to last in participant list
44
+ # end
45
+ #
46
+ # Participant info can be given as attributes to the expression (see code
47
+ # above) or via the workitem.
48
+ #
49
+ # pdef = Ruote.define do
50
+ #
51
+ # registerp :participant => 'participant'
52
+ # # participant info is found in the field 'participant'
53
+ #
54
+ # registerp :participants => 'participants'
55
+ # # an array of participant info is found in the field 'participants'
56
+ # end
57
+ #
58
+ # The expression 'unregisterp' can be used to remove participants from the
59
+ # participant list.
60
+ #
61
+ class RegisterpExpression < FlowExpression
62
+
63
+ names :registerp
64
+
65
+ def apply
66
+
67
+ registerp_allowed?
68
+
69
+ if pa = attribute('participant')
70
+
71
+ register_participant(h.applied_workitem['fields'][pa])
72
+
73
+ elsif pas = attribute('participants')
74
+
75
+ h.applied_workitem['fields'][pas].each do |part|
76
+ register_participant(part)
77
+ end
78
+
79
+ else
80
+
81
+ register_participant(attributes)
82
+ end
83
+
84
+ reply_to_parent(h.applied_workitem)
85
+ end
86
+
87
+ def reply(workitem)
88
+
89
+ # never called
90
+ end
91
+
92
+ protected
93
+
94
+ def registerp_allowed?
95
+
96
+ raise ArgumentError.new(
97
+ "'registerp_allowed' is set to false, cannot [un]register " +
98
+ "participants from process definitions"
99
+ ) if context['registerp_allowed'] != true
100
+ end
101
+
102
+ def register_participant(info)
103
+
104
+ name, (klass, opts) = Ruote::ParticipantEntry.read(info)
105
+
106
+ context.engine.register_participant(name, klass, opts)
107
+ end
108
+ end
109
+ end
110
+
@@ -0,0 +1,126 @@
1
+ #--
2
+ # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Ruote::Exp
27
+
28
+ #
29
+ # Prevents two process branches from executing at the same time.
30
+ #
31
+ # pdef = Ruote.process_definition :name => 'test' do
32
+ # concurrence do
33
+ # reserve :mutex => 'a' do
34
+ # alpha
35
+ # end
36
+ # reserve 'a' do
37
+ # alpha
38
+ # end
39
+ # end
40
+ # end
41
+ #
42
+ # (Nice and tiny example, turns a concurrence into a sequence...)
43
+ #
44
+ class ReserveExpression < FlowExpression
45
+
46
+ names :reserve
47
+
48
+ def apply
49
+
50
+ return reply_to_parent(h.applied_workitem) if tree_children.empty?
51
+
52
+ h.mutex_name = attribute(:mutex) || attribute_text
53
+ h.mutex_name = 'reserve' if h.mutex_name.strip == ''
54
+
55
+ raise(
56
+ ArgumentError.new("can't bind reserve mutex at engine level")
57
+ ) if h.mutex_name.match(/^\/\//)
58
+
59
+ set_mutex
60
+ end
61
+
62
+ def reply(workitem)
63
+
64
+ release_mutex
65
+
66
+ reply_to_parent(workitem)
67
+ end
68
+
69
+ def cancel(flavour)
70
+
71
+ super
72
+
73
+ release_mutex
74
+ end
75
+
76
+ def enter
77
+
78
+ apply_child(0, h.applied_workitem)
79
+ end
80
+
81
+ protected
82
+
83
+ def set_mutex
84
+
85
+ target, var = locate_var(h.mutex_name)
86
+
87
+ val = target.variables[var]
88
+
89
+ # [ 'mutex', name, [ fei0, fei1, ... ] ]
90
+
91
+ mutex = val ? val : [ 'mutex', var, [] ]
92
+
93
+ mutex.last << h.fei
94
+
95
+ target.variables[var] = mutex
96
+
97
+ r = target.try_persist
98
+
99
+ return set_mutex if r != nil
100
+
101
+ if mutex.last.first == h.fei
102
+ enter
103
+ else
104
+ persist_or_raise
105
+ end
106
+ end
107
+
108
+ def release_mutex
109
+
110
+ target, var = locate_var(h.mutex_name)
111
+
112
+ mutex = target.variables[var]
113
+
114
+ mutex.last.shift
115
+
116
+ r = target.try_persist
117
+
118
+ return release_mutex if r != nil
119
+
120
+ next_fei = mutex.last.first
121
+
122
+ Ruote::Exp::FlowExpression.fetch(@context, next_fei).enter if next_fei
123
+ end
124
+ end
125
+ end
126
+