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,62 @@
|
|
|
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
|
+
module OpenWFE
|
|
41
|
+
|
|
42
|
+
class ObjectWithMeta
|
|
43
|
+
#
|
|
44
|
+
# meta a la lucky stiff
|
|
45
|
+
|
|
46
|
+
def self.metaclass
|
|
47
|
+
class << self
|
|
48
|
+
self
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
def self.meta_eval &block
|
|
52
|
+
metaclass.instance_eval &block
|
|
53
|
+
end
|
|
54
|
+
def self.meta_def method_name, &block
|
|
55
|
+
meta_eval { define_method method_name, &block }
|
|
56
|
+
end
|
|
57
|
+
def class_def method_name, &block
|
|
58
|
+
class_eval { define_method name, &block }
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
@@ -0,0 +1,124 @@
|
|
|
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
|
+
require 'openwfe/utils'
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
module OpenWFE
|
|
45
|
+
|
|
46
|
+
class WorkQueue < Service
|
|
47
|
+
|
|
48
|
+
include OwfeServiceLocator
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# Inits the WorkQueue
|
|
52
|
+
#
|
|
53
|
+
def service_init (service_name, application_context)
|
|
54
|
+
|
|
55
|
+
super
|
|
56
|
+
|
|
57
|
+
@queue = Queue.new
|
|
58
|
+
|
|
59
|
+
@stopped = false
|
|
60
|
+
|
|
61
|
+
thread_name = "#{service_name} (engine #{get_engine.object_id})"
|
|
62
|
+
|
|
63
|
+
OpenWFE::call_in_thread thread_name, self do
|
|
64
|
+
|
|
65
|
+
loop do
|
|
66
|
+
|
|
67
|
+
work = @queue.pop
|
|
68
|
+
|
|
69
|
+
break if work == :stop
|
|
70
|
+
|
|
71
|
+
target, method_name, args = work
|
|
72
|
+
|
|
73
|
+
target.send method_name, *args
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
#
|
|
79
|
+
# Returns true if there is or there just was activity for the
|
|
80
|
+
# work queue.
|
|
81
|
+
#
|
|
82
|
+
def busy?
|
|
83
|
+
|
|
84
|
+
@queue.size > 0
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# Returns the current count of jobs on the workqueue
|
|
89
|
+
#
|
|
90
|
+
def size
|
|
91
|
+
|
|
92
|
+
@queue.size
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
#
|
|
96
|
+
# Stops the workqueue.
|
|
97
|
+
#
|
|
98
|
+
def stop
|
|
99
|
+
|
|
100
|
+
@stopped = true
|
|
101
|
+
@queue.push :stop
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
#
|
|
105
|
+
# the method called by the mixer to actually queue the work.
|
|
106
|
+
#
|
|
107
|
+
def push (target, method_name, *args)
|
|
108
|
+
|
|
109
|
+
if @stopped
|
|
110
|
+
|
|
111
|
+
target.send method_name, *args
|
|
112
|
+
#
|
|
113
|
+
# degraded mode : as if there were no workqueue
|
|
114
|
+
else
|
|
115
|
+
|
|
116
|
+
@queue.push [ target, method_name, args ]
|
|
117
|
+
#
|
|
118
|
+
# work will be done later (millisec order)
|
|
119
|
+
# by the work thread
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
@@ -0,0 +1,418 @@
|
|
|
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
|
+
|
|
38
|
+
require 'rexml/document'
|
|
39
|
+
require 'builder'
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# Reopening REXML::Element to add a few helper methods (prefixed with
|
|
44
|
+
# an 'owfe_').
|
|
45
|
+
# Not too happy with this solution, but the prefix should prevent
|
|
46
|
+
# collisions
|
|
47
|
+
#
|
|
48
|
+
class REXML::Element
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# Returns the first child that is a REXML::Element or the first child
|
|
52
|
+
# that is an element and that has the given name.
|
|
53
|
+
#
|
|
54
|
+
def owfe_first_elt_child (name=nil)
|
|
55
|
+
|
|
56
|
+
children.find do |c|
|
|
57
|
+
c.is_a?(REXML::Element) and (( ! name) or c.name == name)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
#
|
|
62
|
+
# Returns all the children that are instances of REXML::Element
|
|
63
|
+
#
|
|
64
|
+
def owfe_elt_children
|
|
65
|
+
|
|
66
|
+
children.find_all { |c| c.is_a?(REXML::Element) }
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
module OpenWFE
|
|
72
|
+
|
|
73
|
+
#
|
|
74
|
+
# Simple methods for converting launchitems and workitems from and to
|
|
75
|
+
# XML.
|
|
76
|
+
#
|
|
77
|
+
# There are also the from_xml(xml) and the to_xml(object) methods
|
|
78
|
+
# that are interesting (though limited).
|
|
79
|
+
#
|
|
80
|
+
module Xml
|
|
81
|
+
|
|
82
|
+
#--
|
|
83
|
+
# launchitems
|
|
84
|
+
#++
|
|
85
|
+
|
|
86
|
+
#
|
|
87
|
+
# Turns a launchitem into an XML String
|
|
88
|
+
#
|
|
89
|
+
def self.launchitem_to_xml (li, indent=0)
|
|
90
|
+
|
|
91
|
+
b = Builder::XmlMarkup.new :indent => indent
|
|
92
|
+
|
|
93
|
+
b.instruct!
|
|
94
|
+
|
|
95
|
+
b.launchitem do
|
|
96
|
+
b.workflow_definition_url li.workflow_definition_url
|
|
97
|
+
b.attributes do
|
|
98
|
+
hash_to_xml b, li.attributes
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
b.target!
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
#
|
|
106
|
+
# Given some XML (string or rexml doc/elt), extracts the LaunchItem
|
|
107
|
+
# instance.
|
|
108
|
+
#
|
|
109
|
+
def self.launchitem_from_xml (xml)
|
|
110
|
+
|
|
111
|
+
root = to_element xml, 'launchitem'
|
|
112
|
+
|
|
113
|
+
li = LaunchItem.new
|
|
114
|
+
|
|
115
|
+
li.wfdurl = text root, 'workflow_definition_url'
|
|
116
|
+
|
|
117
|
+
li.attributes = object_from_xml(
|
|
118
|
+
root.owfe_first_elt_child('attributes').owfe_first_elt_child)
|
|
119
|
+
|
|
120
|
+
li
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
#--
|
|
124
|
+
# flow expression id
|
|
125
|
+
#++
|
|
126
|
+
|
|
127
|
+
def self.fei_to_xml (fei, indent=0)
|
|
128
|
+
|
|
129
|
+
b = Builder::XmlMarkup.new :indent => indent
|
|
130
|
+
|
|
131
|
+
b.instruct!
|
|
132
|
+
|
|
133
|
+
_fei_to_xml b, fei
|
|
134
|
+
|
|
135
|
+
b.target!
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def self.fei_from_xml (xml)
|
|
139
|
+
|
|
140
|
+
xml = to_element xml, 'flow_expression_id'
|
|
141
|
+
|
|
142
|
+
fei = FlowExpressionId.new
|
|
143
|
+
|
|
144
|
+
FlowExpressionId::FIELDS.each do |f|
|
|
145
|
+
fei.send "#{f}=", text(xml, f.to_s)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
fei
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
#--
|
|
152
|
+
# workitems
|
|
153
|
+
#++
|
|
154
|
+
|
|
155
|
+
#
|
|
156
|
+
# Turns an [InFlow]WorkItem into some XML.
|
|
157
|
+
#
|
|
158
|
+
def self.workitem_to_xml (wi, indent=0)
|
|
159
|
+
|
|
160
|
+
b = Builder::XmlMarkup.new :indent => indent
|
|
161
|
+
|
|
162
|
+
b.instruct!
|
|
163
|
+
|
|
164
|
+
_workitem_to_xml b, wi
|
|
165
|
+
|
|
166
|
+
b.target!
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
#
|
|
170
|
+
# Pipes a workitem into a XML builder
|
|
171
|
+
#
|
|
172
|
+
def self._workitem_to_xml (builder, wi)
|
|
173
|
+
|
|
174
|
+
builder.workitem do
|
|
175
|
+
|
|
176
|
+
_fei_to_xml builder, wi.fei # flow expression id
|
|
177
|
+
|
|
178
|
+
builder.last_modified to_httpdate(wi.last_modified)
|
|
179
|
+
|
|
180
|
+
builder.participant_name wi.participant_name
|
|
181
|
+
|
|
182
|
+
builder.dispatch_time to_httpdate(wi.dispatch_time)
|
|
183
|
+
#builder.filter ...
|
|
184
|
+
builder.store wi.store
|
|
185
|
+
|
|
186
|
+
builder.attributes do
|
|
187
|
+
hash_to_xml builder, wi.attributes
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
#
|
|
193
|
+
# Extracts an [InFlow]WorkItem instance from some XML.
|
|
194
|
+
#
|
|
195
|
+
def self.workitem_from_xml (xml)
|
|
196
|
+
|
|
197
|
+
root = to_element xml, 'workitem'
|
|
198
|
+
|
|
199
|
+
wi = InFlowWorkItem.new
|
|
200
|
+
|
|
201
|
+
wi.fei = fei_from_xml root.elements['flow_expression_id']
|
|
202
|
+
|
|
203
|
+
wi.last_modified = from_httpdate(text(root, 'last_modified'))
|
|
204
|
+
wi.participant_name = text root, 'participant_name'
|
|
205
|
+
wi.dispatch_time = from_httpdate(text(root, 'dispatch_time'))
|
|
206
|
+
|
|
207
|
+
wi.attributes = object_from_xml(
|
|
208
|
+
root.owfe_first_elt_child('attributes').owfe_first_elt_child)
|
|
209
|
+
|
|
210
|
+
wi
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
#
|
|
214
|
+
# Extracts a list of workitems from some XML.
|
|
215
|
+
#
|
|
216
|
+
def self.workitems_from_xml (xml)
|
|
217
|
+
|
|
218
|
+
root = to_element xml, 'workitems'
|
|
219
|
+
|
|
220
|
+
root.owfe_elt_children.collect do |elt|
|
|
221
|
+
workitem_from_xml elt
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
#--
|
|
226
|
+
# cancelitems
|
|
227
|
+
#++
|
|
228
|
+
|
|
229
|
+
def self.cancelitem_to_xml (ci)
|
|
230
|
+
|
|
231
|
+
nil # TODO : implement me
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def self.cancelitem_from_xml (xml)
|
|
235
|
+
|
|
236
|
+
nil # TODO : implement me
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
#
|
|
240
|
+
# An 'internal' method, turning an object into some XML.
|
|
241
|
+
#
|
|
242
|
+
def self.object_to_xml (xml, o)
|
|
243
|
+
|
|
244
|
+
return xml.true if o == true
|
|
245
|
+
return xml.false if o == false
|
|
246
|
+
return xml.null if o == nil
|
|
247
|
+
return xml.number(o.to_s) if o.is_a?(Numeric)
|
|
248
|
+
|
|
249
|
+
return hash_to_xml(xml, o) if o.is_a?(Hash)
|
|
250
|
+
return array_to_xml(xml, o) if o.is_a?(Array)
|
|
251
|
+
|
|
252
|
+
return xml.string(o.to_s) if o.is_a?(String)
|
|
253
|
+
|
|
254
|
+
xml.object o.to_s
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
#
|
|
258
|
+
# Turns XML into an object (quite basic though).
|
|
259
|
+
#
|
|
260
|
+
# For example :
|
|
261
|
+
#
|
|
262
|
+
# <array>
|
|
263
|
+
# <string>alpha</string>
|
|
264
|
+
# <number>2</number>
|
|
265
|
+
# <number>2.3</number>
|
|
266
|
+
# <false/>
|
|
267
|
+
# <null/>
|
|
268
|
+
# </array>
|
|
269
|
+
#
|
|
270
|
+
# =>
|
|
271
|
+
#
|
|
272
|
+
# [ 'alpha', 2, 2.3, false, nil ]
|
|
273
|
+
#
|
|
274
|
+
def self.from_xml (xml)
|
|
275
|
+
|
|
276
|
+
xml = to_element xml
|
|
277
|
+
|
|
278
|
+
object_from_xml xml
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
#
|
|
282
|
+
# from_xml, the other way
|
|
283
|
+
#
|
|
284
|
+
def self.to_xml (o, indent=0, instruct = false)
|
|
285
|
+
|
|
286
|
+
b = Builder::XmlMarkup.new :indent => indent
|
|
287
|
+
|
|
288
|
+
b.instruct! if instruct
|
|
289
|
+
|
|
290
|
+
object_to_xml b, o
|
|
291
|
+
|
|
292
|
+
b.target!
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
private
|
|
296
|
+
|
|
297
|
+
def self.to_httpdate (t)
|
|
298
|
+
|
|
299
|
+
return "" unless t
|
|
300
|
+
t.httpdate
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def self.from_httpdate (s)
|
|
304
|
+
|
|
305
|
+
return nil unless s
|
|
306
|
+
return nil if s.strip == ""
|
|
307
|
+
|
|
308
|
+
Time.httpdate s
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
#--
|
|
312
|
+
# OUT
|
|
313
|
+
#++
|
|
314
|
+
|
|
315
|
+
def self._fei_to_xml (xml, fei)
|
|
316
|
+
|
|
317
|
+
xml.flow_expression_id do
|
|
318
|
+
FlowExpressionId::FIELDS.each do |f|
|
|
319
|
+
xml.tag! f.to_s, fei.send(f)
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
xml.fei_short fei.to_s
|
|
323
|
+
# a short, 1 string version of the fei
|
|
324
|
+
end
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def self.to_element (xml, root_name=nil)
|
|
328
|
+
|
|
329
|
+
xml = if xml.is_a?(REXML::Element)
|
|
330
|
+
xml
|
|
331
|
+
elsif xml.is_a?(REXML::Document)
|
|
332
|
+
xml.root
|
|
333
|
+
else
|
|
334
|
+
REXML::Document.new(xml).root
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
raise "not the XML of a #{root_name} ('#{xml.name}')" \
|
|
338
|
+
if root_name and (xml.name != root_name)
|
|
339
|
+
|
|
340
|
+
xml
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def self.hash_to_xml (xml, h)
|
|
344
|
+
|
|
345
|
+
xml.hash do
|
|
346
|
+
h.each do |k, v|
|
|
347
|
+
xml.entry do
|
|
348
|
+
object_to_xml xml, k
|
|
349
|
+
object_to_xml xml, v
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def self.array_to_xml (xml, a)
|
|
356
|
+
|
|
357
|
+
xml.array do
|
|
358
|
+
a.each { |o| object_to_xml xml, o }
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
#--
|
|
363
|
+
# IN
|
|
364
|
+
#++
|
|
365
|
+
|
|
366
|
+
#
|
|
367
|
+
# Returns the text wrapped in the child elt with the given
|
|
368
|
+
# name.
|
|
369
|
+
#
|
|
370
|
+
def self.text (parent, elt_name)
|
|
371
|
+
|
|
372
|
+
parent.elements[elt_name].text
|
|
373
|
+
end
|
|
374
|
+
|
|
375
|
+
def self.object_from_xml (elt)
|
|
376
|
+
|
|
377
|
+
name = elt.name
|
|
378
|
+
text = elt.text
|
|
379
|
+
|
|
380
|
+
return true if name == 'true'
|
|
381
|
+
return false if name == 'false'
|
|
382
|
+
return nil if name == 'null'
|
|
383
|
+
|
|
384
|
+
if name == 'number'
|
|
385
|
+
return text.to_f if text.index('.')
|
|
386
|
+
return text.to_i
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
return hash_from_xml(elt) if name == 'hash'
|
|
390
|
+
return array_from_xml(elt) if name == 'array'
|
|
391
|
+
|
|
392
|
+
text # string / object
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
def self.hash_from_xml (elt)
|
|
396
|
+
|
|
397
|
+
elt.owfe_elt_children.inject({}) do |r, e|
|
|
398
|
+
|
|
399
|
+
children = e.owfe_elt_children
|
|
400
|
+
|
|
401
|
+
k = object_from_xml children[0]
|
|
402
|
+
v = object_from_xml children[1]
|
|
403
|
+
|
|
404
|
+
r[k] = v
|
|
405
|
+
|
|
406
|
+
r
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
def self.array_from_xml (elt)
|
|
411
|
+
|
|
412
|
+
elt.owfe_elt_children.inject([]) do |r, e|
|
|
413
|
+
r << object_from_xml(e)
|
|
414
|
+
end
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
end
|
|
418
|
+
|