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,274 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2007-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
require 'openwfe/workitem'
|
|
41
|
+
require 'openwfe/expressions/merge'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# save and restore
|
|
46
|
+
#
|
|
47
|
+
|
|
48
|
+
module OpenWFE
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# Saves a copy of the current workitem to a variable or saves the
|
|
52
|
+
# attributes of the current workitem into a field (of that current
|
|
53
|
+
# workitem).
|
|
54
|
+
#
|
|
55
|
+
# save :to_variable => "/wix"
|
|
56
|
+
# #
|
|
57
|
+
# # saves a copy of the current workitem to the process
|
|
58
|
+
# # level variable "wix"
|
|
59
|
+
#
|
|
60
|
+
# save :to_field => "old_version"
|
|
61
|
+
# #
|
|
62
|
+
# # saves a copy of the current workitem attributes in the
|
|
63
|
+
# # field 'old_version' of that current workitem.
|
|
64
|
+
#
|
|
65
|
+
# 'save' is often used in conjuntion with 'restore'
|
|
66
|
+
# (RestoreWorkItemExpression).
|
|
67
|
+
#
|
|
68
|
+
class SaveWorkItemExpression < FlowExpression
|
|
69
|
+
|
|
70
|
+
names :save
|
|
71
|
+
|
|
72
|
+
def apply (workitem)
|
|
73
|
+
|
|
74
|
+
field = lookup_string_attribute :to_field, workitem
|
|
75
|
+
variable = lookup_string_attribute :to_variable, workitem
|
|
76
|
+
|
|
77
|
+
wi = workitem.dup
|
|
78
|
+
|
|
79
|
+
if field
|
|
80
|
+
|
|
81
|
+
workitem.set_attribute field, wi.attributes
|
|
82
|
+
|
|
83
|
+
elsif variable
|
|
84
|
+
|
|
85
|
+
set_variable variable, wi
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# else, simply don't save
|
|
89
|
+
|
|
90
|
+
reply_to_parent workitem
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
#
|
|
95
|
+
# "restore" is often used in conjunction with "save"
|
|
96
|
+
# (SaveWorkItemExpression).
|
|
97
|
+
#
|
|
98
|
+
# It can restore a workitem saved to a variable (it will actually
|
|
99
|
+
# restore the payload of that workitem) or transfer the content of a field
|
|
100
|
+
# as top attribute field.
|
|
101
|
+
#
|
|
102
|
+
# restore :from_variable => "freezed_workitem"
|
|
103
|
+
# #
|
|
104
|
+
# # takes the freezed payload at 'freezed_workitem' and makes it
|
|
105
|
+
# # the payload of the current workitem
|
|
106
|
+
#
|
|
107
|
+
# restore :from_field => "some_data"
|
|
108
|
+
# #
|
|
109
|
+
# # replaces the payload of the current workitem with the hash
|
|
110
|
+
# # found in the field "some_data"
|
|
111
|
+
#
|
|
112
|
+
# restore :from_variable => "v", :to_field => "f"
|
|
113
|
+
# #
|
|
114
|
+
# # will copy the payload saved under variable "v" as the value
|
|
115
|
+
# # of the field "f"
|
|
116
|
+
#
|
|
117
|
+
# restore :from_variable => "v", :merge_lead => :current
|
|
118
|
+
# #
|
|
119
|
+
# # will restore the payload of the workitem saved under v
|
|
120
|
+
# # but if fields of v are already present in the current workitem
|
|
121
|
+
# # the current values will be kept
|
|
122
|
+
#
|
|
123
|
+
# restore :from_variable => "v", :merge_lead => :restored
|
|
124
|
+
# #
|
|
125
|
+
# # will restore the payload of the workitem saved under v
|
|
126
|
+
# # but the workitem v payload will have priority.
|
|
127
|
+
#
|
|
128
|
+
# Beware : you should not restore from a field that is not a hash. The
|
|
129
|
+
# top level attributes (payload) of a workitem should always be a hash.
|
|
130
|
+
#
|
|
131
|
+
# Since OpenWFEru 0.9.17, the 'set-fields' alias can be used for restore.
|
|
132
|
+
#
|
|
133
|
+
# sequence do
|
|
134
|
+
# set_fields :value => {
|
|
135
|
+
# "customer" => { "name" => "Zigue", "age" => 34 },
|
|
136
|
+
# "approved" => false }
|
|
137
|
+
# _print "${f:customer.name} (${f:customer.age}) ${f:approved}"
|
|
138
|
+
# end
|
|
139
|
+
#
|
|
140
|
+
# Along with this new alias, the expression now behave much like the 'set'
|
|
141
|
+
# expression, but still, targets the whole workitem payload.
|
|
142
|
+
#
|
|
143
|
+
# Note that "set-fields" can be used outside of the body of a process
|
|
144
|
+
# definition (along with "set") to separate 'data preparation' from
|
|
145
|
+
# actual process definition.
|
|
146
|
+
#
|
|
147
|
+
# class Test44b6 < ProcessDefinition
|
|
148
|
+
# set_fields :value => {
|
|
149
|
+
# "customer" => { "name" => "Zigue", "age" => 34 },
|
|
150
|
+
# "approved" => false }
|
|
151
|
+
# sequence do
|
|
152
|
+
# _print "${f:customer.name} (${f:customer.age}) ${f:approved}"
|
|
153
|
+
# end
|
|
154
|
+
# end
|
|
155
|
+
#
|
|
156
|
+
# Using set_fields at the beginning of a process can be useful for setting
|
|
157
|
+
# up forms (keys without values for now).
|
|
158
|
+
#
|
|
159
|
+
# set_fields :value => {
|
|
160
|
+
# "name" => "",
|
|
161
|
+
# "address" => "",
|
|
162
|
+
# "email" => ""
|
|
163
|
+
# }
|
|
164
|
+
#
|
|
165
|
+
class RestoreWorkItemExpression < FlowExpression
|
|
166
|
+
include MergeMixin
|
|
167
|
+
include ValueMixin
|
|
168
|
+
|
|
169
|
+
names :restore, :set_fields
|
|
170
|
+
|
|
171
|
+
is_definition
|
|
172
|
+
# so that in can be placed outside of process definition bodies
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def reply (workitem)
|
|
176
|
+
|
|
177
|
+
from_field = lookup_string_attribute :from_field, workitem
|
|
178
|
+
from_variable = lookup_string_attribute :from_variable, workitem
|
|
179
|
+
|
|
180
|
+
merge_lead = lookup_sym_attribute :merge_lead, workitem
|
|
181
|
+
|
|
182
|
+
merge_lead = nil \
|
|
183
|
+
unless [ nil, :current, :restored ].include?(merge_lead)
|
|
184
|
+
|
|
185
|
+
value = workitem.attributes[FIELD_RESULT]
|
|
186
|
+
|
|
187
|
+
source = if from_field
|
|
188
|
+
|
|
189
|
+
att = workitem.lookup_attribute from_field
|
|
190
|
+
|
|
191
|
+
lwarn {
|
|
192
|
+
"apply() field '#{from_field}' is NOT a hash, " +
|
|
193
|
+
"restored anyway"
|
|
194
|
+
} unless att.kind_of?(Hash)
|
|
195
|
+
|
|
196
|
+
att
|
|
197
|
+
|
|
198
|
+
elsif from_variable
|
|
199
|
+
|
|
200
|
+
lookup_variable from_variable
|
|
201
|
+
|
|
202
|
+
elsif value
|
|
203
|
+
|
|
204
|
+
value
|
|
205
|
+
|
|
206
|
+
else
|
|
207
|
+
|
|
208
|
+
nil
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
if source
|
|
212
|
+
|
|
213
|
+
workitem = if merge_lead
|
|
214
|
+
do_merge merge_lead, workitem, source
|
|
215
|
+
else
|
|
216
|
+
do_overwrite workitem, source
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
# else, don't restore anything
|
|
220
|
+
|
|
221
|
+
reply_to_parent workitem
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
protected
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# The default case, restored values simply overwrite current
|
|
228
|
+
# values.
|
|
229
|
+
#
|
|
230
|
+
def do_overwrite (workitem, source)
|
|
231
|
+
|
|
232
|
+
return workitem unless source
|
|
233
|
+
|
|
234
|
+
attributes = if source.kind_of?(WorkItem)
|
|
235
|
+
OpenWFE::fulldup source.attributes
|
|
236
|
+
else
|
|
237
|
+
source
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
to_field = lookup_string_attribute :to_field, workitem
|
|
241
|
+
|
|
242
|
+
if to_field
|
|
243
|
+
workitem.set_attribute to_field, attributes
|
|
244
|
+
else
|
|
245
|
+
workitem.attributes = attributes
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
workitem
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
#
|
|
252
|
+
# If the attribute 'merge-lead' (or 'merge_lead') is specified,
|
|
253
|
+
# the workitems get merged.
|
|
254
|
+
#
|
|
255
|
+
def do_merge (merge_lead, workitem, source)
|
|
256
|
+
|
|
257
|
+
if source.kind_of?(Hash)
|
|
258
|
+
wi = InFlowWorkItem.new
|
|
259
|
+
wi.attributes = source
|
|
260
|
+
source = wi
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
wiTarget, wiSource = if merge_lead == :current
|
|
264
|
+
[ source, workitem ]
|
|
265
|
+
else
|
|
266
|
+
[ workitem, source ]
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
merge_workitems wiTarget, wiSource
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
end
|
|
274
|
+
|
|
@@ -0,0 +1,117 @@
|
|
|
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/expressions/flowexpression'
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
module OpenWFE
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# This expression sequentially executes each of its children expression.
|
|
47
|
+
# For a more sophisticated version of it, see the 'cursor' expression
|
|
48
|
+
# (fe_cursor.rb).
|
|
49
|
+
#
|
|
50
|
+
# <sequence>
|
|
51
|
+
# <participant ref="alice" />
|
|
52
|
+
# <participant ref="service_b" />
|
|
53
|
+
# </sequence>
|
|
54
|
+
#
|
|
55
|
+
# In a Ruby process definition, it looks like :
|
|
56
|
+
#
|
|
57
|
+
# sequence do
|
|
58
|
+
# participant "alice"
|
|
59
|
+
# participant "service_b"
|
|
60
|
+
# end
|
|
61
|
+
#
|
|
62
|
+
class SequenceExpression < FlowExpression
|
|
63
|
+
|
|
64
|
+
names :sequence
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def apply (workitem)
|
|
68
|
+
|
|
69
|
+
reply workitem
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def reply (workitem)
|
|
73
|
+
|
|
74
|
+
cfei = next_child workitem.fei
|
|
75
|
+
|
|
76
|
+
return reply_to_parent(workitem) \
|
|
77
|
+
unless cfei
|
|
78
|
+
|
|
79
|
+
#ldebug do
|
|
80
|
+
# "reply() self : \n#{self.to_s}\n" +
|
|
81
|
+
# "reply() next is #{@current_child_id} : #{cfei.to_debug_s}"
|
|
82
|
+
#end
|
|
83
|
+
|
|
84
|
+
get_expression_pool.apply cfei, workitem
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
protected
|
|
88
|
+
|
|
89
|
+
#
|
|
90
|
+
# Returns the flowExpressionId of the next child to apply, or
|
|
91
|
+
# nil if the sequence is over.
|
|
92
|
+
#
|
|
93
|
+
def next_child (current_fei)
|
|
94
|
+
|
|
95
|
+
next_id = if (current_fei == self.fei)
|
|
96
|
+
0
|
|
97
|
+
else
|
|
98
|
+
@children.index(current_fei) + 1
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
loop do
|
|
102
|
+
|
|
103
|
+
break if next_id >= @children.length
|
|
104
|
+
|
|
105
|
+
child = @children[next_id]
|
|
106
|
+
|
|
107
|
+
return child if child.is_a?(FlowExpressionId)
|
|
108
|
+
|
|
109
|
+
next_id += 1
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
nil
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
require 'openwfe/workitem'
|
|
41
|
+
require 'openwfe/flowexpressionid'
|
|
42
|
+
require 'openwfe/expressions/flowexpression'
|
|
43
|
+
require 'openwfe/expressions/value'
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
module OpenWFE
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# The 'set' expression is used to set the value of a (process) variable or
|
|
50
|
+
# a (workitem) field.
|
|
51
|
+
#
|
|
52
|
+
# <set field="price" value="CHF 12.00" />
|
|
53
|
+
# <set variable="/stage" value="3" />
|
|
54
|
+
# <set variable="/stage" field-value="f_stage" />
|
|
55
|
+
# <set field="stamp" value="${r:Time.now.to_i}" />
|
|
56
|
+
#
|
|
57
|
+
# (Notice the usage of the dollar notation in the last exemple).
|
|
58
|
+
#
|
|
59
|
+
# 'set' expressions may be placed outside of a process-definition body,
|
|
60
|
+
# they will be evaluated sequentially before the body gets applied
|
|
61
|
+
# (executed).
|
|
62
|
+
#
|
|
63
|
+
# Shorter attributes are OK :
|
|
64
|
+
#
|
|
65
|
+
# <set f="price" val="CHF 12.00" />
|
|
66
|
+
# <set v="/stage" val="3" />
|
|
67
|
+
# <set v="/stage" field-val="f_stage" />
|
|
68
|
+
# <set f="stamp" val="${r:Time.now.to_i}" />
|
|
69
|
+
#
|
|
70
|
+
# set :f => "price", :val => "USD 12.50"
|
|
71
|
+
# set :v => "toto", :val => "elvis"
|
|
72
|
+
#
|
|
73
|
+
# In case you need the value not to be evaluated if it contains
|
|
74
|
+
# dollar expressions, you can do
|
|
75
|
+
#
|
|
76
|
+
# set :v => "v0", :val => "my ${template} thing", :escape => true
|
|
77
|
+
#
|
|
78
|
+
# to prevent evaluation (i.e. to escape).
|
|
79
|
+
#
|
|
80
|
+
class SetValueExpression < FlowExpression
|
|
81
|
+
include ValueMixin
|
|
82
|
+
|
|
83
|
+
is_definition
|
|
84
|
+
|
|
85
|
+
names :set
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def reply (workitem)
|
|
89
|
+
|
|
90
|
+
vkey = lookup_variable_attribute(workitem)
|
|
91
|
+
fkey = lookup_field_attribute(workitem)
|
|
92
|
+
|
|
93
|
+
value = workitem.attributes[FIELD_RESULT]
|
|
94
|
+
|
|
95
|
+
#puts "value is '#{value}'"
|
|
96
|
+
|
|
97
|
+
if vkey
|
|
98
|
+
set_variable vkey, value
|
|
99
|
+
elsif fkey
|
|
100
|
+
workitem.set_attribute fkey, value
|
|
101
|
+
else
|
|
102
|
+
raise "'variable' or 'field' attribute missing from 'set' expression"
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
reply_to_parent(workitem)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
#
|
|
110
|
+
# 'unset' removes a field or a variable.
|
|
111
|
+
#
|
|
112
|
+
# unset :field => "price"
|
|
113
|
+
# unset :variable => "eval_result"
|
|
114
|
+
#
|
|
115
|
+
class UnsetValueExpression < FlowExpression
|
|
116
|
+
include ValueMixin
|
|
117
|
+
|
|
118
|
+
names :unset
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def apply (workitem)
|
|
122
|
+
|
|
123
|
+
vkey = lookup_variable_attribute(workitem)
|
|
124
|
+
fkey = lookup_field_attribute(workitem)
|
|
125
|
+
|
|
126
|
+
if vkey
|
|
127
|
+
delete_variable(vkey)
|
|
128
|
+
elsif fkey
|
|
129
|
+
workitem.unset_attribute fkey
|
|
130
|
+
else
|
|
131
|
+
raise "attribute 'variable' or 'field' is missing for 'unset' expression"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
reply_to_parent workitem
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
end
|
|
139
|
+
|