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,37 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2005-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
+ module OpenWFE
35
+
36
+ OPENWFERU_VERSION = '0.9.18'
37
+ end
@@ -0,0 +1,499 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2005-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
+ # "hecho en Costa Rica"
36
+ # and "made in Japan"
37
+ #
38
+ # john.mettraux@openwfe.org
39
+ #
40
+
41
+ require 'openwfe/utils'
42
+
43
+
44
+ module OpenWFE
45
+
46
+ #
47
+ # The convention for the result of some expressions is to store
48
+ # their result in a workitem field named "__result__".
49
+ #
50
+ FIELD_RESULT = "__result__"
51
+
52
+ #--
53
+ # WORKITEMS
54
+ #++
55
+
56
+ #
57
+ # The base class for all the workitems.
58
+ #
59
+ class WorkItem
60
+
61
+ attr_accessor :last_modified, :attributes
62
+
63
+ def initialize
64
+ @last_modified = nil
65
+ @attributes = {}
66
+ end
67
+
68
+ alias :fields :attributes
69
+ alias :fields= :attributes=
70
+
71
+ #
72
+ # Sets the last_modified field to now
73
+ #
74
+ def touch
75
+
76
+ @last_modified = Time.now
77
+ end
78
+
79
+ def to_h
80
+
81
+ h = {}
82
+ h[:type] = self.class.name
83
+ h[:last_modified] = @last_modified
84
+ h[:attributes] = @attributes
85
+ h
86
+ end
87
+
88
+ def self.from_h (h)
89
+
90
+ #wi = eval("#{h[:type]}.new")
91
+ wi = OpenWFE.get_class(h).new
92
+ wi.last_modified = h[:last_modified]
93
+ wi.attributes = h[:attributes]
94
+ wi
95
+ end
96
+
97
+ #
98
+ # A shortcut for
99
+ #
100
+ # workitem.attributes['key']
101
+ #
102
+ # is
103
+ #
104
+ # workitem['key']
105
+ #
106
+ # (Note that
107
+ #
108
+ # workitem.key
109
+ #
110
+ # will raise an exception if there is no attribute key).
111
+ #
112
+ def [] (key)
113
+
114
+ @attributes[key]
115
+ end
116
+
117
+ #
118
+ # A shortcut for
119
+ #
120
+ # workitem.attributes['key'] = value
121
+ #
122
+ # is
123
+ #
124
+ # workitem['key'] = value
125
+ #
126
+ def []= (key, value)
127
+
128
+ @attributes[key] = value
129
+ end
130
+
131
+ #
132
+ # In order to simplify code like :
133
+ #
134
+ # value = workitem.attributes['xyz']
135
+ #
136
+ # to
137
+ #
138
+ # value = workitem.xyz
139
+ #
140
+ # or
141
+ #
142
+ # value = workitem['xyz']
143
+ #
144
+ # we overrode method_missing.
145
+ #
146
+ # workitem.xyz = "my new value"
147
+ #
148
+ # is also possible
149
+ #
150
+ def method_missing (m, *args)
151
+
152
+ methodname = m.to_s
153
+
154
+ if args.length == 0
155
+ value = @attributes[methodname]
156
+ return value if value
157
+ raise "Missing attribute '#{methodname}' in workitem"
158
+ end
159
+
160
+ #if methodname == "[]" and args.length == 1
161
+ # value = @attributes[args[0]]
162
+ # return value if value
163
+ # raise "Missing attribute '#{methodname}' in workitem"
164
+ #end
165
+ #if methodname == "[]=" and args.length == 2
166
+ # return @attributes[args[0]] = args[1]
167
+ #end
168
+
169
+ if args.length == 1 and methodname[-1, 1] == "="
170
+ return @attributes[methodname[0..-2]] = args[0]
171
+ end
172
+
173
+ super(m, args)
174
+ end
175
+
176
+ #
177
+ # Produces a deep copy of the workitem
178
+ #
179
+ def dup
180
+ OpenWFE::fulldup(self)
181
+ end
182
+
183
+ #
184
+ # A smarter alternative to
185
+ #
186
+ # value = workitem.attributes[x]
187
+ #
188
+ # Via this method, nested values can be reached. For example :
189
+ #
190
+ # wi = InFlowWorkItem.new()
191
+ # wi.attributes = {
192
+ # "field0" => "value0",
193
+ # "field1" => [ 0, 1, 2, 3, [ "a", "b", "c" ]],
194
+ # "field2" => {
195
+ # "a" => "AA",
196
+ # "b" => "BB",
197
+ # "c" => [ "C0", "C1", "C3" ]
198
+ # },
199
+ # "field3" => 3,
200
+ # "field99" => nil
201
+ # }
202
+ #
203
+ # will verify the following assertions :
204
+ #
205
+ # assert wi.lookup_attribute("field3") == 3
206
+ # assert wi.lookup_attribute("field1.1") == 1
207
+ # assert wi.lookup_attribute("field1.4.1") == "b"
208
+ # assert wi.lookup_attribute("field2.c.1") == "C1"
209
+ #
210
+ def lookup_attribute (key)
211
+ OpenWFE.lookup_attribute(@attributes, key)
212
+ end
213
+
214
+ #
215
+ # The partner to the lookup_attribute() method. Behaves like it.
216
+ #
217
+ def has_attribute? (key)
218
+ OpenWFE.has_attribute?(@attributes, key)
219
+ end
220
+
221
+ #
222
+ # set_attribute() accomodates itself with nested key constructs.
223
+ #
224
+ def set_attribute (key, value)
225
+ OpenWFE.set_attribute(@attributes, key, value)
226
+ end
227
+
228
+ #
229
+ # unset_attribute() accomodates itself with nested key constructs.
230
+ #
231
+ def unset_attribute (key)
232
+ OpenWFE.unset_attribute(@attributes, key)
233
+ end
234
+
235
+ alias :lookup_field :lookup_attribute
236
+ alias :has_field? :has_attribute?
237
+ alias :set_field :set_attribute
238
+ alias :unset_field :unset_attribute
239
+
240
+ end
241
+
242
+ #
243
+ # The common parent class for InFlowWorkItem and CancelItem.
244
+ #
245
+ class InFlowItem < WorkItem
246
+
247
+ attr_accessor :flow_expression_id, :participant_name
248
+
249
+ def last_expression_id
250
+ @flow_expression_id
251
+ end
252
+
253
+ def last_expression_id= (fei)
254
+ @flow_expression_id = fei
255
+ end
256
+
257
+ #
258
+ # Just a handy alias for flow_expression_id
259
+ #
260
+ alias :fei :flow_expression_id
261
+ alias :fei= :flow_expression_id=
262
+
263
+ def to_h
264
+ h = super
265
+ h[:flow_expression_id] = @flow_expression_id.to_h
266
+ h[:participant_name] = @participant_name
267
+ h
268
+ end
269
+
270
+ def InFlowItem.from_h (h)
271
+ wi = super
272
+ wi.flow_expression_id = FlowExpressionId.from_h(h[:flow_expression_id])
273
+ wi.participant_name = h[:participant_name]
274
+ wi
275
+ end
276
+ end
277
+
278
+ #
279
+ # When the term 'workitem' is used it's generally referring to instances
280
+ # of this InFlowWorkItem class.
281
+ # InFlowWorkItem are circulating within process instances and carrying
282
+ # data around. Their 'payload' is located in their attribute Hash field.
283
+ #
284
+ class InFlowWorkItem < InFlowItem
285
+
286
+ attr_accessor :dispatch_time
287
+ attr_accessor :filter
288
+
289
+ #
290
+ # In OpenWFEja, workitem history was stored, OpenWFEru doesn't do
291
+ # it (no need to copy history over and over).
292
+ #
293
+ # (deprecated)
294
+ #
295
+ attr_accessor :history
296
+
297
+ attr_accessor :store
298
+ #
299
+ # special : added by the ruby lib, not given by the worklist
300
+
301
+ #
302
+ # Outputting the workitem in a human readable format
303
+ #
304
+ def to_s
305
+
306
+ s = ""
307
+ s << " #{self.class} :\n"
308
+ s << " - flow_expression_id : #{@flow_expression_id}\n"
309
+ s << " - participant_name : #{@participant_name}\n"
310
+ s << " - last_modified : #{@last_modified}\n"
311
+ s << " - dispatch_time : #{@dispatch_time}\n"
312
+ s << " - attributes :\n"
313
+
314
+ s << " {\n"
315
+ @attributes.keys.sort.each do |k|
316
+ v = @attributes[k]
317
+ s << " #{k.inspect} => #{v.inspect},\n"
318
+ end
319
+ s << " }"
320
+ s
321
+ end
322
+
323
+ #
324
+ # For some easy YAML encoding, turns the workitem into a Hash
325
+ # (Any YAML-enabled platform can thus read it).
326
+ #
327
+ def to_h
328
+
329
+ h = super
330
+ h[:dispatch_time] = @dispatch_time
331
+ #h[:history] = @history
332
+ h[:filter] = @filter
333
+ h
334
+ end
335
+
336
+ #
337
+ # Rebuilds an InFlowWorkItem from its hash version.
338
+ #
339
+ def InFlowWorkItem.from_h (h)
340
+
341
+ wi = super
342
+ wi.dispatch_time = h[:dispatch_time]
343
+ #wi.history = h[:history]
344
+ wi.filter = h[:filter]
345
+ wi
346
+ end
347
+
348
+ #
349
+ # Sets the '__result__' field of this workitem
350
+ #
351
+ def set_result (result)
352
+
353
+ @attributes[FIELD_RESULT] = result
354
+ end
355
+
356
+ #
357
+ # Makes sure the '__result__' field of this workitem is empty.
358
+ #
359
+ def unset_result
360
+
361
+ @attributes.delete FIELD_RESULT
362
+ end
363
+
364
+ #
365
+ # Just a shortcut (for consistency) of
366
+ #
367
+ # workitem.attributes["__result__"]
368
+ #
369
+ def get_result
370
+
371
+ @attributes[FIELD_RESULT]
372
+ end
373
+
374
+ #
375
+ # Returns true or false.
376
+ #
377
+ def get_boolean_result
378
+
379
+ r = get_result
380
+ return false unless r
381
+ (r == true or r == "true")
382
+ end
383
+ end
384
+
385
+ #
386
+ # When it needs to cancel a branch of a process instance, the engine
387
+ # emits a CancelItem towards it.
388
+ # It's especially important for participants to react correctly upon
389
+ # receiving a cancel item.
390
+ #
391
+ class CancelItem < InFlowItem
392
+
393
+ def initialize (workitem)
394
+
395
+ super()
396
+ @flow_expression_id = workitem.fei.dup
397
+ end
398
+ end
399
+
400
+ #
401
+ # LaunchItem instances are used to instantiate and launch processes.
402
+ # They contain attributes that are used as the initial payload of the
403
+ # workitem circulating in the process instances.
404
+ #
405
+ class LaunchItem < WorkItem
406
+
407
+ DEF = "__definition"
408
+ FIELD_DEF = "field:#{DEF}"
409
+
410
+ attr_accessor :workflow_definition_url
411
+ #, :description_map
412
+
413
+ alias :wfdurl :workflow_definition_url
414
+ alias :wfdurl= :workflow_definition_url=
415
+
416
+ #
417
+ # This constructor will build an empty LaunchItem.
418
+ #
419
+ # If the optional parameter process_definition is set, the
420
+ # definition will be embedded in the launchitem attributes
421
+ # for retrieval by the engine.
422
+ #
423
+ # There are several ways to specify the process definition.
424
+ # Here are some examples:
425
+ #
426
+ # # Use a Ruby class that extends OpenWFE::ProcessDefinition
427
+ # LaunchItem.new(MyProcessDefinition)
428
+ #
429
+ # # Provide an XML process definition as a string
430
+ # definition = """
431
+ # <process-definition name="x" revision="y">
432
+ # <sequence>
433
+ # <participant ref="alpha" />
434
+ # <participant ref="bravo" />
435
+ # </sequence>
436
+ # </process-definition>
437
+ # """.strip
438
+ # LaunchItem.new(definition)
439
+ #
440
+ # # Load an XML process definition from a local file
441
+ # require 'uri'
442
+ # LaunchItem.new(URI.parse("file:///tmp/my_process_definition.xml"))
443
+ #
444
+ # # If you initialized your engine with
445
+ # # {:remote_definitions_allowed => true}, then you can also load an
446
+ # # XML process definition from a remote url
447
+ # require 'uri'
448
+ # LaunchItem.new(URI.parse("http://foo.bar/my_process_definition.xml"))
449
+ #
450
+ def initialize (process_definition=nil)
451
+
452
+ super()
453
+
454
+ if process_definition
455
+ @workflow_definition_url = FIELD_DEF
456
+ @attributes[DEF] = process_definition
457
+ end
458
+ end
459
+
460
+ #
461
+ # Turns the LaunchItem instance into a simple 'hash' (easily
462
+ # serializable to other formats).
463
+ #
464
+ def to_h
465
+
466
+ h = super
467
+ h[:workflow_definition_url] = @workflow_definition_url
468
+ h
469
+ end
470
+
471
+ def self.from_h (h)
472
+
473
+ li = super
474
+ li.workflow_definition_url = h[:workflow_definition_url]
475
+ li
476
+ end
477
+ end
478
+
479
+ #
480
+ # Turns a hash into its corresponding workitem (InFlowWorkItem, CancelItem,
481
+ # LaunchItem).
482
+ #
483
+ def OpenWFE.workitem_from_h (h)
484
+
485
+ #wi_class = eval(h[:type])
486
+ wi_class = get_class(h)
487
+ wi_class.from_h(h)
488
+ end
489
+
490
+ def OpenWFE.get_class (h)
491
+
492
+ cl = h[:type]
493
+ return nil if cl.index(";")
494
+ return nil if cl.index(" ")
495
+ eval(cl)
496
+ end
497
+
498
+ end
499
+