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,274 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2007-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/workitem'
41
+ require 'openwfe/expressions/merge'
42
+
43
+
44
+ #
45
+ # save and restore
46
+ #
47
+
48
+ module OpenWFE
49
+
50
+ #
51
+ # Saves a copy of the current workitem to a variable or saves the
52
+ # attributes of the current workitem into a field (of that current
53
+ # workitem).
54
+ #
55
+ # save :to_variable => "/wix"
56
+ # #
57
+ # # saves a copy of the current workitem to the process
58
+ # # level variable "wix"
59
+ #
60
+ # save :to_field => "old_version"
61
+ # #
62
+ # # saves a copy of the current workitem attributes in the
63
+ # # field 'old_version' of that current workitem.
64
+ #
65
+ # 'save' is often used in conjuntion with 'restore'
66
+ # (RestoreWorkItemExpression).
67
+ #
68
+ class SaveWorkItemExpression < FlowExpression
69
+
70
+ names :save
71
+
72
+ def apply (workitem)
73
+
74
+ field = lookup_string_attribute :to_field, workitem
75
+ variable = lookup_string_attribute :to_variable, workitem
76
+
77
+ wi = workitem.dup
78
+
79
+ if field
80
+
81
+ workitem.set_attribute field, wi.attributes
82
+
83
+ elsif variable
84
+
85
+ set_variable variable, wi
86
+ end
87
+
88
+ # else, simply don't save
89
+
90
+ reply_to_parent workitem
91
+ end
92
+ end
93
+
94
+ #
95
+ # "restore" is often used in conjunction with "save"
96
+ # (SaveWorkItemExpression).
97
+ #
98
+ # It can restore a workitem saved to a variable (it will actually
99
+ # restore the payload of that workitem) or transfer the content of a field
100
+ # as top attribute field.
101
+ #
102
+ # restore :from_variable => "freezed_workitem"
103
+ # #
104
+ # # takes the freezed payload at 'freezed_workitem' and makes it
105
+ # # the payload of the current workitem
106
+ #
107
+ # restore :from_field => "some_data"
108
+ # #
109
+ # # replaces the payload of the current workitem with the hash
110
+ # # found in the field "some_data"
111
+ #
112
+ # restore :from_variable => "v", :to_field => "f"
113
+ # #
114
+ # # will copy the payload saved under variable "v" as the value
115
+ # # of the field "f"
116
+ #
117
+ # restore :from_variable => "v", :merge_lead => :current
118
+ # #
119
+ # # will restore the payload of the workitem saved under v
120
+ # # but if fields of v are already present in the current workitem
121
+ # # the current values will be kept
122
+ #
123
+ # restore :from_variable => "v", :merge_lead => :restored
124
+ # #
125
+ # # will restore the payload of the workitem saved under v
126
+ # # but the workitem v payload will have priority.
127
+ #
128
+ # Beware : you should not restore from a field that is not a hash. The
129
+ # top level attributes (payload) of a workitem should always be a hash.
130
+ #
131
+ # Since OpenWFEru 0.9.17, the 'set-fields' alias can be used for restore.
132
+ #
133
+ # sequence do
134
+ # set_fields :value => {
135
+ # "customer" => { "name" => "Zigue", "age" => 34 },
136
+ # "approved" => false }
137
+ # _print "${f:customer.name} (${f:customer.age}) ${f:approved}"
138
+ # end
139
+ #
140
+ # Along with this new alias, the expression now behave much like the 'set'
141
+ # expression, but still, targets the whole workitem payload.
142
+ #
143
+ # Note that "set-fields" can be used outside of the body of a process
144
+ # definition (along with "set") to separate 'data preparation' from
145
+ # actual process definition.
146
+ #
147
+ # class Test44b6 < ProcessDefinition
148
+ # set_fields :value => {
149
+ # "customer" => { "name" => "Zigue", "age" => 34 },
150
+ # "approved" => false }
151
+ # sequence do
152
+ # _print "${f:customer.name} (${f:customer.age}) ${f:approved}"
153
+ # end
154
+ # end
155
+ #
156
+ # Using set_fields at the beginning of a process can be useful for setting
157
+ # up forms (keys without values for now).
158
+ #
159
+ # set_fields :value => {
160
+ # "name" => "",
161
+ # "address" => "",
162
+ # "email" => ""
163
+ # }
164
+ #
165
+ class RestoreWorkItemExpression < FlowExpression
166
+ include MergeMixin
167
+ include ValueMixin
168
+
169
+ names :restore, :set_fields
170
+
171
+ is_definition
172
+ # so that in can be placed outside of process definition bodies
173
+
174
+
175
+ def reply (workitem)
176
+
177
+ from_field = lookup_string_attribute :from_field, workitem
178
+ from_variable = lookup_string_attribute :from_variable, workitem
179
+
180
+ merge_lead = lookup_sym_attribute :merge_lead, workitem
181
+
182
+ merge_lead = nil \
183
+ unless [ nil, :current, :restored ].include?(merge_lead)
184
+
185
+ value = workitem.attributes[FIELD_RESULT]
186
+
187
+ source = if from_field
188
+
189
+ att = workitem.lookup_attribute from_field
190
+
191
+ lwarn {
192
+ "apply() field '#{from_field}' is NOT a hash, " +
193
+ "restored anyway"
194
+ } unless att.kind_of?(Hash)
195
+
196
+ att
197
+
198
+ elsif from_variable
199
+
200
+ lookup_variable from_variable
201
+
202
+ elsif value
203
+
204
+ value
205
+
206
+ else
207
+
208
+ nil
209
+ end
210
+
211
+ if source
212
+
213
+ workitem = if merge_lead
214
+ do_merge merge_lead, workitem, source
215
+ else
216
+ do_overwrite workitem, source
217
+ end
218
+ end
219
+ # else, don't restore anything
220
+
221
+ reply_to_parent workitem
222
+ end
223
+
224
+ protected
225
+
226
+ #
227
+ # The default case, restored values simply overwrite current
228
+ # values.
229
+ #
230
+ def do_overwrite (workitem, source)
231
+
232
+ return workitem unless source
233
+
234
+ attributes = if source.kind_of?(WorkItem)
235
+ OpenWFE::fulldup source.attributes
236
+ else
237
+ source
238
+ end
239
+
240
+ to_field = lookup_string_attribute :to_field, workitem
241
+
242
+ if to_field
243
+ workitem.set_attribute to_field, attributes
244
+ else
245
+ workitem.attributes = attributes
246
+ end
247
+
248
+ workitem
249
+ end
250
+
251
+ #
252
+ # If the attribute 'merge-lead' (or 'merge_lead') is specified,
253
+ # the workitems get merged.
254
+ #
255
+ def do_merge (merge_lead, workitem, source)
256
+
257
+ if source.kind_of?(Hash)
258
+ wi = InFlowWorkItem.new
259
+ wi.attributes = source
260
+ source = wi
261
+ end
262
+
263
+ wiTarget, wiSource = if merge_lead == :current
264
+ [ source, workitem ]
265
+ else
266
+ [ workitem, source ]
267
+ end
268
+
269
+ merge_workitems wiTarget, wiSource
270
+ end
271
+ end
272
+
273
+ end
274
+
@@ -0,0 +1,117 @@
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
+ # This expression sequentially executes each of its children expression.
47
+ # For a more sophisticated version of it, see the 'cursor' expression
48
+ # (fe_cursor.rb).
49
+ #
50
+ # <sequence>
51
+ # <participant ref="alice" />
52
+ # <participant ref="service_b" />
53
+ # </sequence>
54
+ #
55
+ # In a Ruby process definition, it looks like :
56
+ #
57
+ # sequence do
58
+ # participant "alice"
59
+ # participant "service_b"
60
+ # end
61
+ #
62
+ class SequenceExpression < FlowExpression
63
+
64
+ names :sequence
65
+
66
+
67
+ def apply (workitem)
68
+
69
+ reply workitem
70
+ end
71
+
72
+ def reply (workitem)
73
+
74
+ cfei = next_child workitem.fei
75
+
76
+ return reply_to_parent(workitem) \
77
+ unless cfei
78
+
79
+ #ldebug do
80
+ # "reply() self : \n#{self.to_s}\n" +
81
+ # "reply() next is #{@current_child_id} : #{cfei.to_debug_s}"
82
+ #end
83
+
84
+ get_expression_pool.apply cfei, workitem
85
+ end
86
+
87
+ protected
88
+
89
+ #
90
+ # Returns the flowExpressionId of the next child to apply, or
91
+ # nil if the sequence is over.
92
+ #
93
+ def next_child (current_fei)
94
+
95
+ next_id = if (current_fei == self.fei)
96
+ 0
97
+ else
98
+ @children.index(current_fei) + 1
99
+ end
100
+
101
+ loop do
102
+
103
+ break if next_id >= @children.length
104
+
105
+ child = @children[next_id]
106
+
107
+ return child if child.is_a?(FlowExpressionId)
108
+
109
+ next_id += 1
110
+ end
111
+
112
+ nil
113
+ end
114
+ end
115
+
116
+ end
117
+
@@ -0,0 +1,139 @@
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/workitem'
41
+ require 'openwfe/flowexpressionid'
42
+ require 'openwfe/expressions/flowexpression'
43
+ require 'openwfe/expressions/value'
44
+
45
+
46
+ module OpenWFE
47
+
48
+ #
49
+ # The 'set' expression is used to set the value of a (process) variable or
50
+ # a (workitem) field.
51
+ #
52
+ # <set field="price" value="CHF 12.00" />
53
+ # <set variable="/stage" value="3" />
54
+ # <set variable="/stage" field-value="f_stage" />
55
+ # <set field="stamp" value="${r:Time.now.to_i}" />
56
+ #
57
+ # (Notice the usage of the dollar notation in the last exemple).
58
+ #
59
+ # 'set' expressions may be placed outside of a process-definition body,
60
+ # they will be evaluated sequentially before the body gets applied
61
+ # (executed).
62
+ #
63
+ # Shorter attributes are OK :
64
+ #
65
+ # <set f="price" val="CHF 12.00" />
66
+ # <set v="/stage" val="3" />
67
+ # <set v="/stage" field-val="f_stage" />
68
+ # <set f="stamp" val="${r:Time.now.to_i}" />
69
+ #
70
+ # set :f => "price", :val => "USD 12.50"
71
+ # set :v => "toto", :val => "elvis"
72
+ #
73
+ # In case you need the value not to be evaluated if it contains
74
+ # dollar expressions, you can do
75
+ #
76
+ # set :v => "v0", :val => "my ${template} thing", :escape => true
77
+ #
78
+ # to prevent evaluation (i.e. to escape).
79
+ #
80
+ class SetValueExpression < FlowExpression
81
+ include ValueMixin
82
+
83
+ is_definition
84
+
85
+ names :set
86
+
87
+
88
+ def reply (workitem)
89
+
90
+ vkey = lookup_variable_attribute(workitem)
91
+ fkey = lookup_field_attribute(workitem)
92
+
93
+ value = workitem.attributes[FIELD_RESULT]
94
+
95
+ #puts "value is '#{value}'"
96
+
97
+ if vkey
98
+ set_variable vkey, value
99
+ elsif fkey
100
+ workitem.set_attribute fkey, value
101
+ else
102
+ raise "'variable' or 'field' attribute missing from 'set' expression"
103
+ end
104
+
105
+ reply_to_parent(workitem)
106
+ end
107
+ end
108
+
109
+ #
110
+ # 'unset' removes a field or a variable.
111
+ #
112
+ # unset :field => "price"
113
+ # unset :variable => "eval_result"
114
+ #
115
+ class UnsetValueExpression < FlowExpression
116
+ include ValueMixin
117
+
118
+ names :unset
119
+
120
+
121
+ def apply (workitem)
122
+
123
+ vkey = lookup_variable_attribute(workitem)
124
+ fkey = lookup_field_attribute(workitem)
125
+
126
+ if vkey
127
+ delete_variable(vkey)
128
+ elsif fkey
129
+ workitem.unset_attribute fkey
130
+ else
131
+ raise "attribute 'variable' or 'field' is missing for 'unset' expression"
132
+ end
133
+
134
+ reply_to_parent workitem
135
+ end
136
+ end
137
+
138
+ end
139
+