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,62 @@
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
+ class ObjectWithMeta
43
+ #
44
+ # meta a la lucky stiff
45
+
46
+ def self.metaclass
47
+ class << self
48
+ self
49
+ end
50
+ end
51
+ def self.meta_eval &block
52
+ metaclass.instance_eval &block
53
+ end
54
+ def self.meta_def method_name, &block
55
+ meta_eval { define_method method_name, &block }
56
+ end
57
+ def class_def method_name, &block
58
+ class_eval { define_method name, &block }
59
+ end
60
+ end
61
+ end
62
+
@@ -0,0 +1,124 @@
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 'thread'
41
+ require 'openwfe/utils'
42
+
43
+
44
+ module OpenWFE
45
+
46
+ class WorkQueue < Service
47
+
48
+ include OwfeServiceLocator
49
+
50
+ #
51
+ # Inits the WorkQueue
52
+ #
53
+ def service_init (service_name, application_context)
54
+
55
+ super
56
+
57
+ @queue = Queue.new
58
+
59
+ @stopped = false
60
+
61
+ thread_name = "#{service_name} (engine #{get_engine.object_id})"
62
+
63
+ OpenWFE::call_in_thread thread_name, self do
64
+
65
+ loop do
66
+
67
+ work = @queue.pop
68
+
69
+ break if work == :stop
70
+
71
+ target, method_name, args = work
72
+
73
+ target.send method_name, *args
74
+ end
75
+ end
76
+ end
77
+
78
+ #
79
+ # Returns true if there is or there just was activity for the
80
+ # work queue.
81
+ #
82
+ def busy?
83
+
84
+ @queue.size > 0
85
+ end
86
+
87
+ #
88
+ # Returns the current count of jobs on the workqueue
89
+ #
90
+ def size
91
+
92
+ @queue.size
93
+ end
94
+
95
+ #
96
+ # Stops the workqueue.
97
+ #
98
+ def stop
99
+
100
+ @stopped = true
101
+ @queue.push :stop
102
+ end
103
+
104
+ #
105
+ # the method called by the mixer to actually queue the work.
106
+ #
107
+ def push (target, method_name, *args)
108
+
109
+ if @stopped
110
+
111
+ target.send method_name, *args
112
+ #
113
+ # degraded mode : as if there were no workqueue
114
+ else
115
+
116
+ @queue.push [ target, method_name, args ]
117
+ #
118
+ # work will be done later (millisec order)
119
+ # by the work thread
120
+ end
121
+ end
122
+ end
123
+ end
124
+
@@ -0,0 +1,418 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2008 John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+
38
+ require 'rexml/document'
39
+ require 'builder'
40
+
41
+
42
+ #
43
+ # Reopening REXML::Element to add a few helper methods (prefixed with
44
+ # an 'owfe_').
45
+ # Not too happy with this solution, but the prefix should prevent
46
+ # collisions
47
+ #
48
+ class REXML::Element
49
+
50
+ #
51
+ # Returns the first child that is a REXML::Element or the first child
52
+ # that is an element and that has the given name.
53
+ #
54
+ def owfe_first_elt_child (name=nil)
55
+
56
+ children.find do |c|
57
+ c.is_a?(REXML::Element) and (( ! name) or c.name == name)
58
+ end
59
+ end
60
+
61
+ #
62
+ # Returns all the children that are instances of REXML::Element
63
+ #
64
+ def owfe_elt_children
65
+
66
+ children.find_all { |c| c.is_a?(REXML::Element) }
67
+ end
68
+ end
69
+
70
+
71
+ module OpenWFE
72
+
73
+ #
74
+ # Simple methods for converting launchitems and workitems from and to
75
+ # XML.
76
+ #
77
+ # There are also the from_xml(xml) and the to_xml(object) methods
78
+ # that are interesting (though limited).
79
+ #
80
+ module Xml
81
+
82
+ #--
83
+ # launchitems
84
+ #++
85
+
86
+ #
87
+ # Turns a launchitem into an XML String
88
+ #
89
+ def self.launchitem_to_xml (li, indent=0)
90
+
91
+ b = Builder::XmlMarkup.new :indent => indent
92
+
93
+ b.instruct!
94
+
95
+ b.launchitem do
96
+ b.workflow_definition_url li.workflow_definition_url
97
+ b.attributes do
98
+ hash_to_xml b, li.attributes
99
+ end
100
+ end
101
+
102
+ b.target!
103
+ end
104
+
105
+ #
106
+ # Given some XML (string or rexml doc/elt), extracts the LaunchItem
107
+ # instance.
108
+ #
109
+ def self.launchitem_from_xml (xml)
110
+
111
+ root = to_element xml, 'launchitem'
112
+
113
+ li = LaunchItem.new
114
+
115
+ li.wfdurl = text root, 'workflow_definition_url'
116
+
117
+ li.attributes = object_from_xml(
118
+ root.owfe_first_elt_child('attributes').owfe_first_elt_child)
119
+
120
+ li
121
+ end
122
+
123
+ #--
124
+ # flow expression id
125
+ #++
126
+
127
+ def self.fei_to_xml (fei, indent=0)
128
+
129
+ b = Builder::XmlMarkup.new :indent => indent
130
+
131
+ b.instruct!
132
+
133
+ _fei_to_xml b, fei
134
+
135
+ b.target!
136
+ end
137
+
138
+ def self.fei_from_xml (xml)
139
+
140
+ xml = to_element xml, 'flow_expression_id'
141
+
142
+ fei = FlowExpressionId.new
143
+
144
+ FlowExpressionId::FIELDS.each do |f|
145
+ fei.send "#{f}=", text(xml, f.to_s)
146
+ end
147
+
148
+ fei
149
+ end
150
+
151
+ #--
152
+ # workitems
153
+ #++
154
+
155
+ #
156
+ # Turns an [InFlow]WorkItem into some XML.
157
+ #
158
+ def self.workitem_to_xml (wi, indent=0)
159
+
160
+ b = Builder::XmlMarkup.new :indent => indent
161
+
162
+ b.instruct!
163
+
164
+ _workitem_to_xml b, wi
165
+
166
+ b.target!
167
+ end
168
+
169
+ #
170
+ # Pipes a workitem into a XML builder
171
+ #
172
+ def self._workitem_to_xml (builder, wi)
173
+
174
+ builder.workitem do
175
+
176
+ _fei_to_xml builder, wi.fei # flow expression id
177
+
178
+ builder.last_modified to_httpdate(wi.last_modified)
179
+
180
+ builder.participant_name wi.participant_name
181
+
182
+ builder.dispatch_time to_httpdate(wi.dispatch_time)
183
+ #builder.filter ...
184
+ builder.store wi.store
185
+
186
+ builder.attributes do
187
+ hash_to_xml builder, wi.attributes
188
+ end
189
+ end
190
+ end
191
+
192
+ #
193
+ # Extracts an [InFlow]WorkItem instance from some XML.
194
+ #
195
+ def self.workitem_from_xml (xml)
196
+
197
+ root = to_element xml, 'workitem'
198
+
199
+ wi = InFlowWorkItem.new
200
+
201
+ wi.fei = fei_from_xml root.elements['flow_expression_id']
202
+
203
+ wi.last_modified = from_httpdate(text(root, 'last_modified'))
204
+ wi.participant_name = text root, 'participant_name'
205
+ wi.dispatch_time = from_httpdate(text(root, 'dispatch_time'))
206
+
207
+ wi.attributes = object_from_xml(
208
+ root.owfe_first_elt_child('attributes').owfe_first_elt_child)
209
+
210
+ wi
211
+ end
212
+
213
+ #
214
+ # Extracts a list of workitems from some XML.
215
+ #
216
+ def self.workitems_from_xml (xml)
217
+
218
+ root = to_element xml, 'workitems'
219
+
220
+ root.owfe_elt_children.collect do |elt|
221
+ workitem_from_xml elt
222
+ end
223
+ end
224
+
225
+ #--
226
+ # cancelitems
227
+ #++
228
+
229
+ def self.cancelitem_to_xml (ci)
230
+
231
+ nil # TODO : implement me
232
+ end
233
+
234
+ def self.cancelitem_from_xml (xml)
235
+
236
+ nil # TODO : implement me
237
+ end
238
+
239
+ #
240
+ # An 'internal' method, turning an object into some XML.
241
+ #
242
+ def self.object_to_xml (xml, o)
243
+
244
+ return xml.true if o == true
245
+ return xml.false if o == false
246
+ return xml.null if o == nil
247
+ return xml.number(o.to_s) if o.is_a?(Numeric)
248
+
249
+ return hash_to_xml(xml, o) if o.is_a?(Hash)
250
+ return array_to_xml(xml, o) if o.is_a?(Array)
251
+
252
+ return xml.string(o.to_s) if o.is_a?(String)
253
+
254
+ xml.object o.to_s
255
+ end
256
+
257
+ #
258
+ # Turns XML into an object (quite basic though).
259
+ #
260
+ # For example :
261
+ #
262
+ # <array>
263
+ # <string>alpha</string>
264
+ # <number>2</number>
265
+ # <number>2.3</number>
266
+ # <false/>
267
+ # <null/>
268
+ # </array>
269
+ #
270
+ # =>
271
+ #
272
+ # [ 'alpha', 2, 2.3, false, nil ]
273
+ #
274
+ def self.from_xml (xml)
275
+
276
+ xml = to_element xml
277
+
278
+ object_from_xml xml
279
+ end
280
+
281
+ #
282
+ # from_xml, the other way
283
+ #
284
+ def self.to_xml (o, indent=0, instruct = false)
285
+
286
+ b = Builder::XmlMarkup.new :indent => indent
287
+
288
+ b.instruct! if instruct
289
+
290
+ object_to_xml b, o
291
+
292
+ b.target!
293
+ end
294
+
295
+ private
296
+
297
+ def self.to_httpdate (t)
298
+
299
+ return "" unless t
300
+ t.httpdate
301
+ end
302
+
303
+ def self.from_httpdate (s)
304
+
305
+ return nil unless s
306
+ return nil if s.strip == ""
307
+
308
+ Time.httpdate s
309
+ end
310
+
311
+ #--
312
+ # OUT
313
+ #++
314
+
315
+ def self._fei_to_xml (xml, fei)
316
+
317
+ xml.flow_expression_id do
318
+ FlowExpressionId::FIELDS.each do |f|
319
+ xml.tag! f.to_s, fei.send(f)
320
+ end
321
+
322
+ xml.fei_short fei.to_s
323
+ # a short, 1 string version of the fei
324
+ end
325
+ end
326
+
327
+ def self.to_element (xml, root_name=nil)
328
+
329
+ xml = if xml.is_a?(REXML::Element)
330
+ xml
331
+ elsif xml.is_a?(REXML::Document)
332
+ xml.root
333
+ else
334
+ REXML::Document.new(xml).root
335
+ end
336
+
337
+ raise "not the XML of a #{root_name} ('#{xml.name}')" \
338
+ if root_name and (xml.name != root_name)
339
+
340
+ xml
341
+ end
342
+
343
+ def self.hash_to_xml (xml, h)
344
+
345
+ xml.hash do
346
+ h.each do |k, v|
347
+ xml.entry do
348
+ object_to_xml xml, k
349
+ object_to_xml xml, v
350
+ end
351
+ end
352
+ end
353
+ end
354
+
355
+ def self.array_to_xml (xml, a)
356
+
357
+ xml.array do
358
+ a.each { |o| object_to_xml xml, o }
359
+ end
360
+ end
361
+
362
+ #--
363
+ # IN
364
+ #++
365
+
366
+ #
367
+ # Returns the text wrapped in the child elt with the given
368
+ # name.
369
+ #
370
+ def self.text (parent, elt_name)
371
+
372
+ parent.elements[elt_name].text
373
+ end
374
+
375
+ def self.object_from_xml (elt)
376
+
377
+ name = elt.name
378
+ text = elt.text
379
+
380
+ return true if name == 'true'
381
+ return false if name == 'false'
382
+ return nil if name == 'null'
383
+
384
+ if name == 'number'
385
+ return text.to_f if text.index('.')
386
+ return text.to_i
387
+ end
388
+
389
+ return hash_from_xml(elt) if name == 'hash'
390
+ return array_from_xml(elt) if name == 'array'
391
+
392
+ text # string / object
393
+ end
394
+
395
+ def self.hash_from_xml (elt)
396
+
397
+ elt.owfe_elt_children.inject({}) do |r, e|
398
+
399
+ children = e.owfe_elt_children
400
+
401
+ k = object_from_xml children[0]
402
+ v = object_from_xml children[1]
403
+
404
+ r[k] = v
405
+
406
+ r
407
+ end
408
+ end
409
+
410
+ def self.array_from_xml (elt)
411
+
412
+ elt.owfe_elt_children.inject([]) do |r, e|
413
+ r << object_from_xml(e)
414
+ end
415
+ end
416
+ end
417
+ end
418
+