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,102 @@
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/merge'
27
+
28
+
29
+ module Ruote::Exp
30
+
31
+ #
32
+ # Restores the fields of the current workitem. That means usually copying
33
+ # them from a saved version in a variable or in a separate field.
34
+ #
35
+ # restore :from_var => 'v'
36
+ #
37
+ # or
38
+ #
39
+ # restore :from_f => 'customer.address.street', :to_f => 'delivery.street'
40
+ #
41
+ # (yes, this sets the field 'street' inside of the field 'delivery')
42
+ #
43
+ # == set_fields
44
+ #
45
+ # This expressions has a 'set_fields' alias. It can be handy (and readable)
46
+ # to set a bunch of workitem fields in one sweep somewhere in a process :
47
+ #
48
+ # Ruote.process_definition :name => 'working hard' do
49
+ # sequence do
50
+ # set_fields :val => { 'customer' => { 'name' => 'Fred', 'age' => 40 } }
51
+ # participant :ref => 'delivery'
52
+ # participant :ref => 'invoincing'
53
+ # end
54
+ # end
55
+ #
56
+ class RestoreExpression < FlowExpression
57
+
58
+ include MergeMixin
59
+ # still have to implement something about merge...
60
+
61
+ names :restore, :set_fields
62
+
63
+ def apply
64
+
65
+ from =
66
+ has_attribute(*%w[ v var variable ].map { |k| "from_#{k}" }) ||
67
+ has_attribute(*%w[ f fld field ].map { |k| "from_#{k}" }) ||
68
+ has_attribute(*%w[ val value ])
69
+
70
+ _, to_f = determine_tos
71
+ # note : to_v is discarded (the underscore)
72
+
73
+ from = 'from_var' if from == 'from_v'
74
+
75
+ afrom = attribute(from)
76
+
77
+ fields = if from.match(/var/)
78
+ lookup_variable(afrom)
79
+ elsif from.match(/f/)
80
+ Ruote.lookup(h.applied_workitem['fields'], afrom)
81
+ else # val
82
+ afrom
83
+ end
84
+
85
+ if to_f
86
+ Ruote.set(h.applied_workitem['fields'], to_f, fields)
87
+ else
88
+ h.applied_workitem['fields'] = fields
89
+ end
90
+
91
+ # TODO : merge strategies
92
+
93
+ reply_to_parent(h.applied_workitem)
94
+ end
95
+
96
+ def reply(workitem)
97
+
98
+ # empty, never called
99
+ end
100
+ end
101
+ end
102
+
@@ -0,0 +1,72 @@
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
+ # Saves the current workitem fields into a variable or into a field.
30
+ #
31
+ # save :to_field => 'old_workitem'
32
+ # # or
33
+ # save :to => 'f:old_workitem'
34
+ # #
35
+ # # saves a copy of the fields of the current workitem into itself,
36
+ # # in the field named 'old_workitem'
37
+ #
38
+ # save :to_variable => '/wix'
39
+ # # or
40
+ # save :to => 'v:/wix'
41
+ # #
42
+ # # saves a copy of the current workitem in the varialbe 'wix' at
43
+ # # the root of the process
44
+ #
45
+ # See also the 'restore' expression (Ruote::Exp::RestoreExpression).
46
+ #
47
+ class SaveExpression < FlowExpression
48
+
49
+ names :save
50
+
51
+ def apply
52
+
53
+ to_v, to_f = determine_tos
54
+
55
+ if to_v
56
+ set_variable(to_v, h.applied_workitem['fields'])
57
+ elsif to_f
58
+ set_f(to_f, Ruote.fulldup(h.applied_workitem['fields']))
59
+ #else
60
+ # do nothing
61
+ end
62
+
63
+ reply_to_parent(h.applied_workitem)
64
+ end
65
+
66
+ def reply(workitem)
67
+
68
+ # empty, never called
69
+ end
70
+ end
71
+ end
72
+
@@ -0,0 +1,59 @@
1
+ #--
2
+ # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
25
+
26
+ module Ruote::Exp
27
+
28
+ #
29
+ # The plain 'sequence' expression.
30
+ #
31
+ # sequence do
32
+ # participant 'alpha'
33
+ # participant 'bravo'
34
+ # participant 'charly'
35
+ # end
36
+ #
37
+ class SequenceExpression < FlowExpression
38
+
39
+ names :sequence
40
+
41
+ def apply
42
+
43
+ reply(h.applied_workitem)
44
+ end
45
+
46
+ def reply(workitem)
47
+
48
+ position = workitem['fei'] == h.fei ?
49
+ 0 : Ruote::FlowExpressionId.new(workitem['fei']).child_id + 1
50
+
51
+ if position < tree_children.size
52
+ apply_child(position, workitem)
53
+ else
54
+ reply_to_parent(workitem)
55
+ end
56
+ end
57
+ end
58
+ end
59
+
@@ -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
+
26
+ module Ruote::Exp
27
+
28
+ #
29
+ # Setting a workitem field or a process variable.
30
+ #
31
+ # sequence do
32
+ # set :field => 'subject', :value => 'food and beverage'
33
+ # set :field => 'date', :val => 'tomorrow'
34
+ # participant :ref => 'attendees'
35
+ # end
36
+ #
37
+ # :field can be abbreviated to :f or :fld. :variable can be abbreviated to
38
+ # :v or :var. Likewise, :val and :value are interchangeable.
39
+ #
40
+ # == field_value, variable_value
41
+ #
42
+ # Usually, grabbing a value from a field or a value will look like
43
+ #
44
+ # set :f => 'my_field', :value => '${v:my_variable}'
45
+ #
46
+ # But doing those ${} substitutions always result in a string result. What
47
+ # if the variable or the field holds a non-string value ?
48
+ #
49
+ # set :f => 'my_field', :var_value => 'my_variable'
50
+ #
51
+ # Is the way to go then. 'set' understands v_value, var_value, variable_value
52
+ # and f_value, fld_value and field_value.
53
+ #
54
+ # == :escape
55
+ #
56
+ # If the value to insert contains ${} stuff but this has to be preserved,
57
+ # setting the attribute :escape to true will do the trick.
58
+ #
59
+ # set :f => 'my_field', :value => 'oh and ${whatever}', :escape => true
60
+ #
61
+ # == ruote 2.0's shorter form
62
+ #
63
+ # Ruote 2.0 introduces a shorter form for the 'set' expression :
64
+ #
65
+ # sequence do
66
+ # set :field => 'f', :value => 'val0'
67
+ # set :variable => 'v', :value => 'val1'
68
+ # set :field => 'f_${v:v}', :value => 'val2'
69
+ # end
70
+ #
71
+ # can be rewritten as
72
+ #
73
+ # sequence do
74
+ # set 'f:f' => 'val0'
75
+ # set 'v:v' => 'val1'
76
+ # set 'f:f_${v:v}' => 'val2'
77
+ # end
78
+ #
79
+ # since 'f:' is the default for the 'dollar notation', the shortest form
80
+ # becomes
81
+ #
82
+ # sequence do
83
+ # set 'f' => 'val0'
84
+ # set 'v:v' => 'val1'
85
+ # set 'f_${v:v}' => 'val2'
86
+ # end
87
+ #
88
+ # == set and rset
89
+ #
90
+ # Some gems (Sinatra) for example may provide a set method that hides calls
91
+ # to set when building process definitions (see http://groups.google.com/group/openwferu-users/browse_thread/thread/9ac606e30ada686e)
92
+ #
93
+ # A workaround is to write 'rset' instead of 'set'.
94
+ #
95
+ # rset 'customer' => 'Jeff'
96
+ #
97
+ #
98
+ # == unset
99
+ #
100
+ # 'unset' is the counterpart to 'set', it removes a field (or a variable)
101
+ #
102
+ # unset :field => 'customer_name'
103
+ # unset :f => 'customer_name'
104
+ # unset :variable => 'vx'
105
+ # unset :var => 'vx'
106
+ # unset :v => 'vx'
107
+ #
108
+ # or simply
109
+ #
110
+ # unset 'f:customer_name'
111
+ # unset 'customer_name' # yes, it's field by default
112
+ # unset 'v:vx'
113
+ #
114
+ class SetExpression < FlowExpression
115
+
116
+ names :rset, :set, :unset
117
+
118
+ def apply
119
+
120
+ opts = { :escape => attribute(:escape) }
121
+
122
+ value = lookup_val(opts)
123
+ # a nil value is totally OK
124
+
125
+ if var_key = has_attribute(:v, :var, :variable)
126
+
127
+ set_v(attribute(var_key), value, name == 'unset')
128
+
129
+ elsif field_key = has_attribute(:f, :fld, :field)
130
+
131
+ set_f(attribute(field_key), value, name == 'unset')
132
+
133
+ elsif value == nil && kv = expand_atts(opts).find { |k, v| k != 'escape' }
134
+
135
+ kv << (name == 'unset')
136
+
137
+ set_vf(*kv)
138
+
139
+ else
140
+
141
+ raise ArgumentError.new(
142
+ "missing a variable or field target in #{tree.inspect}")
143
+ end
144
+
145
+ reply_to_parent(h.applied_workitem)
146
+ end
147
+
148
+ def reply(workitem)
149
+
150
+ # never called
151
+ end
152
+ end
153
+ end
154
+
@@ -0,0 +1,211 @@
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/util/subprocess'
26
+
27
+
28
+ module Ruote::Exp
29
+
30
+ #
31
+ # An expression for invoking a subprocess.
32
+ #
33
+ # pdef = Ruote.process_definition do
34
+ # sequence do
35
+ # subprocess :ref => 'delivering'
36
+ # subprocess 'invoicing'
37
+ # refill_stock :if => '${v:stock_size} < 10'
38
+ # end
39
+ # define 'delivering' do
40
+ # # ...
41
+ # end
42
+ # define 'invoicing' do
43
+ # # ...
44
+ # end
45
+ # define 'refill_stock' do
46
+ # # ...
47
+ # end
48
+ # end
49
+ #
50
+ #
51
+ # == passing attributes as variables
52
+ #
53
+ # The attributes of the subprocess expression are passed as variables of
54
+ # the new subprocess instance.
55
+ #
56
+ # Ruote.process_definition do
57
+ # subprocess 'sub0', :a => 'A', :b => 'B'
58
+ # define :sub0 do
59
+ # echo '${v:a}:${v:b}'
60
+ # end
61
+ # end
62
+ #
63
+ # This example (and useless) process example will output "A:B" to STDOUT.
64
+ #
65
+ #
66
+ # == passing 'blocks' to subprocesses
67
+ #
68
+ # When the subprocess expression has children, the first of them is passed
69
+ # to the subprocess instance as the 'tree' variable, readily available for
70
+ # an 'apply' expression.
71
+ #
72
+ # Ruote.process_definition :name => 'double review' do
73
+ # sequence do
74
+ # sub0 do
75
+ # review_board
76
+ # end
77
+ # sub0 do
78
+ # review_board
79
+ # end
80
+ # end
81
+ # define 'sub0' do
82
+ # concurrence do
83
+ # apply :i => 0
84
+ # apply :i => 1
85
+ # apply :i => 2
86
+ # end
87
+ # end
88
+ # end
89
+ #
90
+ # This example will send 2 x 3 concurrent workitems to the participant
91
+ # named 'review_board' (note that it could also be the name of another
92
+ # subprocess).
93
+ #
94
+ #
95
+ # == passing 'parameters' to subprocess
96
+ #
97
+ # Ruote.process_definition :name => 'whatever' do
98
+ #
99
+ # call :who => 'the cops', :when => 'if I\'m not back at 3'
100
+ #
101
+ # process_definition 'call' do
102
+ # participant :ref => '${v:who}', :msg => 'this is a call'
103
+ # end
104
+ # end
105
+ #
106
+ # This binds the variables 'who' and 'when' in the subprocess instance.
107
+ #
108
+ # Of course you can combine parameters and blocks passing.
109
+ #
110
+ #
111
+ # == pointing to subprocesses via their URI
112
+ #
113
+ # It's OK to invoke subprocesses via a URI
114
+ #
115
+ # subprocess :ref => 'pdefs/definition1.rb'
116
+ #
117
+ # or
118
+ #
119
+ # subprocess :ref => 'http://pdefs.example.org/account/def1.xml'
120
+ #
121
+ # Remember that the 'remote_definition_allowed' option of the engine has
122
+ # to be set to true for the latter to work, else the engine will refuse
123
+ # to load definitions over HTTP.
124
+ #
125
+ # Shorter :
126
+ #
127
+ # subprocess 'http://pdefs.example.org/account/def1.xml'
128
+ #
129
+ #
130
+ # == subprocess URIs bound at engine level
131
+ #
132
+ # There is a class of variables accessible to process instances in read-only
133
+ # mode : engine level variables.
134
+ #
135
+ # They can be set via the engine's initialization code (or later) like in
136
+ # this example :
137
+ #
138
+ # engine.variables['inventory_check'] = 'http://pdefs.example.com/ic0.rb'
139
+ #
140
+ # All the process instance in the engine may then trigger this process in
141
+ # these 3 ways :
142
+ #
143
+ # subprocess :ref => 'inventory_check'
144
+ # subprocess 'inventory_check'
145
+ # inventory_check
146
+ #
147
+ # The latter may make process definitions quite readable (but blur the
148
+ # distinction between expressions, call to participants or to subprocesses).
149
+ #
150
+ #
151
+ # == subprocess trees bound at engine level
152
+ #
153
+ # It's OK to place a process tree directly in an engine variable :
154
+ #
155
+ # engine.variables['inventory_check'] = Ruote.process_definition do
156
+ # cursor do
157
+ # manager :task => 'hire inventory team'
158
+ # floor_manager :task => 'lead inventory'
159
+ # manager :task => 'check results'
160
+ # rewind :unless => '${inventory_successful}'
161
+ # end
162
+ # end
163
+ #
164
+ # Then, from the main process :
165
+ #
166
+ # sequence do
167
+ # # ...
168
+ # inventory_check
169
+ # # ...
170
+ # end
171
+ #
172
+ class SubprocessExpression < FlowExpression
173
+
174
+ names :subprocess
175
+
176
+ def apply
177
+
178
+ return invoke_engine_participant if attribute(:engine)
179
+
180
+ ref = attribute(:ref) || attribute_text
181
+
182
+ raise "no subprocess referred in #{tree}" unless ref
183
+
184
+ pos, subtree = Ruote.lookup_subprocess(self, ref)
185
+
186
+ vars = compile_atts
187
+ vars.merge!('tree' => tree_children.first)
188
+ # NOTE : we're taking the first child here...
189
+
190
+ launch_sub(pos, subtree, :variables => vars)
191
+ end
192
+
193
+ protected
194
+
195
+ def invoke_engine_participant
196
+
197
+ atts = tree[1]
198
+
199
+ if ref = atts.find { |k, v| v.nil? }
200
+ ref = ref.first
201
+ atts.delete(ref)
202
+ end
203
+ atts['pdef'] = atts['ref'] || ref
204
+ atts['ref'] = atts.delete('engine')
205
+
206
+ @h['name'] = 'participant'
207
+ Ruote::Exp::ParticipantExpression.new(@context, @h).apply
208
+ end
209
+ end
210
+ end
211
+