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,259 @@
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
+ require 'openwfe/expressions/time'
42
+
43
+
44
+ module OpenWFE
45
+
46
+ #
47
+ # Scheduling subprocesses for repeating execution
48
+ #
49
+ # <cron tab="0 9-17 * * mon-fri">
50
+ # <send-reminder/>
51
+ # </cron>
52
+ #
53
+ # In this short process definition snippet, the subprocess "send-reminder"
54
+ # will get triggered once per hour (minute 0) from 0900 to 1700 and
55
+ # this, from monday to friday.
56
+ #
57
+ # It's possible to specify 'every' instead of 'tab' :
58
+ #
59
+ # cron :every => "10m3s" do
60
+ # send_reminder
61
+ # end
62
+ #
63
+ # The subprocess 'send_reminder' will thus be triggered every ten minutes
64
+ # and three seconds.
65
+ #
66
+ # The cron expression never replies [to its parent expression].
67
+ # The classical usage for it is with a concurrence set to expect only
68
+ # one reply :
69
+ #
70
+ # concurrence :count => 1 do
71
+ # participant :toto
72
+ # cron :every => "10m" do
73
+ # send_reminder_email :target => "toto@headlost.org.uk"
74
+ # end
75
+ # end
76
+ #
77
+ # The sub process 'send_reminder_email' will thus be triggered every 10
78
+ # minutes while concurrence is waiting for the answer (reply) of the
79
+ # participant :toto.
80
+ #
81
+ # If the process instance containing a cron is paused, the cron won't get
82
+ # triggered until the process is resumed.
83
+ #
84
+ class CronExpression < TimeExpression
85
+
86
+ names :cron
87
+
88
+ uses_template
89
+
90
+ #++
91
+ # keeping a copy of the child expression (this copy is used
92
+ # for spawning a new expression each time cron triggers)
93
+ #
94
+ #attr_accessor :raw_child
95
+ #--
96
+
97
+ #
98
+ # The cron 'tab', something like "0 9-17 * * mon-fri"
99
+ #
100
+ attr_accessor :tab
101
+
102
+ #
103
+ # If 'tab' is not, then 'every' should, the expression will trigger
104
+ # at the frequency specified here (like for example "10m3s).
105
+ #
106
+ attr_accessor :every
107
+
108
+ #
109
+ # Keeping track of how many times the cron fired.
110
+ #
111
+ attr_accessor :counter
112
+
113
+ #--
114
+ #attr_accessor :name
115
+ #attr_accessor :engine_cron
116
+ #++
117
+
118
+
119
+ def apply (workitem)
120
+
121
+ return reply_to_parent(workitem) \
122
+ if raw_children.size < 1
123
+
124
+ @counter = 0
125
+ #@engine_cron = false
126
+
127
+ @applied_workitem = workitem.dup
128
+ @applied_workitem.flow_expression_id = nil
129
+
130
+ @tab = lookup_attribute :tab, workitem
131
+ @every = lookup_attribute :every, workitem
132
+
133
+ #@name = lookup_attribute :name, workitem
134
+ #@name = fei.to_s unless @name
135
+
136
+ #if @name[0, 2] == '//'
137
+ # @name = @name[1..-1]
138
+ # @engine_cron = true
139
+ #end
140
+
141
+ #forget = lookup_boolean_attribute :forget, workitem
142
+
143
+ #@raw_child, _fei = get_expression_pool.fetch @children[0]
144
+ #@raw_child.parent_id = nil
145
+ #clean_children
146
+ #@children = nil
147
+
148
+ determine_scheduler_tags
149
+
150
+ #
151
+ # schedule self
152
+
153
+ reschedule get_scheduler
154
+
155
+ #
156
+ # store self as a variable
157
+ # (have to do it after the reschedule, so that the schedule
158
+ # info is stored within the variable (within self))
159
+
160
+ #set_variable @name, self
161
+ #set_variable @name, @fei
162
+
163
+ #
164
+ # resume flow (if not a engine level cron)
165
+
166
+ #reply_to_parent(workitem) unless @engine_cron
167
+ #reply_to_parent(workitem) if forget
168
+ end
169
+
170
+ def reply (workitem)
171
+ # discard silently... should never get called though
172
+ end
173
+
174
+ #
175
+ # This is the method called each time the scheduler triggers
176
+ # this cron. The contained segment of process will get
177
+ # executed.
178
+ #
179
+ def trigger (params)
180
+
181
+ return if paused?
182
+
183
+ ldebug { "trigger() cron : #{@fei.to_debug_s}" }
184
+
185
+ #@raw_child.application_context = @application_context
186
+ # done in expool.launch_template()
187
+
188
+ begin
189
+
190
+ #template = @raw_child
191
+ #template, _fei = get_expression_pool.fetch @children[0]
192
+ template = raw_children.first
193
+
194
+ #get_expression_pool.launch_template(
195
+ # @fei.wfid, nil, @counter, template, @applied_workitem.dup)
196
+ child_fei = get_expression_pool.tlaunch_child(
197
+ self, template, @counter, @applied_workitem.dup, false)
198
+ #
199
+ # register_child is set to false, cron doesn't keep
200
+ # track of its spawned children
201
+
202
+ #
203
+ # update count and store self
204
+
205
+ @counter += 1
206
+
207
+ #if is_engine_cron?
208
+ # set_variable @name, self
209
+ #else
210
+ # store_itself
211
+ #end
212
+ store_itself
213
+
214
+ rescue
215
+
216
+ lerror do
217
+ "trigger() cron caught exception\n"+
218
+ OpenWFE::exception_to_s($!)
219
+ end
220
+ end
221
+ end
222
+
223
+ #
224
+ # This method is called at the first schedule of this expression
225
+ # or each time the engine is restarted and this expression has
226
+ # to be rescheduled.
227
+ #
228
+ def reschedule (scheduler)
229
+
230
+ #return unless @applied_workitem
231
+
232
+ #@scheduler_job_id = if @engine_cron
233
+ # "/" + @name
234
+ #else
235
+ # "#{@fei.wfid}__#{@scheduler_job_id}"
236
+ #end
237
+ @scheduler_job_id = "#{@fei.wfid}__#{@scheduler_job_id}"
238
+
239
+ method, arg0 = if @tab
240
+ [ :schedule, @tab ]
241
+ else
242
+ [ :schedule_every, @every ]
243
+ end
244
+
245
+ get_scheduler.send(
246
+ method,
247
+ arg0,
248
+ {
249
+ :schedulable => self,
250
+ :job_id => @scheduler_job_id,
251
+ :tags => @scheduler_tags })
252
+
253
+ #ldebug { "reschedule() name is '#{@name}'" }
254
+ ldebug { "reschedule() job id is '#{@scheduler_job_id}'" }
255
+ end
256
+ end
257
+
258
+ end
259
+
@@ -0,0 +1,259 @@
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/expressions/condition'
41
+ require 'openwfe/expressions/flowexpression'
42
+ require 'openwfe/expressions/fe_command'
43
+
44
+
45
+ module OpenWFE
46
+
47
+ #
48
+ # The 'cursor' is much like a sequence, but you can go
49
+ # back and forth within it, as it reads the field '\_\_cursor_command__' (or
50
+ # the field specified in the 'command-field' attribute) at each
51
+ # transition (each time it's supposed to move from one child expression to
52
+ # the next).
53
+ #
54
+ # cursor do
55
+ # participant "alpha"
56
+ # skip :step => "2"
57
+ # participant "bravo"
58
+ # participant "charly"
59
+ # set :field => "__cursor_command__", value => "2"
60
+ # participant "delta"
61
+ # participant "echo"
62
+ # skip 2
63
+ # participant "fox"
64
+ # #
65
+ # # in that cursor example, only the participants alpha, charly and
66
+ # # echo will be handed a workitem
67
+ # # (notice the last 'skip' with its light syntax)
68
+ # #
69
+ # end
70
+ #
71
+ # As you can see, you can directly set the value of the field
72
+ # '\_\_cursor_command__' or use a CursorCommandExpression like 'skip' or
73
+ # 'jump'.
74
+ #
75
+ class CursorExpression < FlowExpression
76
+ include CommandMixin
77
+
78
+ names :cursor
79
+
80
+ uses_template
81
+
82
+ #
83
+ # the integer identifier for the current loop
84
+ #
85
+ attr_accessor :loop_id
86
+
87
+ #
88
+ # what is the index of the child we're currently executing
89
+ #
90
+ attr_accessor :current_child_id
91
+
92
+ #
93
+ # keeping track of the current child (if any)
94
+ #
95
+ attr_accessor :current_child_fei
96
+
97
+
98
+ def apply (workitem)
99
+
100
+ new_environment
101
+
102
+ @loop_id = 0
103
+
104
+ @current_child_id = -1
105
+
106
+ #clean_children_list
107
+
108
+ reply workitem
109
+ end
110
+
111
+ def reply (workitem)
112
+
113
+ return reply_to_parent(workitem) \
114
+ if raw_children.size < 1
115
+ #
116
+ # well, currently, no infinite empty loop allowed
117
+
118
+ command, step = determine_command_and_step workitem
119
+
120
+ ldebug { "reply() command is '#{command} #{step}'" }
121
+
122
+ if command == C_BREAK or command == C_CANCEL
123
+ return reply_to_parent(workitem)
124
+ end
125
+
126
+ if command == C_REWIND or command == C_CONTINUE
127
+
128
+ @current_child_id = 0
129
+
130
+ elsif command and command.match("^#{C_JUMP}")
131
+
132
+ @current_child_id = step
133
+ @current_child_id = 0 if @current_child_id < 0
134
+
135
+ @current_child_id = raw_children.length - 1 \
136
+ if @current_child_id >= raw_children.length
137
+
138
+ else # C_SKIP or C_BACK
139
+
140
+ @current_child_id = @current_child_id + step
141
+
142
+ @current_child_id = 0 if @current_child_id < 0
143
+
144
+ #if @current_child_id >= @children.length
145
+ if @current_child_id >= raw_children.length
146
+
147
+ return reply_to_parent(workitem) unless is_loop
148
+
149
+ @loop_id += 1
150
+ @current_child_id = 0
151
+ end
152
+ end
153
+
154
+ #template_fei = @children[@current_child_id]
155
+ template = raw_children[@current_child_id]
156
+
157
+ #
158
+ # launch the next child as a template
159
+
160
+ #get_expression_pool.launch_template(
161
+ # self,
162
+ # @environment_id,
163
+ # @loop_id,
164
+ # template_fei,
165
+ # workitem,
166
+ # nil)
167
+ @current_child_fei = get_expression_pool.tlaunch_child(
168
+ self,
169
+ template,
170
+ @current_child_id,
171
+ workitem,
172
+ false) # not registering child
173
+
174
+ store_itself
175
+ end
176
+
177
+ #
178
+ # takes care of cancelling the current child if necessary
179
+ #
180
+ def cancel
181
+
182
+ cfei = current_child_fei
183
+ get_expression_pool.cancel(cfei) if cfei
184
+
185
+ get_expression_pool.cancel(@current_child_fei) \
186
+ if @current_child_fei
187
+
188
+ super
189
+ end
190
+
191
+ #
192
+ # Returns false, the child class LoopExpression does return true.
193
+ #
194
+ def is_loop
195
+
196
+ false
197
+ end
198
+
199
+ protected
200
+
201
+ #
202
+ # Determines the fei of the child being currently executed.
203
+ # This method is used by cancel().
204
+ #
205
+ #def current_child_fei
206
+ # cfei = @children[@current_child_id].dup
207
+ # return nil unless cfei
208
+ # cfei.wfid = cfei.wfid + '.' + @loop_id.to_s
209
+ # cfei
210
+ #end
211
+
212
+ #
213
+ # Makes sure that only flow expression are left in the cursor
214
+ # children list (text and comment nodes get discarded).
215
+ #
216
+ #def clean_children_list
217
+ # c = @children
218
+ # @children = []
219
+ # c.each do |child|
220
+ # @children << child \
221
+ # if child.kind_of?(OpenWFE::FlowExpressionId)
222
+ # end
223
+ #end
224
+ end
225
+
226
+ #
227
+ # The 'loop' expression is like 'cursor' but it doesn't exit until
228
+ # it's broken (with 'break' or 'cancel').
229
+ #
230
+ # <loop>
231
+ # <participant ref="toto" />
232
+ # <break if="${f:done} == true" />
233
+ # </loop>
234
+ #
235
+ # or, in a Ruby process definition :
236
+ #
237
+ # _loop do
238
+ # participant "toto"
239
+ # _break :if => "${f:done} == true"
240
+ # end
241
+ #
242
+ # (notice the _ (underscores) to distinguish the OpenWFEru expressions
243
+ # from the native Ruby ones).
244
+ #
245
+ class LoopExpression < CursorExpression
246
+
247
+ names :loop
248
+
249
+ #
250
+ # Returns true as, well, it's a loop...
251
+ #
252
+ def is_loop
253
+
254
+ true
255
+ end
256
+ end
257
+
258
+ end
259
+