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,38 @@
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
+ # just for nicer looking examples
35
+
36
+ #require 'openwfe/participants/participants'
37
+ require 'openwfe/participants/storeparticipants'
38
+
@@ -0,0 +1,230 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2007, Alain Hoang 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
+ # Alain Hoang at openwfe.org
38
+ # John Mettraux at openwfe.org
39
+ #
40
+
41
+ require 'net/smtp'
42
+
43
+ require 'openwfe/participants/participant'
44
+ require 'openwfe/participants/participants'
45
+
46
+
47
+ module OpenWFE
48
+
49
+ #
50
+ # MailParticipant is a simplification of EmailNotificationParticipant.
51
+ #
52
+ # It's initialized in this way :
53
+ #
54
+ # p = MailParticipant.new(
55
+ # :smtp_server => "mailhost.ourcompany.co.jp",
56
+ # :from_address => "bpms@our.ourcompany.co.jp",
57
+ # :template => "Dear ${f:name}, you've got mail")
58
+ #
59
+ # or
60
+ #
61
+ # p = MailParticipant.new(
62
+ # :smtp_server => "mailhost.ourcompany.co.jp",
63
+ # :smtp_port => 25,
64
+ # :from_address => "bpms@our.ourcompany.co.jp"
65
+ # ) do |workitem|
66
+ # s = ""
67
+ # s << "Dear #{workitem.name},\n"
68
+ # s << "\n"
69
+ # s << "it's #{Time.new.to_s} and you've got mail"
70
+ # s
71
+ # end
72
+ #
73
+ # As with EmailNotificationParticipant, the "to" address for your email
74
+ # is taken from the workitem's <tt>email_target</tt> field. So, to have
75
+ # the email sent to "foo@nowhere.com", set your workitem's
76
+ # <tt>email_target</tt> field to "foo@nowhere.com" prior to feeding it
77
+ # to the mail participant.
78
+ #
79
+ # Likewise, you can also override the :from_address value by setting the
80
+ # workitems <tt>email_from</tt> field.
81
+ #
82
+ # When passing the mail template as a block, you have
83
+ # four possible arities :
84
+ # { |workitem| ... }
85
+ # { |participant_expression, workitem| ... }
86
+ # { |participant_expression, participant_instance, workitem| ... }
87
+ # { ... }
88
+ #
89
+ # The smtp server and host default to "127.0.0.1" / 25.
90
+ #
91
+ class MailParticipant
92
+ include LocalParticipant
93
+ include TemplateMixin
94
+
95
+ def initialize (params, &block)
96
+
97
+ @smtp_server = params[:smtp_server]
98
+ @smtp_port = params[:smtp_port]
99
+ @from_address = params[:from_address]
100
+ @template = params[:template]
101
+
102
+ @block_template = block
103
+
104
+ # some defaults
105
+
106
+ @smtp_server = "127.0.0.1" unless @smtp_server
107
+ @smtp_port = 25 unless @smtp_port
108
+ end
109
+
110
+ #
111
+ # The method called each time a workitem reaches this participant
112
+ #
113
+ def consume (workitem)
114
+
115
+ fe = get_flow_expression(workitem)
116
+ to_address = workitem.email_target
117
+
118
+ #
119
+ # 1. Expand variables
120
+
121
+ msg = eval_template workitem
122
+
123
+ from_address = workitem.email_from rescue @from_address
124
+
125
+ #puts "msg >>>\n#{msg}<<<"
126
+
127
+ #
128
+ # 2. Send message
129
+
130
+ Net::SMTP.start(@smtp_server, @smtp_port) do |smtp|
131
+ smtp.send_message(msg, from_address, to_address)
132
+ end
133
+
134
+ #
135
+ # 3. Reply to engine
136
+
137
+ reply_to_engine(workitem)
138
+ end
139
+ end
140
+
141
+ #
142
+ # This participant is used to send an email notification.
143
+ #
144
+ # It's perhaps better to use MailParticipant which is simpler to
145
+ # initialize. This class is anyway an extension of MailParticipant.
146
+ #
147
+ # @engine.register_participant(
148
+ # 'eno',
149
+ # EmailNotificationParticipant.new(
150
+ # "googlemail.l.google.com",
151
+ # 25,
152
+ # "eno@outoftheblue.co.jp",
153
+ # """Subject: test 0
154
+ #
155
+ # 0 : ${r:Time.new}
156
+ # 1 : ${f:customer_name}
157
+ # """))
158
+ #
159
+ # And then, from the process definition :
160
+ #
161
+ # class TestDefinition0 < OpenWFE::ProcessDefinition
162
+ # def make
163
+ # process_definition :name => "test0", :revision => "0" do
164
+ # sequence do
165
+ # set :field => 'email_target' do
166
+ # "whatever56x56@gmail.com"
167
+ # end
168
+ # set :field => 'customer_name' do
169
+ # "Monsieur Toto"
170
+ # end
171
+ # participant :ref => 'eno'
172
+ # end
173
+ # end
174
+ # end
175
+ # end
176
+ #
177
+ # The 'template' parameter may contain an instance of File instead of
178
+ # an instance of String.
179
+ #
180
+ # @engine.register_participant(
181
+ # 'eno',
182
+ # EmailNotificationParticipant.new(
183
+ # "googlemail.l.google.com",
184
+ # 25,
185
+ # "eno@outoftheblue.co.jp",
186
+ # File.new("path/to/my/mail/template.txt")))
187
+ #
188
+ # You can also define the email template as a Ruby block :
189
+ #
190
+ # p = EmailNotificationParticipant.new("googlemail.l.google.com", 25, "eno@co.co.jp") do | flowexpression, participant, workitem |
191
+ #
192
+ # # generally, only the workitem is used within a template
193
+ #
194
+ # s = ""
195
+ #
196
+ # # the header of the message
197
+ #
198
+ # s << "Subject: #{workitem.subject}\n\n"
199
+ #
200
+ # # then, the body
201
+ #
202
+ # workitem.attributes.each do |key, value|
203
+ # s << "- '#{k}' => '#{value}'\n"
204
+ # end
205
+ # s << "\ndone.\n"
206
+ # end
207
+ #
208
+ # Note that the template integrates the subject and requires then a double
209
+ # newline before the message body.
210
+ #
211
+ class EmailNotificationParticipant < MailParticipant
212
+
213
+ #
214
+ # Create a new email notification participant. Requires
215
+ # a mail server, port, a from address, and a mail message template
216
+ #
217
+ def initialize (
218
+ smtp_server, smtp_port, from_address, template=nil, &block)
219
+
220
+ params = {}
221
+ params[:smtp_server] = smtp_server
222
+ params[:smtp_port] = smtp_port
223
+ params[:from_address] = from_address
224
+
225
+ params[:template] = template if template
226
+
227
+ super(params, &block)
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,141 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'openwfe/logging'
41
+ require 'openwfe/contextual'
42
+ require 'openwfe/rudefinitions'
43
+
44
+
45
+ module OpenWFE
46
+
47
+ #
48
+ # The 'participant' concept is displayed as a module, so that
49
+ # other pieces of code may easily 'mix it in'.
50
+ #
51
+ # Participant extensions should at least provide a consume(workitem)
52
+ # method.
53
+ # As an option, it can provide a cancel(cancelitem) method.
54
+ #
55
+ # The engine will transmit instances of OpenWFE:WorkItem via the
56
+ # consume method.
57
+ #
58
+ # If there is a cancel method available and an OpenWFE::CancelItem instance
59
+ # is emitted (cancelling a process or part of it), it will be fed to
60
+ # the participant only via the cancel method.
61
+ #
62
+ # If there is no cancel method, the participant will not get notified
63
+ # of the cancellation.
64
+ #
65
+ module Participant
66
+
67
+ #
68
+ # A Participant will be receiving OpenWFE::WorkItem's via this method.
69
+ #
70
+ def consume (workitem)
71
+
72
+ raise NotImplementedError.new(
73
+ "implementation for method consume() "+
74
+ "is missing in class '#{self.class}'")
75
+ end
76
+
77
+ #--
78
+ # (optional)
79
+ #
80
+ #def cancel (cancelitem)
81
+ #end
82
+ #++
83
+ end
84
+
85
+ #
86
+ # Local participants provide handy methods like reply_to_engine() to
87
+ # further implementations of the Participant concept.
88
+ #
89
+ module LocalParticipant
90
+ include Participant, Contextual, Logging, OwfeServiceLocator
91
+
92
+ #
93
+ # Returns the FlowExpression instance that triggered this
94
+ # participant.
95
+ # A ParticipantExpression instance will most likely be returned.
96
+ #
97
+ def get_flow_expression (workitem)
98
+
99
+ return nil if not @application_context
100
+
101
+ get_expression_pool.fetch_expression(workitem.flow_expression_id)
102
+ end
103
+
104
+ #
105
+ # A convenience method for calling block passed to participants
106
+ # for templates (mail participants) or execution (BlockParticipant).
107
+ #
108
+ # Allows for such blocks :
109
+ #
110
+ # { |workitem| ... }
111
+ # { |participant_expression, workitem| ... }
112
+ # { |participant_expression, participant, workitem| ... }
113
+ #
114
+ # For 0 or more than 3 arguments, the block will be called without
115
+ # arguments.
116
+ #
117
+ def call_block (block, workitem)
118
+
119
+ if block.arity == 1
120
+ block.call workitem
121
+ elsif block.arity == 2
122
+ block.call get_flow_expression(workitem), workitem
123
+ elsif block.arity == 3
124
+ block.call get_flow_expression(workitem), self, workitem
125
+ else
126
+ block.call
127
+ end
128
+ end
129
+
130
+ #
131
+ # Participants use this method to reply to their engine when
132
+ # their job is done.
133
+ #
134
+ def reply_to_engine (workitem)
135
+
136
+ get_engine.reply(workitem)
137
+ end
138
+ end
139
+
140
+ end
141
+
@@ -0,0 +1,249 @@
1
+ #
2
+ #--
3
+ # Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # . Redistributions of source code must retain the above copyright notice, this
10
+ # list of conditions and the following disclaimer.
11
+ #
12
+ # . Redistributions in binary form must reproduce the above copyright notice,
13
+ # this list of conditions and the following disclaimer in the documentation
14
+ # and/or other materials provided with the distribution.
15
+ #
16
+ # . Neither the name of the "OpenWFE" nor the names of its contributors may be
17
+ # used to endorse or promote products derived from this software without
18
+ # specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
32
+ #
33
+
34
+ #
35
+ # "made in Japan"
36
+ #
37
+ # John Mettraux at openwfe.org
38
+ #
39
+
40
+ require 'openwfe/workitem'
41
+ require 'openwfe/service'
42
+ require 'openwfe/util/observable'
43
+ require 'openwfe/participants/participants'
44
+
45
+
46
+ module OpenWFE
47
+
48
+ #
49
+ # A very simple directory of participants
50
+ #
51
+ class ParticipantMap < Service
52
+ include OwfeObservable
53
+
54
+ attr_accessor :participants
55
+
56
+ def initialize (service_name, application_context)
57
+
58
+ super
59
+
60
+ @participants = []
61
+ @observers = {}
62
+ end
63
+
64
+ #
65
+ # Returns how many participants are currently registered here.
66
+ #
67
+ def size
68
+
69
+ @participants.size
70
+ end
71
+
72
+ #
73
+ # Adds a participant to this map.
74
+ # This method is called by the engine's own register_participant()
75
+ # method.
76
+ #
77
+ # The participant instance is returned by this method call.
78
+ #
79
+ # The know params are :participant (a participant instance or
80
+ # class) and :position (which can be null or :first).
81
+ #
82
+ # By default (if :position is not set to :first), the participant
83
+ # will appear at the bottom of the participant list.
84
+ #
85
+ def register_participant (regex, params, &block)
86
+
87
+ participant = params[:participant]
88
+ position = params[:position]
89
+
90
+ if not participant
91
+
92
+ raise "please provide a participant instance or a block" \
93
+ if not block
94
+
95
+ participant = BlockParticipant.new block
96
+ end
97
+
98
+ ldebug do
99
+ "register_participant() "+
100
+ "participant class is #{participant.class}"
101
+ end
102
+
103
+ if participant.is_a?(Class)
104
+
105
+ ldebug { "register_participant() class #{participant}" }
106
+
107
+ begin
108
+
109
+ participant = participant.new(regex, @application_context)
110
+
111
+ rescue Exception => e
112
+ #ldebug do
113
+ # "register_participant() " +
114
+ # "falling back to no param constructor because of \n" +
115
+ # OpenWFE::exception_to_s(e)
116
+ #end
117
+
118
+ participant = participant.new
119
+ end
120
+ end
121
+
122
+ original_string = regex.to_s
123
+
124
+ unless regex.kind_of?(Regexp)
125
+
126
+ regex = regex.to_s
127
+ regex = "^" + regex unless regex[0, 1] == "^"
128
+ regex = regex + "$" unless regex[-1, 1] == "$"
129
+
130
+ ldebug { "register_participant() '#{regex}'" }
131
+
132
+ regex = Regexp.new(regex)
133
+ end
134
+
135
+ class << regex
136
+ attr_reader :original_string
137
+ end
138
+ regex.instance_variable_set '@original_string', original_string
139
+
140
+ participant.application_context = @application_context \
141
+ if participant.respond_to?(:application_context=)
142
+
143
+ # now add the participant to the list
144
+
145
+ entry = [ regex, participant ]
146
+
147
+ index = (position == :first) ? 0 : -1
148
+
149
+ @participants.insert index, entry
150
+
151
+ participant
152
+ end
153
+
154
+ #
155
+ # Looks up a participant given a participant_name.
156
+ # Will return the first participant whose name matches.
157
+ #
158
+ def lookup_participant (participant_name)
159
+
160
+ #ldebug { "lookup_participant() '#{participant_name}'" }
161
+
162
+ participant_name = participant_name.to_s
163
+
164
+ @participants.each do |tuple|
165
+ return tuple[1] if tuple[0].match(participant_name)
166
+ end
167
+
168
+ nil
169
+ end
170
+
171
+ #
172
+ # Deletes the first participant matching the given name.
173
+ #
174
+ # If 'participant_name' is an integer, will remove the participant
175
+ # at that position in the participant list.
176
+ #
177
+ def unregister_participant (participant_name)
178
+
179
+ return (@participants.delete_at(participant_name) != nil) \
180
+ if participant_name.is_a?(Integer)
181
+
182
+ participant_name = participant_name.to_s
183
+
184
+ p = @participants.find do |tuple|
185
+ tuple[0].original_string == participant_name
186
+ end
187
+ @participants.delete(p) if p
188
+
189
+ (p != nil)
190
+ end
191
+
192
+ #
193
+ # Dispatches to the given participant (participant name (string) or
194
+ # The workitem will be fed to the consume() method of that participant.
195
+ # If it's a cancelitem and the participant has a cancel() method,
196
+ # it will get called instead.
197
+ #
198
+ def dispatch (participant, participant_name, workitem)
199
+
200
+ unless participant
201
+
202
+ participant = lookup_participant participant_name
203
+
204
+ raise "there is no participant named '#{participant_name}'" \
205
+ unless participant
206
+ end
207
+
208
+ workitem.participant_name = participant_name
209
+
210
+ return cancel(participant, workitem) \
211
+ if workitem.is_a?(CancelItem)
212
+
213
+ onotify :dispatch, :before_consume, workitem
214
+
215
+ workitem.dispatch_time = Time.now
216
+
217
+ participant.consume workitem
218
+
219
+ onotify :dispatch, :after_consume, workitem
220
+ end
221
+
222
+ #
223
+ # The method onotify (from Osbservable) is made public so that
224
+ # ParticipantExpression instances may notify the pmap of applies
225
+ # and replies.
226
+ #
227
+ public :onotify
228
+
229
+ protected
230
+
231
+ #
232
+ # Will call the cancel method of the participant if it has
233
+ # one, or will simply discard the cancel item else.
234
+ #
235
+ def cancel (participant, cancel_item)
236
+
237
+ participant.cancel(cancel_item) \
238
+ if participant.respond_to?(:cancel)
239
+
240
+ onotify :dispatch, :cancel, cancel_item
241
+ #
242
+ # maybe it'd be better to specifically log that
243
+ # a participant has no cancel() method, but it's OK
244
+ # like that for now.
245
+ end
246
+ end
247
+
248
+ end
249
+