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,178 @@
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/otime'
41
+
42
+
43
+ #
44
+ # Managing timeout for expressions like 'participant' and 'when'
45
+ #
46
+
47
+ module OpenWFE
48
+
49
+ #
50
+ # The timeout behaviour is implemented here, making it easy
51
+ # to mix it in into ParticipantExpression and WhenExpression.
52
+ #
53
+ module TimeoutMixin
54
+ include Rufus::Schedulable
55
+
56
+ attr_accessor \
57
+ :timeout_at,
58
+ :timeout_job_id
59
+
60
+ #
61
+ # Looks for the "timeout" attribute in its process definition
62
+ # and then sets the @timeout_at field (if there is a timeout).
63
+ #
64
+ def determine_timeout (timeout_attname=:timeout)
65
+
66
+ #@timeout_at = nil
67
+ #@timeout_job_id = nil
68
+
69
+ timeout = lookup_attribute(timeout_attname, @applied_workitem)
70
+ return unless timeout
71
+
72
+ timeout = Rufus::parse_time_string(timeout)
73
+ @timeout_at = Time.new.to_f + timeout
74
+ end
75
+
76
+ #
77
+ # Providing a default reschedule() implementation for the expressions
78
+ # that use this mixin.
79
+ # This default implementation just reschedules the timeout.
80
+ #
81
+ def reschedule (scheduler)
82
+ to_reschedule(scheduler)
83
+ end
84
+
85
+ #
86
+ # Combines a call to determine_timeout and to reschedule.
87
+ #
88
+ def schedule_timeout (timeout_attname=:timeout)
89
+
90
+ determine_timeout(timeout_attname)
91
+ to_reschedule(get_scheduler)
92
+ end
93
+
94
+ #--
95
+ # Overrides the parent method to make sure a potential
96
+ # timeout schedules gets removed.
97
+ #
98
+ # Well... Leave that to classes that mix this in...
99
+ # No method override in a mixin...
100
+ #
101
+ #def reply_to_parent (workitem)
102
+ # unschedule_timeout()
103
+ # super(workitem)
104
+ #end
105
+ #++
106
+
107
+ #
108
+ # Places a "__timed_out__" field in the workitem.
109
+ #
110
+ def set_timedout_flag (workitem)
111
+
112
+ workitem.attributes["__timed_out__"] = "true"
113
+ end
114
+
115
+ #
116
+ # Removes any "__timed_out__" field in the workitem.
117
+ #
118
+ def remove_timedout_flag (workitem)
119
+
120
+ workitem.attributes.delete("__timed_out__")
121
+ end
122
+
123
+ protected
124
+
125
+ #
126
+ # prefixed with "to_" for easy mix in
127
+ #
128
+ def to_reschedule (scheduler)
129
+
130
+ #return if @timeout_job_id
131
+ #
132
+ # already rescheduled
133
+
134
+ return unless @timeout_at
135
+ #
136
+ # no need for a timeout
137
+
138
+ @timeout_job_id = "timeout_#{self.fei.to_s}"
139
+
140
+ scheduler.schedule_at(
141
+ @timeout_at,
142
+ { :schedulable => self,
143
+ :job_id => @timeout_job_id,
144
+ :do_timeout! => true,
145
+ :tags => [ "timeout", self.class.name ] })
146
+
147
+ ldebug do
148
+ "to_reschedule() will timeout at " +
149
+ "#{Rufus::to_iso8601_date(@timeout_at)}" +
150
+ " @timeout_job_id is #{@timeout_job_id}" +
151
+ " (oid #{object_id})"
152
+ end
153
+
154
+ #store_itself()
155
+ #
156
+ # done in the including expression
157
+ end
158
+
159
+ #
160
+ # Unschedules the timeout
161
+ #
162
+ def unschedule_timeout ()
163
+
164
+ ldebug do
165
+ "unschedule_timeout() " +
166
+ "@timeout_job_id is #{@timeout_job_id}" +
167
+ " (oid #{object_id})"
168
+ end
169
+
170
+ #ldebug_callstack "unschedule_timeout()"
171
+
172
+ get_scheduler.unschedule(@timeout_job_id) \
173
+ if @timeout_job_id
174
+ end
175
+ end
176
+
177
+ end
178
+
@@ -0,0 +1,126 @@
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
+ module OpenWFE
41
+
42
+ #
43
+ # A small mixin providing value for looking up the attributes
44
+ # variable/var/v and field/fld/f.
45
+ #
46
+ module ValueMixin
47
+
48
+ #
49
+ # Expressions that include the ValueMixin let it gather values and
50
+ # then, in their reply() methods do the job with the values.
51
+ # The gathering task is performed by the ValueMixin.
52
+ #
53
+ def apply (workitem)
54
+
55
+ escape = lookup_boolean_attribute('escape', workitem, false)
56
+
57
+ if @children.length < 1
58
+
59
+ workitem.attributes[FIELD_RESULT] =
60
+ lookup_value workitem, :escape => escape
61
+
62
+ reply workitem
63
+ return
64
+ end
65
+
66
+ child = @children.first
67
+
68
+ if child.kind_of?(OpenWFE::FlowExpressionId)
69
+
70
+ handle_child child, workitem
71
+ return
72
+ end
73
+
74
+ workitem.attributes[FIELD_RESULT] =
75
+ fetch_text_content workitem, escape
76
+
77
+ reply workitem
78
+ end
79
+
80
+ def lookup_variable_attribute (workitem)
81
+
82
+ lookup [ "variable", "var", "v" ], workitem
83
+ end
84
+
85
+ def lookup_field_attribute (workitem)
86
+
87
+ lookup [ "field", "fld", "f" ], workitem
88
+ end
89
+
90
+ protected
91
+
92
+ def handle_child (child, workitem)
93
+
94
+ raw_child, _fei = get_expression_pool.fetch(child)
95
+
96
+ if raw_child.is_definition?
97
+
98
+ #body_fei = get_expression_pool.evaluate child, workitem
99
+ #workitem.attributes[FIELD_RESULT] = body_fei
100
+
101
+ workitem.attributes[FIELD_RESULT] = raw_child
102
+ #
103
+ # storing the child raw expression
104
+
105
+ reply workitem
106
+ else
107
+
108
+ get_expression_pool.apply raw_child, workitem
109
+ end
110
+ end
111
+
112
+ private
113
+
114
+ def lookup (name_array, workitem)
115
+
116
+ name_array.each do |n|
117
+ v = lookup_string_attribute n, workitem
118
+ return v if v
119
+ end
120
+
121
+ nil
122
+ end
123
+ end
124
+
125
+ end
126
+
@@ -0,0 +1,259 @@
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
+ # $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/utils'
43
+
44
+
45
+ module OpenWFE
46
+
47
+ #
48
+ # A 'filter' is used to restrict what a participant / user / segment
49
+ # of a process may see of a workitem (filter_in) and also enforces
50
+ # restrictions on modifications (filter_out).
51
+ #
52
+ class FilterDefinition
53
+
54
+ attr_accessor \
55
+ :closed,
56
+ :add_ok,
57
+ :remove_ok,
58
+ :fields
59
+
60
+ def initialize
61
+ @closed = false
62
+ @add_ok = true
63
+ @remove_ok = true
64
+ @fields = []
65
+ end
66
+
67
+ def add_allowed= (b)
68
+ @add_ok = b
69
+ end
70
+ def remove_allowed= (b)
71
+ @remove_ok = b
72
+ end
73
+
74
+ def may_add?
75
+ return @add_ok
76
+ end
77
+ def may_remove?
78
+ return @remove_ok
79
+ end
80
+
81
+ #
82
+ # Adds a field to the filter definition
83
+ #
84
+ # filterdef.add_field("readonly", "r")
85
+ # filterdef.add_field("hidden", nil)
86
+ # filterdef.add_field("writable", :w)
87
+ # filterdef.add_field("read_write", :rw)
88
+ # filterdef.add_field("^toto_.*", :r)
89
+ #
90
+ def add_field (regex, permissions)
91
+ f = Field.new
92
+ f.regex = regex
93
+ f.permissions = permissions
94
+ @fields << f
95
+ end
96
+
97
+ #
98
+ # Takes a hash as input and returns a hash. The result will
99
+ # contain only the readable fields.
100
+ #
101
+ # Consider the following test cases to see this
102
+ # 'constraining' in action :
103
+ #
104
+ # f0 = OpenWFE::FilterDefinition.new
105
+ # f0.closed = true
106
+ # f0.add_field("a", "r")
107
+ # f0.add_field("b", "rw")
108
+ # f0.add_field("c", "")
109
+ #
110
+ # m0 = {
111
+ # "a" => "A",
112
+ # "b" => "B",
113
+ # "c" => "C",
114
+ # "d" => "D",
115
+ # }
116
+ #
117
+ # m1 = f0.filter_in m0
118
+ # assert_equal m1, { "a" => "A", "b" => "B" }
119
+ #
120
+ # f0.closed = false
121
+ #
122
+ # m2 = f0.filter_in m0
123
+ # assert_equal m2, { "a" => "A", "b" => "B", "d" => "D" }
124
+ #
125
+ def filter_in (map)
126
+
127
+ result = {}
128
+
129
+ map.each do |key, value|
130
+
131
+ field = get_field key
132
+
133
+ if @closed
134
+ result[key] = value if field and field.may_read?
135
+ else
136
+ result[key] = value if (not field) or field.may_read?
137
+ end
138
+ end
139
+
140
+ result
141
+ end
142
+
143
+ def filter_out (original_map, map)
144
+
145
+ # method with a high cyclomatic score :)
146
+
147
+ result = {}
148
+
149
+ build_out_map(original_map, map).each do |key, v|
150
+
151
+ field, ovalue, nvalue = v
152
+
153
+ #
154
+ # adding a brand new field...
155
+
156
+ isnew = ((not field) and (ovalue == nil) and (nvalue != nil))
157
+
158
+ if isnew
159
+ result[key] = nvalue if @add_ok
160
+ next
161
+ end
162
+
163
+ #
164
+ # removing a field
165
+
166
+ isremoval = ((ovalue != nil) and (nvalue == nil))
167
+
168
+ if isremoval
169
+ result[key] = ovalue unless @remove_ok
170
+ next
171
+ end
172
+
173
+ #
174
+ # no modification
175
+
176
+ haschanged = (ovalue != nvalue)
177
+
178
+ #puts "haschanged ? #{haschanged}"
179
+
180
+ if haschanged
181
+
182
+ result[key] = unless field
183
+ if @closed
184
+ ovalue
185
+ else
186
+ nvalue
187
+ end
188
+ else
189
+ if field.may_write?
190
+ nvalue
191
+ else
192
+ ovalue
193
+ end
194
+ end
195
+
196
+ next
197
+ end
198
+
199
+ # else, just use, the old value
200
+
201
+ result[key] = ovalue
202
+ end
203
+
204
+ result
205
+ end
206
+
207
+ #
208
+ # Returns a deep copy of this filter instance.
209
+ #
210
+ def dup
211
+ OpenWFE::fulldup self
212
+ end
213
+
214
+ protected
215
+
216
+ #
217
+ # pre-digesting the two maps
218
+ #
219
+ def build_out_map (original_map, map)
220
+
221
+ keys = {}
222
+ keys.merge! original_map
223
+ keys.merge! map
224
+
225
+ m = {}
226
+ keys.keys.each do |k|
227
+ m[k] = [ get_field(k), original_map[k], map[k] ]
228
+ end
229
+
230
+ #require 'pp'; pp m
231
+ m
232
+ end
233
+
234
+ #
235
+ # Returns the first field mapping a given key
236
+ #
237
+ def get_field (key)
238
+ @fields.detect do |f|
239
+ key.match f.regex
240
+ end
241
+ end
242
+
243
+ class Field
244
+ attr_accessor :regex, :permissions
245
+
246
+ def may_read?
247
+ @permissions.to_s.index("r") != nil
248
+ end
249
+
250
+ def may_write?
251
+ @permissions.to_s.index("w") != nil
252
+ end
253
+
254
+ def no_rights?
255
+ @permissions.to_s == ""
256
+ end
257
+ end
258
+ end
259
+ end