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,258 @@
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
+ require 'openwfe/expressions/raw'
41
+ require 'openwfe/expressions/environment'
42
+ require 'openwfe/expressions/fe_define'
43
+ require 'openwfe/expressions/fe_misc'
44
+ require 'openwfe/expressions/fe_set'
45
+ require 'openwfe/expressions/fe_if'
46
+ require 'openwfe/expressions/fe_equals'
47
+ require 'openwfe/expressions/fe_sequence'
48
+ require 'openwfe/expressions/fe_subprocess'
49
+ require 'openwfe/expressions/fe_concurrence'
50
+ require 'openwfe/expressions/fe_participant'
51
+ require 'openwfe/expressions/fe_sleep'
52
+ require 'openwfe/expressions/fe_cron'
53
+ require 'openwfe/expressions/fe_when'
54
+ require 'openwfe/expressions/fe_wait'
55
+ require 'openwfe/expressions/fe_reserve'
56
+ require 'openwfe/expressions/fe_losfor'
57
+ require 'openwfe/expressions/fe_command'
58
+ require 'openwfe/expressions/fe_cursor'
59
+ require 'openwfe/expressions/fe_iterator'
60
+ require 'openwfe/expressions/fe_fqv'
61
+ require 'openwfe/expressions/fe_cancel'
62
+ require 'openwfe/expressions/fe_do'
63
+ require 'openwfe/expressions/fe_save'
64
+ require 'openwfe/expressions/fe_filter_definition'
65
+ require 'openwfe/expressions/fe_filter'
66
+ require 'openwfe/expressions/fe_listen'
67
+ require 'openwfe/expressions/fe_timeout'
68
+ require 'openwfe/expressions/fe_step'
69
+
70
+
71
+ module OpenWFE
72
+
73
+ #
74
+ # The mapping between expression names like 'sequence', 'participant', etc
75
+ # and classes like 'ParticipantExpression', 'SequenceExpression', etc.
76
+ #
77
+ class ExpressionMap
78
+
79
+ def initialize
80
+
81
+ super
82
+
83
+ @expressions = {}
84
+ @ancestors = {}
85
+
86
+ register DefineExpression
87
+
88
+ register DescriptionExpression
89
+
90
+ register SequenceExpression
91
+ register ParticipantExpression
92
+
93
+ register ConcurrenceExpression
94
+ register GenericSyncExpression
95
+
96
+ register ConcurrentIteratorExpression
97
+
98
+ register SubProcessRefExpression
99
+
100
+ register SetValueExpression
101
+ register UnsetValueExpression
102
+
103
+ register DefinedExpression
104
+
105
+ register IfExpression
106
+ register CaseExpression
107
+
108
+ register EqualsExpression
109
+
110
+ register SleepExpression
111
+ register CronExpression
112
+ register WhenExpression
113
+ register WaitExpression
114
+
115
+ register ReserveExpression
116
+
117
+ register RevalExpression
118
+ register PrintExpression
119
+ register LogExpression
120
+
121
+ register LoseExpression
122
+ register ForgetExpression
123
+
124
+ register CursorExpression
125
+ register LoopExpression
126
+
127
+ register CursorCommandExpression
128
+
129
+ register IteratorExpression
130
+
131
+ register FqvExpression
132
+ register AttributeExpression
133
+
134
+ register CancelProcessExpression
135
+
136
+ register UndoExpression
137
+ register RedoExpression
138
+
139
+ register SaveWorkItemExpression
140
+ register RestoreWorkItemExpression
141
+
142
+ register FilterDefinitionExpression
143
+ register FilterExpression
144
+
145
+ register ListenExpression
146
+
147
+ register TimeoutExpression
148
+
149
+ register EvalExpression
150
+ register ExpExpression
151
+
152
+ register StepExpression
153
+
154
+ register Environment
155
+ #
156
+ # only used by get_expression_names()
157
+
158
+ register_ancestors RawExpression
159
+ #register_ancestors XmlRawExpression
160
+ #register_ancestors ProgRawExpression
161
+ #
162
+ # just register the ancestors for those two
163
+ end
164
+
165
+ #
166
+ # Returns the expression class corresponding to the given
167
+ # expression name
168
+ #
169
+ def get_class (expression_name)
170
+
171
+ expression_name = expression_name.expression_name \
172
+ if expression_name.kind_of?(RawExpression)
173
+
174
+ expression_name = OpenWFE::symbol_to_name(expression_name)
175
+
176
+ @expressions[expression_name]
177
+ end
178
+
179
+ def get_sync_class (expression_name)
180
+
181
+ get_class(expression_name)
182
+ end
183
+
184
+ #
185
+ # Returns true if the given expression name ('sequence',
186
+ # 'process-definition', ...) is a DefineExpression.
187
+ #
188
+ def is_definition? (expression_name)
189
+
190
+ c = get_class(expression_name)
191
+
192
+ #c == DefineExpression
193
+ (c and c.is_definition?)
194
+ end
195
+
196
+ #
197
+ # Returns an array of expression names whose class are assignable
198
+ # from the given expression_class.
199
+ #
200
+ def get_expression_names (expression_class)
201
+
202
+ return expression_class.expression_names \
203
+ if expression_class.method_defined?(:expression_names)
204
+
205
+ names = []
206
+ @expressions.each do |k, v|
207
+ names << k if v.ancestors.include? expression_class
208
+ end
209
+ names
210
+ end
211
+
212
+ #
213
+ # Returns an array of expression classes that have the given
214
+ # class/module among their ancestors.
215
+ #
216
+ def get_expression_classes (ancestor)
217
+
218
+ @ancestors[ancestor]
219
+ end
220
+
221
+ def to_s
222
+ s = ""
223
+ @expressions.keys.sort.each do |name|
224
+ s << "- '#{name}' -> '#{@expressions[name].to_s}'\n"
225
+ end
226
+ s
227
+ end
228
+
229
+ #
230
+ # Registers an Expression class within this expression map.
231
+ # This method is usually never called from out of the ExpressionMap
232
+ # class, but, who knows, it could prove useful one day as a 'public'
233
+ # method.
234
+ #
235
+ def register (expression_class)
236
+
237
+ expression_class.expression_names.each do |name|
238
+ name = OpenWFE::to_dash(name)
239
+ @expressions[name] = expression_class
240
+ end
241
+ register_ancestors expression_class
242
+ end
243
+
244
+ protected
245
+
246
+ #
247
+ # registers all the ancestors of an expression class
248
+ #
249
+ def register_ancestors (expression_class)
250
+
251
+ expression_class.ancestors.each do |ancestor|
252
+ (@ancestors[ancestor] ||= []) << expression_class
253
+ end
254
+ end
255
+ end
256
+
257
+ end
258
+
@@ -0,0 +1,109 @@
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
+ # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
34
+ #
35
+
36
+ #
37
+ # "made in Japan"
38
+ #
39
+ # John Mettraux at openwfe.org
40
+ #
41
+
42
+ require 'openwfe/expressions/condition'
43
+ require 'openwfe/expressions/flowexpression'
44
+
45
+
46
+ module OpenWFE
47
+
48
+ #
49
+ # This expression cancels the current process instance. Use with care.
50
+ #
51
+ # <sequence>
52
+ # <participant ref="before" />
53
+ # <cancel-process />
54
+ # <participant ref="after" />
55
+ # </sequence>
56
+ #
57
+ # the message "after" will never get printed.
58
+ #
59
+ # Use rather in scenarii like that one :
60
+ #
61
+ # class TestDefinition1 < ProcessDefinition
62
+ # def make
63
+ # process_definition :name => "25_cancel", :revision => "1" do
64
+ # sequence do
65
+ # participant "customer"
66
+ # _cancel_process :if => "${f:no_thanks} == true"
67
+ # concurrence do
68
+ # participant "accounting"
69
+ # participant "logistics"
70
+ # end
71
+ # end
72
+ # end
73
+ # end
74
+ # end
75
+ #
76
+ # Note that the expression accepts an "if" attribute.
77
+ #
78
+ class CancelProcessExpression < FlowExpression
79
+ include ConditionMixin
80
+
81
+ names :cancel_process, :cancel_flow
82
+
83
+ #
84
+ # apply / reply
85
+
86
+ def apply (workitem)
87
+
88
+ conditional = eval_condition(:if, workitem, :unless)
89
+ #
90
+ # for example : <cancel-process if="${approved} == false"/>
91
+
92
+ return reply_to_parent(workitem) \
93
+ if conditional == false
94
+
95
+ #
96
+ # else, do cancel the process
97
+
98
+ get_expression_pool.cancel_process self
99
+
100
+ # no need to reply to parent
101
+ end
102
+
103
+ #def reply (workitem)
104
+ #end
105
+
106
+ end
107
+
108
+ end
109
+
@@ -0,0 +1,241 @@
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/expressions/condition'
41
+
42
+
43
+ module OpenWFE
44
+
45
+ #
46
+ # Some constants shared by 'cursor', 'loop', 'iterator' and
47
+ # the CommandExpression.
48
+ #
49
+ module CommandConstants
50
+
51
+ protected
52
+
53
+ A_COMMAND_FIELD = "command-field"
54
+ F_COMMAND = "__cursor_command__"
55
+ A_DISALLOW = "disallow"
56
+
57
+ C_BACK = "back"
58
+ C_SKIP = "skip"
59
+ C_BREAK = "break"
60
+ C_CANCEL = "cancel"
61
+ C_REWIND = "rewind"
62
+ C_CONTINUE = "continue"
63
+ C_JUMP = "jump"
64
+
65
+ A_STEP = "step"
66
+ end
67
+
68
+ #
69
+ # A mixin shared by 'iterator' and 'cursor' ('loop'), simply
70
+ # provides the methods for looking up the "command" (break, skip,
71
+ # rewind, ...) from the workitem and the process.
72
+ #
73
+ module CommandMixin
74
+ include CommandConstants
75
+
76
+ protected
77
+
78
+ def determine_command_and_step (workitem)
79
+
80
+ command_field = lookup_command_field workitem
81
+
82
+ command, step = lookup_command command_field, workitem
83
+
84
+ disallow_list = lookup_disallow workitem
85
+
86
+ command = nil \
87
+ if disallow_list and disallow_list.include?(command)
88
+
89
+ workitem.attributes.delete(command_field)
90
+
91
+ [ command, step ]
92
+ end
93
+
94
+ private
95
+
96
+ #
97
+ # Looks up the value in the command field.
98
+ #
99
+ def lookup_command_field (workitem)
100
+
101
+ lookup_attribute(
102
+ A_COMMAND_FIELD, workitem, :default => F_COMMAND)
103
+ end
104
+
105
+ #
106
+ # Returns the command and the step
107
+ #
108
+ def lookup_command (command_field, workitem)
109
+
110
+ command = workitem.attributes[command_field]
111
+
112
+ return [ nil, 1 ] unless command
113
+ #
114
+ # this corresponds to the "just one step forward" default
115
+
116
+ command, step = command.strip.split
117
+
118
+ step = if step
119
+ step.to_i
120
+ else
121
+ 1
122
+ end
123
+
124
+ step = -step if command == C_BACK
125
+
126
+ [ command, step ]
127
+ end
128
+
129
+ #
130
+ # Fetches the value of the 'disallow' cursor attribute.
131
+ #
132
+ def lookup_disallow (workitem)
133
+
134
+ lookup_array_attribute A_DISALLOW, workitem
135
+ end
136
+ end
137
+
138
+ #
139
+ # This class implements the following expressions : back, break,
140
+ # cancel, continue, jump, rewind, skip.
141
+ #
142
+ # They are generally used inside of a 'cursor' (CursorExpression) or
143
+ # a 'loop' (LoopExpression), they can be used outside, but their result
144
+ # (the value of the field '\_\_cursor_command__' will be used as soon as the
145
+ # flow enters a cursor or a loop).
146
+ #
147
+ # In fact, this expression is only a nice wrapper that sets the
148
+ # value of the field "\_\_cursor_command__" to its name ('back' for example)
149
+ # plus to the 'step' attribute value.
150
+ #
151
+ # For example <skip step="3"/> simply sets the value of the field
152
+ # '\_\_cursor_command__' to 'skip 3'.
153
+ #
154
+ # (The field \_\_cursor_command__ is, by default, read and
155
+ # obeyed by the 'cursor' expression).
156
+ #
157
+ # With Ruby process definitions, you can directly write :
158
+ #
159
+ # skip 2
160
+ # jump "0"
161
+ #
162
+ # instead of
163
+ #
164
+ # skip :step => "2"
165
+ # jump :step => "0"
166
+ #
167
+ # Likewise, in an XML process definition, you can write
168
+ #
169
+ # <skip>2</skip>
170
+ #
171
+ # although that might still look lighter (it's longer though) :
172
+ #
173
+ # <skip step="2"/>
174
+ #
175
+ #
176
+ # About the command themselves :
177
+ #
178
+ # * back : will go back from the number of given steps, 1 by default
179
+ # * break : will exit the cursor (or the loop)
180
+ # * cancel : an alias for 'break'
181
+ # * continue : will exit the cursor, if in a loop, will get back at step 0
182
+ # * jump : will move the cursor (or loop) to an absolute given position (count starts at 0)
183
+ # * rewind : an alias for continue
184
+ # * skip : skips the given number of steps
185
+ #
186
+ #
187
+ # All those command support an 'if' attribute to restrict their execution :
188
+ #
189
+ # cursor do
190
+ # go_to_shop
191
+ # check_prices
192
+ # _break :if => "${price} > ${f:current_cash}"
193
+ # buy_stuff
194
+ # end
195
+ #
196
+ # The 'rif' attribute may be used instead of the 'if' attribute. Its value
197
+ # is some ruby code that, when evaluating to true will let the command
198
+ # be executed.
199
+ #
200
+ # _skip 2, :rif => "workitem.customers.size % 2 == 0"
201
+ # #
202
+ # # skips if the nb of customers is pair
203
+ #
204
+ # Note that the 'rif' attribute will work only if the
205
+ # <tt>:ruby_eval_allowed</tt> parameter is set to true in the engine's
206
+ # application context.
207
+ #
208
+ # engine.application_context[:ruby_eval_allowed] = true
209
+ #
210
+ class CursorCommandExpression < FlowExpression
211
+ include CommandConstants
212
+ include ConditionMixin
213
+
214
+ names :back, :skip, :continue, :break, :cancel, :rewind, :jump
215
+
216
+ def apply (workitem)
217
+
218
+ conditional = eval_condition(:if, workitem, :unless)
219
+ #
220
+ # for example : <break if="${approved} == true"/>
221
+
222
+ if conditional == nil or conditional
223
+
224
+ command = @fei.expression_name
225
+
226
+ step = lookup_attribute(A_STEP, workitem)
227
+ step = fetch_text_content(workitem) unless step
228
+ step = 1 unless step
229
+ step = Integer(step)
230
+
231
+ command = "#{command} #{step}" #if step != 1
232
+
233
+ workitem.attributes[F_COMMAND] = command
234
+ end
235
+
236
+ reply_to_parent workitem
237
+ end
238
+ end
239
+
240
+ end
241
+