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,172 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
module OpenWFE
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# ExpressionPool methods available via the engine.
|
|
44
|
+
#
|
|
45
|
+
module ExpoolMethods
|
|
46
|
+
|
|
47
|
+
#--
|
|
48
|
+
# METHODS FROM THE EXPRESSION POOL
|
|
49
|
+
#
|
|
50
|
+
# These methods are 'proxy' to method found in the expression pool.
|
|
51
|
+
# They are made available here for a simpler model.
|
|
52
|
+
#++
|
|
53
|
+
|
|
54
|
+
#
|
|
55
|
+
# Returns the list of applied expressions belonging to a given
|
|
56
|
+
# workflow instance.
|
|
57
|
+
# May be used to determine where a process instance currently is.
|
|
58
|
+
#
|
|
59
|
+
# This method returns all the expressions (the stack) a process
|
|
60
|
+
# went through to reach its current state.
|
|
61
|
+
#
|
|
62
|
+
# If the unapplied optional parameter is set to true, all the
|
|
63
|
+
# expressions (even those not yet applied) that compose the process
|
|
64
|
+
# instance will be returned.
|
|
65
|
+
#
|
|
66
|
+
def process_stack (workflow_instance_id, unapplied=false)
|
|
67
|
+
|
|
68
|
+
get_expression_pool.process_stack workflow_instance_id, unapplied
|
|
69
|
+
end
|
|
70
|
+
alias :get_process_stack :process_stack
|
|
71
|
+
alias :get_flow_stack :process_stack
|
|
72
|
+
|
|
73
|
+
#
|
|
74
|
+
# A shortcut for process_stack(wfid, true).representation
|
|
75
|
+
#
|
|
76
|
+
# Returns the representation (tree) for the actual version of the
|
|
77
|
+
# given process instance (returns the tree as running, modifications
|
|
78
|
+
# included).
|
|
79
|
+
#
|
|
80
|
+
def process_representation (workflow_instance_id)
|
|
81
|
+
|
|
82
|
+
process_stack(workflow_instance_id, true).representation
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
#
|
|
86
|
+
# Lists all workflow (process) instances currently in the expool (in
|
|
87
|
+
# the engine).
|
|
88
|
+
# This method will return a list of "process-definition" expressions
|
|
89
|
+
# (i.e. OpenWFE::DefineExpression objects -- each representing the root
|
|
90
|
+
# element of a flow).
|
|
91
|
+
#
|
|
92
|
+
# :wfid ::
|
|
93
|
+
# will list only one process,
|
|
94
|
+
# <tt>:wfid => '20071208-gipijiwozo'</tt>
|
|
95
|
+
# :parent_wfid ::
|
|
96
|
+
# will list only one process, and its subprocesses,
|
|
97
|
+
# <tt>:parent_wfid => '20071208-gipijiwozo'</tt>
|
|
98
|
+
# :consider_subprocesses ::
|
|
99
|
+
# if true, "process-definition" expressions
|
|
100
|
+
# of subprocesses will be returned as well.
|
|
101
|
+
# :wfid_prefix ::
|
|
102
|
+
# allows your to query for specific workflow instance
|
|
103
|
+
# id prefixes. for example :
|
|
104
|
+
# <tt>:wfid_prefix => "200712"</tt>
|
|
105
|
+
# for the processes started in December.
|
|
106
|
+
# :wfname ::
|
|
107
|
+
# will return only the process instances who belongs to the given
|
|
108
|
+
# workflow [name].
|
|
109
|
+
# :wfrevision ::
|
|
110
|
+
# usued in conjuction with :wfname, returns only the process
|
|
111
|
+
# instances of a given workflow revision.
|
|
112
|
+
#
|
|
113
|
+
def list_processes (options={})
|
|
114
|
+
|
|
115
|
+
get_expression_pool.list_processes options
|
|
116
|
+
end
|
|
117
|
+
alias :list_workflows :list_processes
|
|
118
|
+
|
|
119
|
+
#
|
|
120
|
+
# Given any expression of a process, cancels the complete process
|
|
121
|
+
# instance.
|
|
122
|
+
#
|
|
123
|
+
def cancel_process (exp_or_wfid)
|
|
124
|
+
|
|
125
|
+
get_expression_pool.cancel_process exp_or_wfid
|
|
126
|
+
end
|
|
127
|
+
alias :cancel_flow :cancel_process
|
|
128
|
+
alias :abort_process :cancel_process
|
|
129
|
+
|
|
130
|
+
#
|
|
131
|
+
# Cancels the given expression (and its children if any)
|
|
132
|
+
# (warning : advanced method)
|
|
133
|
+
#
|
|
134
|
+
# Cancelling the root expression of a process is equivalent to
|
|
135
|
+
# cancelling the process.
|
|
136
|
+
#
|
|
137
|
+
def cancel_expression (exp_or_fei)
|
|
138
|
+
|
|
139
|
+
get_expression_pool.cancel_expression exp_or_fei
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# Forgets the given expression (make it an orphan)
|
|
144
|
+
# (warning : advanced method)
|
|
145
|
+
#
|
|
146
|
+
def forget_expression (exp_or_fei)
|
|
147
|
+
|
|
148
|
+
get_expression_pool.forget exp_or_fei
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
protected
|
|
152
|
+
|
|
153
|
+
#
|
|
154
|
+
# In case of wfid, returns the root expression of the process,
|
|
155
|
+
# in case of fei, returns the expression itself.
|
|
156
|
+
#
|
|
157
|
+
def fetch_exp (fei_or_wfid)
|
|
158
|
+
|
|
159
|
+
exp = if fei_or_wfid.is_a?(String)
|
|
160
|
+
|
|
161
|
+
get_expression_pool.fetch_root fei_or_wfid
|
|
162
|
+
|
|
163
|
+
else
|
|
164
|
+
|
|
165
|
+
get_expression_pool.fetch_expression fei_or_wfid
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
exp or raise "no expression found for '#{fei_or_wfid.to_s}'"
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-2008, Nicolas Modryzk 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
|
+
# Nicolas Modrzyk at openwfe.org
|
|
38
|
+
# John Mettraux at openwfe.org
|
|
39
|
+
#
|
|
40
|
+
|
|
41
|
+
require 'openwfe/engine/engine'
|
|
42
|
+
require 'openwfe/expool/yamlexpstorage'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
module OpenWFE
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# An engine persisted to a tree of yaml files.
|
|
49
|
+
#
|
|
50
|
+
# Remember that once you have added the participants to a persisted
|
|
51
|
+
# engine, you should call its reload method, to reschedule expressions
|
|
52
|
+
# like 'sleep', 'cron', ... But if you do it before registering the
|
|
53
|
+
# participants you'll end up with broken processes.
|
|
54
|
+
#
|
|
55
|
+
class FilePersistedEngine < Engine
|
|
56
|
+
|
|
57
|
+
protected
|
|
58
|
+
|
|
59
|
+
#
|
|
60
|
+
# Overrides the method already found in Engine with a persisted
|
|
61
|
+
# expression storage
|
|
62
|
+
#
|
|
63
|
+
def build_expression_storage ()
|
|
64
|
+
|
|
65
|
+
init_service S_EXPRESSION_STORAGE, YamlFileExpressionStorage
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
#
|
|
69
|
+
# Uses a file persisted error journal.
|
|
70
|
+
#
|
|
71
|
+
def build_error_journal ()
|
|
72
|
+
|
|
73
|
+
init_service S_ERROR_JOURNAL, YamlErrorJournal
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# An engine with a cache in front of its file persisted expression storage.
|
|
79
|
+
#
|
|
80
|
+
# Remember that once you have added the participants to a persisted
|
|
81
|
+
# engine, you should call its reload method, to reschedule expressions
|
|
82
|
+
# like 'sleep', 'cron', ... But if you do it before registering the
|
|
83
|
+
# participants you'll end up with broken processes.
|
|
84
|
+
#
|
|
85
|
+
class CachedFilePersistedEngine < FilePersistedEngine
|
|
86
|
+
|
|
87
|
+
protected
|
|
88
|
+
|
|
89
|
+
def build_expression_storage ()
|
|
90
|
+
|
|
91
|
+
@application_context[:expression_cache_size] ||= 1000
|
|
92
|
+
|
|
93
|
+
init_service(
|
|
94
|
+
S_EXPRESSION_STORAGE,
|
|
95
|
+
CacheExpressionStorage)
|
|
96
|
+
|
|
97
|
+
#init_service(
|
|
98
|
+
# S_EXPRESSION_STORAGE + ".1",
|
|
99
|
+
# YamlFileExpressionStorage)
|
|
100
|
+
init_service(
|
|
101
|
+
S_EXPRESSION_STORAGE + ".1",
|
|
102
|
+
ThreadedYamlFileExpressionStorage)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
module OpenWFE
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# The methods of the engine about participants (register, unregister,
|
|
44
|
+
# lookup, ...)
|
|
45
|
+
#
|
|
46
|
+
module ParticipantMethods
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# Registers a participant in this [embedded] engine.
|
|
50
|
+
# This method is a shortcut to the ParticipantMap method
|
|
51
|
+
# with the same name.
|
|
52
|
+
#
|
|
53
|
+
# engine.register_participant "user-.*", HashParticipant
|
|
54
|
+
#
|
|
55
|
+
# or
|
|
56
|
+
#
|
|
57
|
+
# engine.register_participant "user-.*" do |wi|
|
|
58
|
+
# puts "participant '#{wi.participant_name}' received a workitem"
|
|
59
|
+
# #
|
|
60
|
+
# # and did nothing with it
|
|
61
|
+
# # as a block participant implicitely returns the workitem
|
|
62
|
+
# # to the engine
|
|
63
|
+
# end
|
|
64
|
+
#
|
|
65
|
+
# Returns the participant instance.
|
|
66
|
+
#
|
|
67
|
+
# The participant parameter can be set to hash like in
|
|
68
|
+
#
|
|
69
|
+
# engine.register_participant(
|
|
70
|
+
# "alpha",
|
|
71
|
+
# { :participant => HashParticipant, :position => :first })
|
|
72
|
+
#
|
|
73
|
+
# or
|
|
74
|
+
#
|
|
75
|
+
# engine.register_participant("alpha", :position => :first) do
|
|
76
|
+
# puts "first !"
|
|
77
|
+
# end
|
|
78
|
+
#
|
|
79
|
+
# There are some times where you have to position a participant first
|
|
80
|
+
# (especially with the regex technique).
|
|
81
|
+
#
|
|
82
|
+
# see ParticipantMap#register_participant
|
|
83
|
+
#
|
|
84
|
+
def register_participant (regex, participant=nil, &block)
|
|
85
|
+
|
|
86
|
+
#get_participant_map.register_participant(
|
|
87
|
+
# regex, participant, &block)
|
|
88
|
+
|
|
89
|
+
params = if participant.class == Hash
|
|
90
|
+
participant
|
|
91
|
+
else
|
|
92
|
+
{ :participant => participant }
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
get_participant_map.register_participant regex, params, &block
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
#
|
|
99
|
+
# Given a participant name, returns the participant in charge
|
|
100
|
+
# of handling workitems for that name.
|
|
101
|
+
# May be useful in some embedded contexts.
|
|
102
|
+
#
|
|
103
|
+
def get_participant (participant_name)
|
|
104
|
+
|
|
105
|
+
get_participant_map.lookup_participant participant_name
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# Removes the first participant matching the given name from the
|
|
110
|
+
# participant map kept by the engine.
|
|
111
|
+
#
|
|
112
|
+
# If 'participant_name' is an integer, will remove the participant
|
|
113
|
+
# at that position in the participant list.
|
|
114
|
+
#
|
|
115
|
+
def unregister_participant (participant_name)
|
|
116
|
+
|
|
117
|
+
get_participant_map.unregister_participant participant_name
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
#
|
|
121
|
+
# Returns the list of participants registered in the engine.
|
|
122
|
+
# In the resolution order.
|
|
123
|
+
#
|
|
124
|
+
# Returns a list of [ regex, participant ] pairs.
|
|
125
|
+
#
|
|
126
|
+
def list_participants
|
|
127
|
+
|
|
128
|
+
get_participant_map.participants
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
end
|
|
133
|
+
|
|
@@ -0,0 +1,353 @@
|
|
|
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
|
+
module OpenWFE
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# ProcessStatus represents information about the status of a workflow
|
|
44
|
+
# process instance.
|
|
45
|
+
#
|
|
46
|
+
# The status is mainly a list of expressions and a hash of errors.
|
|
47
|
+
#
|
|
48
|
+
# Instances of this class are obtained via Engine.process_status().
|
|
49
|
+
#
|
|
50
|
+
class ProcessStatus
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# the String workflow instance id of the Process.
|
|
54
|
+
#
|
|
55
|
+
attr_reader :wfid
|
|
56
|
+
|
|
57
|
+
#
|
|
58
|
+
# The list of the expressions currently active in the process instance.
|
|
59
|
+
#
|
|
60
|
+
# For instance, if your process definition is currently in a
|
|
61
|
+
# concurrence, more than one expressions may be listed here.
|
|
62
|
+
#
|
|
63
|
+
attr_reader :expressions
|
|
64
|
+
|
|
65
|
+
#
|
|
66
|
+
# A hash whose values are ProcessError instances, the keys
|
|
67
|
+
# are FlowExpressionId instances (fei) (identifying the expressions
|
|
68
|
+
# that are concerned with the error)
|
|
69
|
+
#
|
|
70
|
+
attr_reader :errors
|
|
71
|
+
|
|
72
|
+
#
|
|
73
|
+
# The time at which the process got launched.
|
|
74
|
+
#
|
|
75
|
+
attr_reader :launch_time
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# The variables hash as set in the process environment (the process
|
|
79
|
+
# scope).
|
|
80
|
+
#
|
|
81
|
+
attr_reader :variables
|
|
82
|
+
|
|
83
|
+
#
|
|
84
|
+
# Is the process currently in pause ?
|
|
85
|
+
#
|
|
86
|
+
attr_accessor :paused
|
|
87
|
+
|
|
88
|
+
#
|
|
89
|
+
# Builds an empty ProcessStatus instance.
|
|
90
|
+
#
|
|
91
|
+
def initialize
|
|
92
|
+
|
|
93
|
+
@wfid = nil
|
|
94
|
+
@expressions = []
|
|
95
|
+
@errors = {}
|
|
96
|
+
@launch_time = nil
|
|
97
|
+
@variables = nil
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
#
|
|
101
|
+
# Returns the workflow definition name for this process.
|
|
102
|
+
#
|
|
103
|
+
def wfname
|
|
104
|
+
|
|
105
|
+
@expressions.first.fei.wfname
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
alias :workflow_definition_name :wfname
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# Returns the workflow definition revision for this process.
|
|
112
|
+
#
|
|
113
|
+
def wfrevision
|
|
114
|
+
|
|
115
|
+
@expressions.first.fei.wfrevision
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
alias :workflow_definition_revision :wfrevision
|
|
119
|
+
|
|
120
|
+
#
|
|
121
|
+
# Returns the count of concurrent branches currently active for
|
|
122
|
+
# this process. The typical 'sequential only' process will
|
|
123
|
+
# have a return value of 1 here.
|
|
124
|
+
#
|
|
125
|
+
def branches
|
|
126
|
+
|
|
127
|
+
@expressions.size
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
#
|
|
131
|
+
# Returns the tags currently set in this process.
|
|
132
|
+
#
|
|
133
|
+
def tags
|
|
134
|
+
|
|
135
|
+
return [] unless @variables
|
|
136
|
+
|
|
137
|
+
@variables.keys.select do |k|
|
|
138
|
+
@variables[k].is_a?(OpenWFE::RawExpression::Tag)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
#
|
|
143
|
+
# Returns true if the process is in pause.
|
|
144
|
+
#
|
|
145
|
+
def paused?
|
|
146
|
+
|
|
147
|
+
#@expressions.first.paused?
|
|
148
|
+
@paused
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
#
|
|
152
|
+
# this method is used by Engine.get_process_status() when
|
|
153
|
+
# it prepares its results.
|
|
154
|
+
#
|
|
155
|
+
def << (item)
|
|
156
|
+
|
|
157
|
+
if item.kind_of?(FlowExpression)
|
|
158
|
+
add_expression item
|
|
159
|
+
else
|
|
160
|
+
add_error item
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
#
|
|
165
|
+
# A String representation, handy for debugging, quick viewing.
|
|
166
|
+
#
|
|
167
|
+
def to_s
|
|
168
|
+
|
|
169
|
+
s = []
|
|
170
|
+
|
|
171
|
+
s << "-- #{self.class.name} --"
|
|
172
|
+
s << " wfid : #{@wfid}"
|
|
173
|
+
s << " launch_time : #{launch_time}"
|
|
174
|
+
s << " tags : #{tags.join(", ")}"
|
|
175
|
+
s << " errors : #{@errors.size}"
|
|
176
|
+
s << " paused : #{paused?}"
|
|
177
|
+
|
|
178
|
+
s << " expressions :"
|
|
179
|
+
@expressions.each do |fexp|
|
|
180
|
+
s << " #{fexp.fei.to_s}"
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
s.join "\n"
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
protected
|
|
187
|
+
|
|
188
|
+
def add_expression (fexp)
|
|
189
|
+
|
|
190
|
+
if fexp.is_a?(Environment)
|
|
191
|
+
@variables = fexp.variables if fexp.fei.expid == "0"
|
|
192
|
+
return
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
@wfid ||= fexp.fei.parent_wfid
|
|
196
|
+
|
|
197
|
+
@launch_time = fexp.apply_time if fexp.fei.expid == '0'
|
|
198
|
+
|
|
199
|
+
exps = @expressions
|
|
200
|
+
@expressions = []
|
|
201
|
+
|
|
202
|
+
added = false
|
|
203
|
+
@expressions = exps.collect do |fe|
|
|
204
|
+
if added or fe.fei.wfid != fexp.fei.wfid
|
|
205
|
+
fe
|
|
206
|
+
else
|
|
207
|
+
if OpenWFE::starts_with(fexp.fei.expid, fe.fei.expid)
|
|
208
|
+
added = true
|
|
209
|
+
fexp
|
|
210
|
+
elsif OpenWFE::starts_with(fe.fei.expid, fexp.fei.expid)
|
|
211
|
+
added = true
|
|
212
|
+
fe
|
|
213
|
+
else
|
|
214
|
+
fe
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
@expressions << fexp unless added
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def add_error (error)
|
|
222
|
+
|
|
223
|
+
@errors[error.fei] = error
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
#
|
|
228
|
+
# Renders a nice, terminal oriented, representation of an
|
|
229
|
+
# Engine.get_process_status() result.
|
|
230
|
+
#
|
|
231
|
+
# You usually directly benefit from this when doing
|
|
232
|
+
#
|
|
233
|
+
# puts engine.get_process_status.to_s
|
|
234
|
+
#
|
|
235
|
+
def OpenWFE.pretty_print_process_status (ps)
|
|
236
|
+
|
|
237
|
+
# TODO : include launch_time and why is process_id so long ?
|
|
238
|
+
|
|
239
|
+
s = ""
|
|
240
|
+
s << "process_id | name | rev | brn | err | paused? \n"
|
|
241
|
+
s << "--------------------+-------------------+---------+-----+-----+---------\n"
|
|
242
|
+
|
|
243
|
+
ps.keys.sort.each do |wfid|
|
|
244
|
+
|
|
245
|
+
status = ps[wfid]
|
|
246
|
+
fexp = status.expressions.first
|
|
247
|
+
ffei = fexp.fei
|
|
248
|
+
|
|
249
|
+
s << "%-19s" % wfid[0, 19]
|
|
250
|
+
s << " | "
|
|
251
|
+
s << "%-17s" % ffei.workflow_definition_name[0, 17]
|
|
252
|
+
s << " | "
|
|
253
|
+
s << "%-7s" % ffei.workflow_definition_revision[0, 7]
|
|
254
|
+
s << " | "
|
|
255
|
+
s << "%3s" % status.expressions.size.to_s[0, 3]
|
|
256
|
+
s << " | "
|
|
257
|
+
s << "%3s" % status.errors.size.to_s[0, 3]
|
|
258
|
+
s << " | "
|
|
259
|
+
s << "%5s" % status.paused?.to_s
|
|
260
|
+
s << "\n"
|
|
261
|
+
end
|
|
262
|
+
s
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
#
|
|
266
|
+
# This mixin is only included by the Engine class. It contains all
|
|
267
|
+
# the methods about ProcessStatus.
|
|
268
|
+
#
|
|
269
|
+
module StatusMethods
|
|
270
|
+
|
|
271
|
+
#
|
|
272
|
+
# Returns a hash of ProcessStatus instances. The keys of the hash
|
|
273
|
+
# are workflow instance ids.
|
|
274
|
+
#
|
|
275
|
+
# A ProcessStatus is a description of the state of a process instance.
|
|
276
|
+
# It enumerates the expressions where the process is currently
|
|
277
|
+
# located (waiting certainly) and the errors the process currently
|
|
278
|
+
# has (hopefully none).
|
|
279
|
+
#
|
|
280
|
+
def process_statuses (options={})
|
|
281
|
+
|
|
282
|
+
options = { :wfid_prefix => options } if options.is_a?(String)
|
|
283
|
+
|
|
284
|
+
result = {}
|
|
285
|
+
|
|
286
|
+
expressions = get_expression_storage.find_expressions options
|
|
287
|
+
|
|
288
|
+
expressions.each do |fexp|
|
|
289
|
+
|
|
290
|
+
next unless (fexp.apply_time or fexp.is_a?(Environment))
|
|
291
|
+
|
|
292
|
+
next if fexp.fei.wfid == "0" # skip the engine env
|
|
293
|
+
|
|
294
|
+
#(result[fexp.fei.parent_wfid] ||= ProcessStatus.new) << fexp
|
|
295
|
+
|
|
296
|
+
parent_wfid = fexp.fei.parent_wfid
|
|
297
|
+
|
|
298
|
+
ps = result[parent_wfid]
|
|
299
|
+
|
|
300
|
+
if not ps
|
|
301
|
+
|
|
302
|
+
ps = ProcessStatus.new
|
|
303
|
+
|
|
304
|
+
ps.paused =
|
|
305
|
+
(get_expool.paused_instances[parent_wfid] != nil)
|
|
306
|
+
|
|
307
|
+
result[parent_wfid] = ps
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
ps << fexp
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
result.values.each do |ps|
|
|
314
|
+
get_error_journal.get_error_log(ps.wfid).each do |error|
|
|
315
|
+
ps << error
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
class << result
|
|
320
|
+
def to_s
|
|
321
|
+
OpenWFE::pretty_print_process_status(self)
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
result
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
#
|
|
329
|
+
# list_process_status() will be deprecated at release 1.0.0
|
|
330
|
+
#
|
|
331
|
+
alias :list_process_status :process_statuses
|
|
332
|
+
|
|
333
|
+
#
|
|
334
|
+
# Returns the process status of one given process instance.
|
|
335
|
+
#
|
|
336
|
+
def process_status (wfid)
|
|
337
|
+
|
|
338
|
+
wfid = extract_wfid wfid, true
|
|
339
|
+
|
|
340
|
+
process_statuses(:wfid => wfid).values[0]
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
#
|
|
344
|
+
# Returns true if the process is in pause.
|
|
345
|
+
#
|
|
346
|
+
def is_paused? (wfid)
|
|
347
|
+
|
|
348
|
+
(get_expression_pool.paused_instances[wfid] != nil)
|
|
349
|
+
end
|
|
350
|
+
end
|
|
351
|
+
|
|
352
|
+
end
|
|
353
|
+
|