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,166 @@
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/otime'
41
+ require 'openwfe/expressions/time'
42
+
43
+
44
+ module OpenWFE
45
+
46
+ #
47
+ # The 'sleep' expression expects one attribute, either 'for', either
48
+ # 'until'.
49
+ #
50
+ # <sequence>
51
+ # <sleep for="10m12s" />
52
+ # <participant ref="alpha" />
53
+ # </sequence>
54
+ #
55
+ # will wait for 10 minutes and 12 seconds before sending a workitem
56
+ # to participant 'alpha'.
57
+ #
58
+ # In a Ruby process definition, that might look like :
59
+ #
60
+ # sleep :for => "3m"
61
+ # sleep "3m"
62
+ # #
63
+ # # both meaning 'sleep for 3 minutes'
64
+ #
65
+ # sleep :until => "Mon Dec 03 10:41:58 +0900 2007"
66
+ # #
67
+ # # sleep until the given point in time
68
+ #
69
+ # If the 'until' attribute points to a time in the past, the sleep
70
+ # expression will simply let the process resume.
71
+ #
72
+ #
73
+ class SleepExpression < TimeExpression
74
+
75
+ names :sleep
76
+
77
+ attr_accessor :awakening_time
78
+
79
+ def apply (workitem)
80
+
81
+ sfor = lookup_string_attribute(:for, workitem)
82
+ suntil = lookup_string_attribute(:until, workitem)
83
+
84
+ sfor = fetch_text_content(workitem) \
85
+ if sfor == nil and suntil == nil
86
+
87
+ #ldebug { "apply() sfor is '#{sfor}'" }
88
+ #ldebug { "apply() suntil is '#{suntil}'" }
89
+
90
+ tuntil = nil
91
+
92
+ if suntil
93
+
94
+ tuntil = suntil
95
+
96
+ elsif sfor
97
+
98
+ tfor = Rufus::parse_time_string(sfor)
99
+ #ldebug { "apply() tfor is '#{tfor}'" }
100
+ tuntil = Time.new.to_f + tfor
101
+ end
102
+
103
+ #ldebug { "apply() tuntil is '#{tuntil}'" }
104
+
105
+ return reply_to_parent(workitem) \
106
+ if not tuntil
107
+
108
+ @awakening_time = tuntil
109
+ @applied_workitem = workitem.dup
110
+
111
+ determine_scheduler_tags
112
+
113
+ reschedule(get_scheduler)
114
+ end
115
+
116
+ #
117
+ # This is the method called by the Scheduler instance attached to
118
+ # the workflow engine when the 'sleep' of this expression is
119
+ # over
120
+ #
121
+ def trigger (params)
122
+
123
+ ldebug do
124
+ "trigger() #{@fei.to_debug_s} waking up (#{Time.new.to_f}) "+
125
+ "(scheduler #{get_scheduler.object_id})"
126
+ end
127
+
128
+ reply_to_parent(@applied_workitem)
129
+ end
130
+
131
+ #
132
+ # [Re]schedules this expression, effectively registering it within
133
+ # the scheduler.
134
+ # This method is called when the expression is applied and each
135
+ # time the owning engine restarts.
136
+ #
137
+ def reschedule (scheduler)
138
+
139
+ return unless @awakening_time
140
+
141
+ ldebug do
142
+ "[re]schedule() " +
143
+ "will sleep until '#{@awakening_time}' " +
144
+ "(#{Rufus::to_iso8601_date(@awakening_time)})"
145
+ end
146
+
147
+ @scheduler_job_id = "sleep_#{self.fei.to_s}"
148
+
149
+ scheduler.schedule_at(
150
+ @awakening_time,
151
+ {
152
+ :schedulable => self,
153
+ :job_id => @scheduler_job_id,
154
+ :tags => @scheduler_tags })
155
+
156
+ ldebug do
157
+ "[re]schedule() @scheduler_job_id is '#{@scheduler_job_id}' "+
158
+ " (scheduler #{scheduler.object_id})"
159
+ end
160
+
161
+ store_itself
162
+ end
163
+ end
164
+
165
+ end
166
+
@@ -0,0 +1,159 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 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 takes its root in this "trouble ticket blog post" :
47
+ #
48
+ # http://jmettraux.wordpress.com/2008/01/04/the-trouble-ticket-process/
49
+ #
50
+ # In this post, the "step" was implemented directly in the OpenWFEru
51
+ # process definition language.
52
+ #
53
+ # It's been turned into an expression and it's not limited anymore to
54
+ # the concept "state is a participant, transition points to a subprocess",
55
+ # state can now point to a subprocess as well as to a participant, idem
56
+ # for a transition.
57
+ #
58
+ # In other words, this "step" expression allows you to write
59
+ # state-transition process definitions in OpenWFEru (the Ruote workflow
60
+ # engine). But don't abuse it. Classical OpenWFEru constructs can
61
+ # do most of the job.
62
+ #
63
+ # An interesting aspect of the "step" expression is that it can remove
64
+ # the need for some "if" expression constructs (well the fact
65
+ #
66
+ # class ProcDef0 < OpenWFE::ProcessDefinition
67
+ #
68
+ # sequence do
69
+ #
70
+ # step "Alfred", :outcomes => [ 'blue_pen', 'red_pen' ]
71
+ # # Alfred gets to choose between a blue pen and a red pen
72
+ #
73
+ # participant "Bob"
74
+ # # flow resumes with Bob in a classical way (sequence)
75
+ # end
76
+ #
77
+ # define "blue_pen" do
78
+ # # ... Alfred buying a blue pen
79
+ # end
80
+ # define "red_pen" do
81
+ # # ... Alfred buying a red pen
82
+ # end
83
+ # end
84
+ #
85
+ # in XML it would look like :
86
+ #
87
+ # <sequence>
88
+ # <step ref="Alfred" outcomes="blue_pen, red_pen" />
89
+ # <participant ref="Bob" />
90
+ # </sequence>
91
+ #
92
+ # You can specify a default outcome (else if the outcome doesn't correspond
93
+ # to a participant or a subprocess, the flow will cease) :
94
+ #
95
+ # <step ref="toto" outcomes="left, right" default="right" />
96
+ #
97
+ # For some more discussions about Ruote and state-transition see
98
+ #
99
+ # http://groups.google.com/group/openwferu-dev/t/16e713c1313cb2fa
100
+ #
101
+ class StepExpression < FlowExpression
102
+
103
+ names :step
104
+
105
+ attr_accessor :outcomes
106
+ attr_accessor :default
107
+
108
+
109
+ def apply (workitem)
110
+
111
+ step = lookup_attribute(:ref, workitem) || @children.first
112
+
113
+ # keeping track of outcomes and default as found at apply time
114
+
115
+ @outcomes = lookup_array_attribute(
116
+ :outcomes, workitem, :to_s => true)
117
+
118
+ @default = lookup_attribute(
119
+ :default, workitem, :to_s => true)
120
+
121
+ store_itself
122
+
123
+ # launching the 'step' itself
124
+
125
+ template = [
126
+ step.to_s, # expression name
127
+ lookup_attributes(workitem), # attributes
128
+ [], # children
129
+ ]
130
+
131
+ get_expression_pool.tlaunch_child(
132
+ self, template, 0, workitem, true) #, vars=nil
133
+ end
134
+
135
+ def reply (workitem)
136
+
137
+ outcome = workitem.fields.delete 'outcome'
138
+ outcome = outcome.to_s if outcome
139
+
140
+ #p [ outcome, @outcomes, @default ]
141
+
142
+ outcome = @default \
143
+ if @outcomes and (not @outcomes.include?(outcome))
144
+
145
+ return reply_to_parent(workitem) \
146
+ unless outcome
147
+
148
+ template = [
149
+ outcome.to_s, # expression name
150
+ {}, # attributes
151
+ [], # children
152
+ ]
153
+
154
+ get_expression_pool.substitute_and_apply self, template, workitem
155
+ end
156
+ end
157
+
158
+ end
159
+
@@ -0,0 +1,168 @@
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/utils'
41
+
42
+
43
+ module OpenWFE
44
+
45
+ #
46
+ # This expression is used to launch/call a subprocess.
47
+ #
48
+ # For example :
49
+ #
50
+ # <process-definition name="subtest0" revision="0">
51
+ # <sequence>
52
+ # <subprocess ref="sub0" a="A" b="B" c="C" />
53
+ # <sub0 a="A" b="B" c="C" />
54
+ # </sequence>
55
+ #
56
+ # <process-definition name="sub0">
57
+ # <print>${a}${b}${c}</print>
58
+ # </process-definition>
59
+ #
60
+ # </process-definition>
61
+ #
62
+ # It's totally OK to have URLs as referenced processes :
63
+ #
64
+ # require 'openwfe/def'
65
+ #
66
+ # class AnotherDefinition0 < OpenWFE::ProcessDefinition
67
+ # sequence do
68
+ # participant :ref => "toto"
69
+ # subprocess :ref => "http://company.process.server/def0.rb"
70
+ # end
71
+ # end
72
+ #
73
+ # (but the engine parameter :remove_definitions_allowed must be set to true,
74
+ # as it's dangerous to fetch process definitions from other [untrusted]
75
+ # hosts)
76
+ #
77
+ # The 'subprocess' expression accepts a 'forget' attribute :
78
+ #
79
+ # class AnotherDefinition1 < OpenWFE::ProcessDefinition
80
+ # sequence do
81
+ # subprocess :ref => "my_subprocess", :forget => true
82
+ # participant :ref => "ringo"
83
+ # end
84
+ # process-definition :name => "my_subprocess" do
85
+ # participant :ref => "fake steve jobs"
86
+ # end
87
+ # end
88
+ #
89
+ # The 'subprocess' expression accepts an 'if' (or 'unless') attribute :
90
+ #
91
+ # subprocess :ref => "interview_process", :if => "${f:screened}"
92
+ # # will trigger the subprocess only if the field screened
93
+ # # contains the string 'true' or the boolean 'true'
94
+ #
95
+ # interview_process :if => "${f:screened}"
96
+ # # idem
97
+ #
98
+ # interview_process :unless => "${f:has_had_problem_with_justice_?}"
99
+ # # well...
100
+ #
101
+ class SubProcessRefExpression < FlowExpression
102
+ include ConditionMixin
103
+
104
+ names :subprocess
105
+
106
+ attr_accessor :subprocess_fei
107
+
108
+
109
+ def apply (workitem)
110
+
111
+ conditional = eval_condition(:if, workitem, :unless)
112
+
113
+ return reply_to_parent(workitem) \
114
+ if conditional == false
115
+
116
+ ref = lookup_ref workitem
117
+
118
+ raise "'subprocess' expression misses a 'ref', 'field-ref' or 'variable-ref' attribute" unless ref
119
+
120
+ template_uri = OpenWFE::parse_known_uri ref
121
+
122
+ template = template_uri || lookup_variable(ref)
123
+
124
+ raise "did not find any subprocess named '#{ref}'" \
125
+ if not template
126
+
127
+ forget = lookup_boolean_attribute :forget, workitem
128
+
129
+ params = lookup_attributes workitem
130
+
131
+ text = fetch_text_content workitem, false
132
+ params["0"] = text if text
133
+
134
+ #puts
135
+ #puts " ... params are #{params.keys.join(', ')}"
136
+ #puts " ... values are #{params.values.join(', ')}"
137
+
138
+ #requester = if forget
139
+ # @fei.workflow_instance_id
140
+ #else
141
+ # @fei
142
+ #end
143
+ #sub_fei = get_expression_pool.launch_template(
144
+ # requester, nil, get_next_sub_id, template, workitem, params)
145
+
146
+ sub_fei = get_expression_pool.launch_subprocess(
147
+ self, template, forget, workitem, params)
148
+
149
+ if forget
150
+ reply_to_parent workitem.dup
151
+ else
152
+ @subprocess_fei = sub_fei.dup
153
+ store_itself # to keep track of @subprocess_fei
154
+ end
155
+ end
156
+
157
+ #
158
+ # Takes care of cancelling the subprocess as well if any
159
+ #
160
+ def cancel
161
+
162
+ return nil unless @subprocess_fei
163
+ get_expression_pool.cancel @subprocess_fei
164
+ end
165
+ end
166
+
167
+ end
168
+