ruote 0.9.18 → 0.9.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (323) hide show
  1. data/README.txt +2 -0
  2. data/examples/about_state.rb +29 -29
  3. data/examples/bigflow.rb +9 -9
  4. data/examples/csv_weather.rb +4 -4
  5. data/examples/engine_template.rb +141 -129
  6. data/examples/flowtracing.rb +8 -8
  7. data/examples/homeworkreview.rb +15 -15
  8. data/examples/kotoba.rb +9 -9
  9. data/examples/mano_tracker.rb +63 -63
  10. data/examples/openwferu.rb +22 -20
  11. data/examples/quotereporter.rb +79 -79
  12. data/lib/openwfe/contextual.rb +72 -72
  13. data/lib/openwfe/def.rb +21 -21
  14. data/lib/openwfe/engine.rb +19 -19
  15. data/lib/openwfe/engine/engine.rb +578 -614
  16. data/lib/openwfe/engine/expool_methods.rb +144 -115
  17. data/lib/openwfe/engine/file_persisted_engine.rb +77 -77
  18. data/lib/openwfe/engine/participant_methods.rb +96 -96
  19. data/lib/openwfe/engine/status_methods.rb +271 -247
  20. data/lib/openwfe/engine/update_exp_methods.rb +69 -69
  21. data/lib/openwfe/exceptions.rb +25 -25
  22. data/lib/openwfe/expool/errorjournal.rb +334 -348
  23. data/lib/openwfe/expool/expool_pause_methods.rb +98 -0
  24. data/lib/openwfe/expool/expressionpool.rb +793 -800
  25. data/lib/openwfe/expool/expstorage.rb +284 -313
  26. data/lib/openwfe/expool/history.rb +193 -105
  27. data/lib/openwfe/expool/journal.rb +163 -163
  28. data/lib/openwfe/expool/journal_replay.rb +228 -228
  29. data/lib/openwfe/expool/parser.rb +178 -142
  30. data/lib/openwfe/{orest/exception.rb → expool/paused_error.rb} +49 -32
  31. data/lib/openwfe/expool/representation.rb +59 -59
  32. data/lib/openwfe/expool/threadedexpstorage.rb +137 -134
  33. data/lib/openwfe/expool/wfidgen.rb +289 -287
  34. data/lib/openwfe/expool/yamlexpstorage.rb +154 -154
  35. data/lib/openwfe/expressions/condition.rb +175 -168
  36. data/lib/openwfe/expressions/environment.rb +165 -165
  37. data/lib/openwfe/expressions/expressionmap.rb +135 -131
  38. data/lib/openwfe/expressions/fe_cancel.rb +68 -68
  39. data/lib/openwfe/expressions/fe_command.rb +190 -190
  40. data/lib/openwfe/expressions/fe_concurrence.rb +531 -531
  41. data/lib/openwfe/expressions/fe_cron.rb +152 -197
  42. data/lib/openwfe/expressions/fe_cursor.rb +152 -186
  43. data/lib/openwfe/expressions/fe_define.rb +118 -118
  44. data/lib/openwfe/expressions/fe_do.rb +109 -109
  45. data/lib/openwfe/expressions/fe_equals.rb +219 -219
  46. data/lib/openwfe/expressions/fe_filter.rb +98 -98
  47. data/lib/openwfe/expressions/fe_filter_definition.rb +122 -122
  48. data/lib/openwfe/expressions/fe_fqv.rb +203 -203
  49. data/lib/openwfe/expressions/fe_http.rb +212 -0
  50. data/lib/openwfe/expressions/fe_if.rb +214 -214
  51. data/lib/openwfe/expressions/fe_iterator.rb +91 -91
  52. data/lib/openwfe/expressions/fe_listen.rb +268 -268
  53. data/lib/openwfe/expressions/fe_losfor.rb +73 -73
  54. data/lib/openwfe/expressions/fe_misc.rb +343 -351
  55. data/lib/openwfe/expressions/fe_participant.rb +206 -206
  56. data/lib/openwfe/expressions/fe_reserve.rb +153 -142
  57. data/lib/openwfe/expressions/fe_save.rb +226 -226
  58. data/lib/openwfe/expressions/fe_sequence.rb +66 -56
  59. data/lib/openwfe/expressions/fe_set.rb +80 -80
  60. data/lib/openwfe/expressions/fe_sleep.rb +132 -125
  61. data/lib/openwfe/expressions/fe_step.rb +113 -111
  62. data/lib/openwfe/expressions/fe_subprocess.rb +139 -136
  63. data/lib/openwfe/expressions/fe_timeout.rb +74 -78
  64. data/lib/openwfe/expressions/fe_wait.rb +48 -49
  65. data/lib/openwfe/expressions/fe_when.rb +106 -106
  66. data/lib/openwfe/expressions/filter.rb +60 -60
  67. data/lib/openwfe/expressions/flowexpression.rb +618 -612
  68. data/lib/openwfe/expressions/iterator.rb +158 -158
  69. data/lib/openwfe/expressions/merge.rb +53 -53
  70. data/lib/openwfe/expressions/raw.rb +396 -397
  71. data/lib/openwfe/expressions/rprocdef.rb +261 -266
  72. data/lib/openwfe/expressions/time.rb +238 -243
  73. data/lib/openwfe/expressions/timeout.rb +135 -135
  74. data/lib/openwfe/expressions/value.rb +55 -55
  75. data/lib/openwfe/extras/engine/db_persisted_engine.rb +94 -0
  76. data/lib/openwfe/extras/expool/dberrorjournal.rb +189 -0
  77. data/lib/openwfe/extras/expool/dbexpstorage.rb +355 -0
  78. data/lib/openwfe/extras/expool/dbhistory.rb +135 -0
  79. data/lib/openwfe/extras/listeners/sqslisteners.rb +146 -0
  80. data/lib/openwfe/extras/misc/activityfeed.rb +264 -0
  81. data/lib/openwfe/extras/misc/basecamp.rb +485 -0
  82. data/lib/openwfe/extras/participants/activeparticipants.rb +749 -0
  83. data/lib/openwfe/extras/participants/atomfeed_participants.rb +173 -0
  84. data/lib/openwfe/extras/participants/atompub_participants.rb +267 -0
  85. data/lib/openwfe/extras/participants/basecamp_participants.rb +87 -0
  86. data/lib/openwfe/extras/participants/csvparticipants.rb +127 -0
  87. data/lib/openwfe/extras/participants/sqsparticipants.rb +125 -0
  88. data/lib/openwfe/extras/participants/twitterparticipants.rb +176 -0
  89. data/lib/openwfe/filterdef.rb +191 -191
  90. data/lib/openwfe/flowexpressionid.rb +271 -269
  91. data/lib/openwfe/listeners/listener.rb +61 -61
  92. data/lib/openwfe/listeners/listeners.rb +81 -81
  93. data/lib/openwfe/listeners/socketlisteners.rb +189 -189
  94. data/lib/openwfe/logging.rb +74 -74
  95. data/lib/openwfe/omixins.rb +55 -54
  96. data/lib/openwfe/orest/definitions.rb +90 -90
  97. data/lib/openwfe/orest/osocket.rb +91 -91
  98. data/lib/openwfe/orest/xmlcodec.rb +471 -459
  99. data/lib/openwfe/participants.rb +19 -19
  100. data/lib/openwfe/participants/enoparticipants.rb +187 -187
  101. data/lib/openwfe/participants/participant.rb +100 -100
  102. data/lib/openwfe/participants/participantmap.rb +170 -170
  103. data/lib/openwfe/participants/participants.rb +316 -316
  104. data/lib/openwfe/participants/soapparticipants.rb +90 -90
  105. data/lib/openwfe/participants/socketparticipants.rb +143 -143
  106. data/lib/openwfe/participants/storeparticipants.rb +198 -198
  107. data/lib/openwfe/rexml.rb +44 -0
  108. data/lib/openwfe/rudefinitions.rb +87 -91
  109. data/lib/openwfe/service.rb +65 -65
  110. data/lib/openwfe/storage/yamlcustom.rb +71 -71
  111. data/lib/openwfe/storage/yamlfilestorage.rb +190 -190
  112. data/lib/openwfe/tools/flowtracer.rb +41 -45
  113. data/lib/openwfe/util/dollar.rb +125 -139
  114. data/lib/openwfe/util/irb.rb +42 -42
  115. data/lib/openwfe/util/observable.rb +93 -99
  116. data/lib/openwfe/util/ometa.rb +36 -36
  117. data/lib/openwfe/util/treechecker.rb +122 -0
  118. data/lib/openwfe/util/workqueue.rb +73 -73
  119. data/lib/openwfe/util/xml.rb +285 -279
  120. data/lib/openwfe/utils.rb +415 -442
  121. data/lib/openwfe/version.rb +1 -1
  122. data/lib/openwfe/workitem.rb +444 -437
  123. data/lib/openwfe/worklist/oldrest.rb +161 -161
  124. data/lib/openwfe/worklist/storelocks.rb +218 -218
  125. data/lib/openwfe/worklist/storeparticipant.rb +19 -19
  126. data/lib/openwfe/worklist/worklist.rb +223 -223
  127. data/test/back_0916_test.rb +57 -59
  128. data/test/bm/bm_1_xml_vs_prog.rb +25 -22
  129. data/test/bm/bm_2_step.rb +81 -81
  130. data/test/bm/ft_0f_5ms.rb +13 -13
  131. data/test/bm/ft_26_load.rb +177 -179
  132. data/test/bm/ft_26b_load.rb +57 -59
  133. data/test/bm/ft_26c_load.rb +70 -65
  134. data/test/bm/ft_recu.rb +51 -51
  135. data/test/clone_test.rb +145 -99
  136. data/test/concurrence_test.rb +41 -41
  137. data/test/condition_test.rb +104 -90
  138. data/test/description_test.rb +46 -45
  139. data/test/eno_test.rb +36 -36
  140. data/test/expmap_test.rb +26 -26
  141. data/test/extras/README.txt +5 -0
  142. data/test/extras/active_connection.rb +48 -0
  143. data/test/extras/active_with_engine_test.rb +140 -0
  144. data/test/extras/activityfeed_test.rb +85 -0
  145. data/test/extras/ap_0_test.rb +287 -0
  146. data/test/extras/ap_1_test.rb +53 -0
  147. data/test/extras/ap_test_base.rb +24 -0
  148. data/test/extras/atomfeedp_test.rb +113 -0
  149. data/test/extras/atompubp_test.rb +91 -0
  150. data/test/extras/basecamp_test.rb +53 -0
  151. data/test/extras/db_errorjournal_utest.rb +75 -0
  152. data/test/extras/db_expstorage_utest.rb +171 -0
  153. data/test/extras/db_history_0_test.rb +58 -0
  154. data/test/extras/ft_19_csv.rb +58 -0
  155. data/test/extras/ft_71_b14008.rb +85 -0
  156. data/test/extras/sqs_test.rb +57 -0
  157. data/test/extras/twitter_test.rb +62 -0
  158. data/test/fe_lookup_att_test.rb +41 -41
  159. data/test/fei_test.rb +131 -131
  160. data/test/file_persisted_engine_test.rb +30 -30
  161. data/test/file_persistence_test.rb +112 -111
  162. data/test/filep_cancel_test.rb +58 -58
  163. data/test/filter_test.rb +67 -67
  164. data/test/flowtestbase.rb +207 -219
  165. data/test/ft_0.rb +35 -35
  166. data/test/ft_0b_sequence.rb +15 -15
  167. data/test/ft_0c_testname.rb +12 -12
  168. data/test/ft_0d_participant.rb +9 -9
  169. data/test/ft_0e_multibody.rb +11 -11
  170. data/test/ft_10_loop.rb +103 -104
  171. data/test/ft_11_ppd.rb +285 -289
  172. data/test/ft_11b_ppd.rb +26 -26
  173. data/test/ft_12_blockparticipant.rb +57 -57
  174. data/test/ft_13_eno.rb +31 -31
  175. data/test/ft_14_subprocess.rb +45 -45
  176. data/test/ft_14b_subprocess.rb +107 -107
  177. data/test/ft_14c_subprocess.rb +33 -33
  178. data/test/ft_15_iterator.rb +127 -127
  179. data/test/ft_15b_iterator.rb +41 -41
  180. data/test/ft_16_fqv.rb +44 -44
  181. data/test/ft_17_condition.rb +48 -48
  182. data/test/ft_18_pname.rb +26 -26
  183. data/test/ft_1_unset.rb +140 -140
  184. data/test/ft_1b_unset.rb +17 -17
  185. data/test/ft_20_cron.rb +33 -33
  186. data/test/ft_21_cron.rb +51 -51
  187. data/test/ft_21b_cron_pause.rb +41 -41
  188. data/test/ft_22_history.rb +45 -41
  189. data/test/ft_23_when.rb +51 -51
  190. data/test/ft_23b_when.rb +43 -43
  191. data/test/ft_23c_wait.rb +48 -48
  192. data/test/ft_23d_cww.rb +28 -28
  193. data/test/ft_24_def.rb +15 -15
  194. data/test/ft_25_cancel.rb +57 -54
  195. data/test/ft_27_getflowpos.rb +79 -83
  196. data/test/ft_28_fileparticipant.rb +25 -25
  197. data/test/ft_29_httprb.rb +57 -57
  198. data/test/ft_2_concurrence.rb +99 -97
  199. data/test/ft_2b_concurrence.rb +132 -132
  200. data/test/ft_2c_concurrence.rb +37 -37
  201. data/test/ft_30_socketlistener.rb +133 -133
  202. data/test/ft_31_flowname.rb +15 -16
  203. data/test/ft_32_journal.rb +48 -48
  204. data/test/ft_32c_journal.rb +54 -54
  205. data/test/ft_32d_journal.rb +43 -46
  206. data/test/ft_33_description.rb +62 -62
  207. data/test/ft_34_cancelwfid.rb +37 -37
  208. data/test/ft_35_localdefs.rb +36 -34
  209. data/test/ft_36_subprocids.rb +61 -61
  210. data/test/ft_37_pnames.rb +33 -33
  211. data/test/ft_38_tag.rb +82 -82
  212. data/test/ft_38b_tag.rb +97 -97
  213. data/test/ft_38c_tag.rb +50 -50
  214. data/test/ft_38d_tag.rb +53 -0
  215. data/test/ft_39_reserve.rb +33 -33
  216. data/test/ft_39b_reserve.rb +59 -59
  217. data/test/ft_3_equals.rb +131 -131
  218. data/test/ft_3b_lookup_vf.rb +43 -43
  219. data/test/ft_40_defined.rb +33 -33
  220. data/test/ft_41_case.rb +80 -80
  221. data/test/ft_42_environments.rb +48 -48
  222. data/test/ft_43_pat10.rb +51 -51
  223. data/test/ft_44_save.rb +37 -37
  224. data/test/ft_44b_restore.rb +151 -151
  225. data/test/ft_45_citerator.rb +149 -149
  226. data/test/ft_45b_citerator.rb +77 -0
  227. data/test/ft_46_pparams.rb +27 -27
  228. data/test/ft_47_filter.rb +100 -100
  229. data/test/ft_48_fe_filter.rb +41 -41
  230. data/test/ft_49_condition.rb +101 -94
  231. data/test/ft_4_misc.rb +185 -190
  232. data/test/ft_50_xml_attribute.rb +101 -104
  233. data/test/ft_51_stack.rb +30 -30
  234. data/test/ft_52_obs_participant.rb +73 -73
  235. data/test/ft_53_null_noop_participant.rb +31 -31
  236. data/test/ft_54_listen.rb +183 -183
  237. data/test/ft_54b_listen.rb +32 -32
  238. data/test/ft_54c_listen.rb +60 -60
  239. data/test/ft_55_ptimeout.rb +29 -30
  240. data/test/ft_56_timeout.rb +29 -29
  241. data/test/ft_57_a.rb +105 -102
  242. data/test/ft_58_ejournal.rb +83 -80
  243. data/test/ft_58b_ejournal.rb +82 -0
  244. data/test/ft_59_ps.rb +148 -86
  245. data/test/ft_5_time.rb +77 -77
  246. data/test/ft_60_ecancel.rb +98 -98
  247. data/test/ft_61_elsub.rb +23 -23
  248. data/test/ft_62_procparticipant.rb +46 -46
  249. data/test/ft_63_pause.rb +82 -69
  250. data/test/ft_64_alias.rb +56 -57
  251. data/test/ft_65_stringlaunch.rb +29 -29
  252. data/test/ft_66_subforget.rb +42 -42
  253. data/test/ft_67_schedlaunch.rb +58 -59
  254. data/test/ft_68_ifparticipant.rb +39 -39
  255. data/test/ft_69_cancelmissing.rb +23 -21
  256. data/test/ft_6_lambda.rb +37 -37
  257. data/test/ft_70_lookupvar.rb +25 -25
  258. data/test/ft_71_log.rb +35 -35
  259. data/test/ft_72_lookup_processes.rb +43 -40
  260. data/test/ft_73_cancel_sub.rb +79 -79
  261. data/test/ft_74_block_and_workitem_dup.rb +42 -42
  262. data/test/ft_75_ruby_attributes.rb +53 -51
  263. data/test/ft_76_merge_isolate.rb +57 -57
  264. data/test/ft_77_segments.rb +13 -13
  265. data/test/ft_78_eval.rb +94 -94
  266. data/test/ft_79_tticket.rb +79 -79
  267. data/test/ft_79b_tticket.rb +73 -73
  268. data/test/ft_79c_outcome.rb +36 -36
  269. data/test/ft_7_lose.rb +73 -73
  270. data/test/ft_7b_lose.rb +49 -49
  271. data/test/ft_80_spname.rb +65 -65
  272. data/test/ft_81_exp.rb +30 -30
  273. data/test/ft_82_trecu.rb +30 -24
  274. data/test/ft_83_badpause.rb +35 -35
  275. data/test/ft_84_updateexp.rb +118 -118
  276. data/test/ft_84b_subrepr.rb +72 -0
  277. data/test/ft_85_dolhash.rb +18 -18
  278. data/test/ft_86_dollar_fv.rb +33 -33
  279. data/test/ft_87_define.rb +47 -47
  280. data/test/ft_88_http.rb +100 -0
  281. data/test/ft_8_forget.rb +25 -25
  282. data/test/ft_9_cursor.rb +119 -110
  283. data/test/ft_9b_cursor.rb +70 -70
  284. data/test/ft_tests.rb +6 -0
  285. data/test/hash_test.rb +52 -34
  286. data/test/hparticipant_test.rb +92 -88
  287. data/test/lookup_att_test.rb +70 -70
  288. data/test/lookup_vf_test.rb +52 -52
  289. data/test/misc_test.rb +55 -51
  290. data/test/obs_test.rb +82 -82
  291. data/test/param_test.rb +181 -181
  292. data/test/participant_test.rb +46 -46
  293. data/test/pending.rb +12 -12
  294. data/test/ps_representation.rb +70 -70
  295. data/test/rake_ltest.rb +2 -2
  296. data/test/rake_qtest.rb +11 -11
  297. data/test/raw_prog_test.rb +303 -308
  298. data/test/restart_cron_test.rb +74 -74
  299. data/test/restart_paused_test.rb +52 -47
  300. data/test/restart_sleep_test.rb +80 -80
  301. data/test/restart_when_test.rb +64 -64
  302. data/test/ruby_procdef_test.rb +71 -71
  303. data/test/rutest_utils.rb +32 -32
  304. data/test/sec_test.rb +143 -142
  305. data/test/slock_test.rb +41 -41
  306. data/test/storage_test.rb +15 -15
  307. data/test/timeout_test.rb +53 -53
  308. data/test/treechecker_test.rb +111 -0
  309. data/test/util_xml_test.rb +57 -57
  310. data/test/wfid_test.rb +93 -93
  311. data/test/wi_test.rb +58 -58
  312. metadata +64 -19
  313. data/examples/scheduler_cron_usage.rb +0 -48
  314. data/examples/scheduler_usage.rb +0 -56
  315. data/lib/openwfe/orest/controlclient.rb +0 -119
  316. data/lib/openwfe/orest/oldrestservlet.rb +0 -279
  317. data/lib/openwfe/orest/restclient.rb +0 -176
  318. data/lib/openwfe/orest/workitem.rb +0 -206
  319. data/lib/openwfe/orest/worklistclient.rb +0 -272
  320. data/test/bm/ft_26d_load.rb +0 -97
  321. data/test/ft_59b_ps_for_pat.rb +0 -58
  322. data/test/ft_64_clone.rb +0 -69
  323. data/test/orest_test.rb +0 -251
@@ -2,31 +2,31 @@
2
2
  #--
3
3
  # Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
4
4
  # All rights reserved.
5
- #
6
- # Redistribution and use in source and binary forms, with or without
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
7
  # modification, are permitted provided that the following conditions are met:
8
- #
8
+ #
9
9
  # . Redistributions of source code must retain the above copyright notice, this
10
- # list of conditions and the following disclaimer.
11
- #
12
- # . Redistributions in binary form must reproduce the above copyright notice,
13
- # this list of conditions and the following disclaimer in the documentation
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
14
  # and/or other materials provided with the distribution.
15
- #
15
+ #
16
16
  # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
17
  # used to endorse or promote products derived from this software without
18
18
  # specific prior written permission.
19
- #
20
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
- # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
- # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
- # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
- # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
- # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
- # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
- # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
- # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
- # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
30
  # POSSIBILITY OF SUCH DAMAGE.
31
31
  #++
32
32
  #
@@ -42,70 +42,70 @@ require 'openwfe/expressions/flowexpression'
42
42
 
43
43
  module OpenWFE
44
44
 
45
- #
46
- # Triggers the first (and supposedly unique child of this expression)
47
- # but never wait for its reply (lose it).
48
- #
49
- # A 'lose' expression never replies to its parent expression.
50
- #
51
- # <lose>
52
- # <participant ref="toto" />
53
- # </lose>
54
- #
55
- # Useful only some special process cases (like a concurrence
56
- # expecting only a certain number of replies).
57
- #
58
- # The brother expressions is 'forget', but 'forget' triggers its child
59
- # and immediately replies, whereas 'lose' doesn't reply.
60
- #
61
- class LoseExpression < FlowExpression
62
-
63
- names :lose
64
-
65
- def apply (workitem)
66
-
67
- get_expression_pool.apply(children[0], workitem) \
68
- if (@children and @children.length > 0)
69
- end
70
-
71
- def reply (workitem)
72
-
73
- get_expression_pool.remove self
74
- end
45
+ #
46
+ # Triggers the first (and supposedly unique child of this expression)
47
+ # but never wait for its reply (lose it).
48
+ #
49
+ # A 'lose' expression never replies to its parent expression.
50
+ #
51
+ # <lose>
52
+ # <participant ref="toto" />
53
+ # </lose>
54
+ #
55
+ # Useful only some special process cases (like a concurrence
56
+ # expecting only a certain number of replies).
57
+ #
58
+ # The brother expressions is 'forget', but 'forget' triggers its child
59
+ # and immediately replies, whereas 'lose' doesn't reply.
60
+ #
61
+ class LoseExpression < FlowExpression
62
+
63
+ names :lose
64
+
65
+ def apply (workitem)
66
+
67
+ get_expression_pool.apply(children[0], workitem) \
68
+ if (@children and @children.length > 0)
75
69
  end
76
70
 
77
- #
78
- # This expression triggers its child (in its own thread) and then
79
- # forgets about it. It immediately replies to its parent expression.
80
- #
81
- # The brother expression 'lose' triggers its child but never replies to its
82
- # parent expression.
83
- #
84
- # The 'forget' expression is useful for triggering process segments
85
- # that are, well, dead ends.
86
- #
87
- class ForgetExpression < FlowExpression
71
+ def reply (workitem)
88
72
 
89
- names :forget
73
+ get_expression_pool.remove self
74
+ end
75
+ end
76
+
77
+ #
78
+ # This expression triggers its child (in its own thread) and then
79
+ # forgets about it. It immediately replies to its parent expression.
80
+ #
81
+ # The brother expression 'lose' triggers its child but never replies to its
82
+ # parent expression.
83
+ #
84
+ # The 'forget' expression is useful for triggering process segments
85
+ # that are, well, dead ends.
86
+ #
87
+ class ForgetExpression < FlowExpression
90
88
 
91
- def apply (workitem)
89
+ names :forget
92
90
 
93
- if (@children and @children.length > 0)
91
+ def apply (workitem)
94
92
 
95
- wi = workitem.dup
93
+ if (@children and @children.length > 0)
96
94
 
97
- child = @children[0]
98
- get_expression_pool.forget self, child
99
- get_expression_pool.apply child, wi
100
- end
95
+ wi = workitem.dup
101
96
 
102
- reply_to_parent workitem
103
- end
97
+ child = @children[0]
98
+ get_expression_pool.forget self, child
99
+ get_expression_pool.apply child, wi
100
+ end
101
+
102
+ reply_to_parent workitem
103
+ end
104
104
 
105
- def reply (workitem)
106
- # never gets called
107
- end
105
+ def reply (workitem)
106
+ # never gets called
108
107
  end
108
+ end
109
109
 
110
110
  end
111
111
 
@@ -37,385 +37,377 @@
37
37
  # John Mettraux at openwfe.org
38
38
  #
39
39
 
40
- require 'rufus/eval'
41
40
  require 'openwfe/expressions/flowexpression'
42
41
  require 'openwfe/expressions/value'
42
+ require 'openwfe/util/treechecker'
43
43
 
44
44
 
45
45
  module OpenWFE
46
46
 
47
- #
48
- # The 'description' expression, simply binds the given text in
49
- # the 'description' variable in the current process.
50
- #
51
- # class TestDefinition2 < OpenWFE::ProcessDefinition
52
- #
53
- # description :lang => "fr" do "rien de rien" end
54
- #
55
- # sequence do
56
- # _print "${description}"
57
- # _print "${description__fr}"
58
- # end
59
- # end
60
- #
61
- class DescriptionExpression < FlowExpression
62
- include ValueMixin
47
+ #
48
+ # The 'description' expression, simply binds the given text in
49
+ # the 'description' variable in the current process.
50
+ #
51
+ # class TestDefinition2 < OpenWFE::ProcessDefinition
52
+ #
53
+ # description :lang => "fr" do "rien de rien" end
54
+ #
55
+ # sequence do
56
+ # _print "${description}"
57
+ # _print "${description__fr}"
58
+ # end
59
+ # end
60
+ #
61
+ class DescriptionExpression < FlowExpression
62
+ include ValueMixin
63
63
 
64
- is_definition
64
+ is_definition
65
65
 
66
- names :description
66
+ names :description
67
67
 
68
- DESC = 'description'
68
+ DESC = 'description'
69
69
 
70
70
 
71
- def reply (workitem)
71
+ def reply (workitem)
72
72
 
73
- lang =
74
- lookup_attribute(:lang, workitem) ||
75
- lookup_attribute(:language, workitem)
73
+ lang =
74
+ lookup_attribute(:lang, workitem) ||
75
+ lookup_attribute(:language, workitem)
76
76
 
77
- vname = DESC
78
- vname += "__#{lang}" if lang
77
+ vname = DESC
78
+ vname += "__#{lang}" if lang
79
79
 
80
- text = lookup_attribute('text', workitem) || workitem.get_result
80
+ text = lookup_attribute('text', workitem) || workitem.get_result
81
81
 
82
- set_variable(vname, text)
83
- set_variable(DESC, text) unless lookup_variable(DESC)
84
- # set default if not set
82
+ set_variable(vname, text)
83
+ set_variable(DESC, text) unless lookup_variable(DESC)
84
+ # set default if not set
85
85
 
86
- reply_to_parent workitem
87
- end
86
+ reply_to_parent workitem
88
87
  end
89
-
90
- #
91
- # A debug/test expression (it's mostly used in the test suite
92
- # used for the development of OpenWFEru).
93
- # Outputs a message to the STDOUT (via the "puts" Ruby method).
94
- #
95
- # <print>hello</print>
96
- #
97
- # _print "hello"
98
- # _print do
99
- # "in a block"
100
- # end
101
- #
102
- # Note that when expressing the process in Ruby, an underscore has to be
103
- # placed in front of the expression name to avoid a collision with the
104
- # Ruby 'print' function.
105
- #
106
- # If there is an object bound in the application context under the
107
- # name '__tracer', this expression will append its message to this
108
- # instance instead of emitting to the STDOUT. (this is how the
109
- # OpenWFEru test suite uses this expression).
110
- #
111
- class PrintExpression < FlowExpression
112
- include ValueMixin
113
-
114
- names :print
115
-
116
- def reply (workitem)
117
-
118
- text = workitem.get_result.to_s
119
- text << "\n"
120
-
121
- tracer = @application_context['__tracer']
122
-
123
- if tracer
124
- tracer << text
125
- else
126
- puts text
127
- end
128
-
129
- reply_to_parent workitem
130
- end
88
+ end
89
+
90
+ #
91
+ # A debug/test expression (it's mostly used in the test suite
92
+ # used for the development of OpenWFEru).
93
+ # Outputs a message to the STDOUT (via the "puts" Ruby method).
94
+ #
95
+ # <print>hello</print>
96
+ #
97
+ # _print "hello"
98
+ # _print do
99
+ # "in a block"
100
+ # end
101
+ #
102
+ # Note that when expressing the process in Ruby, an underscore has to be
103
+ # placed in front of the expression name to avoid a collision with the
104
+ # Ruby 'print' function.
105
+ #
106
+ # If there is an object bound in the application context under the
107
+ # name '__tracer', this expression will append its message to this
108
+ # instance instead of emitting to the STDOUT. (this is how the
109
+ # OpenWFEru test suite uses this expression).
110
+ #
111
+ class PrintExpression < FlowExpression
112
+ include ValueMixin
113
+
114
+ names :print
115
+
116
+ def reply (workitem)
117
+
118
+ text = workitem.get_result.to_s
119
+ text << "\n"
120
+
121
+ tracer = @application_context['__tracer']
122
+
123
+ if tracer
124
+ tracer << text
125
+ else
126
+ puts text
127
+ end
128
+
129
+ reply_to_parent workitem
131
130
  end
132
-
133
- #
134
- # Evals some Ruby code contained within the process definition
135
- # or within the workitem.
136
- #
137
- # The code is evaluated at a SAFE level of 3.
138
- #
139
- # If the :ruby_eval_allowed isn't set to true
140
- # (<tt>engine.application_context[:ruby_eval_allowed] = true</tt>), this
141
- # expression will throw an exception at apply.
142
- #
143
- # some examples :
144
- #
145
- # <reval>
146
- # workitem.customer_name = "doug"
147
- # # or for short
148
- # wi.customer_address = "midtown 21_21 design"
149
- # </reval>
150
- #
151
- # in a Ruby process definition :
152
- #
153
- # sequence do
154
- # _set :field => "customer" do
155
- # reval """
156
- # {
157
- # :name => "Cheezburger",
158
- # :age => 34,
159
- # :comment => "I can haz ?",
160
- # :timestamp => Time.now.to_s
161
- # }
162
- # """
163
- # end
164
- # end
165
- #
166
- # Don't embed too much Ruby into your process definitions, it might
167
- # hurt...
168
- #
169
- # Reval can also be used with the 'code' attribute (or 'field-code' or
170
- # 'variable-code') :
171
- #
172
- # <reval field-code="f0" />
173
- #
174
- # to eval the Ruby code held in the field named "f0".
175
- #
176
- class RevalExpression < FlowExpression
177
- include ValueMixin
178
-
179
- names :reval
180
-
181
- #
182
- # See for an explanation on Ruby safety levels :
183
- # http://www.rubycentral.com/book/taint.html
184
- #
185
- # 'reval' is entitled a safe level of 3.
186
- #
187
- SAFETY_LEVEL = 3
188
-
189
-
190
- def reply (workitem)
191
-
192
- raise "evaluation of ruby code is not allowed" \
193
- if @application_context[:ruby_eval_allowed] != true
194
-
195
- code = lookup_vf_attribute(workitem, 'code') || workitem.get_result
196
- code = code.to_s
197
-
198
- wi = workitem
199
- # so that the ruby code being evaluated sees 'wi' and 'workitem'
200
-
201
- result = Rufus::eval_safely code, SAFETY_LEVEL, binding()
202
-
203
- workitem.set_result(result) \
204
- if result != nil # 'false' is a valid result
205
-
206
- reply_to_parent workitem
207
- end
131
+ end
132
+
133
+ #
134
+ # Evals some Ruby code contained within the process definition
135
+ # or within the workitem.
136
+ #
137
+ # If the :ruby_eval_allowed isn't set to true
138
+ # (<tt>engine.application_context[:ruby_eval_allowed] = true</tt>), this
139
+ # expression will throw an exception at apply.
140
+ #
141
+ # some examples :
142
+ #
143
+ # <reval>
144
+ # workitem.customer_name = "doug"
145
+ # # or for short
146
+ # wi.customer_address = "midtown 21_21 design"
147
+ # </reval>
148
+ #
149
+ # in a Ruby process definition :
150
+ #
151
+ # sequence do
152
+ # _set :field => "customer" do
153
+ # reval """
154
+ # {
155
+ # :name => "Cheezburger",
156
+ # :age => 34,
157
+ # :comment => "I can haz ?",
158
+ # :timestamp => Time.now.to_s
159
+ # }
160
+ # """
161
+ # end
162
+ # end
163
+ #
164
+ # Don't embed too much Ruby into your process definitions, it might
165
+ # hurt...
166
+ #
167
+ # Reval can also be used with the 'code' attribute (or 'field-code' or
168
+ # 'variable-code') :
169
+ #
170
+ # <reval field-code="f0" />
171
+ #
172
+ # to eval the Ruby code held in the field named "f0".
173
+ #
174
+ class RevalExpression < FlowExpression
175
+ include ValueMixin
176
+
177
+ names :reval
178
+
179
+
180
+ def reply (workitem)
181
+
182
+ raise 'evaluation of ruby code is not allowed' \
183
+ if @application_context[:ruby_eval_allowed] != true
184
+
185
+ code = lookup_vf_attribute(workitem, 'code') || workitem.get_result
186
+ code = code.to_s
187
+
188
+ wi = workitem
189
+ # so that the ruby code being evaluated sees 'wi' and 'workitem'
190
+
191
+ get_tree_checker.check code
192
+
193
+ result = eval code, binding()
194
+
195
+ workitem.set_result(result) \
196
+ if result != nil # as 'false' is a valid result
197
+
198
+ reply_to_parent workitem
208
199
  end
200
+ end
201
+
202
+ #
203
+ # An advanced expression : it takes the value in a field or variable (or
204
+ # the nested value) and evaluates it as a process definition.
205
+ #
206
+ # sequence
207
+ # set :field => "code", :value => "<print>hello 0</print>"
208
+ # _eval :field_def => "code"
209
+ # set :field => "code", :value => "_print 'hello 1'"
210
+ # _eval :field_def => "code"
211
+ # end
212
+ #
213
+ # will print "hello0\nhello1".
214
+ #
215
+ # This expression can be useful for evaluating process definition snippets
216
+ # coming from participants directly.
217
+ #
218
+ # It's also dangerous. This 'eval' expression will raise an error if
219
+ # the parameter :dynamic_eval_allowed in the engine's application context
220
+ # is not set to true.
221
+ #
222
+ class EvalExpression < FlowExpression
223
+ include ValueMixin
224
+
225
+ names :eval
226
+
227
+
228
+ def reply (workitem)
229
+
230
+ raise "dynamic evaluation of process definitions is not allowed" \
231
+ if @application_context[:dynamic_eval_allowed] != true
232
+
233
+ df = lookup_vf_attribute(workitem, 'def') || workitem.get_result
234
+
235
+ return reply_to_parent(workitem) unless df
236
+ #
237
+ # currently, 'nothing to eval' means, 'just go on'
209
238
 
210
- #
211
- # An advanced expression : it takes the value in a field or variable (or
212
- # the nested value) and evaluates it as a process definition.
213
- #
214
- # sequence
215
- # set :field => "code", :value => "<print>hello 0</print>"
216
- # _eval :field_def => "code"
217
- # set :field => "code", :value => "_print 'hello 1'"
218
- # _eval :field_def => "code"
219
- # end
220
- #
221
- # will print "hello0\nhello1".
222
- #
223
- # This expression can be useful for evaluating process definition snippets
224
- # coming from participants directly.
225
- #
226
- # It's also dangerous. This 'eval' expression will raise an error if
227
- # the parameter :dynamic_eval_allowed in the engine's application context
228
- # is not set to true.
229
- #
230
- class EvalExpression < FlowExpression
231
- include ValueMixin
232
-
233
- names :eval
234
-
235
-
236
- def reply (workitem)
237
-
238
- raise "dynamic evaluation of process definitions is not allowed" \
239
- if @application_context[:dynamic_eval_allowed] != true
240
-
241
- df = lookup_vf_attribute(workitem, 'def') || workitem.get_result
242
-
243
- return reply_to_parent(workitem) unless df
244
- #
245
- # currently, 'nothing to eval' means, 'just go on'
246
-
247
- ldebug { "apply() def is >#{df}<" }
248
-
249
- raw_expression = build_raw_expression df
250
-
251
- #puts
252
- #puts "======================================"
253
- #puts raw_expression.to_s
254
- #puts raw_expression.raw_representation
255
- #puts "======================================"
256
- #puts
257
-
258
- raw_expression.apply workitem
259
- end
260
-
261
- protected
239
+ ldebug { "apply() def is >#{df}<" }
262
240
 
263
- def build_raw_expression (df)
241
+ raw_expression = build_raw_expression df
264
242
 
265
- procdf = get_expression_pool.determine_rep df
243
+ #puts
244
+ #puts "======================================"
245
+ #puts raw_expression.to_s
246
+ #puts raw_expression.raw_representation
247
+ #puts "======================================"
248
+ #puts
266
249
 
267
- RawExpression.new_raw(
268
- fei, parent_id, environment_id, application_context, procdf)
269
- end
250
+ raw_expression.apply workitem
270
251
  end
271
252
 
272
- #
273
- # Some kind of limited 'eval' expression.
274
- #
275
- # Here is an usage example :
276
- #
277
- # class ExampleDef < OpenWFE::ProcessDefinition
278
- #
279
- # sequence do
280
- #
281
- # exp :name => "p0"
282
- # exp :name => "sub0"
283
- #
284
- # exp :name => "sequence" do
285
- # p0
286
- # sub0
287
- # end
288
- #
289
- # set :var => "a", :value => { "ref" => "p0" }
290
- # exp :name => "participant", :variable_attributes => "a"
291
- # end
292
- #
293
- # process_definition :name => "sub0" do
294
- # _print "sub0"
295
- # end
296
- # end
297
- #
298
- # This example is a bit static, but the point is that the 'exp'
299
- # is extracting the real expression name (or participant or subprocess
300
- # name) from its 'name' attribute.
301
- #
302
- # The 'eval' expression is about evaluating a complete process definition
303
- # branch, 'exp' is only about one node in the process definition.
304
- #
305
- class ExpExpression < RawExpression
306
-
307
- names :exp
308
-
309
- #--
310
- #def initialize (fei, parent_id, env_id, app_context, att)
311
- # #
312
- # # this responds to the FlowExpression constructor...
313
- # super fei, parent_id, env_id, app_context, nil
314
- # #
315
- # # but this triggers the RawExpression constructor :)
316
- # @attributes = att
317
- # #
318
- # # as this is not done by the RawExpression constructor
319
- #end
320
- #++
321
-
322
- def apply (workitem)
323
-
324
- @applied_workitem = workitem
325
-
326
- super
327
- end
328
-
329
- protected
330
-
331
- #
332
- # Evaluates the 'name' attribute, if it's not present or empty,
333
- # will return the value for the 'default' attribute.
334
- #
335
- def expression_name
336
-
337
- n = lookup_attribute :name, @applied_workitem
338
-
339
- return lookup_attribute(:default, @applied_workitem) \
340
- if (not n) or (n.strip == '')
341
-
342
- n
343
- end
344
-
345
- #
346
- # If the 'attributes' attribute is present, will return its
347
- # value. Else, will simply return the attributes of the 'exp'
348
- # expression itself ('name' and 'default' included).
349
- #
350
- def extract_attributes
351
-
352
- att = lookup_vf_attribute @applied_workitem, :attributes
353
- # will currently only work with an attribute hash
354
- # whose keys are strings... symbols :(
355
-
356
- att || @attributes
357
- end
358
-
359
- #--
360
- #def extract_descriptions
361
- # []
362
- #end
363
- #++
364
-
365
- def extract_children
366
- @children
367
- end
368
-
369
- def extract_parameters
370
- []
371
- end
253
+ protected
254
+
255
+ def build_raw_expression (df)
256
+
257
+ procdf = get_expression_pool.determine_rep df
258
+
259
+ RawExpression.new_raw(
260
+ fei, parent_id, environment_id, application_context, procdf)
261
+ end
262
+ end
263
+
264
+ #
265
+ # Some kind of limited 'eval' expression.
266
+ #
267
+ # Here is an usage example :
268
+ #
269
+ # class ExampleDef < OpenWFE::ProcessDefinition
270
+ #
271
+ # sequence do
272
+ #
273
+ # exp :name => "p0"
274
+ # exp :name => "sub0"
275
+ #
276
+ # exp :name => "sequence" do
277
+ # p0
278
+ # sub0
279
+ # end
280
+ #
281
+ # set :var => "a", :value => { "ref" => "p0" }
282
+ # exp :name => "participant", :variable_attributes => "a"
283
+ # end
284
+ #
285
+ # process_definition :name => "sub0" do
286
+ # _print "sub0"
287
+ # end
288
+ # end
289
+ #
290
+ # This example is a bit static, but the point is that the 'exp'
291
+ # is extracting the real expression name (or participant or subprocess
292
+ # name) from its 'name' attribute.
293
+ #
294
+ # The 'eval' expression is about evaluating a complete process definition
295
+ # branch, 'exp' is only about one node in the process definition.
296
+ #
297
+ class ExpExpression < RawExpression
298
+
299
+ names :exp
300
+
301
+ #--
302
+ #def initialize (fei, parent_id, env_id, app_context, att)
303
+ # #
304
+ # # this responds to the FlowExpression constructor...
305
+ # super fei, parent_id, env_id, app_context, nil
306
+ # #
307
+ # # but this triggers the RawExpression constructor :)
308
+ # @attributes = att
309
+ # #
310
+ # # as this is not done by the RawExpression constructor
311
+ #end
312
+ #++
313
+
314
+ def apply (workitem)
315
+
316
+ @applied_workitem = workitem
317
+
318
+ super
372
319
  end
373
320
 
374
- #
375
- # This expression simply emits a message to the application
376
- # log (by default logs/openwferu.log).
377
- #
378
- # <sequence>
379
- # <log>before participant alpha</log>
380
- # <participant ref="alpha" />
381
- # <log>after participant alpha</log>
382
- # <log level="warn">after participant alpha</log>
383
- # </sequence>
384
- #
385
- # And an example with a Ruby process definition :
386
- #
387
- # sequence do
388
- # log "simple debug message"
389
- # log do
390
- # "another debug message"
391
- # end
392
- # log :message => "yet another debug message"
393
- # log :message => "an info level message", :level => "info"
394
- # end
395
- #
396
- # Possible log levels are 'debug' (the default), 'info', 'warn' and
397
- # 'fatal'.
398
- #
399
- class LogExpression < FlowExpression
400
- include ValueMixin
401
-
402
- names :log
403
-
404
- def reply (workitem)
405
-
406
- text = lookup_attribute('message', workitem) || workitem.get_result
407
-
408
- level = lookup_attribute('level', workitem)
409
- level = level.downcase.to_sym if level
410
-
411
- level = :debug \
412
- unless [ :info, :warn, :error, :fatal ].include?(level)
413
-
414
- get_engine.llog(level, text) if text
415
-
416
- reply_to_parent workitem
417
- end
321
+ protected
322
+
323
+ #
324
+ # Evaluates the 'name' attribute, if it's not present or empty,
325
+ # will return the value for the 'default' attribute.
326
+ #
327
+ def expression_name
328
+
329
+ n = lookup_attribute :name, @applied_workitem
330
+
331
+ return lookup_attribute(:default, @applied_workitem) \
332
+ if (not n) or (n.strip == '')
333
+
334
+ n
335
+ end
336
+
337
+ #
338
+ # If the 'attributes' attribute is present, will return its
339
+ # value. Else, will simply return the attributes of the 'exp'
340
+ # expression itself ('name' and 'default' included).
341
+ #
342
+ def extract_attributes
343
+
344
+ att = lookup_vf_attribute @applied_workitem, :attributes
345
+ # will currently only work with an attribute hash
346
+ # whose keys are strings... symbols :(
347
+
348
+ att || @attributes
349
+ end
350
+
351
+ #--
352
+ #def extract_descriptions
353
+ # []
354
+ #end
355
+ #++
356
+
357
+ def extract_children
358
+ @children
359
+ end
360
+
361
+ def extract_parameters
362
+ []
363
+ end
364
+ end
365
+
366
+ #
367
+ # This expression simply emits a message to the application
368
+ # log (by default logs/openwferu.log).
369
+ #
370
+ # <sequence>
371
+ # <log>before participant alpha</log>
372
+ # <participant ref="alpha" />
373
+ # <log>after participant alpha</log>
374
+ # <log level="warn">after participant alpha</log>
375
+ # </sequence>
376
+ #
377
+ # And an example with a Ruby process definition :
378
+ #
379
+ # sequence do
380
+ # log "simple debug message"
381
+ # log do
382
+ # "another debug message"
383
+ # end
384
+ # log :message => "yet another debug message"
385
+ # log :message => "an info level message", :level => "info"
386
+ # end
387
+ #
388
+ # Possible log levels are 'debug' (the default), 'info', 'warn' and
389
+ # 'fatal'.
390
+ #
391
+ class LogExpression < FlowExpression
392
+ include ValueMixin
393
+
394
+ names :log
395
+
396
+ def reply (workitem)
397
+
398
+ text = lookup_attribute('message', workitem) || workitem.get_result
399
+
400
+ level = lookup_attribute('level', workitem)
401
+ level = level.downcase.to_sym if level
402
+
403
+ level = :debug \
404
+ unless [ :info, :warn, :error, :fatal ].include?(level)
405
+
406
+ get_engine.llog(level, text) if text
407
+
408
+ reply_to_parent workitem
418
409
  end
410
+ end
419
411
 
420
412
  end
421
413