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
@@ -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
@@ -149,7 +149,6 @@ module Ruote::Exp
149
149
 
150
150
  h.frequency = attribute(:frequency) || attribute(:freq) || '10s'
151
151
  h.triggered = false
152
- h.job_id = nil
153
152
 
154
153
  reply(h.applied_workitem)
155
154
  end
@@ -164,37 +163,29 @@ module Ruote::Exp
164
163
 
165
164
  h.triggered = true
166
165
 
167
- @context.storage.delete_schedule(h.job_id)
166
+ @context.storage.delete_schedule(h.schedule_id)
168
167
  # especially for a cron...
169
168
 
170
- if tree_children[0]
171
- #
172
- # trigger first child
173
- #
169
+ if tree_children[0] # trigger first child
170
+
174
171
  apply_child(0, workitem)
175
- else
176
- #
177
- # blocking case
178
- #
172
+
173
+ else # blocking case
174
+
179
175
  reply_to_parent(workitem)
180
176
  end
177
+
181
178
  else
182
179
 
183
180
  reschedule
184
181
  end
185
182
  end
186
183
 
187
- def cancel(flavour)
188
-
189
- @context.storage.delete_schedule(h.job_id)
190
- super
191
- end
192
-
193
184
  protected
194
185
 
195
186
  def reschedule
196
187
 
197
- h.job_id = @context.storage.put_schedule(
188
+ h.schedule_id = @context.storage.put_schedule(
198
189
  'cron',
199
190
  h.fei,
200
191
  h.frequency,
@@ -202,7 +193,7 @@ module Ruote::Exp
202
193
  'fei' => h.fei,
203
194
  'workitem' => h.applied_workitem)
204
195
 
205
- @context.storage.delete_schedule(h.job_id) if try_persist
196
+ @context.storage.delete_schedule(h.schedule_id) if try_persist
206
197
  #
207
198
  # if the persist failed, immediately unschedule
208
199
  # the just scheduled job
@@ -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
@@ -117,7 +117,7 @@ module Ruote::Exp
117
117
 
118
118
  names :participant
119
119
 
120
- # Should return true when the dispatch was successful.
120
+ # Should yield true when the dispatch was successful.
121
121
  #
122
122
  h_reader :dispatched
123
123
 
@@ -131,32 +131,44 @@ module Ruote::Exp
131
131
  h.participant_name = (attribute(:ref) || attribute_text).to_s
132
132
 
133
133
  raise ArgumentError.new(
134
- "no participant name specified"
134
+ 'no participant name specified'
135
135
  ) if h.participant_name == ''
136
136
 
137
- participant_info =
138
- h.participant ||
137
+ h.participant ||=
139
138
  @context.plist.lookup_info(h.participant_name, h.applied_workitem)
140
139
 
141
- unless participant_info.respond_to?(:consume)
142
- h.participant = participant_info
143
- end
144
-
145
140
  raise(ArgumentError.new(
146
141
  "no participant named #{h.participant_name.inspect}")
147
- ) if participant_info.nil?
142
+ ) if h.participant.nil?
148
143
 
149
144
  #
150
- # participant found, consider timeout
145
+ # trigger on_apply if the participant sports it
151
146
 
152
- schedule_timeout(participant_info)
147
+ pa = @context.plist.instantiate(
148
+ h.participant, :if_respond_to? => :on_apply)
149
+
150
+ Ruote.participant_send(
151
+ pa, :on_apply, 'workitem' => Ruote::Workitem.new(h.applied_workitem)
152
+ ) if pa
153
153
 
154
154
  #
155
155
  # dispatch to participant
156
156
 
157
157
  h.applied_workitem['participant_name'] = h.participant_name
158
+
158
159
  h.applied_workitem['fields']['params'] = compile_atts
159
160
 
161
+ h.applied_workitem['fields'].delete('t')
162
+ h.applied_workitem['fields'].delete('__result__')
163
+
164
+ h.applied_workitem['re_dispatch_count'] = 0
165
+
166
+ if tree.last.any?
167
+ h.applied_workitem['fields']['params']['__children__'] = dsub(tree.last)
168
+ end
169
+
170
+ consider_participant_timers(h.participant)
171
+
160
172
  persist_or_raise
161
173
 
162
174
  @context.storage.put_msg(
@@ -169,6 +181,8 @@ module Ruote::Exp
169
181
 
170
182
  def cancel(flavour)
171
183
 
184
+ cancel_flanks(flavour)
185
+
172
186
  return reply_to_parent(h.applied_workitem) unless h.participant_name
173
187
  # no participant, reply immediately
174
188
 
@@ -194,7 +208,9 @@ module Ruote::Exp
194
208
 
195
209
  pa = @context.plist.instantiate(pinfo, :if_respond_to? => :on_reply)
196
210
 
197
- pa.on_reply(Ruote::Workitem.new(workitem)) if pa
211
+ Ruote.participant_send(
212
+ pa, :on_reply, 'workitem' => Ruote::Workitem.new(workitem)
213
+ ) if pa
198
214
 
199
215
  super(workitem)
200
216
  end
@@ -222,32 +238,78 @@ module Ruote::Exp
222
238
  # let's not care if it fails...
223
239
  end
224
240
 
225
- # Overriden with an empty behaviour. The work is now done a bit later
226
- # via the #schedule_timeout method.
227
- #
228
- def consider_timeout
229
- end
230
-
231
241
  # Determines and schedules timeout if any.
232
242
  #
233
243
  # Note that process definition timeout has priority over participant
234
244
  # specified timeout.
235
245
  #
236
- def schedule_timeout(p_info)
246
+ def consider_participant_timers(p_info)
247
+
248
+ return if h.has_timers
249
+ # process definition takes precedence over participant defined timers.
250
+
251
+ timers = nil
252
+
253
+ [ :rtimers, :timers, :rtimeout ].each do |meth|
254
+
255
+ pa = @context.plist.instantiate(p_info, :if_respond_to? => meth)
256
+
257
+ next unless pa
237
258
 
238
- timeout = attribute(:timeout)
259
+ timers = Ruote.participant_send(
260
+ pa, meth, 'workitem' => Ruote::Workitem.new(h.applied_workitem))
239
261
 
240
- unless timeout
262
+ break if timers
263
+ end
241
264
 
242
- pa = @context.plist.instantiate(p_info, :if_respond_to? => :rtimeout)
265
+ return unless timers
243
266
 
244
- timeout = (pa.method(:rtimeout).arity == 0 ?
245
- pa.rtimeout :
246
- pa.rtimeout(Ruote::Workitem.new(h.applied_workitem))
247
- ) if pa
267
+ timers = if timers.index(':')
268
+ timers.split(/,/)
269
+ else
270
+ [ "#{timers}: timeout" ]
248
271
  end
249
272
 
250
- do_schedule_timeout(timeout)
273
+ schedule_timers(timers)
274
+ end
275
+
276
+ def do_pause(msg)
277
+
278
+ return if h.state != nil
279
+
280
+ h['state'] = 'paused'
281
+ h['breakpoint'] = true if msg['breakpoint']
282
+
283
+ do_persist || return
284
+
285
+ @context.storage.put_msg(
286
+ 'dispatch_pause',
287
+ 'fei' => h.fei,
288
+ 'participant_name' => h.participant_name,
289
+ 'participant' => h.participant
290
+ ) unless msg['breakpoint']
291
+ end
292
+
293
+ def do_resume(msg)
294
+
295
+ return if h.state != 'paused'
296
+
297
+ h['state'] = nil
298
+ replies = h.delete('paused_replies') || []
299
+
300
+ do_persist || return
301
+
302
+ if replies.empty?
303
+ @context.storage.put_msg(
304
+ 'dispatch_resume',
305
+ 'fei' => h.fei,
306
+ 'participant_name' => h.participant_name,
307
+ 'participant' => h.participant
308
+ ) unless h['breakpoint']
309
+ else
310
+ replies.each { |m| @context.storage.put_msg(m.delete('action'), m) }
311
+ # trigger replies
312
+ end
251
313
  end
252
314
  end
253
315
  end
@@ -0,0 +1,69 @@
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::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
+
@@ -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
@@ -63,7 +63,8 @@ module Ruote::Exp
63
63
 
64
64
  if tag && Ruote.is_a_fei?(tag)
65
65
 
66
- @context.storage.put_msg('cancel', 'fei' => tag, 're_apply' => true)
66
+ @context.storage.put_msg(
67
+ 'cancel', 'fei' => tag, 're_apply' => { 'workitem' => 'applied' })
67
68
 
68
69
  reply_to_parent(h.applied_workitem) unless ancestor?(tag)
69
70
 
@@ -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
@@ -42,7 +42,7 @@ module Ruote::Exp
42
42
  #
43
43
  # Subprocesses have the priority over participants.
44
44
  #
45
- # Note : this expression is used by the worker when substituting unknown
45
+ # Note: this expression is used by the worker when substituting unknown
46
46
  # expression names with participant or subprocess refs.
47
47
  #
48
48
  class RefExpression < FlowExpression
@@ -58,6 +58,9 @@ module Ruote::Exp
58
58
  tree[1]['ref'] = key
59
59
  end
60
60
 
61
+ key = dsub(key)
62
+ # see test/functional/ft_62_
63
+
61
64
  key2, value = iterative_var_lookup(key)
62
65
 
63
66
  tree[1]['ref'] = key2 if key2
@@ -65,7 +68,7 @@ module Ruote::Exp
65
68
 
66
69
  unless value
67
70
  #
68
- # seems like it's participant
71
+ # seems like it's a participant
69
72
 
70
73
  @h['participant'] =
71
74
  @context.plist.lookup_info(tree[1]['ref'], h.applied_workitem)
@@ -73,14 +76,54 @@ module Ruote::Exp
73
76
  value = key2 if ( ! @h['participant']) && (key2 != key)
74
77
  end
75
78
 
76
- if value.is_a?(Array) && value.size == 2 && value.last.is_a?(Hash)
79
+ new_exp_name, new_exp_class = nil
80
+
81
+ # warning: abusing on 'then' in order to have [somehow] more readability
82
+
83
+ if
84
+ value.is_a?(String)
85
+ then
86
+
87
+ if
88
+ @context['participant_in_variable_enabled'] &&
89
+ value.match(/\bdef consume\(/) &&
90
+ (Rufus::TreeChecker.parse(value) rescue false)
91
+ then
92
+ #
93
+ # participant code passed
94
+
95
+ @h['participant'] = [ 'Ruote::CodeParticipant', { 'code' => value } ]
96
+ tree[1]['ref'] = key
97
+
98
+ elsif klass = @context.expmap.expression_class(tree[1]['ref'])
99
+ #
100
+ # aliased expression
101
+
102
+ new_exp_name = value
103
+ new_exp_class = klass
104
+ end
105
+
106
+ elsif
107
+ @context['participant_in_variable_enabled'] &&
108
+ value.is_a?(Hash) &&
109
+ value['on_workitem']
110
+ then
77
111
  #
78
112
  # participant 'defined' in var
79
113
 
114
+ @h['participant'] = [ 'Ruote::BlockParticipant', value ]
115
+
116
+ elsif
117
+ value.is_a?(Array) &&
118
+ value.size == 2 && value.last.is_a?(Hash)
119
+ then
120
+ #
121
+ # participant 'registered' in var
122
+
80
123
  @h['participant'] = value
81
124
  end
82
125
 
83
- unless value || @h['participant']
126
+ if value == nil && @h['participant'] == nil
84
127
  #
85
128
  # unknown participant or subprocess
86
129
 
@@ -90,37 +133,24 @@ module Ruote::Exp
90
133
  raise("unknown participant or subprocess '#{tree[1]['ref']}'")
91
134
  end
92
135
 
93
- new_exp = if @h['participant']
94
-
95
- @h['participant'] = nil if @h['participant'].respond_to?(:consume)
96
- # instantiated participant
97
-
98
- tree[0] = 'participant'
99
- @h['name'] = 'participant'
100
- Ruote::Exp::ParticipantExpression.new(@context, @h)
136
+ new_exp_name, new_exp_class = if new_exp_name
137
+ [ new_exp_name, new_exp_class ]
138
+ elsif @h['participant']
139
+ [ 'participant', Ruote::Exp::ParticipantExpression ]
101
140
  else
102
-
103
- tree[0] = 'subprocess'
104
- @h['name'] = 'subprocess'
105
- Ruote::Exp::SubprocessExpression.new(@context, @h)
141
+ [ 'subprocess', Ruote::Exp::SubprocessExpression ]
106
142
  end
107
143
 
108
- do_schedule_timeout(attribute(:timeout)) if tree[0] == 'subprocess'
109
- #
110
- # since ref neutralizes consider_timeout because participant expressions
111
- # handle timeout by themselves, we have to force timeout consideration
112
- # for subprocess expressions
144
+ tree[0] = new_exp_name
145
+ @h['name'] = new_exp_name
146
+
147
+ new_exp = new_exp_class.new(@context, @h)
113
148
 
114
149
  #new_exp.initial_persist
115
150
  # not necessary
116
151
 
117
152
  new_exp.apply
118
153
  end
119
-
120
- def consider_timeout
121
-
122
- # neutralized
123
- end
124
154
  end
125
155
  end
126
156