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,242 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2008, John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'rexml/document'
41
+ require 'openwfe/expressions/rprocdef'
42
+
43
+
44
+ module OpenWFE
45
+
46
+ #
47
+ # A process definition parser.
48
+ #
49
+ # Currently supports XML, Ruby process pdefinitions, YAML and JSON.
50
+ #
51
+ module DefParser
52
+
53
+ #
54
+ # in : a process pdefinition
55
+ # out : a tree [ name, attributes, children ]
56
+ #
57
+ def self.parse (pdef)
58
+
59
+ return pdef \
60
+ if pdef.is_a?(Array)
61
+
62
+ return parse_string(pdef) \
63
+ if pdef.is_a?(String)
64
+
65
+ return pdef.do_make \
66
+ if pdef.is_a?(ProcessDefinition) or pdef.is_a?(Class)
67
+
68
+ return pdef.to_a \
69
+ if pdef.is_a?(SimpleExpRepresentation)
70
+ # for legacy stuff
71
+
72
+ raise "cannot handle pdefinition of class #{pdef.class.name}"
73
+ end
74
+
75
+ def self.parse_string (pdef)
76
+
77
+ pdef = pdef.strip
78
+
79
+ return parse_xml(pdef) \
80
+ if pdef[0, 1] == "<"
81
+
82
+ return YAML.load(s) \
83
+ if pdef.match /^--- ./
84
+
85
+ #
86
+ # else it's some ruby code to eval
87
+
88
+ ProcessDefinition.eval_ruby_process_definition pdef
89
+ end
90
+
91
+ #
92
+ # The process definition is expressed as XML, turn that into
93
+ # an expression tree.
94
+ #
95
+ def self.parse_xml (xml)
96
+
97
+ xml = REXML::Document.new(xml) \
98
+ if xml.is_a?(String)
99
+
100
+ xml = xml.root \
101
+ if xml.is_a?(REXML::Document)
102
+
103
+ if xml.is_a?(REXML::Text)
104
+
105
+ s = xml.to_s.strip
106
+
107
+ return s if s.length > 0
108
+
109
+ return nil
110
+ end
111
+
112
+ return nil if xml.is_a?(REXML::Comment)
113
+
114
+ # xml element thus...
115
+
116
+ name = xml.name
117
+
118
+ attributes = xml.attributes.inject({}) do |r, (k, v)|
119
+ r[k] = v
120
+ r
121
+ end
122
+
123
+ rep = [ name, attributes, [] ]
124
+
125
+ xml.children.each do |c|
126
+
127
+ r = parse_xml c
128
+
129
+ rep.last << r if r
130
+ end
131
+
132
+ rep
133
+ end
134
+ end
135
+
136
+ #
137
+ # A set of methods for manipulating / querying a process expression tree
138
+ #
139
+ module ExpressionTree
140
+
141
+ #
142
+ # Extracts the description out of a process definition tree.
143
+ #
144
+ # TODO #14964 : add language support here
145
+ #
146
+ def self.get_description (tree)
147
+
148
+ #return tree.last.first.to_s if tree.first == 'description'
149
+ #tree.last.each do |child|
150
+ # d = get_description(child)
151
+ # return d if d
152
+ #end
153
+ #nil
154
+
155
+ tree.last.each do |child|
156
+ next unless child.is_a?(Array)
157
+ return child.last.first if child.first == 'description'
158
+ end
159
+
160
+ nil
161
+ end
162
+
163
+ #
164
+ # Returns a string containing the ruby code that generated this
165
+ # raw representation tree.
166
+ #
167
+ def self.to_code_s (tree, indentation = 0)
168
+
169
+ s = ""
170
+ tab = " "
171
+ ind = tab * indentation
172
+
173
+ s << ind
174
+ s << OpenWFE::make_safe(tree.first)
175
+
176
+ sa = ""
177
+ tree[1].each do |k, v|
178
+ sa << ", :#{OpenWFE::to_underscore(k)} => '#{v}'"
179
+ end
180
+ s << sa[1..-1] if sa.length > 0
181
+
182
+ if tree.last.length > 0
183
+ s << " do\n"
184
+ tree.last.each do |child|
185
+ #if child.respond_to?(:to_code_s)
186
+ if child.is_a?(Array) and child.size == 3 # and ...
187
+ s << to_code_s(child, indentation + 1)
188
+ else
189
+ s << ind
190
+ s << tab
191
+ s << "'#{child.to_s}'"
192
+ end
193
+ s << "\n"
194
+ end
195
+ s << ind
196
+ s << "end"
197
+ end
198
+
199
+ s
200
+ end
201
+
202
+ #
203
+ # Turns the expression tree into an XML process definition
204
+ #
205
+ def self.to_xml (tree)
206
+
207
+ elt = REXML::Element.new tree.first.to_s
208
+
209
+ tree[1].each do |k, v|
210
+
211
+ elt.attributes[k] = v
212
+ end
213
+
214
+ tree.last.each do |child|
215
+
216
+ #if child.kind_of?(SimpleExpRepresentation)
217
+ if child.is_a?(Array) and child.size == 3
218
+
219
+ elt << to_xml(child)
220
+ else
221
+
222
+ elt << REXML::Text.new(child.to_s)
223
+ end
224
+ end
225
+
226
+ elt
227
+ end
228
+
229
+ #
230
+ # Returns an XML string
231
+ #
232
+ def self.to_s (tree, indent=-1)
233
+
234
+ d = REXML::Document.new
235
+ d << to_xml(tree)
236
+ s = ""
237
+ d.write s, indent
238
+ s
239
+ end
240
+ end
241
+ end
242
+
@@ -0,0 +1,121 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2008, John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ module OpenWFE
41
+
42
+ #
43
+ # This module gets included into the result of the expression pool (and
44
+ # engine) process_stack method (if the optional parameter 'unapplied' is
45
+ # set to true).
46
+ #
47
+ # It adds a representation() method that returns an up-to-date
48
+ # representation of the executing process instance.
49
+ # This representation is suitable for 'fluo' rendering.
50
+ #
51
+ module RepresentationMixin
52
+
53
+ #
54
+ # Computes and returns the up-to-date representation of
55
+ # the process definition (on the fly changes included)
56
+ #
57
+ def representation
58
+
59
+ root_exp = find_root_expression
60
+
61
+ update_rep root_exp
62
+ end
63
+
64
+ protected
65
+
66
+ #
67
+ # if a child expression is present (in the process stack)
68
+ # makes sure to take its current representation and include
69
+ # it in the parent representation.
70
+ #
71
+ def update_rep (flow_expression)
72
+
73
+ rep = flow_expression.raw_representation.dup
74
+ children = flow_expression.children
75
+
76
+ index = -1
77
+
78
+ rep[2] = rep.last.inject([]) { |r, c|
79
+
80
+ index += 1
81
+
82
+ r << if c.is_a?(Array)
83
+
84
+ child_fei = flow_expression.children[index]
85
+ child_exp = find_expression child_fei
86
+
87
+ if child_exp
88
+ update_rep(child_exp)
89
+ else
90
+ #c[1]['__gone__'] = true
91
+ #
92
+ # not a good idea
93
+ # have to differentiate between 'replied'
94
+ # expressions and removed expressions
95
+ c
96
+ end
97
+ else
98
+
99
+ c
100
+ end
101
+
102
+ } if children and children.size > 0
103
+
104
+ rep
105
+ end
106
+
107
+ def find_root_expression
108
+
109
+ self.find do |fexp|
110
+ fexp.fei.expid == "0" &&
111
+ ( ! fexp.is_a?(OpenWFE::Environment)) &&
112
+ fexp.fei.is_in_parent_process?
113
+ end
114
+ end
115
+
116
+ def find_expression (fei)
117
+
118
+ self.find { |fexp| fexp.fei == fei }
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,188 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2007-2008, John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'thread'
41
+
42
+
43
+ module OpenWFE
44
+
45
+ #
46
+ # This mixin gathers all the logic for a threaded expression storage,
47
+ # one that doesn't immediately stores workitems (removes overriding
48
+ # operations).
49
+ # Using this threaded storage brings a very important perf benefit.
50
+ #
51
+ module ThreadedStorageMixin
52
+
53
+ #
54
+ # Will take care of stopping the 'queue processing' thread.
55
+ #
56
+ def stop
57
+
58
+ @stopped = true
59
+ @queue.push :stop
60
+ end
61
+
62
+ #
63
+ # makes sure that the queue isn't actually preparing a batch
64
+ # before returning a result.
65
+ #
66
+ def find_expressions (options)
67
+
68
+ Thread.pass
69
+
70
+ @mutex.synchronize do
71
+ super
72
+ end
73
+ end
74
+
75
+ protected
76
+
77
+ #
78
+ # starts the thread that does the actual persistence.
79
+ #
80
+ def start_queue
81
+
82
+ @mutex = Mutex.new
83
+ @queue = Queue.new
84
+
85
+ Thread.new do
86
+
87
+ loop do
88
+
89
+ events = [ @queue.pop ]
90
+
91
+ @mutex.synchronize do
92
+
93
+ 14.times { Thread.pass } # gather some steam
94
+
95
+ @queue.size.times do
96
+ events << @queue.pop
97
+ end
98
+
99
+ process_events events
100
+ end
101
+
102
+ break if events.include?(:stop)
103
+ end
104
+ end
105
+ end
106
+
107
+ #
108
+ # queues an event for later (well within a second) persistence
109
+ #
110
+ def queue (event, fei, fexp=nil)
111
+
112
+ if @stopped
113
+ process_event event, fei, fexp
114
+ else
115
+ @queue.push [ event, fei, fexp ]
116
+ end
117
+ end
118
+
119
+ def process_events (events)
120
+
121
+ ldebug { "process_events() #{events.size} events" }
122
+
123
+ # reducing the operation count
124
+
125
+ events = events.inject({}) do |r, event|
126
+ r[event[1]] = event if event != :stop
127
+ r
128
+ end
129
+
130
+ ldebug { "process_events() #{events.size} events remaining" }
131
+
132
+ # perform the remaining operations
133
+
134
+ events.each_value do |event, fei, fexp|
135
+
136
+ process_event event, fei, fexp
137
+ end
138
+ end
139
+
140
+ def process_event (event, fei, fexp)
141
+
142
+ begin
143
+ if event == :update
144
+ self[fei] = fexp
145
+ else
146
+ safe_delete fei
147
+ end
148
+ rescue Exception => e
149
+ lwarn do
150
+ "process_event() ':#{event}' exception\n" +
151
+ OpenWFE::exception_to_s(e)
152
+ end
153
+ end
154
+ end
155
+
156
+ #
157
+ # a call to delete that tolerates missing .yaml files
158
+ #
159
+ def safe_delete (fei)
160
+ begin
161
+ self.delete fei
162
+ rescue Exception => e
163
+ # lwarn do
164
+ # "safe_delete() exception\n" +
165
+ # OpenWFE::exception_to_s(e)
166
+ # end
167
+ end
168
+ end
169
+
170
+ #
171
+ # Adds the queue() method as an observer to the update and remove
172
+ # events of the expression pool.
173
+ # :update and :remove mean changes to expressions in the persistence
174
+ # that's why they are observed.
175
+ #
176
+ def observe_expool
177
+
178
+ get_expression_pool.add_observer(:update) do |event, fei, fe|
179
+ ldebug { ":update for #{fei.to_debug_s}" }
180
+ queue event, fei, fe
181
+ end
182
+ get_expression_pool.add_observer(:remove) do |event, fei|
183
+ ldebug { ":remove for #{fei.to_debug_s}" }
184
+ queue event, fei
185
+ end
186
+ end
187
+ end
188
+ end