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,202 @@
|
|
|
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 'yaml'
|
|
41
|
+
require 'socket'
|
|
42
|
+
require 'timeout'
|
|
43
|
+
|
|
44
|
+
require 'openwfe/orest/xmlcodec'
|
|
45
|
+
require 'openwfe/participants/participant'
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
module OpenWFE
|
|
49
|
+
|
|
50
|
+
#
|
|
51
|
+
# This participant implementation dispatches workitems over TCP sockets.
|
|
52
|
+
# By default the workitem are dumped as YAML strings, but you can override
|
|
53
|
+
# the encode_workitem(wi) method.
|
|
54
|
+
#
|
|
55
|
+
# A small example :
|
|
56
|
+
#
|
|
57
|
+
# require 'openwfe/particpants/socketparticipants'
|
|
58
|
+
#
|
|
59
|
+
# sp = OpenWFE::SocketParticipant.new("target.host.xx", 7007)
|
|
60
|
+
#
|
|
61
|
+
# engine.register_participant("Alfred", sp)
|
|
62
|
+
#
|
|
63
|
+
class SocketParticipant
|
|
64
|
+
|
|
65
|
+
attr_accessor :host, :port
|
|
66
|
+
|
|
67
|
+
#
|
|
68
|
+
# The constructor
|
|
69
|
+
#
|
|
70
|
+
def initialize (host, port)
|
|
71
|
+
|
|
72
|
+
@host = host
|
|
73
|
+
@port = port
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
#
|
|
77
|
+
# The method called by the engine for each incoming workitem.
|
|
78
|
+
# Will dispatch the workitem over a TCP connection.
|
|
79
|
+
#
|
|
80
|
+
def consume (workitem)
|
|
81
|
+
|
|
82
|
+
dispatch(workitem)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def dispatch (workitem)
|
|
86
|
+
|
|
87
|
+
socket = TCPSocket.new(@host, @port)
|
|
88
|
+
socket.puts encode_workitem(workitem)
|
|
89
|
+
socket.puts
|
|
90
|
+
socket.close_write
|
|
91
|
+
|
|
92
|
+
#print "\n__socket.closed? #{socket.closed?}"
|
|
93
|
+
|
|
94
|
+
reply = fetch_reply(socket)
|
|
95
|
+
|
|
96
|
+
socket.close
|
|
97
|
+
|
|
98
|
+
decode_reply(reply)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
#
|
|
102
|
+
# A 'static' method for dispatching workitems, you can use it
|
|
103
|
+
# directly, without instantiating the SocketParticipant :
|
|
104
|
+
#
|
|
105
|
+
# require 'openwfe/participants/socketparticipants'
|
|
106
|
+
#
|
|
107
|
+
# SocketParticipant.dispatch("127.0.0.1", 7007, workitem)
|
|
108
|
+
#
|
|
109
|
+
def SocketParticipant.dispatch (host, port, workitem)
|
|
110
|
+
|
|
111
|
+
SocketParticipant.new(host, port).dispatch(workitem)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
protected
|
|
115
|
+
|
|
116
|
+
#
|
|
117
|
+
# By default, uses YAML to serialize the workitem
|
|
118
|
+
# (of course you can override this method).
|
|
119
|
+
#
|
|
120
|
+
def encode_workitem (wi)
|
|
121
|
+
YAML.dump(wi)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# By default, will just return the reply without touching it
|
|
126
|
+
#
|
|
127
|
+
def decode_reply (r)
|
|
128
|
+
r
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
#
|
|
132
|
+
# The code that waits for the reply from the server, nicely
|
|
133
|
+
# wrapped inside a timeout and a rescue block.
|
|
134
|
+
#
|
|
135
|
+
def fetch_reply (socket)
|
|
136
|
+
|
|
137
|
+
reply = ""
|
|
138
|
+
|
|
139
|
+
begin
|
|
140
|
+
|
|
141
|
+
timeout(7) do
|
|
142
|
+
while true
|
|
143
|
+
r = socket.gets
|
|
144
|
+
break unless r
|
|
145
|
+
reply << r
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
rescue Exception => e
|
|
150
|
+
puts e
|
|
151
|
+
raise "timeout while waiting for reply"
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
reply
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
#
|
|
159
|
+
# This extension of of SocketParticipant can be used to dispatch
|
|
160
|
+
# workitems towards an OpenWFEja instance, but OpenWFEru's SocketListener
|
|
161
|
+
# understands XML workitems as well.
|
|
162
|
+
#
|
|
163
|
+
class XmlSocketParticipant < SocketParticipant
|
|
164
|
+
|
|
165
|
+
#def initialize (host, port)
|
|
166
|
+
# super
|
|
167
|
+
#end
|
|
168
|
+
|
|
169
|
+
#
|
|
170
|
+
# A 'static' method for dispatching workitems, you can use it
|
|
171
|
+
# directly, without instantiating the SocketParticipant :
|
|
172
|
+
#
|
|
173
|
+
# require 'openwfe/participants/socketparticipants'
|
|
174
|
+
#
|
|
175
|
+
# SocketParticipant.dispatch("127.0.0.1", 7007, workitem)
|
|
176
|
+
#
|
|
177
|
+
def XmlSocketParticipant.dispatch (host, port, workitem)
|
|
178
|
+
|
|
179
|
+
XmlSocketParticipant.new(host, port).consume(workitem)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
protected
|
|
183
|
+
|
|
184
|
+
#
|
|
185
|
+
# This implementation encodes the workitem as an XML document.
|
|
186
|
+
# This is compatible with OpenWFEja.
|
|
187
|
+
#
|
|
188
|
+
def encode_workitem (wi)
|
|
189
|
+
|
|
190
|
+
sxml = OpenWFE::XmlCodec::encode(wi)
|
|
191
|
+
|
|
192
|
+
s = "xmlCoder #{sxml.length}\n"
|
|
193
|
+
s << "\n"
|
|
194
|
+
s << sxml
|
|
195
|
+
s << "\n"
|
|
196
|
+
s << "\n"
|
|
197
|
+
s
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
end
|
|
202
|
+
|
|
@@ -0,0 +1,254 @@
|
|
|
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 'openwfe/utils'
|
|
41
|
+
require 'openwfe/omixins'
|
|
42
|
+
require 'openwfe/storage/yamlfilestorage'
|
|
43
|
+
require 'openwfe/participants/participant'
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
module OpenWFE
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# A mixin gathering the methods a workitem store participant needs.
|
|
50
|
+
#
|
|
51
|
+
# Two kinds of methods are involved here, the ones used by the engine
|
|
52
|
+
# (its participant map) and the ones used by 'workflow clients'.
|
|
53
|
+
# Thus consume() and cancel() are triggered by the engine, and
|
|
54
|
+
# save() and forward() are at the disposal of 'workflow clients'.
|
|
55
|
+
#
|
|
56
|
+
# A 'workflow client' is supposed to use methods similar to hash methods
|
|
57
|
+
# to retrieve workitems, like in
|
|
58
|
+
#
|
|
59
|
+
# storeparticipant.each do |fei, workitem|
|
|
60
|
+
# puts "workitem : #{fei.to_s}"
|
|
61
|
+
# do_some_work(workitem)
|
|
62
|
+
# end
|
|
63
|
+
#
|
|
64
|
+
#
|
|
65
|
+
module StoreParticipantMixin
|
|
66
|
+
include LocalParticipant
|
|
67
|
+
include FeiMixin
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# optional field (only used by the old rest interface for now)
|
|
71
|
+
#
|
|
72
|
+
attr_accessor :store_name
|
|
73
|
+
|
|
74
|
+
#
|
|
75
|
+
# Called by the engine (the participant expression) when handing
|
|
76
|
+
# out a workitem (to this participant).
|
|
77
|
+
#
|
|
78
|
+
# This method can also be used when delegating a workitem from
|
|
79
|
+
# one store participant to the other.
|
|
80
|
+
#
|
|
81
|
+
def consume (workitem)
|
|
82
|
+
|
|
83
|
+
self[workitem.flow_expression_id] = workitem
|
|
84
|
+
end
|
|
85
|
+
alias :push :consume
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# Called by the participant expression when this participant is
|
|
89
|
+
# 'cancelled' within a flow. The workitem then gets removed.
|
|
90
|
+
#
|
|
91
|
+
def cancel (cancelitem)
|
|
92
|
+
|
|
93
|
+
ldebug do
|
|
94
|
+
"cancel() removing workitem #{cancelitem.flow_expression_id}"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
self.delete(cancelitem.flow_expression_id)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
#
|
|
101
|
+
# The workitem is to be stored again within the store participant,
|
|
102
|
+
# it will probably be reused later. Don't send back to engine yet.
|
|
103
|
+
#
|
|
104
|
+
def save (workitem)
|
|
105
|
+
|
|
106
|
+
raise "Workitem not found in #{self.class}, cannot save." \
|
|
107
|
+
unless self.has_key? workitem.flow_expression_id
|
|
108
|
+
|
|
109
|
+
self[workitem.flow_expression_id] = workitem
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
#
|
|
113
|
+
# The workflow client is done with the workitem, send it back to
|
|
114
|
+
# the engine and make sure it's not in the store participant anymore.
|
|
115
|
+
#
|
|
116
|
+
def forward (workitem)
|
|
117
|
+
|
|
118
|
+
raise "Workitem not found in #{self.class}, cannot forward." \
|
|
119
|
+
unless self.has_key? workitem.flow_expression_id
|
|
120
|
+
|
|
121
|
+
#self.delete(workitem.flow_expression_id)
|
|
122
|
+
self.delete(workitem)
|
|
123
|
+
|
|
124
|
+
reply_to_engine(workitem)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
#
|
|
128
|
+
# 'proceed' is just an alias for 'forward'
|
|
129
|
+
#
|
|
130
|
+
alias :proceed :forward
|
|
131
|
+
|
|
132
|
+
#
|
|
133
|
+
# This delete() method accepts a workitem or simply its FlowExpressionId
|
|
134
|
+
# identifier.
|
|
135
|
+
#
|
|
136
|
+
def delete (wi_or_fei)
|
|
137
|
+
#fei = wi_or_fei
|
|
138
|
+
#fei = fei.fei if fei.is_a? InFlowWorkItem
|
|
139
|
+
#super fei
|
|
140
|
+
super extract_fei(wi_or_fei)
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
#
|
|
144
|
+
# A convenience method for delegating a workitem to another
|
|
145
|
+
# store participant.
|
|
146
|
+
#
|
|
147
|
+
def delegate (wi_or_fei, other_store_participant)
|
|
148
|
+
wi = delete(wi_or_fei)
|
|
149
|
+
other_store_participant.push(wi)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
#
|
|
153
|
+
# Returns all the workitems for a given workflow instance id.
|
|
154
|
+
# If no workflow_instance_id is given, all the workitems will be
|
|
155
|
+
# returned.
|
|
156
|
+
#
|
|
157
|
+
def list_workitems (workflow_instance_id=nil)
|
|
158
|
+
|
|
159
|
+
result = []
|
|
160
|
+
self.each_value do |workitem|
|
|
161
|
+
result << workitem \
|
|
162
|
+
if (not workflow_instance_id) or workitem.fei.parent_wfid == workflow_instance_id
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
result
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
#
|
|
169
|
+
# Returns the first workitem at hand.
|
|
170
|
+
# As a StoreParticipant is usually implemented with a hash, two
|
|
171
|
+
# consecutive calls to this method might not return the same workitem
|
|
172
|
+
# (except if the store is empty or contains 1! workitem).
|
|
173
|
+
#
|
|
174
|
+
def first_workitem
|
|
175
|
+
|
|
176
|
+
result = nil
|
|
177
|
+
|
|
178
|
+
self.each_value do |workitem|
|
|
179
|
+
result = workitem
|
|
180
|
+
break
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
return result
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
#
|
|
188
|
+
# The simplest workitem store possible, gathers the workitem in a
|
|
189
|
+
# hash (this class is an extension of Hash).
|
|
190
|
+
#
|
|
191
|
+
# Some examples :
|
|
192
|
+
#
|
|
193
|
+
# engine.register_participant(:alice, OpenWFE::HashParticipant)
|
|
194
|
+
# engine.register_participant("bob", OpenWFE::HashParticipant)
|
|
195
|
+
#
|
|
196
|
+
# hp = engine.register_participant(:charly, OpenWFE::HashParticipant)
|
|
197
|
+
# #...
|
|
198
|
+
# puts "there are currently #{hp.size} workitems for Charly"
|
|
199
|
+
#
|
|
200
|
+
# hp = OpenWFE::HashParticipant.new
|
|
201
|
+
# engine.register_participant("debbie", hp)
|
|
202
|
+
#
|
|
203
|
+
class HashParticipant < Hash
|
|
204
|
+
include StoreParticipantMixin
|
|
205
|
+
|
|
206
|
+
# that's all...
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
#
|
|
210
|
+
# Implementation of a store participant stores the workitems in
|
|
211
|
+
# yaml file in a dedicated directory.
|
|
212
|
+
#
|
|
213
|
+
# It's quite easy to register a YamlParticipant :
|
|
214
|
+
#
|
|
215
|
+
# yp = engine.register_participant(:alex, YamlParticipant)
|
|
216
|
+
#
|
|
217
|
+
# puts yp.dirname
|
|
218
|
+
#
|
|
219
|
+
# should yield "./work/participants/alex/" (if the key :work_directory
|
|
220
|
+
# in engine.application_context is unset)
|
|
221
|
+
#
|
|
222
|
+
class YamlParticipant < YamlFileStorage
|
|
223
|
+
include StoreParticipantMixin
|
|
224
|
+
|
|
225
|
+
attr_accessor :dirname
|
|
226
|
+
|
|
227
|
+
#
|
|
228
|
+
# The constructor for YamlParticipant awaits a dirname and an
|
|
229
|
+
# application_context.
|
|
230
|
+
# The dirname should be a simple name acceptable as a filename.
|
|
231
|
+
#
|
|
232
|
+
def initialize (dirname, application_context)
|
|
233
|
+
|
|
234
|
+
@dirname = OpenWFE::ensure_for_filename(dirname.to_s)
|
|
235
|
+
|
|
236
|
+
service_name = self.class.name + "__" + @dirname
|
|
237
|
+
|
|
238
|
+
path = "/participants/" + @dirname
|
|
239
|
+
|
|
240
|
+
super(service_name, application_context, path)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
protected
|
|
244
|
+
|
|
245
|
+
def compute_file_path (fei)
|
|
246
|
+
|
|
247
|
+
@basepath +
|
|
248
|
+
fei.workflow_instance_id + "__" +
|
|
249
|
+
fei.workflow_definition_name + "_" +
|
|
250
|
+
fei.workflow_definition_revision + "__" +
|
|
251
|
+
fei.expression_id + ".yaml"
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
end
|