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,81 @@
|
|
|
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
|
+
# $Id: workitem.rb 3556 2006-11-13 04:15:52Z jmettraux $
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# Made in Japan
|
|
38
|
+
#
|
|
39
|
+
# John Mettraux at OpenWFE dot org
|
|
40
|
+
#
|
|
41
|
+
|
|
42
|
+
require 'openwfe/workitem'
|
|
43
|
+
require 'openwfe/engine/engine'
|
|
44
|
+
|
|
45
|
+
#include OpenWFE
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
module OpenWFE
|
|
49
|
+
|
|
50
|
+
def trace_flow (process_definition)
|
|
51
|
+
|
|
52
|
+
li = LaunchItem.new process_definition
|
|
53
|
+
|
|
54
|
+
engine = Engine.new
|
|
55
|
+
|
|
56
|
+
i = 0
|
|
57
|
+
|
|
58
|
+
engine.register_participant(".*") do |workitem|
|
|
59
|
+
|
|
60
|
+
puts "-- #{i} ------------------------------------------------------------------------"
|
|
61
|
+
puts
|
|
62
|
+
puts " participant '#{workitem.participant_name}' received workitem :"
|
|
63
|
+
puts
|
|
64
|
+
puts workitem.to_s
|
|
65
|
+
puts
|
|
66
|
+
puts "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"
|
|
67
|
+
puts
|
|
68
|
+
puts " expression pool state :"
|
|
69
|
+
#puts
|
|
70
|
+
puts engine.get_expression_storage.to_s
|
|
71
|
+
puts
|
|
72
|
+
#puts
|
|
73
|
+
|
|
74
|
+
i = i + 1
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
engine.launch li
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
@@ -0,0 +1,217 @@
|
|
|
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/dollar' # gem 'rufus-dollar'
|
|
41
|
+
require 'rufus/eval' # gem 'rufus-eval'
|
|
42
|
+
|
|
43
|
+
require 'openwfe/utils'
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# 'dollar notation' implementation in Ruby
|
|
47
|
+
#
|
|
48
|
+
|
|
49
|
+
module OpenWFE
|
|
50
|
+
|
|
51
|
+
DSUB_SAFETY_LEVEL = 4
|
|
52
|
+
#
|
|
53
|
+
# Ruby code ${ruby:...} will be evaluated with this
|
|
54
|
+
# safety level.
|
|
55
|
+
# (see http://www.rubycentral.com/book/taint.html )
|
|
56
|
+
|
|
57
|
+
#
|
|
58
|
+
# Performs 'dollar substitution' on a piece of text with as input
|
|
59
|
+
# a flow expression and a workitem (fields and variables).
|
|
60
|
+
#
|
|
61
|
+
def OpenWFE.dosub (text, flow_expression, workitem)
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# patch by Nick Petrella (2008/03/20)
|
|
65
|
+
#
|
|
66
|
+
|
|
67
|
+
if text.is_a?(String)
|
|
68
|
+
|
|
69
|
+
Rufus::dsub(text, FlowDict.new(flow_expression, workitem))
|
|
70
|
+
|
|
71
|
+
elsif text.is_a?(Array)
|
|
72
|
+
|
|
73
|
+
text.collect { |e| dosub(e, flow_expression, workitem) }
|
|
74
|
+
|
|
75
|
+
elsif text.is_a?(Hash)
|
|
76
|
+
|
|
77
|
+
text.inject({}) do |r, (k, v)|
|
|
78
|
+
|
|
79
|
+
r[dosub(k, flow_expression, workitem)] =
|
|
80
|
+
dosub(v, flow_expression, workitem)
|
|
81
|
+
r
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
else
|
|
85
|
+
|
|
86
|
+
text
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
#
|
|
91
|
+
# Wrapping a process expression and the current workitem as a
|
|
92
|
+
# Hash object ready for lookup at substitution time.
|
|
93
|
+
#
|
|
94
|
+
class FlowDict
|
|
95
|
+
|
|
96
|
+
def initialize (flow_expression, workitem, default_prefix='v')
|
|
97
|
+
|
|
98
|
+
@flow_expression = flow_expression
|
|
99
|
+
@workitem = workitem
|
|
100
|
+
@default_prefix = default_prefix
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def [] (key)
|
|
104
|
+
|
|
105
|
+
pr, k = extract_prefix key
|
|
106
|
+
|
|
107
|
+
# stage 0
|
|
108
|
+
|
|
109
|
+
v = lookup(pr[0, 1], k)
|
|
110
|
+
return v if v != nil
|
|
111
|
+
|
|
112
|
+
# stage 1
|
|
113
|
+
|
|
114
|
+
return "" if pr.size < 2
|
|
115
|
+
|
|
116
|
+
lookup(pr[1, 1], k)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def []= (key, value)
|
|
120
|
+
|
|
121
|
+
pr, k = extract_prefix key
|
|
122
|
+
pr = pr[0, 1]
|
|
123
|
+
|
|
124
|
+
if pr == 'f'
|
|
125
|
+
|
|
126
|
+
@workitem.set_attribute k, value
|
|
127
|
+
|
|
128
|
+
elsif @flow_expression
|
|
129
|
+
|
|
130
|
+
@flow_expression.set_variable k, value
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def has_key? (key)
|
|
135
|
+
|
|
136
|
+
pr, k = extract_prefix key
|
|
137
|
+
|
|
138
|
+
return true if pr == 'r'
|
|
139
|
+
|
|
140
|
+
(self[key] != nil)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
protected
|
|
144
|
+
|
|
145
|
+
def lookup (pr, key)
|
|
146
|
+
|
|
147
|
+
case pr
|
|
148
|
+
when 'v' then @flow_expression.lookup_variable(key)
|
|
149
|
+
when 'f' then @workitem.lookup_attribute(key)
|
|
150
|
+
when 'r' then call_ruby(key)
|
|
151
|
+
else nil
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def extract_prefix (key)
|
|
156
|
+
|
|
157
|
+
i = key.index(':')
|
|
158
|
+
|
|
159
|
+
return [ @default_prefix, key ] if not i
|
|
160
|
+
|
|
161
|
+
pr = key[0..i-1] # until ':'
|
|
162
|
+
pr = pr[0, 2] # the first two chars
|
|
163
|
+
|
|
164
|
+
pr = pr[0, 1] unless (pr == 'vf') or (pr == 'fv')
|
|
165
|
+
|
|
166
|
+
[ pr, key[i+1..-1] ]
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
#--
|
|
170
|
+
#def call_function (function_name)
|
|
171
|
+
# #"function '#{function_name}' is not implemented"
|
|
172
|
+
# "functions are not yet implemented"
|
|
173
|
+
# #
|
|
174
|
+
# # no need for them... we have Ruby :)
|
|
175
|
+
#end
|
|
176
|
+
#++
|
|
177
|
+
|
|
178
|
+
#
|
|
179
|
+
# The ${r:1+2} stuff. ("3").
|
|
180
|
+
#
|
|
181
|
+
def call_ruby (ruby_code)
|
|
182
|
+
|
|
183
|
+
if @flow_expression
|
|
184
|
+
return "" \
|
|
185
|
+
if @flow_expression.ac[:ruby_eval_allowed] != true
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
#binding = nil
|
|
189
|
+
#binding = @flow_expression.get_binding if @flow_expression
|
|
190
|
+
#eval(ruby_code, binding).to_s
|
|
191
|
+
|
|
192
|
+
wi = @workitem
|
|
193
|
+
workitem = @workitem
|
|
194
|
+
|
|
195
|
+
fexp = nil
|
|
196
|
+
flow_expression = nil
|
|
197
|
+
fei = nil
|
|
198
|
+
|
|
199
|
+
if @flow_expression
|
|
200
|
+
fexp = @flow_expression
|
|
201
|
+
flow_expression = @flow_expression
|
|
202
|
+
fei = @flow_expression.fei
|
|
203
|
+
end
|
|
204
|
+
#
|
|
205
|
+
# some simple notations made available to ${ruby:...}
|
|
206
|
+
# notations
|
|
207
|
+
|
|
208
|
+
#eval(ruby_code, binding).to_s
|
|
209
|
+
#eval(ruby_code).to_s
|
|
210
|
+
|
|
211
|
+
Rufus::eval_safely(
|
|
212
|
+
ruby_code, DSUB_SAFETY_LEVEL, binding()).to_s
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
end
|
|
217
|
+
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2007, 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
|
+
# $Id$
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# "made in Japan"
|
|
38
|
+
#
|
|
39
|
+
# John Mettraux at openwfe.org
|
|
40
|
+
#
|
|
41
|
+
|
|
42
|
+
require 'irb'
|
|
43
|
+
require 'irb/completion'
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# borrowing ideas from
|
|
47
|
+
#
|
|
48
|
+
# http://groups.google.com/group/ruby-talk-google/browse_frm/thread/60ef4f8cff701e14/26ae883a7cc1da7f
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
module OpenWFE
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
# Binds the SIGINT signal so that a console is opened with the bindings
|
|
55
|
+
# specified in 'args'.
|
|
56
|
+
#
|
|
57
|
+
def OpenWFE.trap_int_irb (*args)
|
|
58
|
+
trap 'INT' do
|
|
59
|
+
OpenWFE.start_irb_session(*args)
|
|
60
|
+
#OpenWFE.trap_int_irb(*args) if $openwfe_irb
|
|
61
|
+
OpenWFE.trap_int_irb(*args)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
protected
|
|
66
|
+
|
|
67
|
+
def OpenWFE.start_irb_session (*args)
|
|
68
|
+
|
|
69
|
+
IRB::setup nil unless $openwfe_irb
|
|
70
|
+
|
|
71
|
+
ws = IRB::WorkSpace.new *args
|
|
72
|
+
|
|
73
|
+
$openwfe_irb = IRB::Irb.new ws
|
|
74
|
+
|
|
75
|
+
IRB::conf[:MAIN_CONTEXT] = $openwfe_irb.context
|
|
76
|
+
|
|
77
|
+
trap 'INT' do
|
|
78
|
+
$openwfe_irb.signal_handle
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
$openwfe_irb.eval_input
|
|
82
|
+
|
|
83
|
+
puts "\nbye!"
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2007-2008, John Mettraux, OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
|
|
34
|
+
#
|
|
35
|
+
# "made in Japan"
|
|
36
|
+
#
|
|
37
|
+
# John Mettraux at openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
module OpenWFE
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# A classic : this mixin gathers observability methods. It assumes
|
|
44
|
+
# that customer classes will have a @observers instance variable
|
|
45
|
+
# available.
|
|
46
|
+
# This mixin is chiefly used by the ExpressionPool class.
|
|
47
|
+
#
|
|
48
|
+
module OwfeObservable
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# Observers will register themselves to the Observable via
|
|
52
|
+
# this method.
|
|
53
|
+
#
|
|
54
|
+
# An observer is an instance which responds to call(channel, *args)
|
|
55
|
+
#
|
|
56
|
+
# Returns the observer object (or the block's Proc object), could
|
|
57
|
+
# be useful when removing the observer.
|
|
58
|
+
#
|
|
59
|
+
def add_observer (channel, observer=nil, &callback)
|
|
60
|
+
|
|
61
|
+
observer = callback unless observer
|
|
62
|
+
(@observers[channel] ||= []) << observer
|
|
63
|
+
observer
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
# Removes an observer (this obviously doesn't work well when
|
|
68
|
+
# the actual observer is a block).
|
|
69
|
+
# If a channel is given, the observer will only get removed when
|
|
70
|
+
# registered for that channel.
|
|
71
|
+
#
|
|
72
|
+
def remove_observer (observer, channel=nil)
|
|
73
|
+
|
|
74
|
+
channels = if channel
|
|
75
|
+
[ channel ]
|
|
76
|
+
else
|
|
77
|
+
@observers.keys
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
channels.each do |c|
|
|
81
|
+
do_remove_observer observer, c
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
protected
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# Observable classes do call this method to notify their
|
|
89
|
+
# observers.
|
|
90
|
+
#
|
|
91
|
+
# Returns true if there was an observer registered.
|
|
92
|
+
#
|
|
93
|
+
def onotify (channel, *args)
|
|
94
|
+
|
|
95
|
+
do_notify(:all, channel, *args)
|
|
96
|
+
do_notify(channel, channel, *args)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
private
|
|
100
|
+
|
|
101
|
+
def do_remove_observer (observer, channel)
|
|
102
|
+
|
|
103
|
+
observers = @observers[channel]
|
|
104
|
+
observers.delete(observer) if observers
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def do_notify (target_channel, channel, *args)
|
|
108
|
+
|
|
109
|
+
#ldebug { "do_notify() @observers.size is #{@observers.size}" }
|
|
110
|
+
|
|
111
|
+
if target_channel.is_a?(String)
|
|
112
|
+
|
|
113
|
+
observers = []
|
|
114
|
+
|
|
115
|
+
@observers.each do |c, o|
|
|
116
|
+
|
|
117
|
+
if c.is_a?(String)
|
|
118
|
+
next unless target_channel.match(c)
|
|
119
|
+
elsif c.is_a?(Regexp)
|
|
120
|
+
next unless c.match(target_channel)
|
|
121
|
+
else
|
|
122
|
+
next
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
observers = observers + o
|
|
126
|
+
end
|
|
127
|
+
else
|
|
128
|
+
|
|
129
|
+
observers = @observers[target_channel]
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
return false unless observers
|
|
133
|
+
|
|
134
|
+
observers.each do |obs|
|
|
135
|
+
obs.call channel, *args
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
(observers.size > 0)
|
|
139
|
+
#
|
|
140
|
+
# returns true if at least one observer was called
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|