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,403 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-2008, Nicolas Modryzk and 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
+ # Nicolas Modrzyk at openwfe.org
38
+ # John Mettraux at openwfe.org
39
+ #
40
+
41
+ require 'fileutils'
42
+
43
+ #require 'rufus/lru'
44
+
45
+ require 'openwfe/service'
46
+ require 'openwfe/flowexpressionid'
47
+ require 'openwfe/rudefinitions'
48
+
49
+
50
+ module OpenWFE
51
+
52
+ #
53
+ # This module contains the observe_expool method which binds the
54
+ # storage to the expression pool.
55
+ # It also features a to_s method for the expression storages including
56
+ # it.
57
+ #
58
+ module ExpressionStorageBase
59
+
60
+ def observe_expool
61
+
62
+ get_expression_pool.add_observer(:update) do |channel, fei, fe|
63
+ ldebug { ":update for #{fei}" }
64
+ self[fei] = fe
65
+ end
66
+ get_expression_pool.add_observer(:remove) do |channel, fei|
67
+ ldebug { ":delete for #{fei}" }
68
+ self.delete fei
69
+ end
70
+ end
71
+
72
+ #
73
+ # a human readable representation of the content of the expression
74
+ # storage.
75
+ #
76
+ # Warning : this will display the content of the real storage,
77
+ # (especially when called against a cache).
78
+ #
79
+ def to_s
80
+
81
+ s = "\n\n==== #{self.class} ===="
82
+
83
+ find_expressions.each do |fexp|
84
+
85
+ s << "\n"
86
+ if fexp.kind_of?(RawExpression)
87
+ s << "*raw"
88
+ else
89
+ s << " "
90
+ end
91
+ s << fexp.fei.to_s
92
+ end
93
+ s << "\n==== . ====\n"
94
+
95
+ s
96
+ end
97
+
98
+ #
99
+ # This method is used by the various implementations of
100
+ # find_expressions()
101
+ #
102
+ def does_match? (options, fexp_or_fei)
103
+
104
+ wfid = options[:wfid]
105
+ wfid_prefix = options[:wfid_prefix]
106
+ parent_wfid = options[:parent_wfid]
107
+
108
+ wfname = options[:wfname]
109
+ wfrevision = options[:wfrevision]
110
+
111
+ ic = options[:include_classes]
112
+ ec = options[:exclude_classes]
113
+ ic = Array(ic) if ic
114
+ ec = Array(ec) if ec
115
+
116
+ cs = options[:consider_subprocesses]
117
+
118
+ ap = options[:applied]
119
+
120
+ fexp, fei = if fexp_or_fei.is_a?(FlowExpressionId)
121
+ [ nil, fexp_or_fei ]
122
+ else
123
+ [ fexp_or_fei, fexp_or_fei.fei ]
124
+ end
125
+
126
+ #
127
+ # let's make it verbose...
128
+
129
+ if fexp
130
+ return false if (ap == true and not fexp.apply_time)
131
+ return false if (ap == false and fexp.apply_time)
132
+ return false unless class_accepted?(fexp, ic, ec)
133
+ end
134
+
135
+ return false \
136
+ if wfname and fei.wfname != wfname
137
+ return false \
138
+ if wfrevision and fei.wfrevision != wfrevision
139
+
140
+ return false \
141
+ if cs and fei.sub_instance_id != ""
142
+ return false \
143
+ if wfid and fei.wfid != wfid
144
+ return false \
145
+ if wfid_prefix and not fei.wfid.match("^#{wfid_prefix}")
146
+ return false \
147
+ if parent_wfid and not fei.parent_wfid == parent_wfid
148
+
149
+ true
150
+ end
151
+
152
+ #
153
+ # Returns true if the given expression is in the list of included
154
+ # classes or false if it's in the list of excluded classes...
155
+ #
156
+ # include_classes has precedence of exclude_classes.
157
+ #
158
+ def class_accepted? (fexp, include_classes, exclude_classes)
159
+
160
+ return false if include_classes and (not include_classes.find do |klazz|
161
+ fexp.is_a?(klazz)
162
+ end)
163
+ return false if exclude_classes and exclude_classes.find do |klazz|
164
+ fexp.is_a?(klazz)
165
+ end
166
+
167
+ true
168
+ end
169
+ end
170
+
171
+ #
172
+ # This cache uses a LruHash (Least Recently Used) to store expressions.
173
+ # If an expression is not cached, the 'real storage' is consulted.
174
+ # The real storage is supposed to be the service named
175
+ # "expressionStorage.1"
176
+ #
177
+ class CacheExpressionStorage
178
+ include ServiceMixin
179
+ include OwfeServiceLocator
180
+ include ExpressionStorageBase
181
+
182
+ #
183
+ # under 20 stored expressions, the unit tests for the
184
+ # CachedFilePersistedEngine do fail because the persistent storage
185
+ # behind the cache hasn't the time to flush its work queue.
186
+ # a min size limit has been set to 77.
187
+ #
188
+ MIN_SIZE = 77
189
+
190
+ DEFAULT_SIZE = 5000
191
+
192
+ def initialize (service_name, application_context)
193
+
194
+ super()
195
+
196
+ service_init(service_name, application_context)
197
+
198
+ size = @application_context[:expression_cache_size] || DEFAULT_SIZE
199
+ size = MIN_SIZE unless size > MIN_SIZE
200
+
201
+ linfo { "new() size is #{size}" }
202
+
203
+ @cache = LruHash.new(size)
204
+
205
+ @real_storage = nil
206
+
207
+ observe_expool
208
+ end
209
+
210
+ def [] (fei)
211
+
212
+ #ldebug { "[] size is #{@cache.size}" }
213
+ #ldebug { "[] (sz #{@cache.size}) for #{fei.to_debug_s}" }
214
+
215
+ fe = @cache[fei.hash]
216
+ return fe if fe
217
+
218
+ #ldebug { "[] (reload) for #{fei.to_debug_s}" }
219
+
220
+ fe = get_real_storage[fei]
221
+
222
+ unless fe
223
+ #ldebug { "[] (reload) miss for #{fei.to_debug_s}" }
224
+ return nil
225
+ end
226
+
227
+ @cache[fei.hash] = fe
228
+
229
+ fe
230
+ end
231
+
232
+ def []= (fei, fe)
233
+
234
+ ldebug { "[]= caching #{fei}" }
235
+
236
+ @cache[fei.hash] = fe
237
+ end
238
+
239
+ def delete (fei)
240
+
241
+ @cache.delete fei.hash
242
+ end
243
+
244
+ def length
245
+
246
+ @cache.length
247
+ end
248
+
249
+ alias :size :length
250
+
251
+ def clear
252
+
253
+ @cache.clear
254
+ end
255
+
256
+ alias :purge :clear
257
+
258
+ #
259
+ # This implementations of find_expressions() immediately passes
260
+ # the call to the underlying real storage.
261
+ #
262
+ def find_expressions (options={})
263
+
264
+ get_real_storage.find_expressions options
265
+ end
266
+
267
+ #
268
+ # Attempts at fetching the root expression of a given process
269
+ # instance.
270
+ #
271
+ def fetch_root (wfid)
272
+
273
+ #
274
+ # at first, look in the cache
275
+
276
+ @cache.each do |hashed_fei, fexp|
277
+
278
+ return fexp \
279
+ if fexp.fei.wfid == wfid and fexp.is_a?(DefineExpression)
280
+ end
281
+
282
+ get_real_storage.fetch_root wfid
283
+ end
284
+
285
+ protected
286
+
287
+ #
288
+ # Returns the "real storage" i.e. the storage that does the real
289
+ # persistence behind this "cache storage".
290
+ #
291
+ def get_real_storage
292
+
293
+ #return @real_storage if @real_storage
294
+ #@real_storage =
295
+ # @application_context[S_EXPRESSION_STORAGE + ".1"]
296
+ #@real_storage
297
+
298
+ @application_context["expressionStorage.1"]
299
+ end
300
+ end
301
+
302
+ #
303
+ # Memory consuming in-memory storage.
304
+ # No memory limit, puts everything in a Hash
305
+ #
306
+ class InMemoryExpressionStorage < Hash
307
+ include ServiceMixin
308
+ include OwfeServiceLocator
309
+ include ExpressionStorageBase
310
+
311
+ def initialize (service_name, application_context)
312
+
313
+ service_init service_name, application_context
314
+
315
+ observe_expool
316
+ end
317
+
318
+ alias :purge :clear
319
+
320
+ #--
321
+ # Allows to pass a block to each expressions of a given kind (type).
322
+ #
323
+ #def each_of_kind (kind, &block)
324
+ # self.each_value do |fexp|
325
+ # block.call(fexp.fei, fexp) if fexp.kind_of?(kind)
326
+ # end
327
+ #end
328
+ #
329
+ # An iterator on the expression stored in here.
330
+ #
331
+ #def each (wfid_prefix=nil, &block)
332
+ # if wfid_prefix
333
+ # super() do |fei, fexp|
334
+ # next unless fei.wfid.match "^#{wfid_prefix}"
335
+ # block.call fei, fexp
336
+ # end
337
+ # else
338
+ # super(&block)
339
+ # end
340
+ #end
341
+ #alias :real_each :each
342
+ #++
343
+
344
+ #
345
+ # Finds expressions matching the given criteria (returns a list
346
+ # of expressions).
347
+ #
348
+ # This methods is called by the expression pool, it's thus not
349
+ # very "public" (not used directly by integrators, who should
350
+ # just focus on the methods provided by the Engine).
351
+ #
352
+ # :wfid ::
353
+ # will list only one process,
354
+ # <tt>:wfid => '20071208-gipijiwozo'</tt>
355
+ # :parent_wfid ::
356
+ # will list only one process, and its subprocesses,
357
+ # <tt>:parent_wfid => '20071208-gipijiwozo'</tt>
358
+ # :consider_subprocesses ::
359
+ # if true, "process-definition" expressions
360
+ # of subprocesses will be returned as well.
361
+ # :wfid_prefix ::
362
+ # allows your to query for specific workflow instance
363
+ # id prefixes. for example :
364
+ # <tt>:wfid_prefix => "200712"</tt>
365
+ # for the processes started in December.
366
+ # :include_classes ::
367
+ # excepts a class or an array of classes, only instances of these
368
+ # classes will be returned. Parent classes or mixins can be
369
+ # given.
370
+ # <tt>:includes_classes => OpenWFE::SequenceExpression</tt>
371
+ # :exclude_classes ::
372
+ # works as expected.
373
+ # :wfname ::
374
+ # will return only the expressions who belongs to the given
375
+ # workflow [name].
376
+ # :wfrevision ::
377
+ # usued in conjuction with :wfname, returns only the expressions
378
+ # with a given workflow revision.
379
+ # :applied ::
380
+ # if this option is set to true, will only return the expressions
381
+ # that have been applied (exp.apply_time != nil).
382
+ #
383
+ def find_expressions (options={})
384
+
385
+ values.find_all do |fexp|
386
+ does_match? options, fexp
387
+ end
388
+ end
389
+
390
+ #
391
+ # Attempts at fetching the root expression of a given process
392
+ # instance.
393
+ #
394
+ def fetch_root (wfid)
395
+
396
+ find_expressions(
397
+ :wfid => wfid,
398
+ :include_classes => DefineExpression)[0]
399
+ end
400
+
401
+ end
402
+
403
+ end
@@ -0,0 +1,174 @@
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 'date'
41
+
42
+ require 'openwfe/service'
43
+ require 'openwfe/omixins'
44
+ require 'openwfe/rudefinitions'
45
+
46
+
47
+ module OpenWFE
48
+
49
+ #
50
+ # A Mixin for history modules
51
+ #
52
+ module HistoryMixin
53
+ include ServiceMixin, OwfeServiceLocator
54
+
55
+ def service_init (service_name, application_context)
56
+
57
+ super
58
+
59
+ get_expression_pool.add_observer(:all) do |event, *args|
60
+ log(event, *args)
61
+ end
62
+ end
63
+
64
+ def log (event, *args)
65
+ raise NotImplementedError.new(
66
+ "please provide an implementation of log(e, fei, wi)")
67
+ end
68
+ end
69
+
70
+ #
71
+ # A base implementation for InMemoryHistory and FileHistory.
72
+ #
73
+ class BaseHistory
74
+ include HistoryMixin
75
+ include FeiMixin
76
+
77
+ attr_reader :entries
78
+
79
+ def initialize (service_name, application_context)
80
+
81
+ super()
82
+
83
+ service_init(service_name, application_context)
84
+ end
85
+
86
+ def log (event, *args)
87
+
88
+ return if event == :update
89
+ return if event == :reschedule
90
+ return if event == :stop
91
+
92
+ msg = "#{Time.now.to_s} -- "
93
+
94
+ msg << event.to_s
95
+
96
+ if args.length > 0
97
+ fei = extract_fei args[0]
98
+ msg << " #{fei.to_s}"
99
+ end
100
+
101
+ #msg << " #{args[1].to_s}" \
102
+ # if args.length > 1
103
+
104
+ @output << msg + "\n"
105
+ end
106
+ end
107
+
108
+ #
109
+ # The simplest implementation, stores all history entries in memory.
110
+ #
111
+ # DO NOT USE IN PRODUCTION, it will trigger an 'out of memory' error
112
+ # sooner or later.
113
+ #
114
+ # Is only used for unit testing purposes.
115
+ #
116
+ class InMemoryHistory < BaseHistory
117
+
118
+ def initialize (service_name, application_context)
119
+ super
120
+
121
+ @output = []
122
+ end
123
+
124
+ #
125
+ # Returns the array of entries.
126
+ #
127
+ def entries
128
+ @output
129
+ end
130
+
131
+ #
132
+ # Returns all the entries as a String.
133
+ #
134
+ def to_s
135
+ s = ""
136
+ @output.each do |entry|
137
+ s << entry.to_s
138
+ end
139
+ s
140
+ end
141
+ end
142
+
143
+ #
144
+ # Simply dumps the history in the work directory in a file named
145
+ # "history.log"
146
+ # Warning : no fancy rotation or compression implemented here.
147
+ #
148
+ class FileHistory < BaseHistory
149
+
150
+ def initialize (service_name, application_context)
151
+
152
+ super
153
+
154
+ @output = get_work_directory + "/history.log"
155
+ @output = File.open(@output, "w+")
156
+
157
+ linfo { "new() outputting history to #{@output.path}" }
158
+ end
159
+
160
+ #
161
+ # Returns a handle on the output file instance used by this
162
+ # FileHistory.
163
+ #
164
+ def output_file
165
+ @output
166
+ end
167
+
168
+ def stop
169
+ @output.close
170
+ end
171
+ end
172
+
173
+ end
174
+