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,166 @@
|
|
|
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 'rufus/otime'
|
|
41
|
+
require 'openwfe/expressions/time'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module OpenWFE
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# The 'sleep' expression expects one attribute, either 'for', either
|
|
48
|
+
# 'until'.
|
|
49
|
+
#
|
|
50
|
+
# <sequence>
|
|
51
|
+
# <sleep for="10m12s" />
|
|
52
|
+
# <participant ref="alpha" />
|
|
53
|
+
# </sequence>
|
|
54
|
+
#
|
|
55
|
+
# will wait for 10 minutes and 12 seconds before sending a workitem
|
|
56
|
+
# to participant 'alpha'.
|
|
57
|
+
#
|
|
58
|
+
# In a Ruby process definition, that might look like :
|
|
59
|
+
#
|
|
60
|
+
# sleep :for => "3m"
|
|
61
|
+
# sleep "3m"
|
|
62
|
+
# #
|
|
63
|
+
# # both meaning 'sleep for 3 minutes'
|
|
64
|
+
#
|
|
65
|
+
# sleep :until => "Mon Dec 03 10:41:58 +0900 2007"
|
|
66
|
+
# #
|
|
67
|
+
# # sleep until the given point in time
|
|
68
|
+
#
|
|
69
|
+
# If the 'until' attribute points to a time in the past, the sleep
|
|
70
|
+
# expression will simply let the process resume.
|
|
71
|
+
#
|
|
72
|
+
#
|
|
73
|
+
class SleepExpression < TimeExpression
|
|
74
|
+
|
|
75
|
+
names :sleep
|
|
76
|
+
|
|
77
|
+
attr_accessor :awakening_time
|
|
78
|
+
|
|
79
|
+
def apply (workitem)
|
|
80
|
+
|
|
81
|
+
sfor = lookup_string_attribute(:for, workitem)
|
|
82
|
+
suntil = lookup_string_attribute(:until, workitem)
|
|
83
|
+
|
|
84
|
+
sfor = fetch_text_content(workitem) \
|
|
85
|
+
if sfor == nil and suntil == nil
|
|
86
|
+
|
|
87
|
+
#ldebug { "apply() sfor is '#{sfor}'" }
|
|
88
|
+
#ldebug { "apply() suntil is '#{suntil}'" }
|
|
89
|
+
|
|
90
|
+
tuntil = nil
|
|
91
|
+
|
|
92
|
+
if suntil
|
|
93
|
+
|
|
94
|
+
tuntil = suntil
|
|
95
|
+
|
|
96
|
+
elsif sfor
|
|
97
|
+
|
|
98
|
+
tfor = Rufus::parse_time_string(sfor)
|
|
99
|
+
#ldebug { "apply() tfor is '#{tfor}'" }
|
|
100
|
+
tuntil = Time.new.to_f + tfor
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
#ldebug { "apply() tuntil is '#{tuntil}'" }
|
|
104
|
+
|
|
105
|
+
return reply_to_parent(workitem) \
|
|
106
|
+
if not tuntil
|
|
107
|
+
|
|
108
|
+
@awakening_time = tuntil
|
|
109
|
+
@applied_workitem = workitem.dup
|
|
110
|
+
|
|
111
|
+
determine_scheduler_tags
|
|
112
|
+
|
|
113
|
+
reschedule(get_scheduler)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
#
|
|
117
|
+
# This is the method called by the Scheduler instance attached to
|
|
118
|
+
# the workflow engine when the 'sleep' of this expression is
|
|
119
|
+
# over
|
|
120
|
+
#
|
|
121
|
+
def trigger (params)
|
|
122
|
+
|
|
123
|
+
ldebug do
|
|
124
|
+
"trigger() #{@fei.to_debug_s} waking up (#{Time.new.to_f}) "+
|
|
125
|
+
"(scheduler #{get_scheduler.object_id})"
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
reply_to_parent(@applied_workitem)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# [Re]schedules this expression, effectively registering it within
|
|
133
|
+
# the scheduler.
|
|
134
|
+
# This method is called when the expression is applied and each
|
|
135
|
+
# time the owning engine restarts.
|
|
136
|
+
#
|
|
137
|
+
def reschedule (scheduler)
|
|
138
|
+
|
|
139
|
+
return unless @awakening_time
|
|
140
|
+
|
|
141
|
+
ldebug do
|
|
142
|
+
"[re]schedule() " +
|
|
143
|
+
"will sleep until '#{@awakening_time}' " +
|
|
144
|
+
"(#{Rufus::to_iso8601_date(@awakening_time)})"
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
@scheduler_job_id = "sleep_#{self.fei.to_s}"
|
|
148
|
+
|
|
149
|
+
scheduler.schedule_at(
|
|
150
|
+
@awakening_time,
|
|
151
|
+
{
|
|
152
|
+
:schedulable => self,
|
|
153
|
+
:job_id => @scheduler_job_id,
|
|
154
|
+
:tags => @scheduler_tags })
|
|
155
|
+
|
|
156
|
+
ldebug do
|
|
157
|
+
"[re]schedule() @scheduler_job_id is '#{@scheduler_job_id}' "+
|
|
158
|
+
" (scheduler #{scheduler.object_id})"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
store_itself
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
end
|
|
166
|
+
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 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/flowexpression'
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
module OpenWFE
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# This expression takes its root in this "trouble ticket blog post" :
|
|
47
|
+
#
|
|
48
|
+
# http://jmettraux.wordpress.com/2008/01/04/the-trouble-ticket-process/
|
|
49
|
+
#
|
|
50
|
+
# In this post, the "step" was implemented directly in the OpenWFEru
|
|
51
|
+
# process definition language.
|
|
52
|
+
#
|
|
53
|
+
# It's been turned into an expression and it's not limited anymore to
|
|
54
|
+
# the concept "state is a participant, transition points to a subprocess",
|
|
55
|
+
# state can now point to a subprocess as well as to a participant, idem
|
|
56
|
+
# for a transition.
|
|
57
|
+
#
|
|
58
|
+
# In other words, this "step" expression allows you to write
|
|
59
|
+
# state-transition process definitions in OpenWFEru (the Ruote workflow
|
|
60
|
+
# engine). But don't abuse it. Classical OpenWFEru constructs can
|
|
61
|
+
# do most of the job.
|
|
62
|
+
#
|
|
63
|
+
# An interesting aspect of the "step" expression is that it can remove
|
|
64
|
+
# the need for some "if" expression constructs (well the fact
|
|
65
|
+
#
|
|
66
|
+
# class ProcDef0 < OpenWFE::ProcessDefinition
|
|
67
|
+
#
|
|
68
|
+
# sequence do
|
|
69
|
+
#
|
|
70
|
+
# step "Alfred", :outcomes => [ 'blue_pen', 'red_pen' ]
|
|
71
|
+
# # Alfred gets to choose between a blue pen and a red pen
|
|
72
|
+
#
|
|
73
|
+
# participant "Bob"
|
|
74
|
+
# # flow resumes with Bob in a classical way (sequence)
|
|
75
|
+
# end
|
|
76
|
+
#
|
|
77
|
+
# define "blue_pen" do
|
|
78
|
+
# # ... Alfred buying a blue pen
|
|
79
|
+
# end
|
|
80
|
+
# define "red_pen" do
|
|
81
|
+
# # ... Alfred buying a red pen
|
|
82
|
+
# end
|
|
83
|
+
# end
|
|
84
|
+
#
|
|
85
|
+
# in XML it would look like :
|
|
86
|
+
#
|
|
87
|
+
# <sequence>
|
|
88
|
+
# <step ref="Alfred" outcomes="blue_pen, red_pen" />
|
|
89
|
+
# <participant ref="Bob" />
|
|
90
|
+
# </sequence>
|
|
91
|
+
#
|
|
92
|
+
# You can specify a default outcome (else if the outcome doesn't correspond
|
|
93
|
+
# to a participant or a subprocess, the flow will cease) :
|
|
94
|
+
#
|
|
95
|
+
# <step ref="toto" outcomes="left, right" default="right" />
|
|
96
|
+
#
|
|
97
|
+
# For some more discussions about Ruote and state-transition see
|
|
98
|
+
#
|
|
99
|
+
# http://groups.google.com/group/openwferu-dev/t/16e713c1313cb2fa
|
|
100
|
+
#
|
|
101
|
+
class StepExpression < FlowExpression
|
|
102
|
+
|
|
103
|
+
names :step
|
|
104
|
+
|
|
105
|
+
attr_accessor :outcomes
|
|
106
|
+
attr_accessor :default
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def apply (workitem)
|
|
110
|
+
|
|
111
|
+
step = lookup_attribute(:ref, workitem) || @children.first
|
|
112
|
+
|
|
113
|
+
# keeping track of outcomes and default as found at apply time
|
|
114
|
+
|
|
115
|
+
@outcomes = lookup_array_attribute(
|
|
116
|
+
:outcomes, workitem, :to_s => true)
|
|
117
|
+
|
|
118
|
+
@default = lookup_attribute(
|
|
119
|
+
:default, workitem, :to_s => true)
|
|
120
|
+
|
|
121
|
+
store_itself
|
|
122
|
+
|
|
123
|
+
# launching the 'step' itself
|
|
124
|
+
|
|
125
|
+
template = [
|
|
126
|
+
step.to_s, # expression name
|
|
127
|
+
lookup_attributes(workitem), # attributes
|
|
128
|
+
[], # children
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
get_expression_pool.tlaunch_child(
|
|
132
|
+
self, template, 0, workitem, true) #, vars=nil
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def reply (workitem)
|
|
136
|
+
|
|
137
|
+
outcome = workitem.fields.delete 'outcome'
|
|
138
|
+
outcome = outcome.to_s if outcome
|
|
139
|
+
|
|
140
|
+
#p [ outcome, @outcomes, @default ]
|
|
141
|
+
|
|
142
|
+
outcome = @default \
|
|
143
|
+
if @outcomes and (not @outcomes.include?(outcome))
|
|
144
|
+
|
|
145
|
+
return reply_to_parent(workitem) \
|
|
146
|
+
unless outcome
|
|
147
|
+
|
|
148
|
+
template = [
|
|
149
|
+
outcome.to_s, # expression name
|
|
150
|
+
{}, # attributes
|
|
151
|
+
[], # children
|
|
152
|
+
]
|
|
153
|
+
|
|
154
|
+
get_expression_pool.substitute_and_apply self, template, workitem
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end
|
|
159
|
+
|
|
@@ -0,0 +1,168 @@
|
|
|
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
|
+
|
|
42
|
+
|
|
43
|
+
module OpenWFE
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# This expression is used to launch/call a subprocess.
|
|
47
|
+
#
|
|
48
|
+
# For example :
|
|
49
|
+
#
|
|
50
|
+
# <process-definition name="subtest0" revision="0">
|
|
51
|
+
# <sequence>
|
|
52
|
+
# <subprocess ref="sub0" a="A" b="B" c="C" />
|
|
53
|
+
# <sub0 a="A" b="B" c="C" />
|
|
54
|
+
# </sequence>
|
|
55
|
+
#
|
|
56
|
+
# <process-definition name="sub0">
|
|
57
|
+
# <print>${a}${b}${c}</print>
|
|
58
|
+
# </process-definition>
|
|
59
|
+
#
|
|
60
|
+
# </process-definition>
|
|
61
|
+
#
|
|
62
|
+
# It's totally OK to have URLs as referenced processes :
|
|
63
|
+
#
|
|
64
|
+
# require 'openwfe/def'
|
|
65
|
+
#
|
|
66
|
+
# class AnotherDefinition0 < OpenWFE::ProcessDefinition
|
|
67
|
+
# sequence do
|
|
68
|
+
# participant :ref => "toto"
|
|
69
|
+
# subprocess :ref => "http://company.process.server/def0.rb"
|
|
70
|
+
# end
|
|
71
|
+
# end
|
|
72
|
+
#
|
|
73
|
+
# (but the engine parameter :remove_definitions_allowed must be set to true,
|
|
74
|
+
# as it's dangerous to fetch process definitions from other [untrusted]
|
|
75
|
+
# hosts)
|
|
76
|
+
#
|
|
77
|
+
# The 'subprocess' expression accepts a 'forget' attribute :
|
|
78
|
+
#
|
|
79
|
+
# class AnotherDefinition1 < OpenWFE::ProcessDefinition
|
|
80
|
+
# sequence do
|
|
81
|
+
# subprocess :ref => "my_subprocess", :forget => true
|
|
82
|
+
# participant :ref => "ringo"
|
|
83
|
+
# end
|
|
84
|
+
# process-definition :name => "my_subprocess" do
|
|
85
|
+
# participant :ref => "fake steve jobs"
|
|
86
|
+
# end
|
|
87
|
+
# end
|
|
88
|
+
#
|
|
89
|
+
# The 'subprocess' expression accepts an 'if' (or 'unless') attribute :
|
|
90
|
+
#
|
|
91
|
+
# subprocess :ref => "interview_process", :if => "${f:screened}"
|
|
92
|
+
# # will trigger the subprocess only if the field screened
|
|
93
|
+
# # contains the string 'true' or the boolean 'true'
|
|
94
|
+
#
|
|
95
|
+
# interview_process :if => "${f:screened}"
|
|
96
|
+
# # idem
|
|
97
|
+
#
|
|
98
|
+
# interview_process :unless => "${f:has_had_problem_with_justice_?}"
|
|
99
|
+
# # well...
|
|
100
|
+
#
|
|
101
|
+
class SubProcessRefExpression < FlowExpression
|
|
102
|
+
include ConditionMixin
|
|
103
|
+
|
|
104
|
+
names :subprocess
|
|
105
|
+
|
|
106
|
+
attr_accessor :subprocess_fei
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def apply (workitem)
|
|
110
|
+
|
|
111
|
+
conditional = eval_condition(:if, workitem, :unless)
|
|
112
|
+
|
|
113
|
+
return reply_to_parent(workitem) \
|
|
114
|
+
if conditional == false
|
|
115
|
+
|
|
116
|
+
ref = lookup_ref workitem
|
|
117
|
+
|
|
118
|
+
raise "'subprocess' expression misses a 'ref', 'field-ref' or 'variable-ref' attribute" unless ref
|
|
119
|
+
|
|
120
|
+
template_uri = OpenWFE::parse_known_uri ref
|
|
121
|
+
|
|
122
|
+
template = template_uri || lookup_variable(ref)
|
|
123
|
+
|
|
124
|
+
raise "did not find any subprocess named '#{ref}'" \
|
|
125
|
+
if not template
|
|
126
|
+
|
|
127
|
+
forget = lookup_boolean_attribute :forget, workitem
|
|
128
|
+
|
|
129
|
+
params = lookup_attributes workitem
|
|
130
|
+
|
|
131
|
+
text = fetch_text_content workitem, false
|
|
132
|
+
params["0"] = text if text
|
|
133
|
+
|
|
134
|
+
#puts
|
|
135
|
+
#puts " ... params are #{params.keys.join(', ')}"
|
|
136
|
+
#puts " ... values are #{params.values.join(', ')}"
|
|
137
|
+
|
|
138
|
+
#requester = if forget
|
|
139
|
+
# @fei.workflow_instance_id
|
|
140
|
+
#else
|
|
141
|
+
# @fei
|
|
142
|
+
#end
|
|
143
|
+
#sub_fei = get_expression_pool.launch_template(
|
|
144
|
+
# requester, nil, get_next_sub_id, template, workitem, params)
|
|
145
|
+
|
|
146
|
+
sub_fei = get_expression_pool.launch_subprocess(
|
|
147
|
+
self, template, forget, workitem, params)
|
|
148
|
+
|
|
149
|
+
if forget
|
|
150
|
+
reply_to_parent workitem.dup
|
|
151
|
+
else
|
|
152
|
+
@subprocess_fei = sub_fei.dup
|
|
153
|
+
store_itself # to keep track of @subprocess_fei
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
#
|
|
158
|
+
# Takes care of cancelling the subprocess as well if any
|
|
159
|
+
#
|
|
160
|
+
def cancel
|
|
161
|
+
|
|
162
|
+
return nil unless @subprocess_fei
|
|
163
|
+
get_expression_pool.cancel @subprocess_fei
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
end
|
|
168
|
+
|