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,259 @@
|
|
|
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/utils'
|
|
41
|
+
require 'openwfe/expressions/time'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module OpenWFE
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# Scheduling subprocesses for repeating execution
|
|
48
|
+
#
|
|
49
|
+
# <cron tab="0 9-17 * * mon-fri">
|
|
50
|
+
# <send-reminder/>
|
|
51
|
+
# </cron>
|
|
52
|
+
#
|
|
53
|
+
# In this short process definition snippet, the subprocess "send-reminder"
|
|
54
|
+
# will get triggered once per hour (minute 0) from 0900 to 1700 and
|
|
55
|
+
# this, from monday to friday.
|
|
56
|
+
#
|
|
57
|
+
# It's possible to specify 'every' instead of 'tab' :
|
|
58
|
+
#
|
|
59
|
+
# cron :every => "10m3s" do
|
|
60
|
+
# send_reminder
|
|
61
|
+
# end
|
|
62
|
+
#
|
|
63
|
+
# The subprocess 'send_reminder' will thus be triggered every ten minutes
|
|
64
|
+
# and three seconds.
|
|
65
|
+
#
|
|
66
|
+
# The cron expression never replies [to its parent expression].
|
|
67
|
+
# The classical usage for it is with a concurrence set to expect only
|
|
68
|
+
# one reply :
|
|
69
|
+
#
|
|
70
|
+
# concurrence :count => 1 do
|
|
71
|
+
# participant :toto
|
|
72
|
+
# cron :every => "10m" do
|
|
73
|
+
# send_reminder_email :target => "toto@headlost.org.uk"
|
|
74
|
+
# end
|
|
75
|
+
# end
|
|
76
|
+
#
|
|
77
|
+
# The sub process 'send_reminder_email' will thus be triggered every 10
|
|
78
|
+
# minutes while concurrence is waiting for the answer (reply) of the
|
|
79
|
+
# participant :toto.
|
|
80
|
+
#
|
|
81
|
+
# If the process instance containing a cron is paused, the cron won't get
|
|
82
|
+
# triggered until the process is resumed.
|
|
83
|
+
#
|
|
84
|
+
class CronExpression < TimeExpression
|
|
85
|
+
|
|
86
|
+
names :cron
|
|
87
|
+
|
|
88
|
+
uses_template
|
|
89
|
+
|
|
90
|
+
#++
|
|
91
|
+
# keeping a copy of the child expression (this copy is used
|
|
92
|
+
# for spawning a new expression each time cron triggers)
|
|
93
|
+
#
|
|
94
|
+
#attr_accessor :raw_child
|
|
95
|
+
#--
|
|
96
|
+
|
|
97
|
+
#
|
|
98
|
+
# The cron 'tab', something like "0 9-17 * * mon-fri"
|
|
99
|
+
#
|
|
100
|
+
attr_accessor :tab
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# If 'tab' is not, then 'every' should, the expression will trigger
|
|
104
|
+
# at the frequency specified here (like for example "10m3s).
|
|
105
|
+
#
|
|
106
|
+
attr_accessor :every
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# Keeping track of how many times the cron fired.
|
|
110
|
+
#
|
|
111
|
+
attr_accessor :counter
|
|
112
|
+
|
|
113
|
+
#--
|
|
114
|
+
#attr_accessor :name
|
|
115
|
+
#attr_accessor :engine_cron
|
|
116
|
+
#++
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def apply (workitem)
|
|
120
|
+
|
|
121
|
+
return reply_to_parent(workitem) \
|
|
122
|
+
if raw_children.size < 1
|
|
123
|
+
|
|
124
|
+
@counter = 0
|
|
125
|
+
#@engine_cron = false
|
|
126
|
+
|
|
127
|
+
@applied_workitem = workitem.dup
|
|
128
|
+
@applied_workitem.flow_expression_id = nil
|
|
129
|
+
|
|
130
|
+
@tab = lookup_attribute :tab, workitem
|
|
131
|
+
@every = lookup_attribute :every, workitem
|
|
132
|
+
|
|
133
|
+
#@name = lookup_attribute :name, workitem
|
|
134
|
+
#@name = fei.to_s unless @name
|
|
135
|
+
|
|
136
|
+
#if @name[0, 2] == '//'
|
|
137
|
+
# @name = @name[1..-1]
|
|
138
|
+
# @engine_cron = true
|
|
139
|
+
#end
|
|
140
|
+
|
|
141
|
+
#forget = lookup_boolean_attribute :forget, workitem
|
|
142
|
+
|
|
143
|
+
#@raw_child, _fei = get_expression_pool.fetch @children[0]
|
|
144
|
+
#@raw_child.parent_id = nil
|
|
145
|
+
#clean_children
|
|
146
|
+
#@children = nil
|
|
147
|
+
|
|
148
|
+
determine_scheduler_tags
|
|
149
|
+
|
|
150
|
+
#
|
|
151
|
+
# schedule self
|
|
152
|
+
|
|
153
|
+
reschedule get_scheduler
|
|
154
|
+
|
|
155
|
+
#
|
|
156
|
+
# store self as a variable
|
|
157
|
+
# (have to do it after the reschedule, so that the schedule
|
|
158
|
+
# info is stored within the variable (within self))
|
|
159
|
+
|
|
160
|
+
#set_variable @name, self
|
|
161
|
+
#set_variable @name, @fei
|
|
162
|
+
|
|
163
|
+
#
|
|
164
|
+
# resume flow (if not a engine level cron)
|
|
165
|
+
|
|
166
|
+
#reply_to_parent(workitem) unless @engine_cron
|
|
167
|
+
#reply_to_parent(workitem) if forget
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def reply (workitem)
|
|
171
|
+
# discard silently... should never get called though
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
#
|
|
175
|
+
# This is the method called each time the scheduler triggers
|
|
176
|
+
# this cron. The contained segment of process will get
|
|
177
|
+
# executed.
|
|
178
|
+
#
|
|
179
|
+
def trigger (params)
|
|
180
|
+
|
|
181
|
+
return if paused?
|
|
182
|
+
|
|
183
|
+
ldebug { "trigger() cron : #{@fei.to_debug_s}" }
|
|
184
|
+
|
|
185
|
+
#@raw_child.application_context = @application_context
|
|
186
|
+
# done in expool.launch_template()
|
|
187
|
+
|
|
188
|
+
begin
|
|
189
|
+
|
|
190
|
+
#template = @raw_child
|
|
191
|
+
#template, _fei = get_expression_pool.fetch @children[0]
|
|
192
|
+
template = raw_children.first
|
|
193
|
+
|
|
194
|
+
#get_expression_pool.launch_template(
|
|
195
|
+
# @fei.wfid, nil, @counter, template, @applied_workitem.dup)
|
|
196
|
+
child_fei = get_expression_pool.tlaunch_child(
|
|
197
|
+
self, template, @counter, @applied_workitem.dup, false)
|
|
198
|
+
#
|
|
199
|
+
# register_child is set to false, cron doesn't keep
|
|
200
|
+
# track of its spawned children
|
|
201
|
+
|
|
202
|
+
#
|
|
203
|
+
# update count and store self
|
|
204
|
+
|
|
205
|
+
@counter += 1
|
|
206
|
+
|
|
207
|
+
#if is_engine_cron?
|
|
208
|
+
# set_variable @name, self
|
|
209
|
+
#else
|
|
210
|
+
# store_itself
|
|
211
|
+
#end
|
|
212
|
+
store_itself
|
|
213
|
+
|
|
214
|
+
rescue
|
|
215
|
+
|
|
216
|
+
lerror do
|
|
217
|
+
"trigger() cron caught exception\n"+
|
|
218
|
+
OpenWFE::exception_to_s($!)
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
#
|
|
224
|
+
# This method is called at the first schedule of this expression
|
|
225
|
+
# or each time the engine is restarted and this expression has
|
|
226
|
+
# to be rescheduled.
|
|
227
|
+
#
|
|
228
|
+
def reschedule (scheduler)
|
|
229
|
+
|
|
230
|
+
#return unless @applied_workitem
|
|
231
|
+
|
|
232
|
+
#@scheduler_job_id = if @engine_cron
|
|
233
|
+
# "/" + @name
|
|
234
|
+
#else
|
|
235
|
+
# "#{@fei.wfid}__#{@scheduler_job_id}"
|
|
236
|
+
#end
|
|
237
|
+
@scheduler_job_id = "#{@fei.wfid}__#{@scheduler_job_id}"
|
|
238
|
+
|
|
239
|
+
method, arg0 = if @tab
|
|
240
|
+
[ :schedule, @tab ]
|
|
241
|
+
else
|
|
242
|
+
[ :schedule_every, @every ]
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
get_scheduler.send(
|
|
246
|
+
method,
|
|
247
|
+
arg0,
|
|
248
|
+
{
|
|
249
|
+
:schedulable => self,
|
|
250
|
+
:job_id => @scheduler_job_id,
|
|
251
|
+
:tags => @scheduler_tags })
|
|
252
|
+
|
|
253
|
+
#ldebug { "reschedule() name is '#{@name}'" }
|
|
254
|
+
ldebug { "reschedule() job id is '#{@scheduler_job_id}'" }
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
end
|
|
259
|
+
|
|
@@ -0,0 +1,259 @@
|
|
|
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 'openwfe/expressions/condition'
|
|
41
|
+
require 'openwfe/expressions/flowexpression'
|
|
42
|
+
require 'openwfe/expressions/fe_command'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
module OpenWFE
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# The 'cursor' is much like a sequence, but you can go
|
|
49
|
+
# back and forth within it, as it reads the field '\_\_cursor_command__' (or
|
|
50
|
+
# the field specified in the 'command-field' attribute) at each
|
|
51
|
+
# transition (each time it's supposed to move from one child expression to
|
|
52
|
+
# the next).
|
|
53
|
+
#
|
|
54
|
+
# cursor do
|
|
55
|
+
# participant "alpha"
|
|
56
|
+
# skip :step => "2"
|
|
57
|
+
# participant "bravo"
|
|
58
|
+
# participant "charly"
|
|
59
|
+
# set :field => "__cursor_command__", value => "2"
|
|
60
|
+
# participant "delta"
|
|
61
|
+
# participant "echo"
|
|
62
|
+
# skip 2
|
|
63
|
+
# participant "fox"
|
|
64
|
+
# #
|
|
65
|
+
# # in that cursor example, only the participants alpha, charly and
|
|
66
|
+
# # echo will be handed a workitem
|
|
67
|
+
# # (notice the last 'skip' with its light syntax)
|
|
68
|
+
# #
|
|
69
|
+
# end
|
|
70
|
+
#
|
|
71
|
+
# As you can see, you can directly set the value of the field
|
|
72
|
+
# '\_\_cursor_command__' or use a CursorCommandExpression like 'skip' or
|
|
73
|
+
# 'jump'.
|
|
74
|
+
#
|
|
75
|
+
class CursorExpression < FlowExpression
|
|
76
|
+
include CommandMixin
|
|
77
|
+
|
|
78
|
+
names :cursor
|
|
79
|
+
|
|
80
|
+
uses_template
|
|
81
|
+
|
|
82
|
+
#
|
|
83
|
+
# the integer identifier for the current loop
|
|
84
|
+
#
|
|
85
|
+
attr_accessor :loop_id
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# what is the index of the child we're currently executing
|
|
89
|
+
#
|
|
90
|
+
attr_accessor :current_child_id
|
|
91
|
+
|
|
92
|
+
#
|
|
93
|
+
# keeping track of the current child (if any)
|
|
94
|
+
#
|
|
95
|
+
attr_accessor :current_child_fei
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def apply (workitem)
|
|
99
|
+
|
|
100
|
+
new_environment
|
|
101
|
+
|
|
102
|
+
@loop_id = 0
|
|
103
|
+
|
|
104
|
+
@current_child_id = -1
|
|
105
|
+
|
|
106
|
+
#clean_children_list
|
|
107
|
+
|
|
108
|
+
reply workitem
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def reply (workitem)
|
|
112
|
+
|
|
113
|
+
return reply_to_parent(workitem) \
|
|
114
|
+
if raw_children.size < 1
|
|
115
|
+
#
|
|
116
|
+
# well, currently, no infinite empty loop allowed
|
|
117
|
+
|
|
118
|
+
command, step = determine_command_and_step workitem
|
|
119
|
+
|
|
120
|
+
ldebug { "reply() command is '#{command} #{step}'" }
|
|
121
|
+
|
|
122
|
+
if command == C_BREAK or command == C_CANCEL
|
|
123
|
+
return reply_to_parent(workitem)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
if command == C_REWIND or command == C_CONTINUE
|
|
127
|
+
|
|
128
|
+
@current_child_id = 0
|
|
129
|
+
|
|
130
|
+
elsif command and command.match("^#{C_JUMP}")
|
|
131
|
+
|
|
132
|
+
@current_child_id = step
|
|
133
|
+
@current_child_id = 0 if @current_child_id < 0
|
|
134
|
+
|
|
135
|
+
@current_child_id = raw_children.length - 1 \
|
|
136
|
+
if @current_child_id >= raw_children.length
|
|
137
|
+
|
|
138
|
+
else # C_SKIP or C_BACK
|
|
139
|
+
|
|
140
|
+
@current_child_id = @current_child_id + step
|
|
141
|
+
|
|
142
|
+
@current_child_id = 0 if @current_child_id < 0
|
|
143
|
+
|
|
144
|
+
#if @current_child_id >= @children.length
|
|
145
|
+
if @current_child_id >= raw_children.length
|
|
146
|
+
|
|
147
|
+
return reply_to_parent(workitem) unless is_loop
|
|
148
|
+
|
|
149
|
+
@loop_id += 1
|
|
150
|
+
@current_child_id = 0
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
#template_fei = @children[@current_child_id]
|
|
155
|
+
template = raw_children[@current_child_id]
|
|
156
|
+
|
|
157
|
+
#
|
|
158
|
+
# launch the next child as a template
|
|
159
|
+
|
|
160
|
+
#get_expression_pool.launch_template(
|
|
161
|
+
# self,
|
|
162
|
+
# @environment_id,
|
|
163
|
+
# @loop_id,
|
|
164
|
+
# template_fei,
|
|
165
|
+
# workitem,
|
|
166
|
+
# nil)
|
|
167
|
+
@current_child_fei = get_expression_pool.tlaunch_child(
|
|
168
|
+
self,
|
|
169
|
+
template,
|
|
170
|
+
@current_child_id,
|
|
171
|
+
workitem,
|
|
172
|
+
false) # not registering child
|
|
173
|
+
|
|
174
|
+
store_itself
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#
|
|
178
|
+
# takes care of cancelling the current child if necessary
|
|
179
|
+
#
|
|
180
|
+
def cancel
|
|
181
|
+
|
|
182
|
+
cfei = current_child_fei
|
|
183
|
+
get_expression_pool.cancel(cfei) if cfei
|
|
184
|
+
|
|
185
|
+
get_expression_pool.cancel(@current_child_fei) \
|
|
186
|
+
if @current_child_fei
|
|
187
|
+
|
|
188
|
+
super
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
#
|
|
192
|
+
# Returns false, the child class LoopExpression does return true.
|
|
193
|
+
#
|
|
194
|
+
def is_loop
|
|
195
|
+
|
|
196
|
+
false
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
protected
|
|
200
|
+
|
|
201
|
+
#
|
|
202
|
+
# Determines the fei of the child being currently executed.
|
|
203
|
+
# This method is used by cancel().
|
|
204
|
+
#
|
|
205
|
+
#def current_child_fei
|
|
206
|
+
# cfei = @children[@current_child_id].dup
|
|
207
|
+
# return nil unless cfei
|
|
208
|
+
# cfei.wfid = cfei.wfid + '.' + @loop_id.to_s
|
|
209
|
+
# cfei
|
|
210
|
+
#end
|
|
211
|
+
|
|
212
|
+
#
|
|
213
|
+
# Makes sure that only flow expression are left in the cursor
|
|
214
|
+
# children list (text and comment nodes get discarded).
|
|
215
|
+
#
|
|
216
|
+
#def clean_children_list
|
|
217
|
+
# c = @children
|
|
218
|
+
# @children = []
|
|
219
|
+
# c.each do |child|
|
|
220
|
+
# @children << child \
|
|
221
|
+
# if child.kind_of?(OpenWFE::FlowExpressionId)
|
|
222
|
+
# end
|
|
223
|
+
#end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# The 'loop' expression is like 'cursor' but it doesn't exit until
|
|
228
|
+
# it's broken (with 'break' or 'cancel').
|
|
229
|
+
#
|
|
230
|
+
# <loop>
|
|
231
|
+
# <participant ref="toto" />
|
|
232
|
+
# <break if="${f:done} == true" />
|
|
233
|
+
# </loop>
|
|
234
|
+
#
|
|
235
|
+
# or, in a Ruby process definition :
|
|
236
|
+
#
|
|
237
|
+
# _loop do
|
|
238
|
+
# participant "toto"
|
|
239
|
+
# _break :if => "${f:done} == true"
|
|
240
|
+
# end
|
|
241
|
+
#
|
|
242
|
+
# (notice the _ (underscores) to distinguish the OpenWFEru expressions
|
|
243
|
+
# from the native Ruby ones).
|
|
244
|
+
#
|
|
245
|
+
class LoopExpression < CursorExpression
|
|
246
|
+
|
|
247
|
+
names :loop
|
|
248
|
+
|
|
249
|
+
#
|
|
250
|
+
# Returns true as, well, it's a loop...
|
|
251
|
+
#
|
|
252
|
+
def is_loop
|
|
253
|
+
|
|
254
|
+
true
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
end
|
|
259
|
+
|