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,202 @@
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 'yaml'
41
+ require 'socket'
42
+ require 'timeout'
43
+
44
+ require 'openwfe/orest/xmlcodec'
45
+ require 'openwfe/participants/participant'
46
+
47
+
48
+ module OpenWFE
49
+
50
+ #
51
+ # This participant implementation dispatches workitems over TCP sockets.
52
+ # By default the workitem are dumped as YAML strings, but you can override
53
+ # the encode_workitem(wi) method.
54
+ #
55
+ # A small example :
56
+ #
57
+ # require 'openwfe/particpants/socketparticipants'
58
+ #
59
+ # sp = OpenWFE::SocketParticipant.new("target.host.xx", 7007)
60
+ #
61
+ # engine.register_participant("Alfred", sp)
62
+ #
63
+ class SocketParticipant
64
+
65
+ attr_accessor :host, :port
66
+
67
+ #
68
+ # The constructor
69
+ #
70
+ def initialize (host, port)
71
+
72
+ @host = host
73
+ @port = port
74
+ end
75
+
76
+ #
77
+ # The method called by the engine for each incoming workitem.
78
+ # Will dispatch the workitem over a TCP connection.
79
+ #
80
+ def consume (workitem)
81
+
82
+ dispatch(workitem)
83
+ end
84
+
85
+ def dispatch (workitem)
86
+
87
+ socket = TCPSocket.new(@host, @port)
88
+ socket.puts encode_workitem(workitem)
89
+ socket.puts
90
+ socket.close_write
91
+
92
+ #print "\n__socket.closed? #{socket.closed?}"
93
+
94
+ reply = fetch_reply(socket)
95
+
96
+ socket.close
97
+
98
+ decode_reply(reply)
99
+ end
100
+
101
+ #
102
+ # A 'static' method for dispatching workitems, you can use it
103
+ # directly, without instantiating the SocketParticipant :
104
+ #
105
+ # require 'openwfe/participants/socketparticipants'
106
+ #
107
+ # SocketParticipant.dispatch("127.0.0.1", 7007, workitem)
108
+ #
109
+ def SocketParticipant.dispatch (host, port, workitem)
110
+
111
+ SocketParticipant.new(host, port).dispatch(workitem)
112
+ end
113
+
114
+ protected
115
+
116
+ #
117
+ # By default, uses YAML to serialize the workitem
118
+ # (of course you can override this method).
119
+ #
120
+ def encode_workitem (wi)
121
+ YAML.dump(wi)
122
+ end
123
+
124
+ #
125
+ # By default, will just return the reply without touching it
126
+ #
127
+ def decode_reply (r)
128
+ r
129
+ end
130
+
131
+ #
132
+ # The code that waits for the reply from the server, nicely
133
+ # wrapped inside a timeout and a rescue block.
134
+ #
135
+ def fetch_reply (socket)
136
+
137
+ reply = ""
138
+
139
+ begin
140
+
141
+ timeout(7) do
142
+ while true
143
+ r = socket.gets
144
+ break unless r
145
+ reply << r
146
+ end
147
+ end
148
+
149
+ rescue Exception => e
150
+ puts e
151
+ raise "timeout while waiting for reply"
152
+ end
153
+
154
+ reply
155
+ end
156
+ end
157
+
158
+ #
159
+ # This extension of of SocketParticipant can be used to dispatch
160
+ # workitems towards an OpenWFEja instance, but OpenWFEru's SocketListener
161
+ # understands XML workitems as well.
162
+ #
163
+ class XmlSocketParticipant < SocketParticipant
164
+
165
+ #def initialize (host, port)
166
+ # super
167
+ #end
168
+
169
+ #
170
+ # A 'static' method for dispatching workitems, you can use it
171
+ # directly, without instantiating the SocketParticipant :
172
+ #
173
+ # require 'openwfe/participants/socketparticipants'
174
+ #
175
+ # SocketParticipant.dispatch("127.0.0.1", 7007, workitem)
176
+ #
177
+ def XmlSocketParticipant.dispatch (host, port, workitem)
178
+
179
+ XmlSocketParticipant.new(host, port).consume(workitem)
180
+ end
181
+
182
+ protected
183
+
184
+ #
185
+ # This implementation encodes the workitem as an XML document.
186
+ # This is compatible with OpenWFEja.
187
+ #
188
+ def encode_workitem (wi)
189
+
190
+ sxml = OpenWFE::XmlCodec::encode(wi)
191
+
192
+ s = "xmlCoder #{sxml.length}\n"
193
+ s << "\n"
194
+ s << sxml
195
+ s << "\n"
196
+ s << "\n"
197
+ s
198
+ end
199
+ end
200
+
201
+ end
202
+
@@ -0,0 +1,254 @@
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/utils'
41
+ require 'openwfe/omixins'
42
+ require 'openwfe/storage/yamlfilestorage'
43
+ require 'openwfe/participants/participant'
44
+
45
+
46
+ module OpenWFE
47
+
48
+ #
49
+ # A mixin gathering the methods a workitem store participant needs.
50
+ #
51
+ # Two kinds of methods are involved here, the ones used by the engine
52
+ # (its participant map) and the ones used by 'workflow clients'.
53
+ # Thus consume() and cancel() are triggered by the engine, and
54
+ # save() and forward() are at the disposal of 'workflow clients'.
55
+ #
56
+ # A 'workflow client' is supposed to use methods similar to hash methods
57
+ # to retrieve workitems, like in
58
+ #
59
+ # storeparticipant.each do |fei, workitem|
60
+ # puts "workitem : #{fei.to_s}"
61
+ # do_some_work(workitem)
62
+ # end
63
+ #
64
+ #
65
+ module StoreParticipantMixin
66
+ include LocalParticipant
67
+ include FeiMixin
68
+
69
+ #
70
+ # optional field (only used by the old rest interface for now)
71
+ #
72
+ attr_accessor :store_name
73
+
74
+ #
75
+ # Called by the engine (the participant expression) when handing
76
+ # out a workitem (to this participant).
77
+ #
78
+ # This method can also be used when delegating a workitem from
79
+ # one store participant to the other.
80
+ #
81
+ def consume (workitem)
82
+
83
+ self[workitem.flow_expression_id] = workitem
84
+ end
85
+ alias :push :consume
86
+
87
+ #
88
+ # Called by the participant expression when this participant is
89
+ # 'cancelled' within a flow. The workitem then gets removed.
90
+ #
91
+ def cancel (cancelitem)
92
+
93
+ ldebug do
94
+ "cancel() removing workitem #{cancelitem.flow_expression_id}"
95
+ end
96
+
97
+ self.delete(cancelitem.flow_expression_id)
98
+ end
99
+
100
+ #
101
+ # The workitem is to be stored again within the store participant,
102
+ # it will probably be reused later. Don't send back to engine yet.
103
+ #
104
+ def save (workitem)
105
+
106
+ raise "Workitem not found in #{self.class}, cannot save." \
107
+ unless self.has_key? workitem.flow_expression_id
108
+
109
+ self[workitem.flow_expression_id] = workitem
110
+ end
111
+
112
+ #
113
+ # The workflow client is done with the workitem, send it back to
114
+ # the engine and make sure it's not in the store participant anymore.
115
+ #
116
+ def forward (workitem)
117
+
118
+ raise "Workitem not found in #{self.class}, cannot forward." \
119
+ unless self.has_key? workitem.flow_expression_id
120
+
121
+ #self.delete(workitem.flow_expression_id)
122
+ self.delete(workitem)
123
+
124
+ reply_to_engine(workitem)
125
+ end
126
+
127
+ #
128
+ # 'proceed' is just an alias for 'forward'
129
+ #
130
+ alias :proceed :forward
131
+
132
+ #
133
+ # This delete() method accepts a workitem or simply its FlowExpressionId
134
+ # identifier.
135
+ #
136
+ def delete (wi_or_fei)
137
+ #fei = wi_or_fei
138
+ #fei = fei.fei if fei.is_a? InFlowWorkItem
139
+ #super fei
140
+ super extract_fei(wi_or_fei)
141
+ end
142
+
143
+ #
144
+ # A convenience method for delegating a workitem to another
145
+ # store participant.
146
+ #
147
+ def delegate (wi_or_fei, other_store_participant)
148
+ wi = delete(wi_or_fei)
149
+ other_store_participant.push(wi)
150
+ end
151
+
152
+ #
153
+ # Returns all the workitems for a given workflow instance id.
154
+ # If no workflow_instance_id is given, all the workitems will be
155
+ # returned.
156
+ #
157
+ def list_workitems (workflow_instance_id=nil)
158
+
159
+ result = []
160
+ self.each_value do |workitem|
161
+ result << workitem \
162
+ if (not workflow_instance_id) or workitem.fei.parent_wfid == workflow_instance_id
163
+ end
164
+
165
+ result
166
+ end
167
+
168
+ #
169
+ # Returns the first workitem at hand.
170
+ # As a StoreParticipant is usually implemented with a hash, two
171
+ # consecutive calls to this method might not return the same workitem
172
+ # (except if the store is empty or contains 1! workitem).
173
+ #
174
+ def first_workitem
175
+
176
+ result = nil
177
+
178
+ self.each_value do |workitem|
179
+ result = workitem
180
+ break
181
+ end
182
+
183
+ return result
184
+ end
185
+ end
186
+
187
+ #
188
+ # The simplest workitem store possible, gathers the workitem in a
189
+ # hash (this class is an extension of Hash).
190
+ #
191
+ # Some examples :
192
+ #
193
+ # engine.register_participant(:alice, OpenWFE::HashParticipant)
194
+ # engine.register_participant("bob", OpenWFE::HashParticipant)
195
+ #
196
+ # hp = engine.register_participant(:charly, OpenWFE::HashParticipant)
197
+ # #...
198
+ # puts "there are currently #{hp.size} workitems for Charly"
199
+ #
200
+ # hp = OpenWFE::HashParticipant.new
201
+ # engine.register_participant("debbie", hp)
202
+ #
203
+ class HashParticipant < Hash
204
+ include StoreParticipantMixin
205
+
206
+ # that's all...
207
+ end
208
+
209
+ #
210
+ # Implementation of a store participant stores the workitems in
211
+ # yaml file in a dedicated directory.
212
+ #
213
+ # It's quite easy to register a YamlParticipant :
214
+ #
215
+ # yp = engine.register_participant(:alex, YamlParticipant)
216
+ #
217
+ # puts yp.dirname
218
+ #
219
+ # should yield "./work/participants/alex/" (if the key :work_directory
220
+ # in engine.application_context is unset)
221
+ #
222
+ class YamlParticipant < YamlFileStorage
223
+ include StoreParticipantMixin
224
+
225
+ attr_accessor :dirname
226
+
227
+ #
228
+ # The constructor for YamlParticipant awaits a dirname and an
229
+ # application_context.
230
+ # The dirname should be a simple name acceptable as a filename.
231
+ #
232
+ def initialize (dirname, application_context)
233
+
234
+ @dirname = OpenWFE::ensure_for_filename(dirname.to_s)
235
+
236
+ service_name = self.class.name + "__" + @dirname
237
+
238
+ path = "/participants/" + @dirname
239
+
240
+ super(service_name, application_context, path)
241
+ end
242
+
243
+ protected
244
+
245
+ def compute_file_path (fei)
246
+
247
+ @basepath +
248
+ fei.workflow_instance_id + "__" +
249
+ fei.workflow_definition_name + "_" +
250
+ fei.workflow_definition_revision + "__" +
251
+ fei.expression_id + ".yaml"
252
+ end
253
+ end
254
+ end