ruote 0.9.18

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 (291) hide show
  1. data/README.txt +24 -0
  2. data/bin/validate-workflow.rb +89 -0
  3. data/examples/about_state.rb +81 -0
  4. data/examples/bigflow.rb +19 -0
  5. data/examples/csv_weather.rb +23 -0
  6. data/examples/engine_template.rb +247 -0
  7. data/examples/flowtracing.rb +24 -0
  8. data/examples/homeworkreview.rb +68 -0
  9. data/examples/kotoba.rb +22 -0
  10. data/examples/mano_tracker.rb +172 -0
  11. data/examples/openwferu.rb +58 -0
  12. data/examples/quotereporter.rb +157 -0
  13. data/examples/scheduler_cron_usage.rb +48 -0
  14. data/examples/scheduler_usage.rb +56 -0
  15. data/lib/openwfe.rb +41 -0
  16. data/lib/openwfe/contextual.rb +111 -0
  17. data/lib/openwfe/def.rb +46 -0
  18. data/lib/openwfe/engine.rb +37 -0
  19. data/lib/openwfe/engine/engine.rb +756 -0
  20. data/lib/openwfe/engine/expool_methods.rb +172 -0
  21. data/lib/openwfe/engine/file_persisted_engine.rb +105 -0
  22. data/lib/openwfe/engine/participant_methods.rb +133 -0
  23. data/lib/openwfe/engine/status_methods.rb +353 -0
  24. data/lib/openwfe/engine/update_exp_methods.rb +112 -0
  25. data/lib/openwfe/exceptions.rb +51 -0
  26. data/lib/openwfe/expool/errorjournal.rb +476 -0
  27. data/lib/openwfe/expool/expressionpool.rb +1144 -0
  28. data/lib/openwfe/expool/expstorage.rb +403 -0
  29. data/lib/openwfe/expool/history.rb +174 -0
  30. data/lib/openwfe/expool/journal.rb +224 -0
  31. data/lib/openwfe/expool/journal_replay.rb +321 -0
  32. data/lib/openwfe/expool/parser.rb +242 -0
  33. data/lib/openwfe/expool/representation.rb +121 -0
  34. data/lib/openwfe/expool/threadedexpstorage.rb +188 -0
  35. data/lib/openwfe/expool/wfidgen.rb +388 -0
  36. data/lib/openwfe/expool/yamlexpstorage.rb +224 -0
  37. data/lib/openwfe/expressions/condition.rb +244 -0
  38. data/lib/openwfe/expressions/environment.rb +246 -0
  39. data/lib/openwfe/expressions/expressionmap.rb +258 -0
  40. data/lib/openwfe/expressions/fe_cancel.rb +109 -0
  41. data/lib/openwfe/expressions/fe_command.rb +241 -0
  42. data/lib/openwfe/expressions/fe_concurrence.rb +662 -0
  43. data/lib/openwfe/expressions/fe_cron.rb +259 -0
  44. data/lib/openwfe/expressions/fe_cursor.rb +259 -0
  45. data/lib/openwfe/expressions/fe_define.rb +192 -0
  46. data/lib/openwfe/expressions/fe_do.rb +168 -0
  47. data/lib/openwfe/expressions/fe_equals.rb +291 -0
  48. data/lib/openwfe/expressions/fe_filter.rb +129 -0
  49. data/lib/openwfe/expressions/fe_filter_definition.rb +168 -0
  50. data/lib/openwfe/expressions/fe_fqv.rb +250 -0
  51. data/lib/openwfe/expressions/fe_if.rb +303 -0
  52. data/lib/openwfe/expressions/fe_iterator.rb +145 -0
  53. data/lib/openwfe/expressions/fe_listen.rb +371 -0
  54. data/lib/openwfe/expressions/fe_losfor.rb +111 -0
  55. data/lib/openwfe/expressions/fe_misc.rb +421 -0
  56. data/lib/openwfe/expressions/fe_participant.rb +269 -0
  57. data/lib/openwfe/expressions/fe_reserve.rb +212 -0
  58. data/lib/openwfe/expressions/fe_save.rb +274 -0
  59. data/lib/openwfe/expressions/fe_sequence.rb +117 -0
  60. data/lib/openwfe/expressions/fe_set.rb +139 -0
  61. data/lib/openwfe/expressions/fe_sleep.rb +166 -0
  62. data/lib/openwfe/expressions/fe_step.rb +159 -0
  63. data/lib/openwfe/expressions/fe_subprocess.rb +168 -0
  64. data/lib/openwfe/expressions/fe_timeout.rb +127 -0
  65. data/lib/openwfe/expressions/fe_wait.rb +78 -0
  66. data/lib/openwfe/expressions/fe_when.rb +142 -0
  67. data/lib/openwfe/expressions/filter.rb +104 -0
  68. data/lib/openwfe/expressions/flowexpression.rb +847 -0
  69. data/lib/openwfe/expressions/iterator.rb +221 -0
  70. data/lib/openwfe/expressions/merge.rb +84 -0
  71. data/lib/openwfe/expressions/raw.rb +547 -0
  72. data/lib/openwfe/expressions/rprocdef.rb +375 -0
  73. data/lib/openwfe/expressions/time.rb +333 -0
  74. data/lib/openwfe/expressions/timeout.rb +178 -0
  75. data/lib/openwfe/expressions/value.rb +126 -0
  76. data/lib/openwfe/filterdef.rb +259 -0
  77. data/lib/openwfe/flowexpressionid.rb +357 -0
  78. data/lib/openwfe/listeners/listener.rb +97 -0
  79. data/lib/openwfe/listeners/listeners.rb +139 -0
  80. data/lib/openwfe/listeners/socketlisteners.rb +272 -0
  81. data/lib/openwfe/logging.rb +122 -0
  82. data/lib/openwfe/omixins.rb +95 -0
  83. data/lib/openwfe/orest/controlclient.rb +119 -0
  84. data/lib/openwfe/orest/definitions.rb +113 -0
  85. data/lib/openwfe/orest/exception.rb +60 -0
  86. data/lib/openwfe/orest/oldrestservlet.rb +279 -0
  87. data/lib/openwfe/orest/osocket.rb +148 -0
  88. data/lib/openwfe/orest/restclient.rb +176 -0
  89. data/lib/openwfe/orest/workitem.rb +206 -0
  90. data/lib/openwfe/orest/worklistclient.rb +272 -0
  91. data/lib/openwfe/orest/xmlcodec.rb +670 -0
  92. data/lib/openwfe/participants.rb +38 -0
  93. data/lib/openwfe/participants/enoparticipants.rb +230 -0
  94. data/lib/openwfe/participants/participant.rb +141 -0
  95. data/lib/openwfe/participants/participantmap.rb +249 -0
  96. data/lib/openwfe/participants/participants.rb +407 -0
  97. data/lib/openwfe/participants/soapparticipants.rb +135 -0
  98. data/lib/openwfe/participants/socketparticipants.rb +202 -0
  99. data/lib/openwfe/participants/storeparticipants.rb +254 -0
  100. data/lib/openwfe/rudefinitions.rb +130 -0
  101. data/lib/openwfe/service.rb +103 -0
  102. data/lib/openwfe/storage/yamlcustom.rb +106 -0
  103. data/lib/openwfe/storage/yamlfilestorage.rb +245 -0
  104. data/lib/openwfe/tools/flowtracer.rb +81 -0
  105. data/lib/openwfe/util/dollar.rb +217 -0
  106. data/lib/openwfe/util/irb.rb +86 -0
  107. data/lib/openwfe/util/observable.rb +144 -0
  108. data/lib/openwfe/util/ometa.rb +62 -0
  109. data/lib/openwfe/util/workqueue.rb +124 -0
  110. data/lib/openwfe/util/xml.rb +418 -0
  111. data/lib/openwfe/utils.rb +554 -0
  112. data/lib/openwfe/version.rb +37 -0
  113. data/lib/openwfe/workitem.rb +499 -0
  114. data/lib/openwfe/worklist/oldrest.rb +244 -0
  115. data/lib/openwfe/worklist/storelocks.rb +293 -0
  116. data/lib/openwfe/worklist/storeparticipant.rb +44 -0
  117. data/lib/openwfe/worklist/worklist.rb +297 -0
  118. data/test/README.txt +27 -0
  119. data/test/back_0916_test.rb +111 -0
  120. data/test/bm/bm_1_xml_vs_prog.rb +56 -0
  121. data/test/bm/bm_2_step.rb +109 -0
  122. data/test/bm/ft_0f_5ms.rb +35 -0
  123. data/test/bm/ft_26_load.rb +210 -0
  124. data/test/bm/ft_26b_load.rb +86 -0
  125. data/test/bm/ft_26c_load.rb +97 -0
  126. data/test/bm/ft_26d_load.rb +97 -0
  127. data/test/bm/ft_recu.rb +71 -0
  128. data/test/clone_test.rb +122 -0
  129. data/test/concurrence_test.rb +77 -0
  130. data/test/condition_test.rb +155 -0
  131. data/test/console_test.rb +12 -0
  132. data/test/cron_ltest.rb +15 -0
  133. data/test/description_test.rb +87 -0
  134. data/test/eno_test.rb +76 -0
  135. data/test/expmap_test.rb +54 -0
  136. data/test/expool_20031219_0916.tgz +0 -0
  137. data/test/fe_lookup_att_test.rb +62 -0
  138. data/test/fei_test.rb +181 -0
  139. data/test/file_persisted_engine_test.rb +64 -0
  140. data/test/file_persistence_test.rb +134 -0
  141. data/test/filep_cancel_test.rb +123 -0
  142. data/test/filter_test.rb +109 -0
  143. data/test/flowtestbase.rb +351 -0
  144. data/test/ft_0.rb +68 -0
  145. data/test/ft_0b_sequence.rb +36 -0
  146. data/test/ft_0c_testname.rb +33 -0
  147. data/test/ft_0d_participant.rb +30 -0
  148. data/test/ft_0e_multibody.rb +34 -0
  149. data/test/ft_10_loop.rb +134 -0
  150. data/test/ft_11_ppd.rb +415 -0
  151. data/test/ft_11b_ppd.rb +54 -0
  152. data/test/ft_12_blockparticipant.rb +97 -0
  153. data/test/ft_13_eno.rb +52 -0
  154. data/test/ft_14_subprocess.rb +88 -0
  155. data/test/ft_14b_subprocess.rb +192 -0
  156. data/test/ft_14c_subprocess.rb +68 -0
  157. data/test/ft_15_iterator.rb +216 -0
  158. data/test/ft_15b_iterator.rb +74 -0
  159. data/test/ft_16_fqv.rb +73 -0
  160. data/test/ft_17_condition.rb +84 -0
  161. data/test/ft_18_pname.rb +56 -0
  162. data/test/ft_1_unset.rb +175 -0
  163. data/test/ft_1b_unset.rb +39 -0
  164. data/test/ft_20_cron.rb +53 -0
  165. data/test/ft_21_cron.rb +87 -0
  166. data/test/ft_21b_cron_pause.rb +82 -0
  167. data/test/ft_22_history.rb +74 -0
  168. data/test/ft_23_when.rb +77 -0
  169. data/test/ft_23b_when.rb +70 -0
  170. data/test/ft_23c_wait.rb +80 -0
  171. data/test/ft_23d_cww.rb +58 -0
  172. data/test/ft_24_def.rb +44 -0
  173. data/test/ft_25_cancel.rb +89 -0
  174. data/test/ft_27_getflowpos.rb +147 -0
  175. data/test/ft_28_fileparticipant.rb +63 -0
  176. data/test/ft_29_httprb.rb +106 -0
  177. data/test/ft_2_concurrence.rb +135 -0
  178. data/test/ft_2b_concurrence.rb +188 -0
  179. data/test/ft_2c_concurrence.rb +64 -0
  180. data/test/ft_30_socketlistener.rb +203 -0
  181. data/test/ft_31_flowname.rb +40 -0
  182. data/test/ft_32_journal.rb +91 -0
  183. data/test/ft_32c_journal.rb +102 -0
  184. data/test/ft_32d_journal.rb +84 -0
  185. data/test/ft_33_description.rb +107 -0
  186. data/test/ft_34_cancelwfid.rb +80 -0
  187. data/test/ft_35_localdefs.rb +75 -0
  188. data/test/ft_36_subprocids.rb +97 -0
  189. data/test/ft_37_pnames.rb +70 -0
  190. data/test/ft_38_tag.rb +127 -0
  191. data/test/ft_38b_tag.rb +161 -0
  192. data/test/ft_38c_tag.rb +100 -0
  193. data/test/ft_39_reserve.rb +63 -0
  194. data/test/ft_39b_reserve.rb +84 -0
  195. data/test/ft_3_equals.rb +170 -0
  196. data/test/ft_3b_lookup_vf.rb +83 -0
  197. data/test/ft_40_defined.rb +61 -0
  198. data/test/ft_41_case.rb +110 -0
  199. data/test/ft_42_environments.rb +75 -0
  200. data/test/ft_43_pat10.rb +85 -0
  201. data/test/ft_44_save.rb +70 -0
  202. data/test/ft_44b_restore.rb +212 -0
  203. data/test/ft_45_citerator.rb +214 -0
  204. data/test/ft_46_pparams.rb +62 -0
  205. data/test/ft_47_filter.rb +160 -0
  206. data/test/ft_48_fe_filter.rb +88 -0
  207. data/test/ft_49_condition.rb +126 -0
  208. data/test/ft_4_misc.rb +237 -0
  209. data/test/ft_50_xml_attribute.rb +155 -0
  210. data/test/ft_51_stack.rb +55 -0
  211. data/test/ft_52_obs_participant.rb +123 -0
  212. data/test/ft_53_null_noop_participant.rb +62 -0
  213. data/test/ft_54_listen.rb +288 -0
  214. data/test/ft_54b_listen.rb +66 -0
  215. data/test/ft_54c_listen.rb +99 -0
  216. data/test/ft_55_ptimeout.rb +59 -0
  217. data/test/ft_56_timeout.rb +59 -0
  218. data/test/ft_57_a.rb +145 -0
  219. data/test/ft_58_ejournal.rb +151 -0
  220. data/test/ft_59_ps.rb +150 -0
  221. data/test/ft_59b_ps_for_pat.rb +58 -0
  222. data/test/ft_5_time.rb +118 -0
  223. data/test/ft_60_ecancel.rb +161 -0
  224. data/test/ft_61_elsub.rb +51 -0
  225. data/test/ft_62_procparticipant.rb +71 -0
  226. data/test/ft_63_pause.rb +124 -0
  227. data/test/ft_64_alias.rb +102 -0
  228. data/test/ft_64_clone.rb +69 -0
  229. data/test/ft_65_stringlaunch.rb +59 -0
  230. data/test/ft_66_subforget.rb +70 -0
  231. data/test/ft_67_schedlaunch.rb +116 -0
  232. data/test/ft_68_ifparticipant.rb +70 -0
  233. data/test/ft_69_cancelmissing.rb +51 -0
  234. data/test/ft_6_lambda.rb +64 -0
  235. data/test/ft_70_lookupvar.rb +55 -0
  236. data/test/ft_71_log.rb +60 -0
  237. data/test/ft_72_lookup_processes.rb +76 -0
  238. data/test/ft_73_cancel_sub.rb +139 -0
  239. data/test/ft_74_block_and_workitem_dup.rb +63 -0
  240. data/test/ft_75_ruby_attributes.rb +87 -0
  241. data/test/ft_76_merge_isolate.rb +88 -0
  242. data/test/ft_77_segments.rb +35 -0
  243. data/test/ft_78_eval.rb +150 -0
  244. data/test/ft_79_tticket.rb +187 -0
  245. data/test/ft_79b_tticket.rb +172 -0
  246. data/test/ft_79c_outcome.rb +56 -0
  247. data/test/ft_7_lose.rb +104 -0
  248. data/test/ft_7b_lose.rb +78 -0
  249. data/test/ft_80_spname.rb +91 -0
  250. data/test/ft_81_exp.rb +60 -0
  251. data/test/ft_82_trecu.rb +46 -0
  252. data/test/ft_83_badpause.rb +58 -0
  253. data/test/ft_84_updateexp.rb +198 -0
  254. data/test/ft_85_dolhash.rb +43 -0
  255. data/test/ft_86_dollar_fv.rb +68 -0
  256. data/test/ft_87_define.rb +74 -0
  257. data/test/ft_8_forget.rb +44 -0
  258. data/test/ft_9_cursor.rb +145 -0
  259. data/test/ft_9b_cursor.rb +105 -0
  260. data/test/ft_tests.rb +124 -0
  261. data/test/hash_test.rb +75 -0
  262. data/test/hparticipant_test.rb +164 -0
  263. data/test/lookup_att_test.rb +90 -0
  264. data/test/lookup_vf_test.rb +94 -0
  265. data/test/misc_test.rb +90 -0
  266. data/test/nut_0_irb.rb +20 -0
  267. data/test/obs_test.rb +142 -0
  268. data/test/orest_test.rb +251 -0
  269. data/test/param_test.rb +290 -0
  270. data/test/participant_test.rb +101 -0
  271. data/test/pending.rb +23 -0
  272. data/test/ps_representation.rb +133 -0
  273. data/test/rake_ltest.rb +38 -0
  274. data/test/rake_qtest.rb +68 -0
  275. data/test/raw_prog_test.rb +412 -0
  276. data/test/restart_cron_test.rb +136 -0
  277. data/test/restart_paused_test.rb +98 -0
  278. data/test/restart_sleep_test.rb +140 -0
  279. data/test/restart_tests.rb +18 -0
  280. data/test/restart_when_test.rb +112 -0
  281. data/test/ruby_procdef_test.rb +132 -0
  282. data/test/rutest_utils.rb +63 -0
  283. data/test/sec_test.rb +205 -0
  284. data/test/slock_test.rb +80 -0
  285. data/test/storage_test.rb +44 -0
  286. data/test/test.rb +3 -0
  287. data/test/timeout_test.rb +105 -0
  288. data/test/util_xml_test.rb +112 -0
  289. data/test/wfid_test.rb +175 -0
  290. data/test/wi_test.rb +75 -0
  291. metadata +433 -0
@@ -0,0 +1,111 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
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
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
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
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'openwfe/expressions/flowexpression'
41
+
42
+
43
+ module OpenWFE
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
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
88
+
89
+ names :forget
90
+
91
+ def apply (workitem)
92
+
93
+ if (@children and @children.length > 0)
94
+
95
+ wi = workitem.dup
96
+
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
+
105
+ def reply (workitem)
106
+ # never gets called
107
+ end
108
+ end
109
+
110
+ end
111
+
@@ -0,0 +1,421 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
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
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
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
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'rufus/eval'
41
+ require 'openwfe/expressions/flowexpression'
42
+ require 'openwfe/expressions/value'
43
+
44
+
45
+ module OpenWFE
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
63
+
64
+ is_definition
65
+
66
+ names :description
67
+
68
+ DESC = 'description'
69
+
70
+
71
+ def reply (workitem)
72
+
73
+ lang =
74
+ lookup_attribute(:lang, workitem) ||
75
+ lookup_attribute(:language, workitem)
76
+
77
+ vname = DESC
78
+ vname += "__#{lang}" if lang
79
+
80
+ text = lookup_attribute('text', workitem) || workitem.get_result
81
+
82
+ set_variable(vname, text)
83
+ set_variable(DESC, text) unless lookup_variable(DESC)
84
+ # set default if not set
85
+
86
+ reply_to_parent workitem
87
+ 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
130
+ end
131
+ 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
208
+ end
209
+
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
262
+
263
+ def build_raw_expression (df)
264
+
265
+ procdf = get_expression_pool.determine_rep df
266
+
267
+ RawExpression.new_raw(
268
+ fei, parent_id, environment_id, application_context, procdf)
269
+ end
270
+ end
271
+
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
372
+ end
373
+
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
418
+ end
419
+
420
+ end
421
+