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,24 @@
|
|
|
1
|
+
|
|
2
|
+
#
|
|
3
|
+
# a little script that traces the flow given as input
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
require 'rubygems'
|
|
7
|
+
|
|
8
|
+
require 'openwfe/expressions/raw_prog'
|
|
9
|
+
require 'openwfe/tools/flowtracer'
|
|
10
|
+
|
|
11
|
+
class MyProcessDefinition < OpenWFE::ProcessDefinition
|
|
12
|
+
def make
|
|
13
|
+
process_definition :name => "mpd", :revision => "0" do
|
|
14
|
+
sequence do
|
|
15
|
+
participant "alpha"
|
|
16
|
+
set :field => "toto", :value => "toto value"
|
|
17
|
+
participant "bravo"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
OpenWFE::trace_flow(MyProcessDefinition)
|
|
24
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
|
|
2
|
+
### EXAMPLE IN PREPARATION ###
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# an OpenWFEru example
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
require 'rubygems'
|
|
9
|
+
|
|
10
|
+
require 'openwfe/engine/engine'
|
|
11
|
+
require 'openwfe/expressions/raw_prog'
|
|
12
|
+
#require 'openwfe/participants/soapparticipants'
|
|
13
|
+
#require 'openwfe/participants/atomparticipants'
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# the process definition
|
|
18
|
+
#
|
|
19
|
+
# instead of using the classical OpenWFE XML process definitions, we
|
|
20
|
+
# define the flow as a Ruby class
|
|
21
|
+
|
|
22
|
+
class ReviewFlow < OpenWFE::ProcessDefinition
|
|
23
|
+
def make
|
|
24
|
+
process_definition :name => "homework_review", :revision => "0.1" do
|
|
25
|
+
sequence do
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
#
|
|
32
|
+
# the engine
|
|
33
|
+
#
|
|
34
|
+
# a simple in memory engine, no persistence whatsoever for now.
|
|
35
|
+
|
|
36
|
+
engine = OpenWFE::Engine.new
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# The Participants
|
|
40
|
+
#
|
|
41
|
+
# Ideally participants are shared by more than one process definition
|
|
42
|
+
# (a person is usually part of more than one business process in
|
|
43
|
+
# his organization)
|
|
44
|
+
|
|
45
|
+
# a small debug participant, as you can see, a participant can
|
|
46
|
+
# directly be a ruby block (which receives the workitem)
|
|
47
|
+
# (it's commented out at the end of the flow)
|
|
48
|
+
#
|
|
49
|
+
engine.register_participant("puts_workitem") do |workitem|
|
|
50
|
+
puts
|
|
51
|
+
puts workitem.to_s
|
|
52
|
+
puts
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
#
|
|
56
|
+
# launching
|
|
57
|
+
|
|
58
|
+
launchitem = LaunchItem.new(QuoteLookupFlow)
|
|
59
|
+
#
|
|
60
|
+
# Passing the process definition class as the unique
|
|
61
|
+
# LaunchItem parameter
|
|
62
|
+
|
|
63
|
+
launchitem.symbols = "aapl, sunw, msft, lnux"
|
|
64
|
+
#
|
|
65
|
+
# directly setting the value for the field "symbols"
|
|
66
|
+
|
|
67
|
+
engine.launch(launchitem)
|
|
68
|
+
|
data/examples/kotoba.rb
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
require 'pp'
|
|
3
|
+
require 'rubygems'
|
|
4
|
+
require 'openwfe/util/kotoba'
|
|
5
|
+
|
|
6
|
+
3.times do
|
|
7
|
+
|
|
8
|
+
i = (rand * 1000000).to_i
|
|
9
|
+
s = Kotoba::from_integer i
|
|
10
|
+
|
|
11
|
+
puts "#{i} => #{s}"
|
|
12
|
+
puts "#{s} => #{Kotoba::to_integer(s)}"
|
|
13
|
+
# forth and back
|
|
14
|
+
|
|
15
|
+
a = Kotoba::split s
|
|
16
|
+
|
|
17
|
+
print "#{s} => "; pp a
|
|
18
|
+
# showing how the 'word' is split
|
|
19
|
+
|
|
20
|
+
puts "."
|
|
21
|
+
end
|
|
22
|
+
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
#
|
|
2
|
+
#--
|
|
3
|
+
# Copyright (c) 2007, John Mettraux OpenWFE.org
|
|
4
|
+
# All rights reserved.
|
|
5
|
+
#
|
|
6
|
+
# Redistribution and use in source and binary forms, with or without
|
|
7
|
+
# modification, are permitted provided that the following conditions are met:
|
|
8
|
+
#
|
|
9
|
+
# . Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
# list of conditions and the following disclaimer.
|
|
11
|
+
#
|
|
12
|
+
# . Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
# this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
# and/or other materials provided with the distribution.
|
|
15
|
+
#
|
|
16
|
+
# . Neither the name of the "OpenWFE" nor the names of its contributors may be
|
|
17
|
+
# used to endorse or promote products derived from this software without
|
|
18
|
+
# specific prior written permission.
|
|
19
|
+
#
|
|
20
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
23
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
24
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
25
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
26
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
27
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
28
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
29
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
30
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
|
31
|
+
#++
|
|
32
|
+
#
|
|
33
|
+
# $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# "made in Japan"
|
|
38
|
+
#
|
|
39
|
+
# John Mettraux at openwfe.org
|
|
40
|
+
#
|
|
41
|
+
|
|
42
|
+
#
|
|
43
|
+
# see
|
|
44
|
+
# http://groups.google.com/group/openwferu-users/browse_frm/thread/81294030fc52cd04
|
|
45
|
+
# for the context of this example
|
|
46
|
+
#
|
|
47
|
+
|
|
48
|
+
require 'rubygems'
|
|
49
|
+
|
|
50
|
+
#require 'openwfe/engine/engine'
|
|
51
|
+
require 'openwfe/engine/file_persisted_engine'
|
|
52
|
+
require 'openwfe/expressions/raw_prog'
|
|
53
|
+
require 'openwfe/worklist/storeparticipant'
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# The process definition
|
|
58
|
+
# (using a programmatic process definition instead of an XML process definition)
|
|
59
|
+
|
|
60
|
+
class TrackerDefinition < OpenWFE::ProcessDefinition
|
|
61
|
+
def make
|
|
62
|
+
|
|
63
|
+
_loop do
|
|
64
|
+
participant "${f:creative}"
|
|
65
|
+
participant "${f:analyst}"
|
|
66
|
+
|
|
67
|
+
_break :if => "${f:done}"
|
|
68
|
+
#
|
|
69
|
+
# loops until the analyst sets the value of the field
|
|
70
|
+
# 'done' to true.
|
|
71
|
+
end
|
|
72
|
+
#
|
|
73
|
+
# 'loop' and 'break' are ruby keywords, they have to be
|
|
74
|
+
# preceded by an underscore '_' to be used in their
|
|
75
|
+
# OpenWFEru sense.
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
#
|
|
80
|
+
# prepare the engine and the participants
|
|
81
|
+
|
|
82
|
+
ANALYSTS = [ "Mano", "Matt", "Moe" ]
|
|
83
|
+
CREATIVES = [ "Jamie", "Jeff", "John", "Jeremy" ]
|
|
84
|
+
|
|
85
|
+
#
|
|
86
|
+
# instantiate the engine (a transient one is sufficient for the example)
|
|
87
|
+
|
|
88
|
+
#$engine = OpenWFE::Engine.new
|
|
89
|
+
# no persistence
|
|
90
|
+
|
|
91
|
+
#$engine = OpenWFE::FilePersistedEngine.new
|
|
92
|
+
# persistence, but no caching (worst performance)
|
|
93
|
+
|
|
94
|
+
$engine = OpenWFE::CachedFilePersistedEngine.new
|
|
95
|
+
# persistence and performance
|
|
96
|
+
|
|
97
|
+
$analyst_stores = {}
|
|
98
|
+
$creative_stores = {}
|
|
99
|
+
#
|
|
100
|
+
# gathering the stores for our fictitious organization
|
|
101
|
+
|
|
102
|
+
def add_stores (names, store_map)
|
|
103
|
+
names.each do |name|
|
|
104
|
+
#hp = OpenWFE::HashParticipant.new
|
|
105
|
+
#$engine.register_participant(name, hp)
|
|
106
|
+
hp = $engine.register_participant(name, OpenWFE::YamlParticipant)
|
|
107
|
+
store_map[name] = hp
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
add_stores(ANALYSTS, $analyst_stores)
|
|
112
|
+
add_stores(CREATIVES, $creative_stores)
|
|
113
|
+
|
|
114
|
+
#
|
|
115
|
+
# a quick method for launching a tracker process instance
|
|
116
|
+
#
|
|
117
|
+
def launch_tracker (analyst_name, creative_name, title, item_url)
|
|
118
|
+
|
|
119
|
+
li = LaunchItem.new(TrackerDefinition)
|
|
120
|
+
#
|
|
121
|
+
# preparing a lunchitem ;) around our TrackerDefinition
|
|
122
|
+
|
|
123
|
+
li.analyst = analyst_name
|
|
124
|
+
li.creative = creative_name
|
|
125
|
+
li.title = title
|
|
126
|
+
li.item_url = item_url
|
|
127
|
+
#
|
|
128
|
+
# filling the workitem with attributes
|
|
129
|
+
|
|
130
|
+
$engine.launch(li)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# the system is ready...
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
#
|
|
137
|
+
# (...)
|
|
138
|
+
#
|
|
139
|
+
# Later it can be used as follow
|
|
140
|
+
|
|
141
|
+
fei = launch_tracker(
|
|
142
|
+
"Mano",
|
|
143
|
+
"Jamie",
|
|
144
|
+
"new logo for company",
|
|
145
|
+
"http://openwferu.rubyforge.org/images/openwfe-logo.png")
|
|
146
|
+
|
|
147
|
+
puts "launched tracker process #{fei.workflow_instance_id}"
|
|
148
|
+
|
|
149
|
+
#
|
|
150
|
+
# the creative Jamie can browse the items he has to treat with :
|
|
151
|
+
|
|
152
|
+
jamie_store = $analyst_stores["Jamie"]
|
|
153
|
+
|
|
154
|
+
first_fei = nil
|
|
155
|
+
|
|
156
|
+
jamie_store.each do |fei, workitem|
|
|
157
|
+
first_fei = fei unless fei
|
|
158
|
+
puts " - #{fei.workflow_instance_id} -- #{workitem.title}"
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
workitem = jamie_store[first_fei]
|
|
162
|
+
|
|
163
|
+
# play with the workitem and then send it back to the engine
|
|
164
|
+
|
|
165
|
+
workitem.item_url = "some other url"
|
|
166
|
+
#
|
|
167
|
+
# actually just changing the item_url
|
|
168
|
+
|
|
169
|
+
jamie_store.forward(workitem)
|
|
170
|
+
|
|
171
|
+
# ...
|
|
172
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
|
|
2
|
+
require 'rubygems'
|
|
3
|
+
require 'openwfe/def'
|
|
4
|
+
require 'openwfe/workitem'
|
|
5
|
+
require 'openwfe/engine/engine'
|
|
6
|
+
|
|
7
|
+
#
|
|
8
|
+
# instantiating an engine
|
|
9
|
+
|
|
10
|
+
engine = OpenWFE::Engine.new
|
|
11
|
+
|
|
12
|
+
#
|
|
13
|
+
# adding some participants
|
|
14
|
+
|
|
15
|
+
engine.register_participant :alice do |workitem|
|
|
16
|
+
puts "alice got a workitem..."
|
|
17
|
+
workitem.alice_comment = "this thing looks interesting"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
engine.register_participant :bob do |workitem|
|
|
21
|
+
puts "bob got a workitem..."
|
|
22
|
+
workitem.bob_comment = "not for me, I prefer VB"
|
|
23
|
+
workitem.bob_comment2 = "Bob rules"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
engine.register_participant :summarize do |workitem|
|
|
27
|
+
puts
|
|
28
|
+
puts "summary of process #{workitem.fei.workflow_instance_id}"
|
|
29
|
+
workitem.attributes.each do |k, v|
|
|
30
|
+
next unless k.match ".*_comment$"
|
|
31
|
+
puts " - #{k} : '#{v}'"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
#
|
|
36
|
+
# a process definition
|
|
37
|
+
|
|
38
|
+
class TheProcessDefinition0 < OpenWFE::ProcessDefinition
|
|
39
|
+
sequence do
|
|
40
|
+
concurrence do
|
|
41
|
+
participant :alice
|
|
42
|
+
participant :bob
|
|
43
|
+
end
|
|
44
|
+
participant :summarize
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
#
|
|
49
|
+
# launching the process
|
|
50
|
+
|
|
51
|
+
li = OpenWFE::LaunchItem.new(TheProcessDefinition0)
|
|
52
|
+
|
|
53
|
+
li.initial_comment = "please give your impressions about http://ruby-lang.org"
|
|
54
|
+
|
|
55
|
+
fei = engine.launch(li)
|
|
56
|
+
|
|
57
|
+
engine.wait_for fei
|
|
58
|
+
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
|
|
2
|
+
#
|
|
3
|
+
# an OpenWFEru example
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
require 'rubygems'
|
|
7
|
+
|
|
8
|
+
require 'openwfe/engine/engine'
|
|
9
|
+
require 'openwfe/expressions/raw_prog'
|
|
10
|
+
require 'openwfe/participants/soapparticipants'
|
|
11
|
+
require 'openwfe/participants/atomparticipants'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# the process definition
|
|
16
|
+
#
|
|
17
|
+
# instead of using the classical OpenWFE XML process definitions, we
|
|
18
|
+
# define the flow as a Ruby class
|
|
19
|
+
|
|
20
|
+
class QuoteLookupFlow < OpenWFE::ProcessDefinition
|
|
21
|
+
def make
|
|
22
|
+
process_definition :name => "quote_lookup", :revision => "0.1" do
|
|
23
|
+
sequence do
|
|
24
|
+
|
|
25
|
+
#
|
|
26
|
+
# lookup quotes
|
|
27
|
+
|
|
28
|
+
iterator :on_field_value => "symbols", :to_field => "symbol" do
|
|
29
|
+
sequence do
|
|
30
|
+
|
|
31
|
+
set \
|
|
32
|
+
:field => "quote_${f:__ip__}_name",
|
|
33
|
+
:field_value => "symbol"
|
|
34
|
+
|
|
35
|
+
participant :quote_service
|
|
36
|
+
|
|
37
|
+
set \
|
|
38
|
+
:field => "quote_${f:__ip__}_value",
|
|
39
|
+
:field_value => "__result__"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
#
|
|
44
|
+
# update feed
|
|
45
|
+
|
|
46
|
+
set :field => "atom_entry_title" do
|
|
47
|
+
"quote feed at ${r:Time.now}"
|
|
48
|
+
end
|
|
49
|
+
#
|
|
50
|
+
# wrapping some ruby code for eval at runtime
|
|
51
|
+
# with ${r: ruby code ... }
|
|
52
|
+
|
|
53
|
+
participant :feed
|
|
54
|
+
|
|
55
|
+
#participant :ref => "puts_workitem"
|
|
56
|
+
#participant :ref => :puts_workitem
|
|
57
|
+
#participant "puts_workitem"
|
|
58
|
+
#participant :puts_workitem
|
|
59
|
+
puts_workitem
|
|
60
|
+
#
|
|
61
|
+
# the five notations are equivalent
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
#
|
|
68
|
+
# the engine
|
|
69
|
+
#
|
|
70
|
+
# a simple in memory engine, no persistence whatsoever for now.
|
|
71
|
+
|
|
72
|
+
engine = OpenWFE::Engine.new
|
|
73
|
+
|
|
74
|
+
#
|
|
75
|
+
# The Participants
|
|
76
|
+
#
|
|
77
|
+
# Ideally participants are shared by more than one process definition
|
|
78
|
+
# (a person is usually part of more than one business process in
|
|
79
|
+
# his organization)
|
|
80
|
+
|
|
81
|
+
# the participant that looks up the quote values
|
|
82
|
+
#
|
|
83
|
+
quote_service = OpenWFE::SoapParticipant.new(
|
|
84
|
+
"http://services.xmethods.net/soap", # service URI
|
|
85
|
+
"urn:xmethods-delayed-quotes", # namespace
|
|
86
|
+
"getQuote", # operation name
|
|
87
|
+
[ "symbol" ]) # param arrays (workitem fields)
|
|
88
|
+
|
|
89
|
+
engine.register_participant("quote_service", quote_service)
|
|
90
|
+
|
|
91
|
+
# the feed : at most 10 feed entries are kept.
|
|
92
|
+
#
|
|
93
|
+
# The entry template is specified as a block returning the template
|
|
94
|
+
# (a string containing xhtml).
|
|
95
|
+
#
|
|
96
|
+
# The feed is outputted in the current working directory ./atom_feed.xml
|
|
97
|
+
#
|
|
98
|
+
feed = OpenWFE::AtomParticipant.new(10) do
|
|
99
|
+
| flow_expression, participant, workitem |
|
|
100
|
+
|
|
101
|
+
#
|
|
102
|
+
# the template (xhtml by default) is generated via a block
|
|
103
|
+
|
|
104
|
+
s = "<h3>quotes</h3>"
|
|
105
|
+
|
|
106
|
+
s << "<ul>"
|
|
107
|
+
|
|
108
|
+
workitem.__ic__.times do |i|
|
|
109
|
+
#
|
|
110
|
+
# within an iteration, the count of iterations is stored in the
|
|
111
|
+
# workitem field "__ic__"
|
|
112
|
+
#
|
|
113
|
+
s << "<li>"
|
|
114
|
+
s << workitem.attributes["quote_#{i}_name"].to_s
|
|
115
|
+
s << " : "
|
|
116
|
+
s << workitem.attributes["quote_#{i}_value"].to_s
|
|
117
|
+
s << "</li>\n"
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
s << "</ul>"
|
|
121
|
+
end
|
|
122
|
+
engine.register_participant("feed", feed)
|
|
123
|
+
|
|
124
|
+
# a small debug participant, as you can see, a participant can
|
|
125
|
+
# directly be a ruby block (which receives the workitem)
|
|
126
|
+
# (it's commented out at the end of the flow)
|
|
127
|
+
#
|
|
128
|
+
engine.register_participant("puts_workitem") do |workitem|
|
|
129
|
+
puts
|
|
130
|
+
puts workitem.to_s
|
|
131
|
+
puts
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
#
|
|
135
|
+
# launching (not lunching)
|
|
136
|
+
|
|
137
|
+
launchitem = LaunchItem.new(QuoteLookupFlow)
|
|
138
|
+
#
|
|
139
|
+
# Passing the process definition class as the unique
|
|
140
|
+
# LaunchItem parameter
|
|
141
|
+
|
|
142
|
+
launchitem.symbols = "aapl, sunw, msft, lnux"
|
|
143
|
+
#
|
|
144
|
+
# directly setting the value for the field "symbols"
|
|
145
|
+
|
|
146
|
+
engine.launch(launchitem)
|
|
147
|
+
|
|
148
|
+
# in this example, the engine is used once with only one process definition,
|
|
149
|
+
# but an OpenWFE engine is made to run multiple different process instances.
|
|
150
|
+
|
|
151
|
+
# as an extension example, to produce a feed for the next ten hours you would :
|
|
152
|
+
#
|
|
153
|
+
# 10.times do
|
|
154
|
+
# engine.launch(launchitem)
|
|
155
|
+
# sleep (3600) # one hour
|
|
156
|
+
# end
|
|
157
|
+
|