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.
- data/README.txt +24 -0
- data/bin/validate-workflow.rb +89 -0
- data/examples/about_state.rb +81 -0
- data/examples/bigflow.rb +19 -0
- data/examples/csv_weather.rb +23 -0
- data/examples/engine_template.rb +247 -0
- data/examples/flowtracing.rb +24 -0
- data/examples/homeworkreview.rb +68 -0
- data/examples/kotoba.rb +22 -0
- data/examples/mano_tracker.rb +172 -0
- data/examples/openwferu.rb +58 -0
- data/examples/quotereporter.rb +157 -0
- data/examples/scheduler_cron_usage.rb +48 -0
- data/examples/scheduler_usage.rb +56 -0
- data/lib/openwfe.rb +41 -0
- data/lib/openwfe/contextual.rb +111 -0
- data/lib/openwfe/def.rb +46 -0
- data/lib/openwfe/engine.rb +37 -0
- data/lib/openwfe/engine/engine.rb +756 -0
- data/lib/openwfe/engine/expool_methods.rb +172 -0
- data/lib/openwfe/engine/file_persisted_engine.rb +105 -0
- data/lib/openwfe/engine/participant_methods.rb +133 -0
- data/lib/openwfe/engine/status_methods.rb +353 -0
- data/lib/openwfe/engine/update_exp_methods.rb +112 -0
- data/lib/openwfe/exceptions.rb +51 -0
- data/lib/openwfe/expool/errorjournal.rb +476 -0
- data/lib/openwfe/expool/expressionpool.rb +1144 -0
- data/lib/openwfe/expool/expstorage.rb +403 -0
- data/lib/openwfe/expool/history.rb +174 -0
- data/lib/openwfe/expool/journal.rb +224 -0
- data/lib/openwfe/expool/journal_replay.rb +321 -0
- data/lib/openwfe/expool/parser.rb +242 -0
- data/lib/openwfe/expool/representation.rb +121 -0
- data/lib/openwfe/expool/threadedexpstorage.rb +188 -0
- data/lib/openwfe/expool/wfidgen.rb +388 -0
- data/lib/openwfe/expool/yamlexpstorage.rb +224 -0
- data/lib/openwfe/expressions/condition.rb +244 -0
- data/lib/openwfe/expressions/environment.rb +246 -0
- data/lib/openwfe/expressions/expressionmap.rb +258 -0
- data/lib/openwfe/expressions/fe_cancel.rb +109 -0
- data/lib/openwfe/expressions/fe_command.rb +241 -0
- data/lib/openwfe/expressions/fe_concurrence.rb +662 -0
- data/lib/openwfe/expressions/fe_cron.rb +259 -0
- data/lib/openwfe/expressions/fe_cursor.rb +259 -0
- data/lib/openwfe/expressions/fe_define.rb +192 -0
- data/lib/openwfe/expressions/fe_do.rb +168 -0
- data/lib/openwfe/expressions/fe_equals.rb +291 -0
- data/lib/openwfe/expressions/fe_filter.rb +129 -0
- data/lib/openwfe/expressions/fe_filter_definition.rb +168 -0
- data/lib/openwfe/expressions/fe_fqv.rb +250 -0
- data/lib/openwfe/expressions/fe_if.rb +303 -0
- data/lib/openwfe/expressions/fe_iterator.rb +145 -0
- data/lib/openwfe/expressions/fe_listen.rb +371 -0
- data/lib/openwfe/expressions/fe_losfor.rb +111 -0
- data/lib/openwfe/expressions/fe_misc.rb +421 -0
- data/lib/openwfe/expressions/fe_participant.rb +269 -0
- data/lib/openwfe/expressions/fe_reserve.rb +212 -0
- data/lib/openwfe/expressions/fe_save.rb +274 -0
- data/lib/openwfe/expressions/fe_sequence.rb +117 -0
- data/lib/openwfe/expressions/fe_set.rb +139 -0
- data/lib/openwfe/expressions/fe_sleep.rb +166 -0
- data/lib/openwfe/expressions/fe_step.rb +159 -0
- data/lib/openwfe/expressions/fe_subprocess.rb +168 -0
- data/lib/openwfe/expressions/fe_timeout.rb +127 -0
- data/lib/openwfe/expressions/fe_wait.rb +78 -0
- data/lib/openwfe/expressions/fe_when.rb +142 -0
- data/lib/openwfe/expressions/filter.rb +104 -0
- data/lib/openwfe/expressions/flowexpression.rb +847 -0
- data/lib/openwfe/expressions/iterator.rb +221 -0
- data/lib/openwfe/expressions/merge.rb +84 -0
- data/lib/openwfe/expressions/raw.rb +547 -0
- data/lib/openwfe/expressions/rprocdef.rb +375 -0
- data/lib/openwfe/expressions/time.rb +333 -0
- data/lib/openwfe/expressions/timeout.rb +178 -0
- data/lib/openwfe/expressions/value.rb +126 -0
- data/lib/openwfe/filterdef.rb +259 -0
- data/lib/openwfe/flowexpressionid.rb +357 -0
- data/lib/openwfe/listeners/listener.rb +97 -0
- data/lib/openwfe/listeners/listeners.rb +139 -0
- data/lib/openwfe/listeners/socketlisteners.rb +272 -0
- data/lib/openwfe/logging.rb +122 -0
- data/lib/openwfe/omixins.rb +95 -0
- data/lib/openwfe/orest/controlclient.rb +119 -0
- data/lib/openwfe/orest/definitions.rb +113 -0
- data/lib/openwfe/orest/exception.rb +60 -0
- data/lib/openwfe/orest/oldrestservlet.rb +279 -0
- data/lib/openwfe/orest/osocket.rb +148 -0
- data/lib/openwfe/orest/restclient.rb +176 -0
- data/lib/openwfe/orest/workitem.rb +206 -0
- data/lib/openwfe/orest/worklistclient.rb +272 -0
- data/lib/openwfe/orest/xmlcodec.rb +670 -0
- data/lib/openwfe/participants.rb +38 -0
- data/lib/openwfe/participants/enoparticipants.rb +230 -0
- data/lib/openwfe/participants/participant.rb +141 -0
- data/lib/openwfe/participants/participantmap.rb +249 -0
- data/lib/openwfe/participants/participants.rb +407 -0
- data/lib/openwfe/participants/soapparticipants.rb +135 -0
- data/lib/openwfe/participants/socketparticipants.rb +202 -0
- data/lib/openwfe/participants/storeparticipants.rb +254 -0
- data/lib/openwfe/rudefinitions.rb +130 -0
- data/lib/openwfe/service.rb +103 -0
- data/lib/openwfe/storage/yamlcustom.rb +106 -0
- data/lib/openwfe/storage/yamlfilestorage.rb +245 -0
- data/lib/openwfe/tools/flowtracer.rb +81 -0
- data/lib/openwfe/util/dollar.rb +217 -0
- data/lib/openwfe/util/irb.rb +86 -0
- data/lib/openwfe/util/observable.rb +144 -0
- data/lib/openwfe/util/ometa.rb +62 -0
- data/lib/openwfe/util/workqueue.rb +124 -0
- data/lib/openwfe/util/xml.rb +418 -0
- data/lib/openwfe/utils.rb +554 -0
- data/lib/openwfe/version.rb +37 -0
- data/lib/openwfe/workitem.rb +499 -0
- data/lib/openwfe/worklist/oldrest.rb +244 -0
- data/lib/openwfe/worklist/storelocks.rb +293 -0
- data/lib/openwfe/worklist/storeparticipant.rb +44 -0
- data/lib/openwfe/worklist/worklist.rb +297 -0
- data/test/README.txt +27 -0
- data/test/back_0916_test.rb +111 -0
- data/test/bm/bm_1_xml_vs_prog.rb +56 -0
- data/test/bm/bm_2_step.rb +109 -0
- data/test/bm/ft_0f_5ms.rb +35 -0
- data/test/bm/ft_26_load.rb +210 -0
- data/test/bm/ft_26b_load.rb +86 -0
- data/test/bm/ft_26c_load.rb +97 -0
- data/test/bm/ft_26d_load.rb +97 -0
- data/test/bm/ft_recu.rb +71 -0
- data/test/clone_test.rb +122 -0
- data/test/concurrence_test.rb +77 -0
- data/test/condition_test.rb +155 -0
- data/test/console_test.rb +12 -0
- data/test/cron_ltest.rb +15 -0
- data/test/description_test.rb +87 -0
- data/test/eno_test.rb +76 -0
- data/test/expmap_test.rb +54 -0
- data/test/expool_20031219_0916.tgz +0 -0
- data/test/fe_lookup_att_test.rb +62 -0
- data/test/fei_test.rb +181 -0
- data/test/file_persisted_engine_test.rb +64 -0
- data/test/file_persistence_test.rb +134 -0
- data/test/filep_cancel_test.rb +123 -0
- data/test/filter_test.rb +109 -0
- data/test/flowtestbase.rb +351 -0
- data/test/ft_0.rb +68 -0
- data/test/ft_0b_sequence.rb +36 -0
- data/test/ft_0c_testname.rb +33 -0
- data/test/ft_0d_participant.rb +30 -0
- data/test/ft_0e_multibody.rb +34 -0
- data/test/ft_10_loop.rb +134 -0
- data/test/ft_11_ppd.rb +415 -0
- data/test/ft_11b_ppd.rb +54 -0
- data/test/ft_12_blockparticipant.rb +97 -0
- data/test/ft_13_eno.rb +52 -0
- data/test/ft_14_subprocess.rb +88 -0
- data/test/ft_14b_subprocess.rb +192 -0
- data/test/ft_14c_subprocess.rb +68 -0
- data/test/ft_15_iterator.rb +216 -0
- data/test/ft_15b_iterator.rb +74 -0
- data/test/ft_16_fqv.rb +73 -0
- data/test/ft_17_condition.rb +84 -0
- data/test/ft_18_pname.rb +56 -0
- data/test/ft_1_unset.rb +175 -0
- data/test/ft_1b_unset.rb +39 -0
- data/test/ft_20_cron.rb +53 -0
- data/test/ft_21_cron.rb +87 -0
- data/test/ft_21b_cron_pause.rb +82 -0
- data/test/ft_22_history.rb +74 -0
- data/test/ft_23_when.rb +77 -0
- data/test/ft_23b_when.rb +70 -0
- data/test/ft_23c_wait.rb +80 -0
- data/test/ft_23d_cww.rb +58 -0
- data/test/ft_24_def.rb +44 -0
- data/test/ft_25_cancel.rb +89 -0
- data/test/ft_27_getflowpos.rb +147 -0
- data/test/ft_28_fileparticipant.rb +63 -0
- data/test/ft_29_httprb.rb +106 -0
- data/test/ft_2_concurrence.rb +135 -0
- data/test/ft_2b_concurrence.rb +188 -0
- data/test/ft_2c_concurrence.rb +64 -0
- data/test/ft_30_socketlistener.rb +203 -0
- data/test/ft_31_flowname.rb +40 -0
- data/test/ft_32_journal.rb +91 -0
- data/test/ft_32c_journal.rb +102 -0
- data/test/ft_32d_journal.rb +84 -0
- data/test/ft_33_description.rb +107 -0
- data/test/ft_34_cancelwfid.rb +80 -0
- data/test/ft_35_localdefs.rb +75 -0
- data/test/ft_36_subprocids.rb +97 -0
- data/test/ft_37_pnames.rb +70 -0
- data/test/ft_38_tag.rb +127 -0
- data/test/ft_38b_tag.rb +161 -0
- data/test/ft_38c_tag.rb +100 -0
- data/test/ft_39_reserve.rb +63 -0
- data/test/ft_39b_reserve.rb +84 -0
- data/test/ft_3_equals.rb +170 -0
- data/test/ft_3b_lookup_vf.rb +83 -0
- data/test/ft_40_defined.rb +61 -0
- data/test/ft_41_case.rb +110 -0
- data/test/ft_42_environments.rb +75 -0
- data/test/ft_43_pat10.rb +85 -0
- data/test/ft_44_save.rb +70 -0
- data/test/ft_44b_restore.rb +212 -0
- data/test/ft_45_citerator.rb +214 -0
- data/test/ft_46_pparams.rb +62 -0
- data/test/ft_47_filter.rb +160 -0
- data/test/ft_48_fe_filter.rb +88 -0
- data/test/ft_49_condition.rb +126 -0
- data/test/ft_4_misc.rb +237 -0
- data/test/ft_50_xml_attribute.rb +155 -0
- data/test/ft_51_stack.rb +55 -0
- data/test/ft_52_obs_participant.rb +123 -0
- data/test/ft_53_null_noop_participant.rb +62 -0
- data/test/ft_54_listen.rb +288 -0
- data/test/ft_54b_listen.rb +66 -0
- data/test/ft_54c_listen.rb +99 -0
- data/test/ft_55_ptimeout.rb +59 -0
- data/test/ft_56_timeout.rb +59 -0
- data/test/ft_57_a.rb +145 -0
- data/test/ft_58_ejournal.rb +151 -0
- data/test/ft_59_ps.rb +150 -0
- data/test/ft_59b_ps_for_pat.rb +58 -0
- data/test/ft_5_time.rb +118 -0
- data/test/ft_60_ecancel.rb +161 -0
- data/test/ft_61_elsub.rb +51 -0
- data/test/ft_62_procparticipant.rb +71 -0
- data/test/ft_63_pause.rb +124 -0
- data/test/ft_64_alias.rb +102 -0
- data/test/ft_64_clone.rb +69 -0
- data/test/ft_65_stringlaunch.rb +59 -0
- data/test/ft_66_subforget.rb +70 -0
- data/test/ft_67_schedlaunch.rb +116 -0
- data/test/ft_68_ifparticipant.rb +70 -0
- data/test/ft_69_cancelmissing.rb +51 -0
- data/test/ft_6_lambda.rb +64 -0
- data/test/ft_70_lookupvar.rb +55 -0
- data/test/ft_71_log.rb +60 -0
- data/test/ft_72_lookup_processes.rb +76 -0
- data/test/ft_73_cancel_sub.rb +139 -0
- data/test/ft_74_block_and_workitem_dup.rb +63 -0
- data/test/ft_75_ruby_attributes.rb +87 -0
- data/test/ft_76_merge_isolate.rb +88 -0
- data/test/ft_77_segments.rb +35 -0
- data/test/ft_78_eval.rb +150 -0
- data/test/ft_79_tticket.rb +187 -0
- data/test/ft_79b_tticket.rb +172 -0
- data/test/ft_79c_outcome.rb +56 -0
- data/test/ft_7_lose.rb +104 -0
- data/test/ft_7b_lose.rb +78 -0
- data/test/ft_80_spname.rb +91 -0
- data/test/ft_81_exp.rb +60 -0
- data/test/ft_82_trecu.rb +46 -0
- data/test/ft_83_badpause.rb +58 -0
- data/test/ft_84_updateexp.rb +198 -0
- data/test/ft_85_dolhash.rb +43 -0
- data/test/ft_86_dollar_fv.rb +68 -0
- data/test/ft_87_define.rb +74 -0
- data/test/ft_8_forget.rb +44 -0
- data/test/ft_9_cursor.rb +145 -0
- data/test/ft_9b_cursor.rb +105 -0
- data/test/ft_tests.rb +124 -0
- data/test/hash_test.rb +75 -0
- data/test/hparticipant_test.rb +164 -0
- data/test/lookup_att_test.rb +90 -0
- data/test/lookup_vf_test.rb +94 -0
- data/test/misc_test.rb +90 -0
- data/test/nut_0_irb.rb +20 -0
- data/test/obs_test.rb +142 -0
- data/test/orest_test.rb +251 -0
- data/test/param_test.rb +290 -0
- data/test/participant_test.rb +101 -0
- data/test/pending.rb +23 -0
- data/test/ps_representation.rb +133 -0
- data/test/rake_ltest.rb +38 -0
- data/test/rake_qtest.rb +68 -0
- data/test/raw_prog_test.rb +412 -0
- data/test/restart_cron_test.rb +136 -0
- data/test/restart_paused_test.rb +98 -0
- data/test/restart_sleep_test.rb +140 -0
- data/test/restart_tests.rb +18 -0
- data/test/restart_when_test.rb +112 -0
- data/test/ruby_procdef_test.rb +132 -0
- data/test/rutest_utils.rb +63 -0
- data/test/sec_test.rb +205 -0
- data/test/slock_test.rb +80 -0
- data/test/storage_test.rb +44 -0
- data/test/test.rb +3 -0
- data/test/timeout_test.rb +105 -0
- data/test/util_xml_test.rb +112 -0
- data/test/wfid_test.rb +175 -0
- data/test/wi_test.rb +75 -0
- 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
|
+
|