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,357 @@
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
+ # enhanced in Japan
37
+ #
38
+ # john.mettraux@openwfe.org
39
+ #
40
+
41
+
42
+ module OpenWFE
43
+
44
+ #
45
+ # A FlowExpressionId is a unique identifier for a FlowExpression (an atomic
46
+ # piece of a process instance).
47
+ #
48
+ # As workitems move through a workflow among the expressions and are emitted
49
+ # outside of the business process engine via 'participant expressions',
50
+ # these workitems are identified by the FlowExpressionId of the participant
51
+ # expression that pushed them out (and is usually waiting for them
52
+ # to come back).
53
+ #
54
+ class FlowExpressionId
55
+
56
+ FIELDS = [
57
+ :owfe_version,
58
+ :engine_id,
59
+ #:initial_engine_id,
60
+ :workflow_definition_url,
61
+ :workflow_definition_name,
62
+ :workflow_definition_revision,
63
+ :workflow_instance_id,
64
+ :expression_name,
65
+ :expression_id
66
+ ]
67
+
68
+ FIELDS.each { |f| attr_accessor f }
69
+
70
+ alias :expid :expression_id
71
+ alias :expid= :expression_id=
72
+
73
+ alias :expname :expression_name
74
+ alias :wfurl :workflow_definition_url
75
+ alias :wfname :workflow_definition_name
76
+ alias :wfrevision :workflow_definition_revision
77
+
78
+ #--
79
+ # a trick : returns self...
80
+ #
81
+ #def fei
82
+ # self
83
+ #end
84
+ #++
85
+
86
+ #
87
+ # This method return @workflow_instance_id. If parent is set to
88
+ # true, if will return the same result as
89
+ # parent_workflow_instance_id().
90
+ #
91
+ def wfid (parent=false)
92
+
93
+ if parent
94
+ parent_workflow_instance_id
95
+ else
96
+ workflow_instance_id
97
+ end
98
+ end
99
+ alias :wfid= :workflow_instance_id=
100
+
101
+ #
102
+ # the old 'initial_engine_id' is now deprecated, the methods
103
+ # are still around though.
104
+ #
105
+ def initial_engine_id= (s)
106
+
107
+ # silently discard
108
+ end
109
+ def initial_engine_id
110
+
111
+ @engine_id
112
+ end
113
+
114
+ #
115
+ # Overrides the classical to_s()
116
+ #
117
+ def to_s
118
+ "(fei #{@owfe_version} #{@engine_id} #{wfurl} #{wfname} #{wfrevision} #{wfid} #{expname} #{expid})"
119
+ end
120
+
121
+ #
122
+ # Returns a hash version of this FlowExpressionId instance.
123
+ #
124
+ def to_h
125
+
126
+ FIELDS.inject({}) { |r, f| r[f] = instance_eval("@#{f.to_s}"); r }
127
+ end
128
+
129
+ #
130
+ # Rebuilds a FlowExpressionId from its Hash representation.
131
+ #
132
+ def FlowExpressionId.from_h (h)
133
+
134
+ FIELDS.inject FlowExpressionId.new do |fei, f|
135
+ fei.instance_variable_set("@#{f}", h[f] || h[f.to_s])
136
+ fei
137
+ end
138
+ end
139
+
140
+ def hash
141
+
142
+ to_s.hash
143
+ end
144
+
145
+ def == (other)
146
+
147
+ return false if not other.kind_of?(FlowExpressionId)
148
+
149
+ #return self.to_s == other.to_s
150
+ # no perf gain
151
+
152
+ @workflow_instance_id == other.workflow_instance_id and
153
+ @expression_id == other.expression_id and
154
+ @workflow_definition_url == other.workflow_definition_url and
155
+ @workflow_definition_revision == other.workflow_definition_revision and
156
+ @workflow_definition_name == other.workflow_definition_name and
157
+ @expression_name == other.expression_name and
158
+ @owfe_version == other.owfe_version and
159
+ @engine_id == other.engine_id
160
+ #@initial_engine_id == other.initial_engine_id
161
+ #
162
+ # Made sure to put on top of the 'and' the things that
163
+ # change the most...
164
+ end
165
+
166
+ #
167
+ # Returns true if this other FlowExpressionId is nested within
168
+ # this one.
169
+ #
170
+ # For example (fei TestTag 3 20070331-goyunodabu 0.0.0 sequence)
171
+ # is an ancestor of (fei TestTag 3 20070331-goyunodabu 0.0.0.1 redo)
172
+ #
173
+ # This current implementation doesn't cross the subprocesses
174
+ # boundaries.
175
+ #
176
+ def ancestor_of? (other_fei)
177
+
178
+ o = other_fei.dup
179
+ o.expression_name = @expression_name
180
+ o.expression_id = @expression_id
181
+
182
+ return false unless self == o
183
+
184
+ OpenWFE::starts_with other_fei.expression_id, @expression_id
185
+ end
186
+
187
+ #
188
+ # Returns a deep copy of this FlowExpressionId instance.
189
+ #
190
+ def dup
191
+
192
+ OpenWFE::fulldup(self)
193
+ end
194
+
195
+ alias eql? ==
196
+
197
+ def to_debug_s
198
+ "(fei #{wfname} #{wfrevision} #{wfid} #{expid} #{expname})"
199
+ end
200
+
201
+ #
202
+ # Returns a very short string representation (fei wfid expid expname).
203
+ #
204
+ def to_short_s
205
+ "(fei #{wfid} #{expid} #{expname})"
206
+ end
207
+
208
+ #
209
+ # Returns a URI escaped string with just the wfid and the expid, like
210
+ # '20070917-dupibodasa__0.0.1'
211
+ #
212
+ # Useful for unique identifier in URIs.
213
+ #
214
+ def to_web_s
215
+
216
+ eid = expid.gsub("\.", "_")
217
+
218
+ URI.escape "#{wfid}__#{eid}"
219
+ end
220
+
221
+ #
222
+ # Splits the web fei into the workflow instance id and the expression
223
+ # id.
224
+ #
225
+ def self.split_web_s (s)
226
+
227
+ i = s.rindex("__")
228
+
229
+ [ s[0..i-1], s[i+2..-1].gsub("\_", ".") ]
230
+ end
231
+
232
+ #
233
+ # Yet another debugging method. Just returns the sub_instance_id and
234
+ # the expression_id, in a string.
235
+ #
236
+ def to_env_s
237
+
238
+ "i#{sub_instance_id} #{@expression_id}"
239
+ end
240
+
241
+ #
242
+ # Returns the workflow instance id without any subflow indices.
243
+ # For example, if the wfid is "1234.0.1", this method will
244
+ # return "1234".
245
+ #
246
+ def parent_workflow_instance_id
247
+
248
+ FlowExpressionId.to_parent_wfid workflow_instance_id
249
+ end
250
+
251
+ alias :parent_wfid :parent_workflow_instance_id
252
+
253
+ #
254
+ # Returns "" if this expression id belongs to a top process,
255
+ # returns something like ".0" or ".1.3" if this exp id belongs to
256
+ # an expression in a subprocess.
257
+ # (Only used in some unit tests for now)
258
+ #
259
+ def sub_instance_id
260
+
261
+ i = workflow_instance_id.index(".")
262
+ return "" unless i
263
+ workflow_instance_id[i..-1]
264
+ end
265
+
266
+ #
267
+ # If this flow expression id belongs to a sub instance, a call to
268
+ # this method will return the last number of the sub instanceid.
269
+ #
270
+ # For example, in the case of the instance "20071114-dukikomino.1", "1"
271
+ # will be returned. For "20071114-dukikomino.1.0", "0" will be returned.
272
+ #
273
+ # If the flow expression id doesn't belong to a sub instance, nil
274
+ # will be returned.
275
+ #
276
+ def last_sub_instance_id
277
+
278
+ i = workflow_instance_id.rindex(".")
279
+ return nil unless i
280
+ workflow_instance_id[i+1..-1]
281
+ end
282
+
283
+ #
284
+ # Returns true if this flow expression id belongs to a process
285
+ # which is not a subprocess.
286
+ #
287
+ def is_in_parent_process?
288
+
289
+ (sub_instance_id == "")
290
+ end
291
+
292
+ #
293
+ # Returns the last part of the expression_id. For example, if
294
+ # the expression_id is "0.1.0.4", "4" will be returned.
295
+ #
296
+ # This method is used in "concurrence" when merging workitems coming
297
+ # backing from the children expressions.
298
+ #
299
+ def child_id
300
+
301
+ i = @expression_id.rindex(".")
302
+ return @expression_id unless i
303
+ @expression_id[i+1..-1]
304
+ end
305
+
306
+ #
307
+ # This class method parses a string into a FlowExpressionId instance
308
+ #
309
+ def self.to_fei (string)
310
+
311
+ fei = FlowExpressionId.new
312
+
313
+ ss = string.split(" ")
314
+
315
+ #require 'pp'; puts; pp ss
316
+
317
+ ss = ss[1..-1] if ss[0] == "("
318
+
319
+ fei.owfe_version = ss[1]
320
+
321
+ ssRawEngineId = ss[2].split("/")
322
+ fei.engine_id = ssRawEngineId[0]
323
+ #fei.initial_engine_id = ssRawEngineId[1]
324
+
325
+ fei.workflow_definition_url = ss[3]
326
+ fei.workflow_definition_name = ss[4]
327
+ fei.workflow_definition_revision = ss[5]
328
+ fei.workflow_instance_id = ss[6]
329
+ fei.expression_name = ss[7]
330
+ fei.expression_id = ss[8][0..-2]
331
+
332
+ fei.expression_id = fei.expression_id[0..-2] \
333
+ if fei.expression_id[-1, 1] == ")"
334
+
335
+ fei
336
+ end
337
+
338
+ #
339
+ # An alias for to_fei(string)
340
+ #
341
+ def self.from_s (string)
342
+
343
+ to_fei string
344
+ end
345
+
346
+ #
347
+ # If wfid is already a 'parent wfid' (no sub id), returns it. Else
348
+ # returns the parent wfid (whatever is before the first ".").
349
+ #
350
+ def self.to_parent_wfid (wfid)
351
+
352
+ wfid.split(".").first
353
+ end
354
+ end
355
+
356
+ end
357
+
@@ -0,0 +1,97 @@
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
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'openwfe/logging'
41
+ require 'openwfe/workitem'
42
+ require 'openwfe/contextual'
43
+
44
+
45
+ module OpenWFE
46
+
47
+ #
48
+ # this mixin module provides two protected methods, handle_item() and
49
+ # filter_item(). They can be easily overriden to add some special
50
+ # behaviours.
51
+ #
52
+ module WorkItemListener
53
+ include Contextual, Logging, OwfeServiceLocator
54
+
55
+ protected
56
+
57
+ #
58
+ # Simply considers the object as a workitem and feeds it to the
59
+ # engine.
60
+ #
61
+ def handle_item (item)
62
+
63
+ filter_items item
64
+
65
+ get_engine.reply item
66
+ end
67
+
68
+ #
69
+ # The base implementation is just empty, feel free to override it
70
+ # if you need to filter workitems.
71
+ #
72
+ # One example :
73
+ #
74
+ # class MyListener
75
+ # include WorkItemListener
76
+ #
77
+ # protected
78
+ #
79
+ # #
80
+ # # MyListener doesn't accept launchitems
81
+ # #
82
+ # def filter_items (item)
83
+ # raise "launchitems not allowed" \
84
+ # if item.is_a?(OpenWFE::LaunchItem)
85
+ # end
86
+ # end
87
+ #
88
+ def filter_items (item)
89
+
90
+ #raise(
91
+ # "listener of class '#{self.class.name}' "+
92
+ # "doesn't accept launchitems")
93
+ end
94
+ end
95
+
96
+ end
97
+