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,111 @@
|
|
|
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
|
+
# Triggers the first (and supposedly unique child of this expression)
|
|
47
|
+
# but never wait for its reply (lose it).
|
|
48
|
+
#
|
|
49
|
+
# A 'lose' expression never replies to its parent expression.
|
|
50
|
+
#
|
|
51
|
+
# <lose>
|
|
52
|
+
# <participant ref="toto" />
|
|
53
|
+
# </lose>
|
|
54
|
+
#
|
|
55
|
+
# Useful only some special process cases (like a concurrence
|
|
56
|
+
# expecting only a certain number of replies).
|
|
57
|
+
#
|
|
58
|
+
# The brother expressions is 'forget', but 'forget' triggers its child
|
|
59
|
+
# and immediately replies, whereas 'lose' doesn't reply.
|
|
60
|
+
#
|
|
61
|
+
class LoseExpression < FlowExpression
|
|
62
|
+
|
|
63
|
+
names :lose
|
|
64
|
+
|
|
65
|
+
def apply (workitem)
|
|
66
|
+
|
|
67
|
+
get_expression_pool.apply(children[0], workitem) \
|
|
68
|
+
if (@children and @children.length > 0)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def reply (workitem)
|
|
72
|
+
|
|
73
|
+
get_expression_pool.remove self
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# This expression triggers its child (in its own thread) and then
|
|
79
|
+
# forgets about it. It immediately replies to its parent expression.
|
|
80
|
+
#
|
|
81
|
+
# The brother expression 'lose' triggers its child but never replies to its
|
|
82
|
+
# parent expression.
|
|
83
|
+
#
|
|
84
|
+
# The 'forget' expression is useful for triggering process segments
|
|
85
|
+
# that are, well, dead ends.
|
|
86
|
+
#
|
|
87
|
+
class ForgetExpression < FlowExpression
|
|
88
|
+
|
|
89
|
+
names :forget
|
|
90
|
+
|
|
91
|
+
def apply (workitem)
|
|
92
|
+
|
|
93
|
+
if (@children and @children.length > 0)
|
|
94
|
+
|
|
95
|
+
wi = workitem.dup
|
|
96
|
+
|
|
97
|
+
child = @children[0]
|
|
98
|
+
get_expression_pool.forget self, child
|
|
99
|
+
get_expression_pool.apply child, wi
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
reply_to_parent workitem
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def reply (workitem)
|
|
106
|
+
# never gets called
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
require 'rufus/eval'
|
|
41
|
+
require 'openwfe/expressions/flowexpression'
|
|
42
|
+
require 'openwfe/expressions/value'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
module OpenWFE
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# The 'description' expression, simply binds the given text in
|
|
49
|
+
# the 'description' variable in the current process.
|
|
50
|
+
#
|
|
51
|
+
# class TestDefinition2 < OpenWFE::ProcessDefinition
|
|
52
|
+
#
|
|
53
|
+
# description :lang => "fr" do "rien de rien" end
|
|
54
|
+
#
|
|
55
|
+
# sequence do
|
|
56
|
+
# _print "${description}"
|
|
57
|
+
# _print "${description__fr}"
|
|
58
|
+
# end
|
|
59
|
+
# end
|
|
60
|
+
#
|
|
61
|
+
class DescriptionExpression < FlowExpression
|
|
62
|
+
include ValueMixin
|
|
63
|
+
|
|
64
|
+
is_definition
|
|
65
|
+
|
|
66
|
+
names :description
|
|
67
|
+
|
|
68
|
+
DESC = 'description'
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def reply (workitem)
|
|
72
|
+
|
|
73
|
+
lang =
|
|
74
|
+
lookup_attribute(:lang, workitem) ||
|
|
75
|
+
lookup_attribute(:language, workitem)
|
|
76
|
+
|
|
77
|
+
vname = DESC
|
|
78
|
+
vname += "__#{lang}" if lang
|
|
79
|
+
|
|
80
|
+
text = lookup_attribute('text', workitem) || workitem.get_result
|
|
81
|
+
|
|
82
|
+
set_variable(vname, text)
|
|
83
|
+
set_variable(DESC, text) unless lookup_variable(DESC)
|
|
84
|
+
# set default if not set
|
|
85
|
+
|
|
86
|
+
reply_to_parent workitem
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
#
|
|
91
|
+
# A debug/test expression (it's mostly used in the test suite
|
|
92
|
+
# used for the development of OpenWFEru).
|
|
93
|
+
# Outputs a message to the STDOUT (via the "puts" Ruby method).
|
|
94
|
+
#
|
|
95
|
+
# <print>hello</print>
|
|
96
|
+
#
|
|
97
|
+
# _print "hello"
|
|
98
|
+
# _print do
|
|
99
|
+
# "in a block"
|
|
100
|
+
# end
|
|
101
|
+
#
|
|
102
|
+
# Note that when expressing the process in Ruby, an underscore has to be
|
|
103
|
+
# placed in front of the expression name to avoid a collision with the
|
|
104
|
+
# Ruby 'print' function.
|
|
105
|
+
#
|
|
106
|
+
# If there is an object bound in the application context under the
|
|
107
|
+
# name '__tracer', this expression will append its message to this
|
|
108
|
+
# instance instead of emitting to the STDOUT. (this is how the
|
|
109
|
+
# OpenWFEru test suite uses this expression).
|
|
110
|
+
#
|
|
111
|
+
class PrintExpression < FlowExpression
|
|
112
|
+
include ValueMixin
|
|
113
|
+
|
|
114
|
+
names :print
|
|
115
|
+
|
|
116
|
+
def reply (workitem)
|
|
117
|
+
|
|
118
|
+
text = workitem.get_result.to_s
|
|
119
|
+
text << "\n"
|
|
120
|
+
|
|
121
|
+
tracer = @application_context['__tracer']
|
|
122
|
+
|
|
123
|
+
if tracer
|
|
124
|
+
tracer << text
|
|
125
|
+
else
|
|
126
|
+
puts text
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
reply_to_parent workitem
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
#
|
|
134
|
+
# Evals some Ruby code contained within the process definition
|
|
135
|
+
# or within the workitem.
|
|
136
|
+
#
|
|
137
|
+
# The code is evaluated at a SAFE level of 3.
|
|
138
|
+
#
|
|
139
|
+
# If the :ruby_eval_allowed isn't set to true
|
|
140
|
+
# (<tt>engine.application_context[:ruby_eval_allowed] = true</tt>), this
|
|
141
|
+
# expression will throw an exception at apply.
|
|
142
|
+
#
|
|
143
|
+
# some examples :
|
|
144
|
+
#
|
|
145
|
+
# <reval>
|
|
146
|
+
# workitem.customer_name = "doug"
|
|
147
|
+
# # or for short
|
|
148
|
+
# wi.customer_address = "midtown 21_21 design"
|
|
149
|
+
# </reval>
|
|
150
|
+
#
|
|
151
|
+
# in a Ruby process definition :
|
|
152
|
+
#
|
|
153
|
+
# sequence do
|
|
154
|
+
# _set :field => "customer" do
|
|
155
|
+
# reval """
|
|
156
|
+
# {
|
|
157
|
+
# :name => "Cheezburger",
|
|
158
|
+
# :age => 34,
|
|
159
|
+
# :comment => "I can haz ?",
|
|
160
|
+
# :timestamp => Time.now.to_s
|
|
161
|
+
# }
|
|
162
|
+
# """
|
|
163
|
+
# end
|
|
164
|
+
# end
|
|
165
|
+
#
|
|
166
|
+
# Don't embed too much Ruby into your process definitions, it might
|
|
167
|
+
# hurt...
|
|
168
|
+
#
|
|
169
|
+
# Reval can also be used with the 'code' attribute (or 'field-code' or
|
|
170
|
+
# 'variable-code') :
|
|
171
|
+
#
|
|
172
|
+
# <reval field-code="f0" />
|
|
173
|
+
#
|
|
174
|
+
# to eval the Ruby code held in the field named "f0".
|
|
175
|
+
#
|
|
176
|
+
class RevalExpression < FlowExpression
|
|
177
|
+
include ValueMixin
|
|
178
|
+
|
|
179
|
+
names :reval
|
|
180
|
+
|
|
181
|
+
#
|
|
182
|
+
# See for an explanation on Ruby safety levels :
|
|
183
|
+
# http://www.rubycentral.com/book/taint.html
|
|
184
|
+
#
|
|
185
|
+
# 'reval' is entitled a safe level of 3.
|
|
186
|
+
#
|
|
187
|
+
SAFETY_LEVEL = 3
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def reply (workitem)
|
|
191
|
+
|
|
192
|
+
raise "evaluation of ruby code is not allowed" \
|
|
193
|
+
if @application_context[:ruby_eval_allowed] != true
|
|
194
|
+
|
|
195
|
+
code = lookup_vf_attribute(workitem, 'code') || workitem.get_result
|
|
196
|
+
code = code.to_s
|
|
197
|
+
|
|
198
|
+
wi = workitem
|
|
199
|
+
# so that the ruby code being evaluated sees 'wi' and 'workitem'
|
|
200
|
+
|
|
201
|
+
result = Rufus::eval_safely code, SAFETY_LEVEL, binding()
|
|
202
|
+
|
|
203
|
+
workitem.set_result(result) \
|
|
204
|
+
if result != nil # 'false' is a valid result
|
|
205
|
+
|
|
206
|
+
reply_to_parent workitem
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
#
|
|
211
|
+
# An advanced expression : it takes the value in a field or variable (or
|
|
212
|
+
# the nested value) and evaluates it as a process definition.
|
|
213
|
+
#
|
|
214
|
+
# sequence
|
|
215
|
+
# set :field => "code", :value => "<print>hello 0</print>"
|
|
216
|
+
# _eval :field_def => "code"
|
|
217
|
+
# set :field => "code", :value => "_print 'hello 1'"
|
|
218
|
+
# _eval :field_def => "code"
|
|
219
|
+
# end
|
|
220
|
+
#
|
|
221
|
+
# will print "hello0\nhello1".
|
|
222
|
+
#
|
|
223
|
+
# This expression can be useful for evaluating process definition snippets
|
|
224
|
+
# coming from participants directly.
|
|
225
|
+
#
|
|
226
|
+
# It's also dangerous. This 'eval' expression will raise an error if
|
|
227
|
+
# the parameter :dynamic_eval_allowed in the engine's application context
|
|
228
|
+
# is not set to true.
|
|
229
|
+
#
|
|
230
|
+
class EvalExpression < FlowExpression
|
|
231
|
+
include ValueMixin
|
|
232
|
+
|
|
233
|
+
names :eval
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
def reply (workitem)
|
|
237
|
+
|
|
238
|
+
raise "dynamic evaluation of process definitions is not allowed" \
|
|
239
|
+
if @application_context[:dynamic_eval_allowed] != true
|
|
240
|
+
|
|
241
|
+
df = lookup_vf_attribute(workitem, 'def') || workitem.get_result
|
|
242
|
+
|
|
243
|
+
return reply_to_parent(workitem) unless df
|
|
244
|
+
#
|
|
245
|
+
# currently, 'nothing to eval' means, 'just go on'
|
|
246
|
+
|
|
247
|
+
ldebug { "apply() def is >#{df}<" }
|
|
248
|
+
|
|
249
|
+
raw_expression = build_raw_expression df
|
|
250
|
+
|
|
251
|
+
#puts
|
|
252
|
+
#puts "======================================"
|
|
253
|
+
#puts raw_expression.to_s
|
|
254
|
+
#puts raw_expression.raw_representation
|
|
255
|
+
#puts "======================================"
|
|
256
|
+
#puts
|
|
257
|
+
|
|
258
|
+
raw_expression.apply workitem
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
protected
|
|
262
|
+
|
|
263
|
+
def build_raw_expression (df)
|
|
264
|
+
|
|
265
|
+
procdf = get_expression_pool.determine_rep df
|
|
266
|
+
|
|
267
|
+
RawExpression.new_raw(
|
|
268
|
+
fei, parent_id, environment_id, application_context, procdf)
|
|
269
|
+
end
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
#
|
|
273
|
+
# Some kind of limited 'eval' expression.
|
|
274
|
+
#
|
|
275
|
+
# Here is an usage example :
|
|
276
|
+
#
|
|
277
|
+
# class ExampleDef < OpenWFE::ProcessDefinition
|
|
278
|
+
#
|
|
279
|
+
# sequence do
|
|
280
|
+
#
|
|
281
|
+
# exp :name => "p0"
|
|
282
|
+
# exp :name => "sub0"
|
|
283
|
+
#
|
|
284
|
+
# exp :name => "sequence" do
|
|
285
|
+
# p0
|
|
286
|
+
# sub0
|
|
287
|
+
# end
|
|
288
|
+
#
|
|
289
|
+
# set :var => "a", :value => { "ref" => "p0" }
|
|
290
|
+
# exp :name => "participant", :variable_attributes => "a"
|
|
291
|
+
# end
|
|
292
|
+
#
|
|
293
|
+
# process_definition :name => "sub0" do
|
|
294
|
+
# _print "sub0"
|
|
295
|
+
# end
|
|
296
|
+
# end
|
|
297
|
+
#
|
|
298
|
+
# This example is a bit static, but the point is that the 'exp'
|
|
299
|
+
# is extracting the real expression name (or participant or subprocess
|
|
300
|
+
# name) from its 'name' attribute.
|
|
301
|
+
#
|
|
302
|
+
# The 'eval' expression is about evaluating a complete process definition
|
|
303
|
+
# branch, 'exp' is only about one node in the process definition.
|
|
304
|
+
#
|
|
305
|
+
class ExpExpression < RawExpression
|
|
306
|
+
|
|
307
|
+
names :exp
|
|
308
|
+
|
|
309
|
+
#--
|
|
310
|
+
#def initialize (fei, parent_id, env_id, app_context, att)
|
|
311
|
+
# #
|
|
312
|
+
# # this responds to the FlowExpression constructor...
|
|
313
|
+
# super fei, parent_id, env_id, app_context, nil
|
|
314
|
+
# #
|
|
315
|
+
# # but this triggers the RawExpression constructor :)
|
|
316
|
+
# @attributes = att
|
|
317
|
+
# #
|
|
318
|
+
# # as this is not done by the RawExpression constructor
|
|
319
|
+
#end
|
|
320
|
+
#++
|
|
321
|
+
|
|
322
|
+
def apply (workitem)
|
|
323
|
+
|
|
324
|
+
@applied_workitem = workitem
|
|
325
|
+
|
|
326
|
+
super
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
protected
|
|
330
|
+
|
|
331
|
+
#
|
|
332
|
+
# Evaluates the 'name' attribute, if it's not present or empty,
|
|
333
|
+
# will return the value for the 'default' attribute.
|
|
334
|
+
#
|
|
335
|
+
def expression_name
|
|
336
|
+
|
|
337
|
+
n = lookup_attribute :name, @applied_workitem
|
|
338
|
+
|
|
339
|
+
return lookup_attribute(:default, @applied_workitem) \
|
|
340
|
+
if (not n) or (n.strip == '')
|
|
341
|
+
|
|
342
|
+
n
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
#
|
|
346
|
+
# If the 'attributes' attribute is present, will return its
|
|
347
|
+
# value. Else, will simply return the attributes of the 'exp'
|
|
348
|
+
# expression itself ('name' and 'default' included).
|
|
349
|
+
#
|
|
350
|
+
def extract_attributes
|
|
351
|
+
|
|
352
|
+
att = lookup_vf_attribute @applied_workitem, :attributes
|
|
353
|
+
# will currently only work with an attribute hash
|
|
354
|
+
# whose keys are strings... symbols :(
|
|
355
|
+
|
|
356
|
+
att || @attributes
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
#--
|
|
360
|
+
#def extract_descriptions
|
|
361
|
+
# []
|
|
362
|
+
#end
|
|
363
|
+
#++
|
|
364
|
+
|
|
365
|
+
def extract_children
|
|
366
|
+
@children
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
def extract_parameters
|
|
370
|
+
[]
|
|
371
|
+
end
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
#
|
|
375
|
+
# This expression simply emits a message to the application
|
|
376
|
+
# log (by default logs/openwferu.log).
|
|
377
|
+
#
|
|
378
|
+
# <sequence>
|
|
379
|
+
# <log>before participant alpha</log>
|
|
380
|
+
# <participant ref="alpha" />
|
|
381
|
+
# <log>after participant alpha</log>
|
|
382
|
+
# <log level="warn">after participant alpha</log>
|
|
383
|
+
# </sequence>
|
|
384
|
+
#
|
|
385
|
+
# And an example with a Ruby process definition :
|
|
386
|
+
#
|
|
387
|
+
# sequence do
|
|
388
|
+
# log "simple debug message"
|
|
389
|
+
# log do
|
|
390
|
+
# "another debug message"
|
|
391
|
+
# end
|
|
392
|
+
# log :message => "yet another debug message"
|
|
393
|
+
# log :message => "an info level message", :level => "info"
|
|
394
|
+
# end
|
|
395
|
+
#
|
|
396
|
+
# Possible log levels are 'debug' (the default), 'info', 'warn' and
|
|
397
|
+
# 'fatal'.
|
|
398
|
+
#
|
|
399
|
+
class LogExpression < FlowExpression
|
|
400
|
+
include ValueMixin
|
|
401
|
+
|
|
402
|
+
names :log
|
|
403
|
+
|
|
404
|
+
def reply (workitem)
|
|
405
|
+
|
|
406
|
+
text = lookup_attribute('message', workitem) || workitem.get_result
|
|
407
|
+
|
|
408
|
+
level = lookup_attribute('level', workitem)
|
|
409
|
+
level = level.downcase.to_sym if level
|
|
410
|
+
|
|
411
|
+
level = :debug \
|
|
412
|
+
unless [ :info, :warn, :error, :fatal ].include?(level)
|
|
413
|
+
|
|
414
|
+
get_engine.llog(level, text) if text
|
|
415
|
+
|
|
416
|
+
reply_to_parent workitem
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
end
|
|
421
|
+
|