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,244 @@
|
|
|
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 'rufus/eval' # gem 'rufus-eval'
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
module OpenWFE
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# A ConditionMixin is a mixin for flow expressions like 'if' and 'break' for
|
|
47
|
+
# example.
|
|
48
|
+
# It allows for shorter notations like
|
|
49
|
+
#
|
|
50
|
+
# <if test="${f:approved} == true"/>
|
|
51
|
+
#
|
|
52
|
+
# or
|
|
53
|
+
#
|
|
54
|
+
# _loop do
|
|
55
|
+
# participant :graphical_designer
|
|
56
|
+
# participant :business_analyst
|
|
57
|
+
# _break :if => "${f:approved}"
|
|
58
|
+
# end
|
|
59
|
+
#
|
|
60
|
+
module ConditionMixin
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# This is the method brought to expression classes including this
|
|
64
|
+
# mixin. Easy evaluation of a conditon expressed in an attribute.
|
|
65
|
+
#
|
|
66
|
+
def eval_condition (attname, workitem, nattname=nil)
|
|
67
|
+
|
|
68
|
+
positive = nil
|
|
69
|
+
negative = nil
|
|
70
|
+
|
|
71
|
+
positive = do_eval_condition(attname, workitem)
|
|
72
|
+
negative = do_eval_condition(nattname, workitem) if nattname
|
|
73
|
+
|
|
74
|
+
negative = (not negative) if negative != nil
|
|
75
|
+
|
|
76
|
+
return positive if positive != nil
|
|
77
|
+
|
|
78
|
+
negative
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
#
|
|
82
|
+
# Returns nil if the cited attname (without or without 'r' prefix)
|
|
83
|
+
# is not present.
|
|
84
|
+
#
|
|
85
|
+
# Attname may be a String or a Symbol, or an Array of String or Symbol
|
|
86
|
+
# instances.
|
|
87
|
+
#
|
|
88
|
+
# Returns the Symbol the attribute if present.
|
|
89
|
+
#
|
|
90
|
+
def determine_condition_attribute (attname)
|
|
91
|
+
|
|
92
|
+
attname = [ attname ] unless attname.is_a?(Array)
|
|
93
|
+
|
|
94
|
+
attname.each do |aname|
|
|
95
|
+
aname = aname.intern if aname.is_a?(String)
|
|
96
|
+
return aname if has_attribute(aname)
|
|
97
|
+
return aname if has_attribute("r" + aname.to_s)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
nil
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
protected
|
|
104
|
+
|
|
105
|
+
def do_eval_condition (attname, workitem)
|
|
106
|
+
|
|
107
|
+
#attname = pick_attribute(attname) \
|
|
108
|
+
# if attname.is_a?(Array)
|
|
109
|
+
|
|
110
|
+
conditional = lookup_attribute(attname, workitem)
|
|
111
|
+
rconditional = lookup_attribute("r"+attname.to_s, workitem)
|
|
112
|
+
|
|
113
|
+
return do_eval(rconditional, workitem) \
|
|
114
|
+
if rconditional and not conditional
|
|
115
|
+
|
|
116
|
+
return nil \
|
|
117
|
+
unless conditional
|
|
118
|
+
|
|
119
|
+
ldebug { "do_eval_condition() 0 for >#{conditional}<" }
|
|
120
|
+
|
|
121
|
+
conditional = unescape conditional
|
|
122
|
+
|
|
123
|
+
ldebug { "do_eval_condition() 1 for >#{conditional}<" }
|
|
124
|
+
|
|
125
|
+
r = eval_set conditional
|
|
126
|
+
return r if r != nil
|
|
127
|
+
|
|
128
|
+
begin
|
|
129
|
+
return to_boolean(do_eval(conditional, workitem))
|
|
130
|
+
rescue Exception => e
|
|
131
|
+
# probably needs some quoting...
|
|
132
|
+
ldebug { "do_eval_condition() e : #{e}" }
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
conditional = do_quote(conditional)
|
|
136
|
+
|
|
137
|
+
ldebug { "do_eval_condition() 2 for >#{conditional}<" }
|
|
138
|
+
|
|
139
|
+
to_boolean(do_eval(conditional, workitem))
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
SET_REGEX = /(\S*?)( is)?( not)? set$/
|
|
143
|
+
|
|
144
|
+
#
|
|
145
|
+
# Evals the 'x [ is][ not] set' notation...
|
|
146
|
+
#
|
|
147
|
+
def eval_set (cond)
|
|
148
|
+
|
|
149
|
+
m = SET_REGEX.match cond
|
|
150
|
+
|
|
151
|
+
return nil unless m
|
|
152
|
+
|
|
153
|
+
val = m[1]
|
|
154
|
+
n = m[3]
|
|
155
|
+
|
|
156
|
+
ldebug do
|
|
157
|
+
"eval_set() for >#{cond}< "+
|
|
158
|
+
"m[1] is '#{val}', m[3] is '#{n}'"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
val = val.strip if val
|
|
162
|
+
val = (val != nil and val != '')
|
|
163
|
+
n = (n and n.strip == 'not')
|
|
164
|
+
|
|
165
|
+
n ? (not val) : val
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
private
|
|
169
|
+
|
|
170
|
+
#
|
|
171
|
+
# Returns true if result is the "true" String or the true
|
|
172
|
+
# boolean value. Returns false else.
|
|
173
|
+
#
|
|
174
|
+
def to_boolean (o)
|
|
175
|
+
|
|
176
|
+
ldebug { "to_boolean() o is _#{o}_" }
|
|
177
|
+
|
|
178
|
+
#(o == "true" or o == true)
|
|
179
|
+
o = o.strip if o.is_a?(String)
|
|
180
|
+
not (o == nil || o == false || o == 'false' || o == '')
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
#
|
|
184
|
+
# unescapes '>' and '<'
|
|
185
|
+
#
|
|
186
|
+
def unescape (s)
|
|
187
|
+
|
|
188
|
+
s.gsub("&", "&").gsub(">", ">").gsub("<", "<")
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
#
|
|
192
|
+
# Quotes the given string so that it can easily get evaluated
|
|
193
|
+
# as Ruby code (a string comparison actually).
|
|
194
|
+
#
|
|
195
|
+
def do_quote (string)
|
|
196
|
+
|
|
197
|
+
op = find_operator string
|
|
198
|
+
|
|
199
|
+
return '"' + string + '"' unless op
|
|
200
|
+
|
|
201
|
+
op, i = op
|
|
202
|
+
|
|
203
|
+
s = '"'
|
|
204
|
+
s << string[0..i-1].strip
|
|
205
|
+
s << '" '
|
|
206
|
+
s << string[i, op.length]
|
|
207
|
+
s << ' "'
|
|
208
|
+
s << string[i+op.length..-1].strip
|
|
209
|
+
s << '"'
|
|
210
|
+
s
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
#
|
|
214
|
+
# Returns the operator and its index (position) in the string.
|
|
215
|
+
# Returns nil if not operator was found in the string.
|
|
216
|
+
#
|
|
217
|
+
def find_operator (string)
|
|
218
|
+
|
|
219
|
+
[ "==", "!=", "<=", ">=", "<", ">" ].each do |op|
|
|
220
|
+
i = string.index op
|
|
221
|
+
next unless i
|
|
222
|
+
return [ op, i ]
|
|
223
|
+
end
|
|
224
|
+
nil
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
#
|
|
228
|
+
# Runs the given given within an instance_eval() at a $SAFE
|
|
229
|
+
# level of 4.
|
|
230
|
+
#
|
|
231
|
+
def do_eval (s, workitem)
|
|
232
|
+
|
|
233
|
+
wi = workitem
|
|
234
|
+
fe = self
|
|
235
|
+
#
|
|
236
|
+
# wi and fe are thus available as well
|
|
237
|
+
# (as self and workitem)
|
|
238
|
+
|
|
239
|
+
Rufus::eval_safely(s, 4, binding())
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
end
|
|
244
|
+
|
|
@@ -0,0 +1,246 @@
|
|
|
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/scheduler'
|
|
41
|
+
require 'openwfe/utils'
|
|
42
|
+
require 'openwfe/expressions/flowexpression'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
module OpenWFE
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# An environment is a store for variables.
|
|
49
|
+
# It's an expression thus it's storable in the expression pool.
|
|
50
|
+
#
|
|
51
|
+
class Environment < FlowExpression
|
|
52
|
+
include Rufus::Schedulable
|
|
53
|
+
|
|
54
|
+
names :environment
|
|
55
|
+
|
|
56
|
+
V_PAUSED = VAR_PAUSED[1..-1]
|
|
57
|
+
|
|
58
|
+
#
|
|
59
|
+
# the variables stored in this environment.
|
|
60
|
+
#
|
|
61
|
+
attr_accessor :variables
|
|
62
|
+
|
|
63
|
+
#def initialize (
|
|
64
|
+
# fei, parent, environment_id, application_context, attributes)
|
|
65
|
+
# super(fei, parent, environment_id, application_context, attributes)
|
|
66
|
+
# @variables = {}
|
|
67
|
+
#end
|
|
68
|
+
|
|
69
|
+
def initialize
|
|
70
|
+
|
|
71
|
+
super
|
|
72
|
+
|
|
73
|
+
@variables = {}
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.new_env (
|
|
77
|
+
fei, parent_id, environment_id, app_context, attributes)
|
|
78
|
+
|
|
79
|
+
env = self.new
|
|
80
|
+
|
|
81
|
+
env.fei = fei
|
|
82
|
+
env.parent_id = parent_id
|
|
83
|
+
env.environment_id = environment_id
|
|
84
|
+
env.application_context = app_context
|
|
85
|
+
env.attributes = attributes
|
|
86
|
+
|
|
87
|
+
env
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
#
|
|
91
|
+
# Looks up for the value of a variable in this environment.
|
|
92
|
+
#
|
|
93
|
+
def [] (key)
|
|
94
|
+
|
|
95
|
+
value = @variables[key]
|
|
96
|
+
|
|
97
|
+
return value \
|
|
98
|
+
if @variables.has_key?(key) or is_engine_environment?
|
|
99
|
+
|
|
100
|
+
return get_parent[key] if @parent_id
|
|
101
|
+
|
|
102
|
+
get_expression_pool.fetch_engine_environment[key]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# Binds a variable in this environment.
|
|
107
|
+
#
|
|
108
|
+
def []= (key, value)
|
|
109
|
+
|
|
110
|
+
#ldebug do
|
|
111
|
+
# "#{fei.to_debug_s} []= "+
|
|
112
|
+
# "'#{key}' => '#{value}' (#{value.class.name})"
|
|
113
|
+
#end
|
|
114
|
+
|
|
115
|
+
#synchronize do
|
|
116
|
+
|
|
117
|
+
@variables[key] = value
|
|
118
|
+
store_itself
|
|
119
|
+
#end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
#
|
|
123
|
+
# Removes a variable from this environment.
|
|
124
|
+
#
|
|
125
|
+
def delete (key)
|
|
126
|
+
#synchronize do
|
|
127
|
+
|
|
128
|
+
ldebug { "#{fei.to_debug_s} delete() '#{key}'" }
|
|
129
|
+
|
|
130
|
+
@variables.delete key
|
|
131
|
+
store_itself
|
|
132
|
+
#end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
#
|
|
136
|
+
# This method is usually called before the environment gets wiped
|
|
137
|
+
# out of the expression pool.
|
|
138
|
+
# It takes care of removing subprocess templates pointed at by
|
|
139
|
+
# variables in this environment.
|
|
140
|
+
#
|
|
141
|
+
def unbind
|
|
142
|
+
|
|
143
|
+
#ldebug { "unbind() for #{fei.to_s}" }
|
|
144
|
+
|
|
145
|
+
@variables.each do |key, value|
|
|
146
|
+
|
|
147
|
+
#ldebug { "unbind() '#{key}' => #{value.class}" }
|
|
148
|
+
|
|
149
|
+
if value.kind_of?(FlowExpressionId)
|
|
150
|
+
|
|
151
|
+
get_expression_pool.remove(value)
|
|
152
|
+
|
|
153
|
+
#elsif value.kind_of?(FlowExpression)
|
|
154
|
+
# value.cancel
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
#
|
|
160
|
+
# Returns true if this environment is the engine environment
|
|
161
|
+
#
|
|
162
|
+
def is_engine_environment?
|
|
163
|
+
|
|
164
|
+
(@fei == get_expression_pool.engine_environment_id)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
#
|
|
168
|
+
# Should never get used, only the reschedule() method is relevant
|
|
169
|
+
# for the Schedulable aspect of an environment expression.
|
|
170
|
+
#
|
|
171
|
+
def trigger (params)
|
|
172
|
+
|
|
173
|
+
raise "an environment should never get directly triggered"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
#
|
|
177
|
+
# Will reschedule any 'Schedulable' variable found in this environment
|
|
178
|
+
# this method especially targets cron expressions that are stored
|
|
179
|
+
# as variables and need to be rescheduled upon engine restart.
|
|
180
|
+
#
|
|
181
|
+
def reschedule (scheduler)
|
|
182
|
+
|
|
183
|
+
@fei.owfe_version = OPENWFERU_VERSION \
|
|
184
|
+
if @fei.wfurl == 'ee' and @fei.wfname =='ee'
|
|
185
|
+
#
|
|
186
|
+
# so that older versions of engine envs get accepted
|
|
187
|
+
|
|
188
|
+
@variables.each do |key, value|
|
|
189
|
+
|
|
190
|
+
#ldebug { "reschedule() - item of class #{value.class}" }
|
|
191
|
+
|
|
192
|
+
get_expression_pool.paused_instances[@fei.wfid] = true \
|
|
193
|
+
if key == V_PAUSED
|
|
194
|
+
|
|
195
|
+
next unless value.kind_of?(Rufus::Schedulable)
|
|
196
|
+
|
|
197
|
+
linfo { "reschedule() for instance of #{value.class.name}" }
|
|
198
|
+
|
|
199
|
+
value.application_context = @application_context
|
|
200
|
+
value.reschedule(scheduler)
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
store_itself
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
#
|
|
207
|
+
# Returns the top environment for the process instance (the
|
|
208
|
+
# environment just before the engine environment).
|
|
209
|
+
#
|
|
210
|
+
def get_root_environment
|
|
211
|
+
|
|
212
|
+
#ldebug { "get_root_environment\n#{self}" }
|
|
213
|
+
|
|
214
|
+
return self unless @parent_id
|
|
215
|
+
|
|
216
|
+
get_parent.get_root_environment
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
#--
|
|
220
|
+
#def get_subprocess_environment
|
|
221
|
+
# return self if not @parent_id
|
|
222
|
+
# return self if @parent_id.sub_instance_id != @fei.sub_instance_id
|
|
223
|
+
# get_parent.get_subprocess_environment
|
|
224
|
+
#end
|
|
225
|
+
#++
|
|
226
|
+
|
|
227
|
+
#
|
|
228
|
+
# Returns a deep copy of this environment.
|
|
229
|
+
#
|
|
230
|
+
def dup
|
|
231
|
+
|
|
232
|
+
env = Environment.new_env(
|
|
233
|
+
@fei.dup,
|
|
234
|
+
@parent_id,
|
|
235
|
+
@environment_id,
|
|
236
|
+
@application_context,
|
|
237
|
+
OpenWFE::fulldup(@attributes))
|
|
238
|
+
|
|
239
|
+
env.variables = OpenWFE::fulldup self.variables
|
|
240
|
+
|
|
241
|
+
env
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
end
|
|
246
|
+
|