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,37 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2005-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
|
+
module OpenWFE
|
|
35
|
+
|
|
36
|
+
OPENWFERU_VERSION = '0.9.18'
|
|
37
|
+
end
|
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2005-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
|
+
# "hecho en Costa Rica"
|
|
36
|
+
# and "made in Japan"
|
|
37
|
+
#
|
|
38
|
+
# john.mettraux@openwfe.org
|
|
39
|
+
#
|
|
40
|
+
|
|
41
|
+
require 'openwfe/utils'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module OpenWFE
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# The convention for the result of some expressions is to store
|
|
48
|
+
# their result in a workitem field named "__result__".
|
|
49
|
+
#
|
|
50
|
+
FIELD_RESULT = "__result__"
|
|
51
|
+
|
|
52
|
+
#--
|
|
53
|
+
# WORKITEMS
|
|
54
|
+
#++
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# The base class for all the workitems.
|
|
58
|
+
#
|
|
59
|
+
class WorkItem
|
|
60
|
+
|
|
61
|
+
attr_accessor :last_modified, :attributes
|
|
62
|
+
|
|
63
|
+
def initialize
|
|
64
|
+
@last_modified = nil
|
|
65
|
+
@attributes = {}
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
alias :fields :attributes
|
|
69
|
+
alias :fields= :attributes=
|
|
70
|
+
|
|
71
|
+
#
|
|
72
|
+
# Sets the last_modified field to now
|
|
73
|
+
#
|
|
74
|
+
def touch
|
|
75
|
+
|
|
76
|
+
@last_modified = Time.now
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def to_h
|
|
80
|
+
|
|
81
|
+
h = {}
|
|
82
|
+
h[:type] = self.class.name
|
|
83
|
+
h[:last_modified] = @last_modified
|
|
84
|
+
h[:attributes] = @attributes
|
|
85
|
+
h
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def self.from_h (h)
|
|
89
|
+
|
|
90
|
+
#wi = eval("#{h[:type]}.new")
|
|
91
|
+
wi = OpenWFE.get_class(h).new
|
|
92
|
+
wi.last_modified = h[:last_modified]
|
|
93
|
+
wi.attributes = h[:attributes]
|
|
94
|
+
wi
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
#
|
|
98
|
+
# A shortcut for
|
|
99
|
+
#
|
|
100
|
+
# workitem.attributes['key']
|
|
101
|
+
#
|
|
102
|
+
# is
|
|
103
|
+
#
|
|
104
|
+
# workitem['key']
|
|
105
|
+
#
|
|
106
|
+
# (Note that
|
|
107
|
+
#
|
|
108
|
+
# workitem.key
|
|
109
|
+
#
|
|
110
|
+
# will raise an exception if there is no attribute key).
|
|
111
|
+
#
|
|
112
|
+
def [] (key)
|
|
113
|
+
|
|
114
|
+
@attributes[key]
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
#
|
|
118
|
+
# A shortcut for
|
|
119
|
+
#
|
|
120
|
+
# workitem.attributes['key'] = value
|
|
121
|
+
#
|
|
122
|
+
# is
|
|
123
|
+
#
|
|
124
|
+
# workitem['key'] = value
|
|
125
|
+
#
|
|
126
|
+
def []= (key, value)
|
|
127
|
+
|
|
128
|
+
@attributes[key] = value
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# In order to simplify code like :
|
|
133
|
+
#
|
|
134
|
+
# value = workitem.attributes['xyz']
|
|
135
|
+
#
|
|
136
|
+
# to
|
|
137
|
+
#
|
|
138
|
+
# value = workitem.xyz
|
|
139
|
+
#
|
|
140
|
+
# or
|
|
141
|
+
#
|
|
142
|
+
# value = workitem['xyz']
|
|
143
|
+
#
|
|
144
|
+
# we overrode method_missing.
|
|
145
|
+
#
|
|
146
|
+
# workitem.xyz = "my new value"
|
|
147
|
+
#
|
|
148
|
+
# is also possible
|
|
149
|
+
#
|
|
150
|
+
def method_missing (m, *args)
|
|
151
|
+
|
|
152
|
+
methodname = m.to_s
|
|
153
|
+
|
|
154
|
+
if args.length == 0
|
|
155
|
+
value = @attributes[methodname]
|
|
156
|
+
return value if value
|
|
157
|
+
raise "Missing attribute '#{methodname}' in workitem"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
#if methodname == "[]" and args.length == 1
|
|
161
|
+
# value = @attributes[args[0]]
|
|
162
|
+
# return value if value
|
|
163
|
+
# raise "Missing attribute '#{methodname}' in workitem"
|
|
164
|
+
#end
|
|
165
|
+
#if methodname == "[]=" and args.length == 2
|
|
166
|
+
# return @attributes[args[0]] = args[1]
|
|
167
|
+
#end
|
|
168
|
+
|
|
169
|
+
if args.length == 1 and methodname[-1, 1] == "="
|
|
170
|
+
return @attributes[methodname[0..-2]] = args[0]
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
super(m, args)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
#
|
|
177
|
+
# Produces a deep copy of the workitem
|
|
178
|
+
#
|
|
179
|
+
def dup
|
|
180
|
+
OpenWFE::fulldup(self)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
#
|
|
184
|
+
# A smarter alternative to
|
|
185
|
+
#
|
|
186
|
+
# value = workitem.attributes[x]
|
|
187
|
+
#
|
|
188
|
+
# Via this method, nested values can be reached. For example :
|
|
189
|
+
#
|
|
190
|
+
# wi = InFlowWorkItem.new()
|
|
191
|
+
# wi.attributes = {
|
|
192
|
+
# "field0" => "value0",
|
|
193
|
+
# "field1" => [ 0, 1, 2, 3, [ "a", "b", "c" ]],
|
|
194
|
+
# "field2" => {
|
|
195
|
+
# "a" => "AA",
|
|
196
|
+
# "b" => "BB",
|
|
197
|
+
# "c" => [ "C0", "C1", "C3" ]
|
|
198
|
+
# },
|
|
199
|
+
# "field3" => 3,
|
|
200
|
+
# "field99" => nil
|
|
201
|
+
# }
|
|
202
|
+
#
|
|
203
|
+
# will verify the following assertions :
|
|
204
|
+
#
|
|
205
|
+
# assert wi.lookup_attribute("field3") == 3
|
|
206
|
+
# assert wi.lookup_attribute("field1.1") == 1
|
|
207
|
+
# assert wi.lookup_attribute("field1.4.1") == "b"
|
|
208
|
+
# assert wi.lookup_attribute("field2.c.1") == "C1"
|
|
209
|
+
#
|
|
210
|
+
def lookup_attribute (key)
|
|
211
|
+
OpenWFE.lookup_attribute(@attributes, key)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
#
|
|
215
|
+
# The partner to the lookup_attribute() method. Behaves like it.
|
|
216
|
+
#
|
|
217
|
+
def has_attribute? (key)
|
|
218
|
+
OpenWFE.has_attribute?(@attributes, key)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
#
|
|
222
|
+
# set_attribute() accomodates itself with nested key constructs.
|
|
223
|
+
#
|
|
224
|
+
def set_attribute (key, value)
|
|
225
|
+
OpenWFE.set_attribute(@attributes, key, value)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
#
|
|
229
|
+
# unset_attribute() accomodates itself with nested key constructs.
|
|
230
|
+
#
|
|
231
|
+
def unset_attribute (key)
|
|
232
|
+
OpenWFE.unset_attribute(@attributes, key)
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
alias :lookup_field :lookup_attribute
|
|
236
|
+
alias :has_field? :has_attribute?
|
|
237
|
+
alias :set_field :set_attribute
|
|
238
|
+
alias :unset_field :unset_attribute
|
|
239
|
+
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
#
|
|
243
|
+
# The common parent class for InFlowWorkItem and CancelItem.
|
|
244
|
+
#
|
|
245
|
+
class InFlowItem < WorkItem
|
|
246
|
+
|
|
247
|
+
attr_accessor :flow_expression_id, :participant_name
|
|
248
|
+
|
|
249
|
+
def last_expression_id
|
|
250
|
+
@flow_expression_id
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def last_expression_id= (fei)
|
|
254
|
+
@flow_expression_id = fei
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
#
|
|
258
|
+
# Just a handy alias for flow_expression_id
|
|
259
|
+
#
|
|
260
|
+
alias :fei :flow_expression_id
|
|
261
|
+
alias :fei= :flow_expression_id=
|
|
262
|
+
|
|
263
|
+
def to_h
|
|
264
|
+
h = super
|
|
265
|
+
h[:flow_expression_id] = @flow_expression_id.to_h
|
|
266
|
+
h[:participant_name] = @participant_name
|
|
267
|
+
h
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
def InFlowItem.from_h (h)
|
|
271
|
+
wi = super
|
|
272
|
+
wi.flow_expression_id = FlowExpressionId.from_h(h[:flow_expression_id])
|
|
273
|
+
wi.participant_name = h[:participant_name]
|
|
274
|
+
wi
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
#
|
|
279
|
+
# When the term 'workitem' is used it's generally referring to instances
|
|
280
|
+
# of this InFlowWorkItem class.
|
|
281
|
+
# InFlowWorkItem are circulating within process instances and carrying
|
|
282
|
+
# data around. Their 'payload' is located in their attribute Hash field.
|
|
283
|
+
#
|
|
284
|
+
class InFlowWorkItem < InFlowItem
|
|
285
|
+
|
|
286
|
+
attr_accessor :dispatch_time
|
|
287
|
+
attr_accessor :filter
|
|
288
|
+
|
|
289
|
+
#
|
|
290
|
+
# In OpenWFEja, workitem history was stored, OpenWFEru doesn't do
|
|
291
|
+
# it (no need to copy history over and over).
|
|
292
|
+
#
|
|
293
|
+
# (deprecated)
|
|
294
|
+
#
|
|
295
|
+
attr_accessor :history
|
|
296
|
+
|
|
297
|
+
attr_accessor :store
|
|
298
|
+
#
|
|
299
|
+
# special : added by the ruby lib, not given by the worklist
|
|
300
|
+
|
|
301
|
+
#
|
|
302
|
+
# Outputting the workitem in a human readable format
|
|
303
|
+
#
|
|
304
|
+
def to_s
|
|
305
|
+
|
|
306
|
+
s = ""
|
|
307
|
+
s << " #{self.class} :\n"
|
|
308
|
+
s << " - flow_expression_id : #{@flow_expression_id}\n"
|
|
309
|
+
s << " - participant_name : #{@participant_name}\n"
|
|
310
|
+
s << " - last_modified : #{@last_modified}\n"
|
|
311
|
+
s << " - dispatch_time : #{@dispatch_time}\n"
|
|
312
|
+
s << " - attributes :\n"
|
|
313
|
+
|
|
314
|
+
s << " {\n"
|
|
315
|
+
@attributes.keys.sort.each do |k|
|
|
316
|
+
v = @attributes[k]
|
|
317
|
+
s << " #{k.inspect} => #{v.inspect},\n"
|
|
318
|
+
end
|
|
319
|
+
s << " }"
|
|
320
|
+
s
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
#
|
|
324
|
+
# For some easy YAML encoding, turns the workitem into a Hash
|
|
325
|
+
# (Any YAML-enabled platform can thus read it).
|
|
326
|
+
#
|
|
327
|
+
def to_h
|
|
328
|
+
|
|
329
|
+
h = super
|
|
330
|
+
h[:dispatch_time] = @dispatch_time
|
|
331
|
+
#h[:history] = @history
|
|
332
|
+
h[:filter] = @filter
|
|
333
|
+
h
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
#
|
|
337
|
+
# Rebuilds an InFlowWorkItem from its hash version.
|
|
338
|
+
#
|
|
339
|
+
def InFlowWorkItem.from_h (h)
|
|
340
|
+
|
|
341
|
+
wi = super
|
|
342
|
+
wi.dispatch_time = h[:dispatch_time]
|
|
343
|
+
#wi.history = h[:history]
|
|
344
|
+
wi.filter = h[:filter]
|
|
345
|
+
wi
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
#
|
|
349
|
+
# Sets the '__result__' field of this workitem
|
|
350
|
+
#
|
|
351
|
+
def set_result (result)
|
|
352
|
+
|
|
353
|
+
@attributes[FIELD_RESULT] = result
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
#
|
|
357
|
+
# Makes sure the '__result__' field of this workitem is empty.
|
|
358
|
+
#
|
|
359
|
+
def unset_result
|
|
360
|
+
|
|
361
|
+
@attributes.delete FIELD_RESULT
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
#
|
|
365
|
+
# Just a shortcut (for consistency) of
|
|
366
|
+
#
|
|
367
|
+
# workitem.attributes["__result__"]
|
|
368
|
+
#
|
|
369
|
+
def get_result
|
|
370
|
+
|
|
371
|
+
@attributes[FIELD_RESULT]
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
#
|
|
375
|
+
# Returns true or false.
|
|
376
|
+
#
|
|
377
|
+
def get_boolean_result
|
|
378
|
+
|
|
379
|
+
r = get_result
|
|
380
|
+
return false unless r
|
|
381
|
+
(r == true or r == "true")
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
#
|
|
386
|
+
# When it needs to cancel a branch of a process instance, the engine
|
|
387
|
+
# emits a CancelItem towards it.
|
|
388
|
+
# It's especially important for participants to react correctly upon
|
|
389
|
+
# receiving a cancel item.
|
|
390
|
+
#
|
|
391
|
+
class CancelItem < InFlowItem
|
|
392
|
+
|
|
393
|
+
def initialize (workitem)
|
|
394
|
+
|
|
395
|
+
super()
|
|
396
|
+
@flow_expression_id = workitem.fei.dup
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
400
|
+
#
|
|
401
|
+
# LaunchItem instances are used to instantiate and launch processes.
|
|
402
|
+
# They contain attributes that are used as the initial payload of the
|
|
403
|
+
# workitem circulating in the process instances.
|
|
404
|
+
#
|
|
405
|
+
class LaunchItem < WorkItem
|
|
406
|
+
|
|
407
|
+
DEF = "__definition"
|
|
408
|
+
FIELD_DEF = "field:#{DEF}"
|
|
409
|
+
|
|
410
|
+
attr_accessor :workflow_definition_url
|
|
411
|
+
#, :description_map
|
|
412
|
+
|
|
413
|
+
alias :wfdurl :workflow_definition_url
|
|
414
|
+
alias :wfdurl= :workflow_definition_url=
|
|
415
|
+
|
|
416
|
+
#
|
|
417
|
+
# This constructor will build an empty LaunchItem.
|
|
418
|
+
#
|
|
419
|
+
# If the optional parameter process_definition is set, the
|
|
420
|
+
# definition will be embedded in the launchitem attributes
|
|
421
|
+
# for retrieval by the engine.
|
|
422
|
+
#
|
|
423
|
+
# There are several ways to specify the process definition.
|
|
424
|
+
# Here are some examples:
|
|
425
|
+
#
|
|
426
|
+
# # Use a Ruby class that extends OpenWFE::ProcessDefinition
|
|
427
|
+
# LaunchItem.new(MyProcessDefinition)
|
|
428
|
+
#
|
|
429
|
+
# # Provide an XML process definition as a string
|
|
430
|
+
# definition = """
|
|
431
|
+
# <process-definition name="x" revision="y">
|
|
432
|
+
# <sequence>
|
|
433
|
+
# <participant ref="alpha" />
|
|
434
|
+
# <participant ref="bravo" />
|
|
435
|
+
# </sequence>
|
|
436
|
+
# </process-definition>
|
|
437
|
+
# """.strip
|
|
438
|
+
# LaunchItem.new(definition)
|
|
439
|
+
#
|
|
440
|
+
# # Load an XML process definition from a local file
|
|
441
|
+
# require 'uri'
|
|
442
|
+
# LaunchItem.new(URI.parse("file:///tmp/my_process_definition.xml"))
|
|
443
|
+
#
|
|
444
|
+
# # If you initialized your engine with
|
|
445
|
+
# # {:remote_definitions_allowed => true}, then you can also load an
|
|
446
|
+
# # XML process definition from a remote url
|
|
447
|
+
# require 'uri'
|
|
448
|
+
# LaunchItem.new(URI.parse("http://foo.bar/my_process_definition.xml"))
|
|
449
|
+
#
|
|
450
|
+
def initialize (process_definition=nil)
|
|
451
|
+
|
|
452
|
+
super()
|
|
453
|
+
|
|
454
|
+
if process_definition
|
|
455
|
+
@workflow_definition_url = FIELD_DEF
|
|
456
|
+
@attributes[DEF] = process_definition
|
|
457
|
+
end
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
#
|
|
461
|
+
# Turns the LaunchItem instance into a simple 'hash' (easily
|
|
462
|
+
# serializable to other formats).
|
|
463
|
+
#
|
|
464
|
+
def to_h
|
|
465
|
+
|
|
466
|
+
h = super
|
|
467
|
+
h[:workflow_definition_url] = @workflow_definition_url
|
|
468
|
+
h
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
def self.from_h (h)
|
|
472
|
+
|
|
473
|
+
li = super
|
|
474
|
+
li.workflow_definition_url = h[:workflow_definition_url]
|
|
475
|
+
li
|
|
476
|
+
end
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
#
|
|
480
|
+
# Turns a hash into its corresponding workitem (InFlowWorkItem, CancelItem,
|
|
481
|
+
# LaunchItem).
|
|
482
|
+
#
|
|
483
|
+
def OpenWFE.workitem_from_h (h)
|
|
484
|
+
|
|
485
|
+
#wi_class = eval(h[:type])
|
|
486
|
+
wi_class = get_class(h)
|
|
487
|
+
wi_class.from_h(h)
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
def OpenWFE.get_class (h)
|
|
491
|
+
|
|
492
|
+
cl = h[:type]
|
|
493
|
+
return nil if cl.index(";")
|
|
494
|
+
return nil if cl.index(" ")
|
|
495
|
+
eval(cl)
|
|
496
|
+
end
|
|
497
|
+
|
|
498
|
+
end
|
|
499
|
+
|