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,148 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2006-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
|
+
|
|
34
|
+
require 'socket'
|
|
35
|
+
|
|
36
|
+
require 'openwfe/orest/xmlcodec'
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
module OpenWFE
|
|
40
|
+
|
|
41
|
+
#
|
|
42
|
+
# This code was blogged about at
|
|
43
|
+
# http://jmettraux.wordpress.com/2006/06/01/openwfe-ruby/
|
|
44
|
+
#
|
|
45
|
+
class OldSocketListener < TCPServer
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# starts to listen on a given interface (IP) and port
|
|
49
|
+
#
|
|
50
|
+
def initialize (iface, port)
|
|
51
|
+
super(iface, port)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def listen ()
|
|
55
|
+
while (session = accept())
|
|
56
|
+
#
|
|
57
|
+
# how does it scale ?
|
|
58
|
+
|
|
59
|
+
s = session.gets
|
|
60
|
+
|
|
61
|
+
if s[0..8] != 'xmlCoder '
|
|
62
|
+
session.close
|
|
63
|
+
break
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
l = s[9..-1].to_i
|
|
67
|
+
|
|
68
|
+
s = session.gets
|
|
69
|
+
#
|
|
70
|
+
# skipping the empty line between the
|
|
71
|
+
# header and the actual workitem
|
|
72
|
+
|
|
73
|
+
sXml = ''
|
|
74
|
+
|
|
75
|
+
while sXml.length < l
|
|
76
|
+
s = session.gets
|
|
77
|
+
sXml = "#{sXml}#{s}"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
session.print "<ok-reply/>"
|
|
81
|
+
session.close
|
|
82
|
+
|
|
83
|
+
yield OpenWFE.xml_decode(xml.root)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
#
|
|
89
|
+
# Dispatches a workitem over TCP, the workitem will be
|
|
90
|
+
# encoded with XML
|
|
91
|
+
# The default encode_method is
|
|
92
|
+
#
|
|
93
|
+
def OpenWFE.dispatch_workitem (host, port, workitem)
|
|
94
|
+
|
|
95
|
+
#sXml = OpenWFE.xml_encode(workitem)
|
|
96
|
+
sXml = OpenWFE::XmlCodec::encode workitem
|
|
97
|
+
|
|
98
|
+
socket = TCPSocket.new(host, port)
|
|
99
|
+
socket.puts "xmlCoder #{sXml.length}"
|
|
100
|
+
socket.puts
|
|
101
|
+
socket.puts sXml
|
|
102
|
+
socket.puts
|
|
103
|
+
socket.close_write
|
|
104
|
+
|
|
105
|
+
reply = socket.gets
|
|
106
|
+
|
|
107
|
+
#reply = reply + socket.gets
|
|
108
|
+
#
|
|
109
|
+
# a bit ridiculous, but it works
|
|
110
|
+
# socket.close_write fixed it
|
|
111
|
+
|
|
112
|
+
socket.close
|
|
113
|
+
|
|
114
|
+
#puts "dispatch() reply is >#{reply}<"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
#
|
|
121
|
+
# some test code
|
|
122
|
+
|
|
123
|
+
#sl = OpenWFE::OldSocketListener.new('127.0.0.1', 7010)
|
|
124
|
+
#
|
|
125
|
+
#puts "..ready.."
|
|
126
|
+
#
|
|
127
|
+
#sl.listen do |workitem|
|
|
128
|
+
#
|
|
129
|
+
# #puts workitem
|
|
130
|
+
# #next
|
|
131
|
+
#
|
|
132
|
+
# puts workitem.flow_expression_id
|
|
133
|
+
# puts "...history length : #{workitem.history.length}"
|
|
134
|
+
#
|
|
135
|
+
# #puts workitem.history
|
|
136
|
+
# workitem.history.each do |hi|
|
|
137
|
+
# puts ".....hi = '#{hi.text}' #{hi.date}"
|
|
138
|
+
# end
|
|
139
|
+
#
|
|
140
|
+
# #hi = OpenWFE::HistoryItem.new
|
|
141
|
+
# #hi.author = 'osocket.rb'
|
|
142
|
+
# #workitem.history.push(hi)
|
|
143
|
+
#
|
|
144
|
+
# workitem.attributes['ruby?'] = 'yes'
|
|
145
|
+
#
|
|
146
|
+
# OpenWFE.dispatch_workitem('127.0.0.1', 7007, workitem)
|
|
147
|
+
#end
|
|
148
|
+
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2005-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
|
+
|
|
34
|
+
#
|
|
35
|
+
# "hecho en Costa Rica"
|
|
36
|
+
#
|
|
37
|
+
|
|
38
|
+
require 'base64'
|
|
39
|
+
require 'net/http'
|
|
40
|
+
require 'rexml/document'
|
|
41
|
+
|
|
42
|
+
require 'openwfe/version'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
module OpenWFE
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# A basic REST client for OpenWFE services (control and worklist)
|
|
49
|
+
#
|
|
50
|
+
class RestClient
|
|
51
|
+
|
|
52
|
+
attr_reader \
|
|
53
|
+
:host, :port, :resource, :session_id
|
|
54
|
+
|
|
55
|
+
def initialize (url, username, password)
|
|
56
|
+
|
|
57
|
+
split_url(url)
|
|
58
|
+
@username = username
|
|
59
|
+
|
|
60
|
+
connect(password)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
#
|
|
64
|
+
# Closes this REST client
|
|
65
|
+
#
|
|
66
|
+
def close
|
|
67
|
+
get('endWorkSession', nil, {})
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
protected
|
|
71
|
+
|
|
72
|
+
def decode (reply)
|
|
73
|
+
|
|
74
|
+
raise "Error : #{reply.code} - #{reply.body}" \
|
|
75
|
+
if reply.code != "200"
|
|
76
|
+
|
|
77
|
+
begin
|
|
78
|
+
xml = REXML::Document.new reply.body
|
|
79
|
+
OpenWFE::XmlCodec::decode xml.root
|
|
80
|
+
rescue Exception => e
|
|
81
|
+
if $DEBUG
|
|
82
|
+
#puts
|
|
83
|
+
#puts e.to_s
|
|
84
|
+
puts
|
|
85
|
+
puts "failed to decode reply :"
|
|
86
|
+
puts
|
|
87
|
+
puts reply.body
|
|
88
|
+
puts
|
|
89
|
+
end
|
|
90
|
+
raise e
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
#
|
|
95
|
+
# GETs a REST operation
|
|
96
|
+
#
|
|
97
|
+
def get (action, subResourceName, params)
|
|
98
|
+
|
|
99
|
+
@httpclient.get(
|
|
100
|
+
compute_resource(action, subResourceName, params))
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
#
|
|
104
|
+
# POSTs a REST operation
|
|
105
|
+
#
|
|
106
|
+
def post (action, subResourceName, params, data)
|
|
107
|
+
|
|
108
|
+
@httpclient.post(
|
|
109
|
+
compute_resource(action, subResourceName, params),
|
|
110
|
+
data.to_s)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
private
|
|
114
|
+
|
|
115
|
+
def split_url (url)
|
|
116
|
+
|
|
117
|
+
@host = nil
|
|
118
|
+
@port = nil
|
|
119
|
+
@resource = nil
|
|
120
|
+
|
|
121
|
+
url = url[7..-1] if url[0..6] == 'http://'
|
|
122
|
+
|
|
123
|
+
i = url.index('/')
|
|
124
|
+
unless i
|
|
125
|
+
@resource = '/defaultrestresource'
|
|
126
|
+
else
|
|
127
|
+
@resource = url[i..-1]
|
|
128
|
+
url = url[0..i]
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
@host, @port = url.split(':')
|
|
132
|
+
|
|
133
|
+
if @port == nil
|
|
134
|
+
@port = 5080
|
|
135
|
+
else
|
|
136
|
+
@port = Integer(@port[0..-2])
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def connect (password)
|
|
141
|
+
|
|
142
|
+
@httpclient = Net::HTTP.new(@host, @port)
|
|
143
|
+
|
|
144
|
+
hs = {}
|
|
145
|
+
hs['Authorization'] = \
|
|
146
|
+
'Basic ' + Base64.encode64(@username+":"+password).strip
|
|
147
|
+
hs['RestClient'] = "openwfe-ruby #{OPENWFERU_VERSION}"
|
|
148
|
+
hs['User-Agent'] = "openwfe-ruby #{OPENWFERU_VERSION}"
|
|
149
|
+
|
|
150
|
+
#puts "@resource is '#{@resource}'"
|
|
151
|
+
#puts "hs is '#{hs.inspect}'"
|
|
152
|
+
|
|
153
|
+
r = @httpclient.get(@resource, hs)
|
|
154
|
+
|
|
155
|
+
#xml = REXML::Document.new(r.body)
|
|
156
|
+
#@session_id = Integer(xml.root.attributes["id"])
|
|
157
|
+
|
|
158
|
+
@session_id = decode r
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def compute_resource (action, sub_resource_name, params)
|
|
162
|
+
|
|
163
|
+
reso = @resource.dup
|
|
164
|
+
reso += "/#{sub_resource_name}" if sub_resource_name
|
|
165
|
+
|
|
166
|
+
reso += "?session=#{@session_id.to_s}&action=#{action}"
|
|
167
|
+
|
|
168
|
+
params.each { |k, v|
|
|
169
|
+
reso += "&#{k.to_s}=#{v.to_s}"
|
|
170
|
+
} if params
|
|
171
|
+
|
|
172
|
+
reso
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2005-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
|
+
|
|
34
|
+
#
|
|
35
|
+
# "hecho en Costa Rica"
|
|
36
|
+
#
|
|
37
|
+
# john.mettraux@openwfe.org
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
require 'base64'
|
|
41
|
+
|
|
42
|
+
require 'openwfe/utils'
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
module OpenWFE
|
|
46
|
+
|
|
47
|
+
#--
|
|
48
|
+
# HISTORY ITEM
|
|
49
|
+
#
|
|
50
|
+
# (currently not used in OpenWFEru itself :( )
|
|
51
|
+
#++
|
|
52
|
+
|
|
53
|
+
#
|
|
54
|
+
# HistoryItem instances are used to keep track of what happened to
|
|
55
|
+
# a workitem.
|
|
56
|
+
#
|
|
57
|
+
class HistoryItem
|
|
58
|
+
|
|
59
|
+
attr_accessor \
|
|
60
|
+
:date,
|
|
61
|
+
:author,
|
|
62
|
+
:host,
|
|
63
|
+
:text,
|
|
64
|
+
:wfd_name,
|
|
65
|
+
:wfd_revision,
|
|
66
|
+
:wf_instance_id,
|
|
67
|
+
:expression_id
|
|
68
|
+
|
|
69
|
+
def dup
|
|
70
|
+
OpenWFE::fulldup(self)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
#--
|
|
76
|
+
# STORES
|
|
77
|
+
#++
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# Models the information about a store as viewed by the current user
|
|
81
|
+
# (upon calling the listStores or getStoreNames methods)
|
|
82
|
+
#
|
|
83
|
+
class Store
|
|
84
|
+
|
|
85
|
+
attr_accessor :name, :workitem_count, :permissions
|
|
86
|
+
|
|
87
|
+
def initialize ()
|
|
88
|
+
super()
|
|
89
|
+
#@name = nil
|
|
90
|
+
#@workitem_count = nil
|
|
91
|
+
#@permissions = nil
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
#
|
|
95
|
+
# Returns true if the current user may read headers and workitems
|
|
96
|
+
# from this store
|
|
97
|
+
#
|
|
98
|
+
def may_read? ()
|
|
99
|
+
return @permissions.index('r') > -1
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# Returns true if the current user may modify workitems (and at least
|
|
104
|
+
# proceed/forward them) in this store
|
|
105
|
+
#
|
|
106
|
+
def may_write? ()
|
|
107
|
+
@permissions.index('w') > -1
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
#
|
|
111
|
+
# Returns true if the current user may browse the headers of this
|
|
112
|
+
# store
|
|
113
|
+
#
|
|
114
|
+
def may_browse? ()
|
|
115
|
+
@permissions.index('b') > -1
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
#
|
|
119
|
+
# Returns true if the current user may delegate workitems to this store
|
|
120
|
+
#
|
|
121
|
+
def may_delegate? ()
|
|
122
|
+
@permissions.index('d') > -1
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
#
|
|
127
|
+
# A header is a summary of a workitem, returned by the getHeader
|
|
128
|
+
# worklist method.
|
|
129
|
+
#
|
|
130
|
+
# (Only used when accessing an OpenWFEja engine)
|
|
131
|
+
#
|
|
132
|
+
class Header < InFlowWorkItem
|
|
133
|
+
|
|
134
|
+
attr_accessor :locked
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
#--
|
|
139
|
+
# MISC ATTRIBUTES
|
|
140
|
+
#
|
|
141
|
+
# in openwfe-ruby, OpenWFE attributes are immediately mapped to
|
|
142
|
+
# Ruby instances, but some attributes still deserve their own class
|
|
143
|
+
#
|
|
144
|
+
# (Only used when accessing an OpenWFEja engine)
|
|
145
|
+
#++
|
|
146
|
+
|
|
147
|
+
#
|
|
148
|
+
# a wrapper for some binary content
|
|
149
|
+
#
|
|
150
|
+
class Base64Attribute
|
|
151
|
+
|
|
152
|
+
attr_accessor :content
|
|
153
|
+
|
|
154
|
+
def initialize (base64content)
|
|
155
|
+
|
|
156
|
+
@content = base64content
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
#
|
|
160
|
+
# dewraps (decode) the current content and returns it
|
|
161
|
+
#
|
|
162
|
+
def dewrap ()
|
|
163
|
+
|
|
164
|
+
Base64.decode64(@content)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
#
|
|
168
|
+
# wraps some binary content and stores it in this attribute
|
|
169
|
+
# (class method)
|
|
170
|
+
#
|
|
171
|
+
def Base64Attribute.wrap (binaryData)
|
|
172
|
+
|
|
173
|
+
Base64Attribute.new(Base64.encode64(binaryData))
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
#--
|
|
179
|
+
# LAUNCHABLE
|
|
180
|
+
#++
|
|
181
|
+
|
|
182
|
+
#
|
|
183
|
+
# A worklist will return list of Launchable instances indicating
|
|
184
|
+
# what processes (URL) a user may launch on which engine.
|
|
185
|
+
#
|
|
186
|
+
# (Only used when accessing an OpenWFEja engine)
|
|
187
|
+
#
|
|
188
|
+
class Launchable
|
|
189
|
+
|
|
190
|
+
attr_accessor :url, :engine_id
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
#
|
|
195
|
+
# Expression, somehow equivalent to FlowExpression, but only used
|
|
196
|
+
# by the control interface.
|
|
197
|
+
#
|
|
198
|
+
# (Only used when accessing an OpenWFEja engine)
|
|
199
|
+
#
|
|
200
|
+
class Expression
|
|
201
|
+
|
|
202
|
+
attr_accessor :id, :apply_time, :state, :state_since
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
end
|
|
206
|
+
|