ruote 2.2.0 → 2.3.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.
Files changed (305) hide show
  1. data/CHANGELOG.txt +166 -1
  2. data/CREDITS.txt +36 -17
  3. data/LICENSE.txt +1 -1
  4. data/README.rdoc +1 -7
  5. data/Rakefile +38 -29
  6. data/TODO.txt +93 -52
  7. data/lib/ruote-fs.rb +3 -0
  8. data/lib/ruote.rb +5 -1
  9. data/lib/ruote/context.rb +140 -35
  10. data/lib/ruote/dashboard.rb +1247 -0
  11. data/lib/ruote/{engine → dboard}/process_error.rb +22 -2
  12. data/lib/ruote/dboard/process_status.rb +587 -0
  13. data/lib/ruote/engine.rb +6 -871
  14. data/lib/ruote/exp/command.rb +7 -2
  15. data/lib/ruote/exp/commanded.rb +2 -2
  16. data/lib/ruote/exp/condition.rb +38 -13
  17. data/lib/ruote/exp/fe_add_branches.rb +1 -1
  18. data/lib/ruote/exp/fe_apply.rb +1 -1
  19. data/lib/ruote/exp/fe_await.rb +357 -0
  20. data/lib/ruote/exp/fe_cancel_process.rb +17 -3
  21. data/lib/ruote/exp/fe_command.rb +8 -4
  22. data/lib/ruote/exp/fe_concurrence.rb +218 -18
  23. data/lib/ruote/exp/fe_concurrent_iterator.rb +71 -10
  24. data/lib/ruote/exp/fe_cron.rb +3 -10
  25. data/lib/ruote/exp/fe_cursor.rb +14 -4
  26. data/lib/ruote/exp/fe_define.rb +3 -1
  27. data/lib/ruote/exp/fe_echo.rb +1 -1
  28. data/lib/ruote/exp/fe_equals.rb +1 -1
  29. data/lib/ruote/exp/fe_error.rb +1 -1
  30. data/lib/ruote/exp/fe_filter.rb +163 -4
  31. data/lib/ruote/exp/fe_forget.rb +21 -4
  32. data/lib/ruote/exp/fe_given.rb +1 -1
  33. data/lib/ruote/exp/fe_if.rb +1 -1
  34. data/lib/ruote/exp/fe_inc.rb +102 -35
  35. data/lib/ruote/exp/fe_iterator.rb +47 -12
  36. data/lib/ruote/exp/fe_listen.rb +96 -11
  37. data/lib/ruote/exp/fe_lose.rb +31 -4
  38. data/lib/ruote/exp/fe_noop.rb +1 -1
  39. data/lib/ruote/exp/fe_on_error.rb +109 -0
  40. data/lib/ruote/exp/fe_once.rb +10 -19
  41. data/lib/ruote/exp/fe_participant.rb +90 -28
  42. data/lib/ruote/exp/fe_read.rb +69 -0
  43. data/lib/ruote/exp/fe_redo.rb +3 -2
  44. data/lib/ruote/exp/fe_ref.rb +57 -27
  45. data/lib/ruote/exp/fe_registerp.rb +1 -3
  46. data/lib/ruote/exp/fe_reserve.rb +1 -1
  47. data/lib/ruote/exp/fe_restore.rb +6 -6
  48. data/lib/ruote/exp/fe_save.rb +12 -19
  49. data/lib/ruote/exp/fe_sequence.rb +38 -2
  50. data/lib/ruote/exp/fe_set.rb +143 -40
  51. data/lib/ruote/exp/{fe_let.rb → fe_stall.rb} +7 -38
  52. data/lib/ruote/exp/fe_subprocess.rb +8 -2
  53. data/lib/ruote/exp/fe_that.rb +1 -1
  54. data/lib/ruote/exp/fe_undo.rb +40 -4
  55. data/lib/ruote/exp/fe_unregisterp.rb +1 -3
  56. data/lib/ruote/exp/fe_wait.rb +12 -25
  57. data/lib/ruote/exp/{flowexpression.rb → flow_expression.rb} +375 -229
  58. data/lib/ruote/exp/iterator.rb +2 -2
  59. data/lib/ruote/exp/merge.rb +78 -17
  60. data/lib/ruote/exp/ro_attributes.rb +46 -36
  61. data/lib/ruote/exp/ro_filters.rb +34 -8
  62. data/lib/ruote/exp/ro_on_x.rb +431 -0
  63. data/lib/ruote/exp/ro_persist.rb +19 -7
  64. data/lib/ruote/exp/ro_timers.rb +123 -0
  65. data/lib/ruote/exp/ro_variables.rb +90 -29
  66. data/lib/ruote/fei.rb +57 -3
  67. data/lib/ruote/fs.rb +3 -0
  68. data/lib/ruote/id/mnemo_wfid_generator.rb +30 -7
  69. data/lib/ruote/id/wfid_generator.rb +17 -38
  70. data/lib/ruote/log/default_history.rb +23 -9
  71. data/lib/ruote/log/fancy_printing.rb +265 -0
  72. data/lib/ruote/log/storage_history.rb +23 -13
  73. data/lib/ruote/log/wait_logger.rb +224 -17
  74. data/lib/ruote/observer.rb +82 -0
  75. data/lib/ruote/part/block_participant.rb +65 -28
  76. data/lib/ruote/part/code_participant.rb +81 -0
  77. data/lib/ruote/part/engine_participant.rb +7 -2
  78. data/lib/ruote/part/local_participant.rb +221 -21
  79. data/lib/ruote/part/no_op_participant.rb +1 -1
  80. data/lib/ruote/part/null_participant.rb +1 -1
  81. data/lib/ruote/part/participant.rb +50 -0
  82. data/lib/ruote/part/rev_participant.rb +178 -0
  83. data/lib/ruote/part/smtp_participant.rb +2 -2
  84. data/lib/ruote/part/storage_participant.rb +228 -60
  85. data/lib/ruote/part/template.rb +1 -1
  86. data/lib/ruote/participant.rb +2 -0
  87. data/lib/ruote/reader.rb +205 -68
  88. data/lib/ruote/reader/json.rb +49 -0
  89. data/lib/ruote/reader/radial.rb +303 -0
  90. data/lib/ruote/reader/ruby_dsl.rb +44 -9
  91. data/lib/ruote/reader/xml.rb +11 -8
  92. data/lib/ruote/receiver/base.rb +98 -45
  93. data/lib/ruote/storage/base.rb +104 -35
  94. data/lib/ruote/storage/composite_storage.rb +50 -60
  95. data/lib/ruote/storage/fs_storage.rb +25 -34
  96. data/lib/ruote/storage/hash_storage.rb +38 -36
  97. data/lib/ruote/svc/dispatch_pool.rb +104 -35
  98. data/lib/ruote/svc/dollar_sub.rb +10 -8
  99. data/lib/ruote/svc/error_handler.rb +108 -52
  100. data/lib/ruote/svc/expression_map.rb +3 -3
  101. data/lib/ruote/svc/participant_list.rb +160 -55
  102. data/lib/ruote/svc/tracker.rb +31 -31
  103. data/lib/ruote/svc/treechecker.rb +28 -16
  104. data/lib/ruote/tree_dot.rb +1 -1
  105. data/lib/ruote/util/deep.rb +143 -0
  106. data/lib/ruote/util/filter.rb +125 -18
  107. data/lib/ruote/util/hashdot.rb +15 -13
  108. data/lib/ruote/util/look.rb +1 -1
  109. data/lib/ruote/util/lookup.rb +60 -22
  110. data/lib/ruote/util/misc.rb +63 -18
  111. data/lib/ruote/util/mpatch.rb +53 -0
  112. data/lib/ruote/util/ometa.rb +1 -2
  113. data/lib/ruote/util/process_observer.rb +177 -0
  114. data/lib/ruote/util/subprocess.rb +1 -1
  115. data/lib/ruote/util/time.rb +2 -2
  116. data/lib/ruote/util/tree.rb +64 -2
  117. data/lib/ruote/version.rb +3 -2
  118. data/lib/ruote/worker.rb +421 -92
  119. data/lib/ruote/workitem.rb +157 -22
  120. data/ruote.gemspec +15 -9
  121. data/test/bm/ci.rb +0 -2
  122. data/test/bm/ici.rb +0 -2
  123. data/test/bm/load_26c.rb +0 -3
  124. data/test/bm/mega.rb +0 -2
  125. data/test/functional/base.rb +57 -43
  126. data/test/functional/concurrent_base.rb +16 -13
  127. data/test/functional/ct_0_concurrence.rb +7 -11
  128. data/test/functional/ct_1_iterator.rb +9 -11
  129. data/test/functional/ct_2_cancel.rb +28 -17
  130. data/test/functional/eft_0_flow_expression.rb +35 -0
  131. data/test/functional/eft_10_cancel_process.rb +1 -1
  132. data/test/functional/eft_11_wait.rb +13 -13
  133. data/test/functional/eft_12_listen.rb +199 -66
  134. data/test/functional/eft_13_iterator.rb +95 -29
  135. data/test/functional/eft_14_cursor.rb +74 -24
  136. data/test/functional/eft_15_loop.rb +7 -7
  137. data/test/functional/eft_16_if.rb +1 -1
  138. data/test/functional/eft_17_equals.rb +1 -1
  139. data/test/functional/eft_18_concurrent_iterator.rb +156 -68
  140. data/test/functional/eft_19_reserve.rb +15 -15
  141. data/test/functional/eft_1_echo.rb +1 -1
  142. data/test/functional/eft_20_save.rb +51 -9
  143. data/test/functional/eft_21_restore.rb +1 -1
  144. data/test/functional/eft_22_noop.rb +1 -1
  145. data/test/functional/eft_23_apply.rb +1 -1
  146. data/test/functional/eft_24_add_branches.rb +7 -8
  147. data/test/functional/eft_25_command.rb +1 -1
  148. data/test/functional/eft_26_error.rb +11 -11
  149. data/test/functional/eft_27_inc.rb +111 -67
  150. data/test/functional/eft_28_once.rb +16 -16
  151. data/test/functional/eft_29_cron.rb +9 -9
  152. data/test/functional/eft_2_sequence.rb +23 -4
  153. data/test/functional/eft_30_ref.rb +36 -24
  154. data/test/functional/eft_31_registerp.rb +24 -24
  155. data/test/functional/eft_32_lose.rb +46 -20
  156. data/test/functional/eft_34_given.rb +1 -1
  157. data/test/functional/eft_35_filter.rb +161 -7
  158. data/test/functional/eft_36_read.rb +97 -0
  159. data/test/functional/{eft_0_process_definition.rb → eft_37_process_definition.rb} +4 -4
  160. data/test/functional/eft_38_on_error.rb +195 -0
  161. data/test/functional/eft_39_stall.rb +35 -0
  162. data/test/functional/eft_3_participant.rb +77 -22
  163. data/test/functional/eft_40_await.rb +297 -0
  164. data/test/functional/eft_4_set.rb +110 -11
  165. data/test/functional/eft_5_subprocess.rb +27 -5
  166. data/test/functional/eft_6_concurrence.rb +299 -60
  167. data/test/functional/eft_7_forget.rb +24 -22
  168. data/test/functional/eft_8_undo.rb +52 -15
  169. data/test/functional/eft_9_redo.rb +18 -20
  170. data/test/functional/ft_0_worker.rb +122 -13
  171. data/test/functional/ft_10_dollar.rb +77 -16
  172. data/test/functional/ft_11_recursion.rb +9 -9
  173. data/test/functional/ft_12_launchitem.rb +7 -9
  174. data/test/functional/ft_13_variables.rb +125 -22
  175. data/test/functional/ft_14_re_apply.rb +112 -56
  176. data/test/functional/ft_15_timeout.rb +64 -33
  177. data/test/functional/ft_16_participant_params.rb +59 -6
  178. data/test/functional/ft_17_conditional.rb +68 -2
  179. data/test/functional/ft_18_kill.rb +48 -30
  180. data/test/functional/ft_19_participant_code.rb +67 -0
  181. data/test/functional/ft_1_process_status.rb +222 -150
  182. data/test/functional/ft_20_storage_participant.rb +445 -44
  183. data/test/functional/ft_21_forget.rb +21 -26
  184. data/test/functional/ft_22_process_definitions.rb +8 -6
  185. data/test/functional/ft_23_load_defs.rb +29 -5
  186. data/test/functional/ft_24_block_participant.rb +199 -20
  187. data/test/functional/ft_25_receiver.rb +98 -46
  188. data/test/functional/ft_26_participant_rtimeout.rb +34 -26
  189. data/test/functional/ft_27_var_indirection.rb +40 -5
  190. data/test/functional/ft_28_null_noop_participants.rb +5 -5
  191. data/test/functional/ft_29_part_template.rb +2 -2
  192. data/test/functional/ft_2_errors.rb +106 -74
  193. data/test/functional/ft_30_smtp_participant.rb +7 -7
  194. data/test/functional/ft_31_part_blocking.rb +11 -11
  195. data/test/functional/ft_32_scope.rb +50 -0
  196. data/test/functional/ft_33_participant_subprocess_priority.rb +3 -3
  197. data/test/functional/ft_34_cursor_rewind.rb +14 -14
  198. data/test/functional/ft_35_add_service.rb +67 -9
  199. data/test/functional/ft_36_storage_history.rb +92 -24
  200. data/test/functional/ft_37_default_history.rb +35 -23
  201. data/test/functional/ft_38_participant_more.rb +189 -32
  202. data/test/functional/ft_39_wait_for.rb +25 -25
  203. data/test/functional/ft_3_participant_registration.rb +235 -107
  204. data/test/functional/ft_40_wait_logger.rb +105 -18
  205. data/test/functional/ft_41_participants.rb +13 -12
  206. data/test/functional/ft_42_storage_copy.rb +12 -12
  207. data/test/functional/ft_43_participant_on_reply.rb +85 -11
  208. data/test/functional/ft_44_var_participant.rb +5 -5
  209. data/test/functional/ft_45_participant_accept.rb +3 -3
  210. data/test/functional/ft_46_launch_single.rb +17 -17
  211. data/test/functional/ft_47_wfids.rb +41 -0
  212. data/test/functional/ft_48_lose.rb +19 -25
  213. data/test/functional/ft_49_engine_on_error.rb +54 -70
  214. data/test/functional/ft_4_cancel.rb +84 -26
  215. data/test/functional/ft_50_engine_config.rb +4 -4
  216. data/test/functional/ft_51_misc.rb +12 -12
  217. data/test/functional/ft_52_case.rb +17 -17
  218. data/test/functional/ft_53_engine_on_terminate.rb +18 -21
  219. data/test/functional/ft_54_patterns.rb +18 -16
  220. data/test/functional/ft_55_engine_participant.rb +55 -55
  221. data/test/functional/ft_56_filter_attribute.rb +90 -52
  222. data/test/functional/ft_57_rev_participant.rb +252 -0
  223. data/test/functional/ft_58_workitem.rb +150 -0
  224. data/test/functional/ft_59_pause.rb +329 -0
  225. data/test/functional/ft_5_on_error.rb +430 -77
  226. data/test/functional/ft_60_code_participant.rb +65 -0
  227. data/test/functional/ft_61_trailing_fields.rb +34 -0
  228. data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
  229. data/test/functional/ft_63_participants_221.rb +458 -0
  230. data/test/functional/ft_64_stash.rb +41 -0
  231. data/test/functional/ft_65_timers.rb +313 -0
  232. data/test/functional/ft_66_flank.rb +133 -0
  233. data/test/functional/ft_67_radial_misc.rb +34 -0
  234. data/test/functional/ft_68_reput.rb +72 -0
  235. data/test/functional/ft_69_worker_info.rb +56 -0
  236. data/test/functional/ft_6_on_cancel.rb +189 -36
  237. data/test/functional/ft_70_take_and_discard_attributes.rb +94 -0
  238. data/test/functional/ft_71_retries.rb +144 -0
  239. data/test/functional/ft_72_on_terminate.rb +60 -0
  240. data/test/functional/ft_73_raise_msg.rb +107 -0
  241. data/test/functional/ft_74_respark.rb +106 -0
  242. data/test/functional/ft_75_context.rb +66 -0
  243. data/test/functional/ft_76_observer.rb +53 -0
  244. data/test/functional/ft_77_process_observer.rb +157 -0
  245. data/test/functional/ft_78_part_participant.rb +37 -0
  246. data/test/functional/ft_7_tags.rb +238 -50
  247. data/test/functional/ft_8_participant_consumption.rb +27 -21
  248. data/test/functional/ft_9_subprocesses.rb +48 -18
  249. data/test/functional/restart_base.rb +4 -6
  250. data/test/functional/rt_0_wait.rb +10 -10
  251. data/test/functional/rt_1_listen.rb +6 -6
  252. data/test/functional/rt_2_errors.rb +12 -12
  253. data/test/functional/rt_3_once.rb +17 -12
  254. data/test/functional/rt_4_cron.rb +17 -17
  255. data/test/functional/rt_5_timeout.rb +13 -13
  256. data/test/functional/signals.rb +103 -0
  257. data/test/functional/storage.rb +730 -0
  258. data/test/functional/storage_helper.rb +48 -35
  259. data/test/functional/test.rb +6 -2
  260. data/test/misc/idle.rb +21 -0
  261. data/test/misc/light.rb +29 -0
  262. data/test/path_helper.rb +1 -1
  263. data/test/test.rb +2 -5
  264. data/test/test_helper.rb +13 -0
  265. data/test/unit/test.rb +1 -4
  266. data/test/unit/ut_0_ruby_reader.rb +25 -9
  267. data/test/unit/ut_10_participants.rb +47 -0
  268. data/test/unit/ut_11_lookup.rb +59 -2
  269. data/test/unit/ut_12_wait_logger.rb +123 -0
  270. data/test/unit/ut_14_is_uri.rb +1 -1
  271. data/test/unit/ut_15_util.rb +1 -1
  272. data/test/unit/ut_16_reader.rb +136 -14
  273. data/test/unit/ut_17_merge.rb +155 -0
  274. data/test/unit/ut_19_part_template.rb +1 -1
  275. data/test/unit/ut_1_fei.rb +11 -2
  276. data/test/unit/ut_20_composite_storage.rb +27 -1
  277. data/test/unit/{ut_21_participant_list.rb → ut_21_svc_participant_list.rb} +2 -3
  278. data/test/unit/ut_22_filter.rb +231 -10
  279. data/test/unit/ut_23_svc_tracker.rb +48 -0
  280. data/test/unit/ut_24_radial_reader.rb +458 -0
  281. data/test/unit/ut_25_process_status.rb +143 -0
  282. data/test/unit/ut_26_deep.rb +131 -0
  283. data/test/unit/ut_2_dashboard.rb +114 -0
  284. data/test/unit/ut_3_worker.rb +54 -0
  285. data/test/unit/ut_4_expmap.rb +1 -1
  286. data/test/unit/ut_5_tree.rb +23 -23
  287. data/test/unit/ut_6_condition.rb +71 -29
  288. data/test/unit/ut_7_workitem.rb +18 -4
  289. data/test/unit/ut_8_tree_to_dot.rb +1 -1
  290. data/test/unit/ut_9_xml_reader.rb +1 -1
  291. metadata +142 -63
  292. data/jruby_issue.txt +0 -32
  293. data/lib/ruote/engine/process_status.rb +0 -403
  294. data/lib/ruote/log/pretty.rb +0 -165
  295. data/lib/ruote/log/test_logger.rb +0 -204
  296. data/lib/ruote/util/serializer.rb +0 -103
  297. data/phil.txt +0 -14
  298. data/test/functional/eft_33_let.rb +0 -31
  299. data/test/functional/ft_19_alias.rb +0 -33
  300. data/test/functional/ft_47_wfid_generator.rb +0 -54
  301. data/test/unit/storage.rb +0 -403
  302. data/test/unit/storages.rb +0 -37
  303. data/test/unit/ut_13_serializer.rb +0 -65
  304. data/test/unit/ut_18_engine.rb +0 -47
  305. data/test/unit/ut_3_wait_logger.rb +0 -39
@@ -0,0 +1,81 @@
1
+ #--
2
+ # Copyright (c) 2005-2012, 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
27
+
28
+ #
29
+ # TODO
30
+ #
31
+ class CodeParticipant
32
+
33
+ include LocalParticipant
34
+
35
+ attr_accessor :context
36
+
37
+ def initialize(opts)
38
+
39
+ @opts = opts
40
+ end
41
+
42
+ def context=(con)
43
+
44
+ @context = con
45
+
46
+ @context.treechecker.code_check(@opts['code'])
47
+
48
+ instance_eval(@opts['code'])
49
+
50
+ #instance_eval do
51
+ # alias code_consume consume
52
+ # def consume(workitem)
53
+ # code_consume(workitem)
54
+ # rescue => e
55
+ # raise e
56
+ # end
57
+ # # what about doing that with other methods
58
+ #end
59
+ end
60
+
61
+ protected
62
+
63
+ # def get_block(*keys)
64
+ #
65
+ # key = keys.find { |k| @opts[k] }
66
+ #
67
+ # return nil unless key
68
+ #
69
+ # block = @opts[key]
70
+ #
71
+ # @context.treechecker.block_check(block)
72
+ # # raises in case of 'security' violation
73
+ #
74
+ # #eval(block, @context.send(:binding))
75
+ # # doesn't work with ruby 1.9.2-p136
76
+ # eval(block, @context.instance_eval { binding })
77
+ # # works OK with ruby 1.8.7-249 and 1.9.2-p136
78
+ # end
79
+ end
80
+ end
81
+
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, 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
@@ -115,7 +115,12 @@ module Ruote
115
115
 
116
116
  raise(ArgumentError.new("missing 'storage_class' parameter")) unless kl
117
117
 
118
- @storage = Ruote.constantize(kl).new(opts['storage_args'])
118
+ args = opts['storage_args']
119
+ args = args.is_a?(Hash) ? [ args ] : Array(args)
120
+ args << {} unless args.last.is_a?(Hash)
121
+ args.last['preserve_configuration'] = true
122
+
123
+ @storage = Ruote.constantize(kl).new(*args)
119
124
  end
120
125
 
121
126
  def consume(workitem)
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, 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
@@ -23,6 +23,7 @@
23
23
  #++
24
24
 
25
25
  require 'ruote/receiver/base'
26
+ require 'ruote/svc/dispatch_pool'
26
27
 
27
28
 
28
29
  module Ruote
@@ -38,10 +39,103 @@ module Ruote
38
39
  module LocalParticipant
39
40
 
40
41
  include ReceiverMixin
41
- # the reply_to_engine method is there
42
42
 
43
+ # The engine context, it's a local participant so it knows about the
44
+ # context in which the engine operates...
45
+ #
43
46
  attr_accessor :context
44
47
 
48
+ # Usually set right before a call to #on_workitem or #accept?
49
+ #
50
+ attr_writer :workitem
51
+
52
+ # Usually set right before a call to #on_cancel or #cancel
53
+ #
54
+ attr_writer :fei
55
+
56
+ # Usually set right before a call to #on_cancel or #cancel
57
+ #
58
+ attr_accessor :flavour
59
+
60
+ # Returns the current workitem if no fei is given.
61
+ # If a fei is given, it will return the applied workitem for that fei
62
+ # (if any).
63
+ #
64
+ # The optional fei is mostly here for backward compatibility (with 2.2.0)
65
+ #
66
+ def workitem(fei=nil)
67
+
68
+ return fetch_workitem(fei) if fei
69
+
70
+ @workitem ? @workitem : applied_workitem
71
+ end
72
+
73
+ # Returns the current fei (Ruote::FlowExpressionId).
74
+ #
75
+ def fei
76
+
77
+ @fei ? @fei : @workitem.fei
78
+ end
79
+
80
+ # Returns the Ruote::ParticipantExpression that corresponds with this
81
+ # participant.
82
+ #
83
+ # If a wi_or_fei arg is given, will return the corresponding
84
+ # flow expression. This arg is mostly here for backward compatibility.
85
+ #
86
+ def fexp(wi_or_fei=nil)
87
+
88
+ flow_expression(wi_or_fei || fei)
89
+ end
90
+
91
+ # Returns the workitem as was applied when the Ruote::ParticipantExpression
92
+ # was reached.
93
+ #
94
+ # If the _fei arg is specified, it will return the corresponding applied
95
+ # workitem. This args is mostly here for backward compatibility.
96
+ #
97
+ def applied_workitem(_fei=nil)
98
+
99
+ fetch_workitem(_fei || fei)
100
+ end
101
+
102
+ # Up until ruote 2.3.0, the participant name had to be fetched from the
103
+ # workitem. This is a shortcut, it lets you write participant code
104
+ # that look like
105
+ #
106
+ # def on_workitem
107
+ # (workitem.fields['supervisors'] || []) << participant_name
108
+ # reply
109
+ # end
110
+ #
111
+ def participant_name
112
+
113
+ workitem.participant_name
114
+ end
115
+
116
+ # A shortcut for
117
+ #
118
+ # fexp.lookup_variable(key)
119
+ #
120
+ def lookup_variable(key)
121
+
122
+ fexp.lookup_variable(key)
123
+ end
124
+
125
+ # Participant implementations call this method when their #on_workitem
126
+ # (#consume) methods are done and they want to hand back the workitem
127
+ # to the engine so that the flow can resume.
128
+ #
129
+ # the (wi=workitem) is mostly for backward compatibility (or for passing a
130
+ # totally different workitem to the engine).
131
+ #
132
+ def reply_to_engine(wi=workitem)
133
+
134
+ receive(wi)
135
+ end
136
+
137
+ alias reply reply_to_engine
138
+
45
139
  # Use this method to re_dispatch the workitem.
46
140
  #
47
141
  # It takes two options :in and :at for "later re_dispatch".
@@ -51,23 +145,28 @@ module Ruote
51
145
  #
52
146
  # Without one of those options, the method is a "reject".
53
147
  #
54
- def re_dispatch(workitem, opts={})
148
+ def re_dispatch(wi=nil, opts=nil)
149
+
150
+ wi, opts = [ nil, wi ] if wi.is_a?(Hash) && opts.nil?
151
+ wi ||= workitem()
152
+ opts ||= {}
153
+
154
+ wi.h['re_dispatch_count'] = wi.h['re_dispatch_count'].to_s.to_i + 1
55
155
 
56
156
  msg = {
57
157
  'action' => 'dispatch',
58
- 'fei' => workitem.h.fei,
59
- 'workitem' => workitem.h,
60
- 'participant_name' => workitem.participant_name,
61
- 'rejected' => true
158
+ 'fei' => wi.h.fei,
159
+ 'workitem' => wi.h,
160
+ 'participant_name' => wi.participant_name
62
161
  }
63
162
 
64
163
  if t = opts[:in] || opts[:at]
65
164
 
66
- sched_id = @context.storage.put_schedule('at', workitem.h.fei, t, msg)
165
+ sched_id = @context.storage.put_schedule('at', wi.h.fei, t, msg)
67
166
 
68
- fexp = fetch_flow_expression(workitem)
69
- fexp.h['re_dispatch_sched_id'] = sched_id
70
- fexp.try_persist
167
+ exp = fexp(wi)
168
+ exp.h['re_dispatch_sched_id'] = sched_id
169
+ exp.try_persist
71
170
 
72
171
  else
73
172
 
@@ -77,7 +176,7 @@ module Ruote
77
176
 
78
177
  # Cancels the scheduled re_dispatch, if any.
79
178
  #
80
- # An example or 'retrying participant' :
179
+ # An example of 'retrying participant' :
81
180
  #
82
181
  # class RetryParticipant
83
182
  # include Ruote::LocalParticipant
@@ -86,27 +185,24 @@ module Ruote
86
185
  # @opts = opts
87
186
  # end
88
187
  #
89
- # def consume(workitem)
188
+ # def on_workitem
90
189
  # begin
91
190
  # do_the_job
92
- # reply(workitem)
191
+ # reply
93
192
  # rescue
94
- # re_dispatch(workitem, :in => @opts['delay'] || '1s')
193
+ # re_dispatch(:in => @opts['delay'] || '1s')
95
194
  # end
96
195
  # end
97
196
  #
98
- # def cancel(fei, flavour)
99
- # unschedule_re_dispatch(fei)
197
+ # def cancel
198
+ # unschedule_re_dispatch
100
199
  # end
101
200
  # end
102
201
  #
103
202
  # Note how unschedule_re_dispatch is used in the cancel method. Warning,
104
203
  # this example could loop forever...
105
204
  #
106
- def unschedule_re_dispatch(fei)
107
-
108
- fexp = Ruote::Exp::FlowExpression.fetch(
109
- @context, Ruote::FlowExpressionId.extract_h(fei))
205
+ def unschedule_re_dispatch(fei=nil)
110
206
 
111
207
  if s = fexp.h['re_dispatch_sched_id']
112
208
  @context.storage.delete_schedule(s)
@@ -133,6 +229,110 @@ module Ruote
133
229
  # Well, here it is, use with care.
134
230
  #
135
231
  alias :reject :re_dispatch
232
+
233
+ #--
234
+ # test methods
235
+ # prefixed with an underscore
236
+ #++
237
+
238
+ # Test shortcut, alleviates the need to set the workitem before calling
239
+ # consume / on_workitem.
240
+ #
241
+ def _on_workitem(wi)
242
+ Ruote.participant_send(
243
+ self, [ :on_workitem, :consume ], 'workitem' => wi)
244
+ end
245
+ alias _consume _on_workitem
246
+
247
+ # Test shortcut, alleviates the need to set fei and flavour before calling
248
+ # cancel / on_consume.
249
+ #
250
+ def _on_cancel(fei, flavour)
251
+ Ruote.participant_send(
252
+ self, [ :on_cancel, :cancel ], 'fei' => fei, 'flavour' => flavour)
253
+ end
254
+ alias _cancel _on_cancel
255
+
256
+ # Test shortcut, alleviates the need to set the workitem before calling
257
+ # on_reply.
258
+ #
259
+ def _on_reply(wi)
260
+ Ruote.participant_send(self, :on_reply, 'workitem' => wi)
261
+ end
262
+
263
+ # Test shortcut, alleviates the need to set the workitem before calling
264
+ # accept?
265
+ #
266
+ def _accept?(wi)
267
+ Ruote.participant_send(self, :accept?, 'workitem' => wi)
268
+ end
269
+
270
+ # Test shortcut, alleviates the need to set the workitem before calling
271
+ # dont_thread?, do_not_thread? or do_not_thread.
272
+ #
273
+ def _dont_thread?(wi)
274
+ Ruote.participant_send(
275
+ self,
276
+ [ :dont_thread?, :do_not_thread?, :do_not_thread ],
277
+ 'workitem' => wi)
278
+ end
279
+ alias _do_not_thread _dont_thread?
280
+ alias _do_not_thread? _dont_thread?
281
+
282
+ # Test shortcut, alleviates the need to set the workitem before calling
283
+ # rtimeout.
284
+ #
285
+ def _rtimeout(wi)
286
+ Ruote.participant_send(self, :rtimeout, 'workitem' => wi)
287
+ end
288
+
289
+ # Returns true if the underlying participant expression is 'gone' (probably
290
+ # cancelled somehow).
291
+ #
292
+ def is_gone?
293
+
294
+ fexp.nil?
295
+ end
296
+
297
+ # Returns true if the underlying participant expression is gone or
298
+ # cancelling.
299
+ #
300
+ def is_cancelled?
301
+
302
+ if fe = fexp
303
+ return fe.h.state == 'cancelling'
304
+ else
305
+ true
306
+ end
307
+ end
308
+
309
+ alias is_canceled? is_cancelled?
310
+
311
+ protected
312
+
313
+ # Receivers and local participants share the #stash_put and #stash_get
314
+ # methods. The local participant has #put and #get which don't need
315
+ # an initial fei, thus #get and #put deal with the participant
316
+ # expression directly, whereas stash_put and stash_get can point at
317
+ # any expression.
318
+ #
319
+ # 'put' can be called as
320
+ #
321
+ # put('secret' => 'message', 'to' => 'embassy')
322
+ # # or
323
+ # put('secret', 'message')
324
+ #
325
+ def put(key, value=nil)
326
+
327
+ stash_put(fei, key, value)
328
+ end
329
+
330
+ # See #put
331
+ #
332
+ def get(key=nil)
333
+
334
+ stash_get(fei, key)
335
+ end
136
336
  end
137
337
  end
138
338
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, 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
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, 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
@@ -0,0 +1,50 @@
1
+ #--
2
+ # Copyright (c) 2005-2012, 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/part/local_participant'
26
+
27
+
28
+ module Ruote
29
+
30
+ # A simple stub class for participants.
31
+ #
32
+ # Used mostly as in:
33
+ #
34
+ # class MyParticipant < Ruote::Participant
35
+ #
36
+ # def on_workitem
37
+ # workitem.fields['tag'] = 'kilroy was here'
38
+ # end
39
+ # end
40
+ #
41
+ class Participant
42
+ include LocalParticipant
43
+
44
+ # Empty default implementation.
45
+ #
46
+ def on_cancel
47
+ end
48
+ end
49
+ end
50
+