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,24 @@
1
+
2
+ #
3
+ # a little script that traces the flow given as input
4
+ #
5
+
6
+ require 'rubygems'
7
+
8
+ require 'openwfe/expressions/raw_prog'
9
+ require 'openwfe/tools/flowtracer'
10
+
11
+ class MyProcessDefinition < OpenWFE::ProcessDefinition
12
+ def make
13
+ process_definition :name => "mpd", :revision => "0" do
14
+ sequence do
15
+ participant "alpha"
16
+ set :field => "toto", :value => "toto value"
17
+ participant "bravo"
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ OpenWFE::trace_flow(MyProcessDefinition)
24
+
@@ -0,0 +1,68 @@
1
+
2
+ ### EXAMPLE IN PREPARATION ###
3
+
4
+ #
5
+ # an OpenWFEru example
6
+ #
7
+
8
+ require 'rubygems'
9
+
10
+ require 'openwfe/engine/engine'
11
+ require 'openwfe/expressions/raw_prog'
12
+ #require 'openwfe/participants/soapparticipants'
13
+ #require 'openwfe/participants/atomparticipants'
14
+
15
+
16
+ #
17
+ # the process definition
18
+ #
19
+ # instead of using the classical OpenWFE XML process definitions, we
20
+ # define the flow as a Ruby class
21
+
22
+ class ReviewFlow < OpenWFE::ProcessDefinition
23
+ def make
24
+ process_definition :name => "homework_review", :revision => "0.1" do
25
+ sequence do
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ #
32
+ # the engine
33
+ #
34
+ # a simple in memory engine, no persistence whatsoever for now.
35
+
36
+ engine = OpenWFE::Engine.new
37
+
38
+ #
39
+ # The Participants
40
+ #
41
+ # Ideally participants are shared by more than one process definition
42
+ # (a person is usually part of more than one business process in
43
+ # his organization)
44
+
45
+ # a small debug participant, as you can see, a participant can
46
+ # directly be a ruby block (which receives the workitem)
47
+ # (it's commented out at the end of the flow)
48
+ #
49
+ engine.register_participant("puts_workitem") do |workitem|
50
+ puts
51
+ puts workitem.to_s
52
+ puts
53
+ end
54
+
55
+ #
56
+ # launching
57
+
58
+ launchitem = LaunchItem.new(QuoteLookupFlow)
59
+ #
60
+ # Passing the process definition class as the unique
61
+ # LaunchItem parameter
62
+
63
+ launchitem.symbols = "aapl, sunw, msft, lnux"
64
+ #
65
+ # directly setting the value for the field "symbols"
66
+
67
+ engine.launch(launchitem)
68
+
@@ -0,0 +1,22 @@
1
+
2
+ require 'pp'
3
+ require 'rubygems'
4
+ require 'openwfe/util/kotoba'
5
+
6
+ 3.times do
7
+
8
+ i = (rand * 1000000).to_i
9
+ s = Kotoba::from_integer i
10
+
11
+ puts "#{i} => #{s}"
12
+ puts "#{s} => #{Kotoba::to_integer(s)}"
13
+ # forth and back
14
+
15
+ a = Kotoba::split s
16
+
17
+ print "#{s} => "; pp a
18
+ # showing how the 'word' is split
19
+
20
+ puts "."
21
+ end
22
+
@@ -0,0 +1,172 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2007, 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
+ # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
34
+ #
35
+
36
+ #
37
+ # "made in Japan"
38
+ #
39
+ # John Mettraux at openwfe.org
40
+ #
41
+
42
+ #
43
+ # see
44
+ # http://groups.google.com/group/openwferu-users/browse_frm/thread/81294030fc52cd04
45
+ # for the context of this example
46
+ #
47
+
48
+ require 'rubygems'
49
+
50
+ #require 'openwfe/engine/engine'
51
+ require 'openwfe/engine/file_persisted_engine'
52
+ require 'openwfe/expressions/raw_prog'
53
+ require 'openwfe/worklist/storeparticipant'
54
+
55
+
56
+ #
57
+ # The process definition
58
+ # (using a programmatic process definition instead of an XML process definition)
59
+
60
+ class TrackerDefinition < OpenWFE::ProcessDefinition
61
+ def make
62
+
63
+ _loop do
64
+ participant "${f:creative}"
65
+ participant "${f:analyst}"
66
+
67
+ _break :if => "${f:done}"
68
+ #
69
+ # loops until the analyst sets the value of the field
70
+ # 'done' to true.
71
+ end
72
+ #
73
+ # 'loop' and 'break' are ruby keywords, they have to be
74
+ # preceded by an underscore '_' to be used in their
75
+ # OpenWFEru sense.
76
+ end
77
+ end
78
+
79
+ #
80
+ # prepare the engine and the participants
81
+
82
+ ANALYSTS = [ "Mano", "Matt", "Moe" ]
83
+ CREATIVES = [ "Jamie", "Jeff", "John", "Jeremy" ]
84
+
85
+ #
86
+ # instantiate the engine (a transient one is sufficient for the example)
87
+
88
+ #$engine = OpenWFE::Engine.new
89
+ # no persistence
90
+
91
+ #$engine = OpenWFE::FilePersistedEngine.new
92
+ # persistence, but no caching (worst performance)
93
+
94
+ $engine = OpenWFE::CachedFilePersistedEngine.new
95
+ # persistence and performance
96
+
97
+ $analyst_stores = {}
98
+ $creative_stores = {}
99
+ #
100
+ # gathering the stores for our fictitious organization
101
+
102
+ def add_stores (names, store_map)
103
+ names.each do |name|
104
+ #hp = OpenWFE::HashParticipant.new
105
+ #$engine.register_participant(name, hp)
106
+ hp = $engine.register_participant(name, OpenWFE::YamlParticipant)
107
+ store_map[name] = hp
108
+ end
109
+ end
110
+
111
+ add_stores(ANALYSTS, $analyst_stores)
112
+ add_stores(CREATIVES, $creative_stores)
113
+
114
+ #
115
+ # a quick method for launching a tracker process instance
116
+ #
117
+ def launch_tracker (analyst_name, creative_name, title, item_url)
118
+
119
+ li = LaunchItem.new(TrackerDefinition)
120
+ #
121
+ # preparing a lunchitem ;) around our TrackerDefinition
122
+
123
+ li.analyst = analyst_name
124
+ li.creative = creative_name
125
+ li.title = title
126
+ li.item_url = item_url
127
+ #
128
+ # filling the workitem with attributes
129
+
130
+ $engine.launch(li)
131
+ end
132
+
133
+ # the system is ready...
134
+
135
+
136
+ #
137
+ # (...)
138
+ #
139
+ # Later it can be used as follow
140
+
141
+ fei = launch_tracker(
142
+ "Mano",
143
+ "Jamie",
144
+ "new logo for company",
145
+ "http://openwferu.rubyforge.org/images/openwfe-logo.png")
146
+
147
+ puts "launched tracker process #{fei.workflow_instance_id}"
148
+
149
+ #
150
+ # the creative Jamie can browse the items he has to treat with :
151
+
152
+ jamie_store = $analyst_stores["Jamie"]
153
+
154
+ first_fei = nil
155
+
156
+ jamie_store.each do |fei, workitem|
157
+ first_fei = fei unless fei
158
+ puts " - #{fei.workflow_instance_id} -- #{workitem.title}"
159
+ end
160
+
161
+ workitem = jamie_store[first_fei]
162
+
163
+ # play with the workitem and then send it back to the engine
164
+
165
+ workitem.item_url = "some other url"
166
+ #
167
+ # actually just changing the item_url
168
+
169
+ jamie_store.forward(workitem)
170
+
171
+ # ...
172
+
@@ -0,0 +1,58 @@
1
+
2
+ require 'rubygems'
3
+ require 'openwfe/def'
4
+ require 'openwfe/workitem'
5
+ require 'openwfe/engine/engine'
6
+
7
+ #
8
+ # instantiating an engine
9
+
10
+ engine = OpenWFE::Engine.new
11
+
12
+ #
13
+ # adding some participants
14
+
15
+ engine.register_participant :alice do |workitem|
16
+ puts "alice got a workitem..."
17
+ workitem.alice_comment = "this thing looks interesting"
18
+ end
19
+
20
+ engine.register_participant :bob do |workitem|
21
+ puts "bob got a workitem..."
22
+ workitem.bob_comment = "not for me, I prefer VB"
23
+ workitem.bob_comment2 = "Bob rules"
24
+ end
25
+
26
+ engine.register_participant :summarize do |workitem|
27
+ puts
28
+ puts "summary of process #{workitem.fei.workflow_instance_id}"
29
+ workitem.attributes.each do |k, v|
30
+ next unless k.match ".*_comment$"
31
+ puts " - #{k} : '#{v}'"
32
+ end
33
+ end
34
+
35
+ #
36
+ # a process definition
37
+
38
+ class TheProcessDefinition0 < OpenWFE::ProcessDefinition
39
+ sequence do
40
+ concurrence do
41
+ participant :alice
42
+ participant :bob
43
+ end
44
+ participant :summarize
45
+ end
46
+ end
47
+
48
+ #
49
+ # launching the process
50
+
51
+ li = OpenWFE::LaunchItem.new(TheProcessDefinition0)
52
+
53
+ li.initial_comment = "please give your impressions about http://ruby-lang.org"
54
+
55
+ fei = engine.launch(li)
56
+
57
+ engine.wait_for fei
58
+
@@ -0,0 +1,157 @@
1
+
2
+ #
3
+ # an OpenWFEru example
4
+ #
5
+
6
+ require 'rubygems'
7
+
8
+ require 'openwfe/engine/engine'
9
+ require 'openwfe/expressions/raw_prog'
10
+ require 'openwfe/participants/soapparticipants'
11
+ require 'openwfe/participants/atomparticipants'
12
+
13
+
14
+ #
15
+ # the process definition
16
+ #
17
+ # instead of using the classical OpenWFE XML process definitions, we
18
+ # define the flow as a Ruby class
19
+
20
+ class QuoteLookupFlow < OpenWFE::ProcessDefinition
21
+ def make
22
+ process_definition :name => "quote_lookup", :revision => "0.1" do
23
+ sequence do
24
+
25
+ #
26
+ # lookup quotes
27
+
28
+ iterator :on_field_value => "symbols", :to_field => "symbol" do
29
+ sequence do
30
+
31
+ set \
32
+ :field => "quote_${f:__ip__}_name",
33
+ :field_value => "symbol"
34
+
35
+ participant :quote_service
36
+
37
+ set \
38
+ :field => "quote_${f:__ip__}_value",
39
+ :field_value => "__result__"
40
+ end
41
+ end
42
+
43
+ #
44
+ # update feed
45
+
46
+ set :field => "atom_entry_title" do
47
+ "quote feed at ${r:Time.now}"
48
+ end
49
+ #
50
+ # wrapping some ruby code for eval at runtime
51
+ # with ${r: ruby code ... }
52
+
53
+ participant :feed
54
+
55
+ #participant :ref => "puts_workitem"
56
+ #participant :ref => :puts_workitem
57
+ #participant "puts_workitem"
58
+ #participant :puts_workitem
59
+ puts_workitem
60
+ #
61
+ # the five notations are equivalent
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ #
68
+ # the engine
69
+ #
70
+ # a simple in memory engine, no persistence whatsoever for now.
71
+
72
+ engine = OpenWFE::Engine.new
73
+
74
+ #
75
+ # The Participants
76
+ #
77
+ # Ideally participants are shared by more than one process definition
78
+ # (a person is usually part of more than one business process in
79
+ # his organization)
80
+
81
+ # the participant that looks up the quote values
82
+ #
83
+ quote_service = OpenWFE::SoapParticipant.new(
84
+ "http://services.xmethods.net/soap", # service URI
85
+ "urn:xmethods-delayed-quotes", # namespace
86
+ "getQuote", # operation name
87
+ [ "symbol" ]) # param arrays (workitem fields)
88
+
89
+ engine.register_participant("quote_service", quote_service)
90
+
91
+ # the feed : at most 10 feed entries are kept.
92
+ #
93
+ # The entry template is specified as a block returning the template
94
+ # (a string containing xhtml).
95
+ #
96
+ # The feed is outputted in the current working directory ./atom_feed.xml
97
+ #
98
+ feed = OpenWFE::AtomParticipant.new(10) do
99
+ | flow_expression, participant, workitem |
100
+
101
+ #
102
+ # the template (xhtml by default) is generated via a block
103
+
104
+ s = "<h3>quotes</h3>"
105
+
106
+ s << "<ul>"
107
+
108
+ workitem.__ic__.times do |i|
109
+ #
110
+ # within an iteration, the count of iterations is stored in the
111
+ # workitem field "__ic__"
112
+ #
113
+ s << "<li>"
114
+ s << workitem.attributes["quote_#{i}_name"].to_s
115
+ s << " : "
116
+ s << workitem.attributes["quote_#{i}_value"].to_s
117
+ s << "</li>\n"
118
+ end
119
+
120
+ s << "</ul>"
121
+ end
122
+ engine.register_participant("feed", feed)
123
+
124
+ # a small debug participant, as you can see, a participant can
125
+ # directly be a ruby block (which receives the workitem)
126
+ # (it's commented out at the end of the flow)
127
+ #
128
+ engine.register_participant("puts_workitem") do |workitem|
129
+ puts
130
+ puts workitem.to_s
131
+ puts
132
+ end
133
+
134
+ #
135
+ # launching (not lunching)
136
+
137
+ launchitem = LaunchItem.new(QuoteLookupFlow)
138
+ #
139
+ # Passing the process definition class as the unique
140
+ # LaunchItem parameter
141
+
142
+ launchitem.symbols = "aapl, sunw, msft, lnux"
143
+ #
144
+ # directly setting the value for the field "symbols"
145
+
146
+ engine.launch(launchitem)
147
+
148
+ # in this example, the engine is used once with only one process definition,
149
+ # but an OpenWFE engine is made to run multiple different process instances.
150
+
151
+ # as an extension example, to produce a feed for the next ten hours you would :
152
+ #
153
+ # 10.times do
154
+ # engine.launch(launchitem)
155
+ # sleep (3600) # one hour
156
+ # end
157
+