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,242 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 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 'rexml/document'
|
|
41
|
+
require 'openwfe/expressions/rprocdef'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module OpenWFE
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# A process definition parser.
|
|
48
|
+
#
|
|
49
|
+
# Currently supports XML, Ruby process pdefinitions, YAML and JSON.
|
|
50
|
+
#
|
|
51
|
+
module DefParser
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
# in : a process pdefinition
|
|
55
|
+
# out : a tree [ name, attributes, children ]
|
|
56
|
+
#
|
|
57
|
+
def self.parse (pdef)
|
|
58
|
+
|
|
59
|
+
return pdef \
|
|
60
|
+
if pdef.is_a?(Array)
|
|
61
|
+
|
|
62
|
+
return parse_string(pdef) \
|
|
63
|
+
if pdef.is_a?(String)
|
|
64
|
+
|
|
65
|
+
return pdef.do_make \
|
|
66
|
+
if pdef.is_a?(ProcessDefinition) or pdef.is_a?(Class)
|
|
67
|
+
|
|
68
|
+
return pdef.to_a \
|
|
69
|
+
if pdef.is_a?(SimpleExpRepresentation)
|
|
70
|
+
# for legacy stuff
|
|
71
|
+
|
|
72
|
+
raise "cannot handle pdefinition of class #{pdef.class.name}"
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def self.parse_string (pdef)
|
|
76
|
+
|
|
77
|
+
pdef = pdef.strip
|
|
78
|
+
|
|
79
|
+
return parse_xml(pdef) \
|
|
80
|
+
if pdef[0, 1] == "<"
|
|
81
|
+
|
|
82
|
+
return YAML.load(s) \
|
|
83
|
+
if pdef.match /^--- ./
|
|
84
|
+
|
|
85
|
+
#
|
|
86
|
+
# else it's some ruby code to eval
|
|
87
|
+
|
|
88
|
+
ProcessDefinition.eval_ruby_process_definition pdef
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
#
|
|
92
|
+
# The process definition is expressed as XML, turn that into
|
|
93
|
+
# an expression tree.
|
|
94
|
+
#
|
|
95
|
+
def self.parse_xml (xml)
|
|
96
|
+
|
|
97
|
+
xml = REXML::Document.new(xml) \
|
|
98
|
+
if xml.is_a?(String)
|
|
99
|
+
|
|
100
|
+
xml = xml.root \
|
|
101
|
+
if xml.is_a?(REXML::Document)
|
|
102
|
+
|
|
103
|
+
if xml.is_a?(REXML::Text)
|
|
104
|
+
|
|
105
|
+
s = xml.to_s.strip
|
|
106
|
+
|
|
107
|
+
return s if s.length > 0
|
|
108
|
+
|
|
109
|
+
return nil
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
return nil if xml.is_a?(REXML::Comment)
|
|
113
|
+
|
|
114
|
+
# xml element thus...
|
|
115
|
+
|
|
116
|
+
name = xml.name
|
|
117
|
+
|
|
118
|
+
attributes = xml.attributes.inject({}) do |r, (k, v)|
|
|
119
|
+
r[k] = v
|
|
120
|
+
r
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
rep = [ name, attributes, [] ]
|
|
124
|
+
|
|
125
|
+
xml.children.each do |c|
|
|
126
|
+
|
|
127
|
+
r = parse_xml c
|
|
128
|
+
|
|
129
|
+
rep.last << r if r
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
rep
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
#
|
|
137
|
+
# A set of methods for manipulating / querying a process expression tree
|
|
138
|
+
#
|
|
139
|
+
module ExpressionTree
|
|
140
|
+
|
|
141
|
+
#
|
|
142
|
+
# Extracts the description out of a process definition tree.
|
|
143
|
+
#
|
|
144
|
+
# TODO #14964 : add language support here
|
|
145
|
+
#
|
|
146
|
+
def self.get_description (tree)
|
|
147
|
+
|
|
148
|
+
#return tree.last.first.to_s if tree.first == 'description'
|
|
149
|
+
#tree.last.each do |child|
|
|
150
|
+
# d = get_description(child)
|
|
151
|
+
# return d if d
|
|
152
|
+
#end
|
|
153
|
+
#nil
|
|
154
|
+
|
|
155
|
+
tree.last.each do |child|
|
|
156
|
+
next unless child.is_a?(Array)
|
|
157
|
+
return child.last.first if child.first == 'description'
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
nil
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
#
|
|
164
|
+
# Returns a string containing the ruby code that generated this
|
|
165
|
+
# raw representation tree.
|
|
166
|
+
#
|
|
167
|
+
def self.to_code_s (tree, indentation = 0)
|
|
168
|
+
|
|
169
|
+
s = ""
|
|
170
|
+
tab = " "
|
|
171
|
+
ind = tab * indentation
|
|
172
|
+
|
|
173
|
+
s << ind
|
|
174
|
+
s << OpenWFE::make_safe(tree.first)
|
|
175
|
+
|
|
176
|
+
sa = ""
|
|
177
|
+
tree[1].each do |k, v|
|
|
178
|
+
sa << ", :#{OpenWFE::to_underscore(k)} => '#{v}'"
|
|
179
|
+
end
|
|
180
|
+
s << sa[1..-1] if sa.length > 0
|
|
181
|
+
|
|
182
|
+
if tree.last.length > 0
|
|
183
|
+
s << " do\n"
|
|
184
|
+
tree.last.each do |child|
|
|
185
|
+
#if child.respond_to?(:to_code_s)
|
|
186
|
+
if child.is_a?(Array) and child.size == 3 # and ...
|
|
187
|
+
s << to_code_s(child, indentation + 1)
|
|
188
|
+
else
|
|
189
|
+
s << ind
|
|
190
|
+
s << tab
|
|
191
|
+
s << "'#{child.to_s}'"
|
|
192
|
+
end
|
|
193
|
+
s << "\n"
|
|
194
|
+
end
|
|
195
|
+
s << ind
|
|
196
|
+
s << "end"
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
s
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
#
|
|
203
|
+
# Turns the expression tree into an XML process definition
|
|
204
|
+
#
|
|
205
|
+
def self.to_xml (tree)
|
|
206
|
+
|
|
207
|
+
elt = REXML::Element.new tree.first.to_s
|
|
208
|
+
|
|
209
|
+
tree[1].each do |k, v|
|
|
210
|
+
|
|
211
|
+
elt.attributes[k] = v
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
tree.last.each do |child|
|
|
215
|
+
|
|
216
|
+
#if child.kind_of?(SimpleExpRepresentation)
|
|
217
|
+
if child.is_a?(Array) and child.size == 3
|
|
218
|
+
|
|
219
|
+
elt << to_xml(child)
|
|
220
|
+
else
|
|
221
|
+
|
|
222
|
+
elt << REXML::Text.new(child.to_s)
|
|
223
|
+
end
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
elt
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
#
|
|
230
|
+
# Returns an XML string
|
|
231
|
+
#
|
|
232
|
+
def self.to_s (tree, indent=-1)
|
|
233
|
+
|
|
234
|
+
d = REXML::Document.new
|
|
235
|
+
d << to_xml(tree)
|
|
236
|
+
s = ""
|
|
237
|
+
d.write s, indent
|
|
238
|
+
s
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
end
|
|
242
|
+
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 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
|
+
# This module gets included into the result of the expression pool (and
|
|
44
|
+
# engine) process_stack method (if the optional parameter 'unapplied' is
|
|
45
|
+
# set to true).
|
|
46
|
+
#
|
|
47
|
+
# It adds a representation() method that returns an up-to-date
|
|
48
|
+
# representation of the executing process instance.
|
|
49
|
+
# This representation is suitable for 'fluo' rendering.
|
|
50
|
+
#
|
|
51
|
+
module RepresentationMixin
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
# Computes and returns the up-to-date representation of
|
|
55
|
+
# the process definition (on the fly changes included)
|
|
56
|
+
#
|
|
57
|
+
def representation
|
|
58
|
+
|
|
59
|
+
root_exp = find_root_expression
|
|
60
|
+
|
|
61
|
+
update_rep root_exp
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
protected
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
# if a child expression is present (in the process stack)
|
|
68
|
+
# makes sure to take its current representation and include
|
|
69
|
+
# it in the parent representation.
|
|
70
|
+
#
|
|
71
|
+
def update_rep (flow_expression)
|
|
72
|
+
|
|
73
|
+
rep = flow_expression.raw_representation.dup
|
|
74
|
+
children = flow_expression.children
|
|
75
|
+
|
|
76
|
+
index = -1
|
|
77
|
+
|
|
78
|
+
rep[2] = rep.last.inject([]) { |r, c|
|
|
79
|
+
|
|
80
|
+
index += 1
|
|
81
|
+
|
|
82
|
+
r << if c.is_a?(Array)
|
|
83
|
+
|
|
84
|
+
child_fei = flow_expression.children[index]
|
|
85
|
+
child_exp = find_expression child_fei
|
|
86
|
+
|
|
87
|
+
if child_exp
|
|
88
|
+
update_rep(child_exp)
|
|
89
|
+
else
|
|
90
|
+
#c[1]['__gone__'] = true
|
|
91
|
+
#
|
|
92
|
+
# not a good idea
|
|
93
|
+
# have to differentiate between 'replied'
|
|
94
|
+
# expressions and removed expressions
|
|
95
|
+
c
|
|
96
|
+
end
|
|
97
|
+
else
|
|
98
|
+
|
|
99
|
+
c
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
} if children and children.size > 0
|
|
103
|
+
|
|
104
|
+
rep
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def find_root_expression
|
|
108
|
+
|
|
109
|
+
self.find do |fexp|
|
|
110
|
+
fexp.fei.expid == "0" &&
|
|
111
|
+
( ! fexp.is_a?(OpenWFE::Environment)) &&
|
|
112
|
+
fexp.fei.is_in_parent_process?
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def find_expression (fei)
|
|
117
|
+
|
|
118
|
+
self.find { |fexp| fexp.fei == fei }
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,188 @@
|
|
|
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 'thread'
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
module OpenWFE
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# This mixin gathers all the logic for a threaded expression storage,
|
|
47
|
+
# one that doesn't immediately stores workitems (removes overriding
|
|
48
|
+
# operations).
|
|
49
|
+
# Using this threaded storage brings a very important perf benefit.
|
|
50
|
+
#
|
|
51
|
+
module ThreadedStorageMixin
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
# Will take care of stopping the 'queue processing' thread.
|
|
55
|
+
#
|
|
56
|
+
def stop
|
|
57
|
+
|
|
58
|
+
@stopped = true
|
|
59
|
+
@queue.push :stop
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
#
|
|
63
|
+
# makes sure that the queue isn't actually preparing a batch
|
|
64
|
+
# before returning a result.
|
|
65
|
+
#
|
|
66
|
+
def find_expressions (options)
|
|
67
|
+
|
|
68
|
+
Thread.pass
|
|
69
|
+
|
|
70
|
+
@mutex.synchronize do
|
|
71
|
+
super
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
protected
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# starts the thread that does the actual persistence.
|
|
79
|
+
#
|
|
80
|
+
def start_queue
|
|
81
|
+
|
|
82
|
+
@mutex = Mutex.new
|
|
83
|
+
@queue = Queue.new
|
|
84
|
+
|
|
85
|
+
Thread.new do
|
|
86
|
+
|
|
87
|
+
loop do
|
|
88
|
+
|
|
89
|
+
events = [ @queue.pop ]
|
|
90
|
+
|
|
91
|
+
@mutex.synchronize do
|
|
92
|
+
|
|
93
|
+
14.times { Thread.pass } # gather some steam
|
|
94
|
+
|
|
95
|
+
@queue.size.times do
|
|
96
|
+
events << @queue.pop
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
process_events events
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
break if events.include?(:stop)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
#
|
|
108
|
+
# queues an event for later (well within a second) persistence
|
|
109
|
+
#
|
|
110
|
+
def queue (event, fei, fexp=nil)
|
|
111
|
+
|
|
112
|
+
if @stopped
|
|
113
|
+
process_event event, fei, fexp
|
|
114
|
+
else
|
|
115
|
+
@queue.push [ event, fei, fexp ]
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def process_events (events)
|
|
120
|
+
|
|
121
|
+
ldebug { "process_events() #{events.size} events" }
|
|
122
|
+
|
|
123
|
+
# reducing the operation count
|
|
124
|
+
|
|
125
|
+
events = events.inject({}) do |r, event|
|
|
126
|
+
r[event[1]] = event if event != :stop
|
|
127
|
+
r
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
ldebug { "process_events() #{events.size} events remaining" }
|
|
131
|
+
|
|
132
|
+
# perform the remaining operations
|
|
133
|
+
|
|
134
|
+
events.each_value do |event, fei, fexp|
|
|
135
|
+
|
|
136
|
+
process_event event, fei, fexp
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def process_event (event, fei, fexp)
|
|
141
|
+
|
|
142
|
+
begin
|
|
143
|
+
if event == :update
|
|
144
|
+
self[fei] = fexp
|
|
145
|
+
else
|
|
146
|
+
safe_delete fei
|
|
147
|
+
end
|
|
148
|
+
rescue Exception => e
|
|
149
|
+
lwarn do
|
|
150
|
+
"process_event() ':#{event}' exception\n" +
|
|
151
|
+
OpenWFE::exception_to_s(e)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
#
|
|
157
|
+
# a call to delete that tolerates missing .yaml files
|
|
158
|
+
#
|
|
159
|
+
def safe_delete (fei)
|
|
160
|
+
begin
|
|
161
|
+
self.delete fei
|
|
162
|
+
rescue Exception => e
|
|
163
|
+
# lwarn do
|
|
164
|
+
# "safe_delete() exception\n" +
|
|
165
|
+
# OpenWFE::exception_to_s(e)
|
|
166
|
+
# end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
#
|
|
171
|
+
# Adds the queue() method as an observer to the update and remove
|
|
172
|
+
# events of the expression pool.
|
|
173
|
+
# :update and :remove mean changes to expressions in the persistence
|
|
174
|
+
# that's why they are observed.
|
|
175
|
+
#
|
|
176
|
+
def observe_expool
|
|
177
|
+
|
|
178
|
+
get_expression_pool.add_observer(:update) do |event, fei, fe|
|
|
179
|
+
ldebug { ":update for #{fei.to_debug_s}" }
|
|
180
|
+
queue event, fei, fe
|
|
181
|
+
end
|
|
182
|
+
get_expression_pool.add_observer(:remove) do |event, fei|
|
|
183
|
+
ldebug { ":remove for #{fei.to_debug_s}" }
|
|
184
|
+
queue event, fei
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|