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,244 @@
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 'rufus/eval' # gem 'rufus-eval'
41
+
42
+
43
+ module OpenWFE
44
+
45
+ #
46
+ # A ConditionMixin is a mixin for flow expressions like 'if' and 'break' for
47
+ # example.
48
+ # It allows for shorter notations like
49
+ #
50
+ # <if test="${f:approved} == true"/>
51
+ #
52
+ # or
53
+ #
54
+ # _loop do
55
+ # participant :graphical_designer
56
+ # participant :business_analyst
57
+ # _break :if => "${f:approved}"
58
+ # end
59
+ #
60
+ module ConditionMixin
61
+
62
+ #
63
+ # This is the method brought to expression classes including this
64
+ # mixin. Easy evaluation of a conditon expressed in an attribute.
65
+ #
66
+ def eval_condition (attname, workitem, nattname=nil)
67
+
68
+ positive = nil
69
+ negative = nil
70
+
71
+ positive = do_eval_condition(attname, workitem)
72
+ negative = do_eval_condition(nattname, workitem) if nattname
73
+
74
+ negative = (not negative) if negative != nil
75
+
76
+ return positive if positive != nil
77
+
78
+ negative
79
+ end
80
+
81
+ #
82
+ # Returns nil if the cited attname (without or without 'r' prefix)
83
+ # is not present.
84
+ #
85
+ # Attname may be a String or a Symbol, or an Array of String or Symbol
86
+ # instances.
87
+ #
88
+ # Returns the Symbol the attribute if present.
89
+ #
90
+ def determine_condition_attribute (attname)
91
+
92
+ attname = [ attname ] unless attname.is_a?(Array)
93
+
94
+ attname.each do |aname|
95
+ aname = aname.intern if aname.is_a?(String)
96
+ return aname if has_attribute(aname)
97
+ return aname if has_attribute("r" + aname.to_s)
98
+ end
99
+
100
+ nil
101
+ end
102
+
103
+ protected
104
+
105
+ def do_eval_condition (attname, workitem)
106
+
107
+ #attname = pick_attribute(attname) \
108
+ # if attname.is_a?(Array)
109
+
110
+ conditional = lookup_attribute(attname, workitem)
111
+ rconditional = lookup_attribute("r"+attname.to_s, workitem)
112
+
113
+ return do_eval(rconditional, workitem) \
114
+ if rconditional and not conditional
115
+
116
+ return nil \
117
+ unless conditional
118
+
119
+ ldebug { "do_eval_condition() 0 for >#{conditional}<" }
120
+
121
+ conditional = unescape conditional
122
+
123
+ ldebug { "do_eval_condition() 1 for >#{conditional}<" }
124
+
125
+ r = eval_set conditional
126
+ return r if r != nil
127
+
128
+ begin
129
+ return to_boolean(do_eval(conditional, workitem))
130
+ rescue Exception => e
131
+ # probably needs some quoting...
132
+ ldebug { "do_eval_condition() e : #{e}" }
133
+ end
134
+
135
+ conditional = do_quote(conditional)
136
+
137
+ ldebug { "do_eval_condition() 2 for >#{conditional}<" }
138
+
139
+ to_boolean(do_eval(conditional, workitem))
140
+ end
141
+
142
+ SET_REGEX = /(\S*?)( is)?( not)? set$/
143
+
144
+ #
145
+ # Evals the 'x [ is][ not] set' notation...
146
+ #
147
+ def eval_set (cond)
148
+
149
+ m = SET_REGEX.match cond
150
+
151
+ return nil unless m
152
+
153
+ val = m[1]
154
+ n = m[3]
155
+
156
+ ldebug do
157
+ "eval_set() for >#{cond}< "+
158
+ "m[1] is '#{val}', m[3] is '#{n}'"
159
+ end
160
+
161
+ val = val.strip if val
162
+ val = (val != nil and val != '')
163
+ n = (n and n.strip == 'not')
164
+
165
+ n ? (not val) : val
166
+ end
167
+
168
+ private
169
+
170
+ #
171
+ # Returns true if result is the "true" String or the true
172
+ # boolean value. Returns false else.
173
+ #
174
+ def to_boolean (o)
175
+
176
+ ldebug { "to_boolean() o is _#{o}_" }
177
+
178
+ #(o == "true" or o == true)
179
+ o = o.strip if o.is_a?(String)
180
+ not (o == nil || o == false || o == 'false' || o == '')
181
+ end
182
+
183
+ #
184
+ # unescapes '>' and '<'
185
+ #
186
+ def unescape (s)
187
+
188
+ s.gsub("&amp;", "&").gsub("&gt;", ">").gsub("&lt;", "<")
189
+ end
190
+
191
+ #
192
+ # Quotes the given string so that it can easily get evaluated
193
+ # as Ruby code (a string comparison actually).
194
+ #
195
+ def do_quote (string)
196
+
197
+ op = find_operator string
198
+
199
+ return '"' + string + '"' unless op
200
+
201
+ op, i = op
202
+
203
+ s = '"'
204
+ s << string[0..i-1].strip
205
+ s << '" '
206
+ s << string[i, op.length]
207
+ s << ' "'
208
+ s << string[i+op.length..-1].strip
209
+ s << '"'
210
+ s
211
+ end
212
+
213
+ #
214
+ # Returns the operator and its index (position) in the string.
215
+ # Returns nil if not operator was found in the string.
216
+ #
217
+ def find_operator (string)
218
+
219
+ [ "==", "!=", "<=", ">=", "<", ">" ].each do |op|
220
+ i = string.index op
221
+ next unless i
222
+ return [ op, i ]
223
+ end
224
+ nil
225
+ end
226
+
227
+ #
228
+ # Runs the given given within an instance_eval() at a $SAFE
229
+ # level of 4.
230
+ #
231
+ def do_eval (s, workitem)
232
+
233
+ wi = workitem
234
+ fe = self
235
+ #
236
+ # wi and fe are thus available as well
237
+ # (as self and workitem)
238
+
239
+ Rufus::eval_safely(s, 4, binding())
240
+ end
241
+ end
242
+
243
+ end
244
+
@@ -0,0 +1,246 @@
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 'rufus/scheduler'
41
+ require 'openwfe/utils'
42
+ require 'openwfe/expressions/flowexpression'
43
+
44
+
45
+ module OpenWFE
46
+
47
+ #
48
+ # An environment is a store for variables.
49
+ # It's an expression thus it's storable in the expression pool.
50
+ #
51
+ class Environment < FlowExpression
52
+ include Rufus::Schedulable
53
+
54
+ names :environment
55
+
56
+ V_PAUSED = VAR_PAUSED[1..-1]
57
+
58
+ #
59
+ # the variables stored in this environment.
60
+ #
61
+ attr_accessor :variables
62
+
63
+ #def initialize (
64
+ # fei, parent, environment_id, application_context, attributes)
65
+ # super(fei, parent, environment_id, application_context, attributes)
66
+ # @variables = {}
67
+ #end
68
+
69
+ def initialize
70
+
71
+ super
72
+
73
+ @variables = {}
74
+ end
75
+
76
+ def self.new_env (
77
+ fei, parent_id, environment_id, app_context, attributes)
78
+
79
+ env = self.new
80
+
81
+ env.fei = fei
82
+ env.parent_id = parent_id
83
+ env.environment_id = environment_id
84
+ env.application_context = app_context
85
+ env.attributes = attributes
86
+
87
+ env
88
+ end
89
+
90
+ #
91
+ # Looks up for the value of a variable in this environment.
92
+ #
93
+ def [] (key)
94
+
95
+ value = @variables[key]
96
+
97
+ return value \
98
+ if @variables.has_key?(key) or is_engine_environment?
99
+
100
+ return get_parent[key] if @parent_id
101
+
102
+ get_expression_pool.fetch_engine_environment[key]
103
+ end
104
+
105
+ #
106
+ # Binds a variable in this environment.
107
+ #
108
+ def []= (key, value)
109
+
110
+ #ldebug do
111
+ # "#{fei.to_debug_s} []= "+
112
+ # "'#{key}' => '#{value}' (#{value.class.name})"
113
+ #end
114
+
115
+ #synchronize do
116
+
117
+ @variables[key] = value
118
+ store_itself
119
+ #end
120
+ end
121
+
122
+ #
123
+ # Removes a variable from this environment.
124
+ #
125
+ def delete (key)
126
+ #synchronize do
127
+
128
+ ldebug { "#{fei.to_debug_s} delete() '#{key}'" }
129
+
130
+ @variables.delete key
131
+ store_itself
132
+ #end
133
+ end
134
+
135
+ #
136
+ # This method is usually called before the environment gets wiped
137
+ # out of the expression pool.
138
+ # It takes care of removing subprocess templates pointed at by
139
+ # variables in this environment.
140
+ #
141
+ def unbind
142
+
143
+ #ldebug { "unbind() for #{fei.to_s}" }
144
+
145
+ @variables.each do |key, value|
146
+
147
+ #ldebug { "unbind() '#{key}' => #{value.class}" }
148
+
149
+ if value.kind_of?(FlowExpressionId)
150
+
151
+ get_expression_pool.remove(value)
152
+
153
+ #elsif value.kind_of?(FlowExpression)
154
+ # value.cancel
155
+ end
156
+ end
157
+ end
158
+
159
+ #
160
+ # Returns true if this environment is the engine environment
161
+ #
162
+ def is_engine_environment?
163
+
164
+ (@fei == get_expression_pool.engine_environment_id)
165
+ end
166
+
167
+ #
168
+ # Should never get used, only the reschedule() method is relevant
169
+ # for the Schedulable aspect of an environment expression.
170
+ #
171
+ def trigger (params)
172
+
173
+ raise "an environment should never get directly triggered"
174
+ end
175
+
176
+ #
177
+ # Will reschedule any 'Schedulable' variable found in this environment
178
+ # this method especially targets cron expressions that are stored
179
+ # as variables and need to be rescheduled upon engine restart.
180
+ #
181
+ def reschedule (scheduler)
182
+
183
+ @fei.owfe_version = OPENWFERU_VERSION \
184
+ if @fei.wfurl == 'ee' and @fei.wfname =='ee'
185
+ #
186
+ # so that older versions of engine envs get accepted
187
+
188
+ @variables.each do |key, value|
189
+
190
+ #ldebug { "reschedule() - item of class #{value.class}" }
191
+
192
+ get_expression_pool.paused_instances[@fei.wfid] = true \
193
+ if key == V_PAUSED
194
+
195
+ next unless value.kind_of?(Rufus::Schedulable)
196
+
197
+ linfo { "reschedule() for instance of #{value.class.name}" }
198
+
199
+ value.application_context = @application_context
200
+ value.reschedule(scheduler)
201
+ end
202
+
203
+ store_itself
204
+ end
205
+
206
+ #
207
+ # Returns the top environment for the process instance (the
208
+ # environment just before the engine environment).
209
+ #
210
+ def get_root_environment
211
+
212
+ #ldebug { "get_root_environment\n#{self}" }
213
+
214
+ return self unless @parent_id
215
+
216
+ get_parent.get_root_environment
217
+ end
218
+
219
+ #--
220
+ #def get_subprocess_environment
221
+ # return self if not @parent_id
222
+ # return self if @parent_id.sub_instance_id != @fei.sub_instance_id
223
+ # get_parent.get_subprocess_environment
224
+ #end
225
+ #++
226
+
227
+ #
228
+ # Returns a deep copy of this environment.
229
+ #
230
+ def dup
231
+
232
+ env = Environment.new_env(
233
+ @fei.dup,
234
+ @parent_id,
235
+ @environment_id,
236
+ @application_context,
237
+ OpenWFE::fulldup(@attributes))
238
+
239
+ env.variables = OpenWFE::fulldup self.variables
240
+
241
+ env
242
+ end
243
+ end
244
+
245
+ end
246
+