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,172 @@
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
+ module OpenWFE
41
+
42
+ #
43
+ # ExpressionPool methods available via the engine.
44
+ #
45
+ module ExpoolMethods
46
+
47
+ #--
48
+ # METHODS FROM THE EXPRESSION POOL
49
+ #
50
+ # These methods are 'proxy' to method found in the expression pool.
51
+ # They are made available here for a simpler model.
52
+ #++
53
+
54
+ #
55
+ # Returns the list of applied expressions belonging to a given
56
+ # workflow instance.
57
+ # May be used to determine where a process instance currently is.
58
+ #
59
+ # This method returns all the expressions (the stack) a process
60
+ # went through to reach its current state.
61
+ #
62
+ # If the unapplied optional parameter is set to true, all the
63
+ # expressions (even those not yet applied) that compose the process
64
+ # instance will be returned.
65
+ #
66
+ def process_stack (workflow_instance_id, unapplied=false)
67
+
68
+ get_expression_pool.process_stack workflow_instance_id, unapplied
69
+ end
70
+ alias :get_process_stack :process_stack
71
+ alias :get_flow_stack :process_stack
72
+
73
+ #
74
+ # A shortcut for process_stack(wfid, true).representation
75
+ #
76
+ # Returns the representation (tree) for the actual version of the
77
+ # given process instance (returns the tree as running, modifications
78
+ # included).
79
+ #
80
+ def process_representation (workflow_instance_id)
81
+
82
+ process_stack(workflow_instance_id, true).representation
83
+ end
84
+
85
+ #
86
+ # Lists all workflow (process) instances currently in the expool (in
87
+ # the engine).
88
+ # This method will return a list of "process-definition" expressions
89
+ # (i.e. OpenWFE::DefineExpression objects -- each representing the root
90
+ # element of a flow).
91
+ #
92
+ # :wfid ::
93
+ # will list only one process,
94
+ # <tt>:wfid => '20071208-gipijiwozo'</tt>
95
+ # :parent_wfid ::
96
+ # will list only one process, and its subprocesses,
97
+ # <tt>:parent_wfid => '20071208-gipijiwozo'</tt>
98
+ # :consider_subprocesses ::
99
+ # if true, "process-definition" expressions
100
+ # of subprocesses will be returned as well.
101
+ # :wfid_prefix ::
102
+ # allows your to query for specific workflow instance
103
+ # id prefixes. for example :
104
+ # <tt>:wfid_prefix => "200712"</tt>
105
+ # for the processes started in December.
106
+ # :wfname ::
107
+ # will return only the process instances who belongs to the given
108
+ # workflow [name].
109
+ # :wfrevision ::
110
+ # usued in conjuction with :wfname, returns only the process
111
+ # instances of a given workflow revision.
112
+ #
113
+ def list_processes (options={})
114
+
115
+ get_expression_pool.list_processes options
116
+ end
117
+ alias :list_workflows :list_processes
118
+
119
+ #
120
+ # Given any expression of a process, cancels the complete process
121
+ # instance.
122
+ #
123
+ def cancel_process (exp_or_wfid)
124
+
125
+ get_expression_pool.cancel_process exp_or_wfid
126
+ end
127
+ alias :cancel_flow :cancel_process
128
+ alias :abort_process :cancel_process
129
+
130
+ #
131
+ # Cancels the given expression (and its children if any)
132
+ # (warning : advanced method)
133
+ #
134
+ # Cancelling the root expression of a process is equivalent to
135
+ # cancelling the process.
136
+ #
137
+ def cancel_expression (exp_or_fei)
138
+
139
+ get_expression_pool.cancel_expression exp_or_fei
140
+ end
141
+
142
+ #
143
+ # Forgets the given expression (make it an orphan)
144
+ # (warning : advanced method)
145
+ #
146
+ def forget_expression (exp_or_fei)
147
+
148
+ get_expression_pool.forget exp_or_fei
149
+ end
150
+
151
+ protected
152
+
153
+ #
154
+ # In case of wfid, returns the root expression of the process,
155
+ # in case of fei, returns the expression itself.
156
+ #
157
+ def fetch_exp (fei_or_wfid)
158
+
159
+ exp = if fei_or_wfid.is_a?(String)
160
+
161
+ get_expression_pool.fetch_root fei_or_wfid
162
+
163
+ else
164
+
165
+ get_expression_pool.fetch_expression fei_or_wfid
166
+ end
167
+
168
+ exp or raise "no expression found for '#{fei_or_wfid.to_s}'"
169
+ end
170
+ end
171
+ end
172
+
@@ -0,0 +1,105 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-2008, Nicolas Modryzk and 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
+ # Nicolas Modrzyk at openwfe.org
38
+ # John Mettraux at openwfe.org
39
+ #
40
+
41
+ require 'openwfe/engine/engine'
42
+ require 'openwfe/expool/yamlexpstorage'
43
+
44
+
45
+ module OpenWFE
46
+
47
+ #
48
+ # An engine persisted to a tree of yaml files.
49
+ #
50
+ # Remember that once you have added the participants to a persisted
51
+ # engine, you should call its reload method, to reschedule expressions
52
+ # like 'sleep', 'cron', ... But if you do it before registering the
53
+ # participants you'll end up with broken processes.
54
+ #
55
+ class FilePersistedEngine < Engine
56
+
57
+ protected
58
+
59
+ #
60
+ # Overrides the method already found in Engine with a persisted
61
+ # expression storage
62
+ #
63
+ def build_expression_storage ()
64
+
65
+ init_service S_EXPRESSION_STORAGE, YamlFileExpressionStorage
66
+ end
67
+
68
+ #
69
+ # Uses a file persisted error journal.
70
+ #
71
+ def build_error_journal ()
72
+
73
+ init_service S_ERROR_JOURNAL, YamlErrorJournal
74
+ end
75
+ end
76
+
77
+ #
78
+ # An engine with a cache in front of its file persisted expression storage.
79
+ #
80
+ # Remember that once you have added the participants to a persisted
81
+ # engine, you should call its reload method, to reschedule expressions
82
+ # like 'sleep', 'cron', ... But if you do it before registering the
83
+ # participants you'll end up with broken processes.
84
+ #
85
+ class CachedFilePersistedEngine < FilePersistedEngine
86
+
87
+ protected
88
+
89
+ def build_expression_storage ()
90
+
91
+ @application_context[:expression_cache_size] ||= 1000
92
+
93
+ init_service(
94
+ S_EXPRESSION_STORAGE,
95
+ CacheExpressionStorage)
96
+
97
+ #init_service(
98
+ # S_EXPRESSION_STORAGE + ".1",
99
+ # YamlFileExpressionStorage)
100
+ init_service(
101
+ S_EXPRESSION_STORAGE + ".1",
102
+ ThreadedYamlFileExpressionStorage)
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,133 @@
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
+ module OpenWFE
41
+
42
+ #
43
+ # The methods of the engine about participants (register, unregister,
44
+ # lookup, ...)
45
+ #
46
+ module ParticipantMethods
47
+
48
+ #
49
+ # Registers a participant in this [embedded] engine.
50
+ # This method is a shortcut to the ParticipantMap method
51
+ # with the same name.
52
+ #
53
+ # engine.register_participant "user-.*", HashParticipant
54
+ #
55
+ # or
56
+ #
57
+ # engine.register_participant "user-.*" do |wi|
58
+ # puts "participant '#{wi.participant_name}' received a workitem"
59
+ # #
60
+ # # and did nothing with it
61
+ # # as a block participant implicitely returns the workitem
62
+ # # to the engine
63
+ # end
64
+ #
65
+ # Returns the participant instance.
66
+ #
67
+ # The participant parameter can be set to hash like in
68
+ #
69
+ # engine.register_participant(
70
+ # "alpha",
71
+ # { :participant => HashParticipant, :position => :first })
72
+ #
73
+ # or
74
+ #
75
+ # engine.register_participant("alpha", :position => :first) do
76
+ # puts "first !"
77
+ # end
78
+ #
79
+ # There are some times where you have to position a participant first
80
+ # (especially with the regex technique).
81
+ #
82
+ # see ParticipantMap#register_participant
83
+ #
84
+ def register_participant (regex, participant=nil, &block)
85
+
86
+ #get_participant_map.register_participant(
87
+ # regex, participant, &block)
88
+
89
+ params = if participant.class == Hash
90
+ participant
91
+ else
92
+ { :participant => participant }
93
+ end
94
+
95
+ get_participant_map.register_participant regex, params, &block
96
+ end
97
+
98
+ #
99
+ # Given a participant name, returns the participant in charge
100
+ # of handling workitems for that name.
101
+ # May be useful in some embedded contexts.
102
+ #
103
+ def get_participant (participant_name)
104
+
105
+ get_participant_map.lookup_participant participant_name
106
+ end
107
+
108
+ #
109
+ # Removes the first participant matching the given name from the
110
+ # participant map kept by the engine.
111
+ #
112
+ # If 'participant_name' is an integer, will remove the participant
113
+ # at that position in the participant list.
114
+ #
115
+ def unregister_participant (participant_name)
116
+
117
+ get_participant_map.unregister_participant participant_name
118
+ end
119
+
120
+ #
121
+ # Returns the list of participants registered in the engine.
122
+ # In the resolution order.
123
+ #
124
+ # Returns a list of [ regex, participant ] pairs.
125
+ #
126
+ def list_participants
127
+
128
+ get_participant_map.participants
129
+ end
130
+ end
131
+
132
+ end
133
+
@@ -0,0 +1,353 @@
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
+ module OpenWFE
41
+
42
+ #
43
+ # ProcessStatus represents information about the status of a workflow
44
+ # process instance.
45
+ #
46
+ # The status is mainly a list of expressions and a hash of errors.
47
+ #
48
+ # Instances of this class are obtained via Engine.process_status().
49
+ #
50
+ class ProcessStatus
51
+
52
+ #
53
+ # the String workflow instance id of the Process.
54
+ #
55
+ attr_reader :wfid
56
+
57
+ #
58
+ # The list of the expressions currently active in the process instance.
59
+ #
60
+ # For instance, if your process definition is currently in a
61
+ # concurrence, more than one expressions may be listed here.
62
+ #
63
+ attr_reader :expressions
64
+
65
+ #
66
+ # A hash whose values are ProcessError instances, the keys
67
+ # are FlowExpressionId instances (fei) (identifying the expressions
68
+ # that are concerned with the error)
69
+ #
70
+ attr_reader :errors
71
+
72
+ #
73
+ # The time at which the process got launched.
74
+ #
75
+ attr_reader :launch_time
76
+
77
+ #
78
+ # The variables hash as set in the process environment (the process
79
+ # scope).
80
+ #
81
+ attr_reader :variables
82
+
83
+ #
84
+ # Is the process currently in pause ?
85
+ #
86
+ attr_accessor :paused
87
+
88
+ #
89
+ # Builds an empty ProcessStatus instance.
90
+ #
91
+ def initialize
92
+
93
+ @wfid = nil
94
+ @expressions = []
95
+ @errors = {}
96
+ @launch_time = nil
97
+ @variables = nil
98
+ end
99
+
100
+ #
101
+ # Returns the workflow definition name for this process.
102
+ #
103
+ def wfname
104
+
105
+ @expressions.first.fei.wfname
106
+ end
107
+
108
+ alias :workflow_definition_name :wfname
109
+
110
+ #
111
+ # Returns the workflow definition revision for this process.
112
+ #
113
+ def wfrevision
114
+
115
+ @expressions.first.fei.wfrevision
116
+ end
117
+
118
+ alias :workflow_definition_revision :wfrevision
119
+
120
+ #
121
+ # Returns the count of concurrent branches currently active for
122
+ # this process. The typical 'sequential only' process will
123
+ # have a return value of 1 here.
124
+ #
125
+ def branches
126
+
127
+ @expressions.size
128
+ end
129
+
130
+ #
131
+ # Returns the tags currently set in this process.
132
+ #
133
+ def tags
134
+
135
+ return [] unless @variables
136
+
137
+ @variables.keys.select do |k|
138
+ @variables[k].is_a?(OpenWFE::RawExpression::Tag)
139
+ end
140
+ end
141
+
142
+ #
143
+ # Returns true if the process is in pause.
144
+ #
145
+ def paused?
146
+
147
+ #@expressions.first.paused?
148
+ @paused
149
+ end
150
+
151
+ #
152
+ # this method is used by Engine.get_process_status() when
153
+ # it prepares its results.
154
+ #
155
+ def << (item)
156
+
157
+ if item.kind_of?(FlowExpression)
158
+ add_expression item
159
+ else
160
+ add_error item
161
+ end
162
+ end
163
+
164
+ #
165
+ # A String representation, handy for debugging, quick viewing.
166
+ #
167
+ def to_s
168
+
169
+ s = []
170
+
171
+ s << "-- #{self.class.name} --"
172
+ s << " wfid : #{@wfid}"
173
+ s << " launch_time : #{launch_time}"
174
+ s << " tags : #{tags.join(", ")}"
175
+ s << " errors : #{@errors.size}"
176
+ s << " paused : #{paused?}"
177
+
178
+ s << " expressions :"
179
+ @expressions.each do |fexp|
180
+ s << " #{fexp.fei.to_s}"
181
+ end
182
+
183
+ s.join "\n"
184
+ end
185
+
186
+ protected
187
+
188
+ def add_expression (fexp)
189
+
190
+ if fexp.is_a?(Environment)
191
+ @variables = fexp.variables if fexp.fei.expid == "0"
192
+ return
193
+ end
194
+
195
+ @wfid ||= fexp.fei.parent_wfid
196
+
197
+ @launch_time = fexp.apply_time if fexp.fei.expid == '0'
198
+
199
+ exps = @expressions
200
+ @expressions = []
201
+
202
+ added = false
203
+ @expressions = exps.collect do |fe|
204
+ if added or fe.fei.wfid != fexp.fei.wfid
205
+ fe
206
+ else
207
+ if OpenWFE::starts_with(fexp.fei.expid, fe.fei.expid)
208
+ added = true
209
+ fexp
210
+ elsif OpenWFE::starts_with(fe.fei.expid, fexp.fei.expid)
211
+ added = true
212
+ fe
213
+ else
214
+ fe
215
+ end
216
+ end
217
+ end
218
+ @expressions << fexp unless added
219
+ end
220
+
221
+ def add_error (error)
222
+
223
+ @errors[error.fei] = error
224
+ end
225
+ end
226
+
227
+ #
228
+ # Renders a nice, terminal oriented, representation of an
229
+ # Engine.get_process_status() result.
230
+ #
231
+ # You usually directly benefit from this when doing
232
+ #
233
+ # puts engine.get_process_status.to_s
234
+ #
235
+ def OpenWFE.pretty_print_process_status (ps)
236
+
237
+ # TODO : include launch_time and why is process_id so long ?
238
+
239
+ s = ""
240
+ s << "process_id | name | rev | brn | err | paused? \n"
241
+ s << "--------------------+-------------------+---------+-----+-----+---------\n"
242
+
243
+ ps.keys.sort.each do |wfid|
244
+
245
+ status = ps[wfid]
246
+ fexp = status.expressions.first
247
+ ffei = fexp.fei
248
+
249
+ s << "%-19s" % wfid[0, 19]
250
+ s << " | "
251
+ s << "%-17s" % ffei.workflow_definition_name[0, 17]
252
+ s << " | "
253
+ s << "%-7s" % ffei.workflow_definition_revision[0, 7]
254
+ s << " | "
255
+ s << "%3s" % status.expressions.size.to_s[0, 3]
256
+ s << " | "
257
+ s << "%3s" % status.errors.size.to_s[0, 3]
258
+ s << " | "
259
+ s << "%5s" % status.paused?.to_s
260
+ s << "\n"
261
+ end
262
+ s
263
+ end
264
+
265
+ #
266
+ # This mixin is only included by the Engine class. It contains all
267
+ # the methods about ProcessStatus.
268
+ #
269
+ module StatusMethods
270
+
271
+ #
272
+ # Returns a hash of ProcessStatus instances. The keys of the hash
273
+ # are workflow instance ids.
274
+ #
275
+ # A ProcessStatus is a description of the state of a process instance.
276
+ # It enumerates the expressions where the process is currently
277
+ # located (waiting certainly) and the errors the process currently
278
+ # has (hopefully none).
279
+ #
280
+ def process_statuses (options={})
281
+
282
+ options = { :wfid_prefix => options } if options.is_a?(String)
283
+
284
+ result = {}
285
+
286
+ expressions = get_expression_storage.find_expressions options
287
+
288
+ expressions.each do |fexp|
289
+
290
+ next unless (fexp.apply_time or fexp.is_a?(Environment))
291
+
292
+ next if fexp.fei.wfid == "0" # skip the engine env
293
+
294
+ #(result[fexp.fei.parent_wfid] ||= ProcessStatus.new) << fexp
295
+
296
+ parent_wfid = fexp.fei.parent_wfid
297
+
298
+ ps = result[parent_wfid]
299
+
300
+ if not ps
301
+
302
+ ps = ProcessStatus.new
303
+
304
+ ps.paused =
305
+ (get_expool.paused_instances[parent_wfid] != nil)
306
+
307
+ result[parent_wfid] = ps
308
+ end
309
+
310
+ ps << fexp
311
+ end
312
+
313
+ result.values.each do |ps|
314
+ get_error_journal.get_error_log(ps.wfid).each do |error|
315
+ ps << error
316
+ end
317
+ end
318
+
319
+ class << result
320
+ def to_s
321
+ OpenWFE::pretty_print_process_status(self)
322
+ end
323
+ end
324
+
325
+ result
326
+ end
327
+
328
+ #
329
+ # list_process_status() will be deprecated at release 1.0.0
330
+ #
331
+ alias :list_process_status :process_statuses
332
+
333
+ #
334
+ # Returns the process status of one given process instance.
335
+ #
336
+ def process_status (wfid)
337
+
338
+ wfid = extract_wfid wfid, true
339
+
340
+ process_statuses(:wfid => wfid).values[0]
341
+ end
342
+
343
+ #
344
+ # Returns true if the process is in pause.
345
+ #
346
+ def is_paused? (wfid)
347
+
348
+ (get_expression_pool.paused_instances[wfid] != nil)
349
+ end
350
+ end
351
+
352
+ end
353
+