ruote-maestrodev 2.2.1
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/CHANGELOG.txt +290 -0
- data/CREDITS.txt +99 -0
- data/LICENSE.txt +21 -0
- data/README.rdoc +88 -0
- data/Rakefile +108 -0
- data/TODO.txt +488 -0
- data/lib/ruote.rb +7 -0
- data/lib/ruote/context.rb +194 -0
- data/lib/ruote/engine.rb +1062 -0
- data/lib/ruote/engine/process_error.rb +122 -0
- data/lib/ruote/engine/process_status.rb +448 -0
- data/lib/ruote/exp/command.rb +87 -0
- data/lib/ruote/exp/commanded.rb +69 -0
- data/lib/ruote/exp/condition.rb +227 -0
- data/lib/ruote/exp/fe_add_branches.rb +138 -0
- data/lib/ruote/exp/fe_apply.rb +154 -0
- data/lib/ruote/exp/fe_cancel_process.rb +78 -0
- data/lib/ruote/exp/fe_command.rb +156 -0
- data/lib/ruote/exp/fe_concurrence.rb +321 -0
- data/lib/ruote/exp/fe_concurrent_iterator.rb +219 -0
- data/lib/ruote/exp/fe_cron.rb +141 -0
- data/lib/ruote/exp/fe_cursor.rb +324 -0
- data/lib/ruote/exp/fe_define.rb +112 -0
- data/lib/ruote/exp/fe_echo.rb +60 -0
- data/lib/ruote/exp/fe_equals.rb +115 -0
- data/lib/ruote/exp/fe_error.rb +82 -0
- data/lib/ruote/exp/fe_filter.rb +648 -0
- data/lib/ruote/exp/fe_forget.rb +88 -0
- data/lib/ruote/exp/fe_given.rb +154 -0
- data/lib/ruote/exp/fe_if.rb +127 -0
- data/lib/ruote/exp/fe_inc.rb +205 -0
- data/lib/ruote/exp/fe_iterator.rb +234 -0
- data/lib/ruote/exp/fe_let.rb +75 -0
- data/lib/ruote/exp/fe_listen.rb +304 -0
- data/lib/ruote/exp/fe_lose.rb +110 -0
- data/lib/ruote/exp/fe_noop.rb +45 -0
- data/lib/ruote/exp/fe_once.rb +215 -0
- data/lib/ruote/exp/fe_participant.rb +287 -0
- data/lib/ruote/exp/fe_read.rb +69 -0
- data/lib/ruote/exp/fe_redo.rb +82 -0
- data/lib/ruote/exp/fe_ref.rb +152 -0
- data/lib/ruote/exp/fe_registerp.rb +110 -0
- data/lib/ruote/exp/fe_reserve.rb +126 -0
- data/lib/ruote/exp/fe_restore.rb +102 -0
- data/lib/ruote/exp/fe_save.rb +72 -0
- data/lib/ruote/exp/fe_sequence.rb +59 -0
- data/lib/ruote/exp/fe_set.rb +154 -0
- data/lib/ruote/exp/fe_subprocess.rb +211 -0
- data/lib/ruote/exp/fe_that.rb +92 -0
- data/lib/ruote/exp/fe_undo.rb +67 -0
- data/lib/ruote/exp/fe_unregisterp.rb +69 -0
- data/lib/ruote/exp/fe_wait.rb +95 -0
- data/lib/ruote/exp/flowexpression.rb +886 -0
- data/lib/ruote/exp/iterator.rb +81 -0
- data/lib/ruote/exp/merge.rb +118 -0
- data/lib/ruote/exp/ro_attributes.rb +212 -0
- data/lib/ruote/exp/ro_filters.rb +136 -0
- data/lib/ruote/exp/ro_persist.rb +154 -0
- data/lib/ruote/exp/ro_variables.rb +189 -0
- data/lib/ruote/exp/ro_vf.rb +68 -0
- data/lib/ruote/fei.rb +260 -0
- data/lib/ruote/id/mnemo_wfid_generator.rb +43 -0
- data/lib/ruote/id/wfid_generator.rb +81 -0
- data/lib/ruote/log/default_history.rb +122 -0
- data/lib/ruote/log/pretty.rb +176 -0
- data/lib/ruote/log/storage_history.rb +159 -0
- data/lib/ruote/log/test_logger.rb +208 -0
- data/lib/ruote/log/wait_logger.rb +64 -0
- data/lib/ruote/part/block_participant.rb +137 -0
- data/lib/ruote/part/code_participant.rb +81 -0
- data/lib/ruote/part/engine_participant.rb +189 -0
- data/lib/ruote/part/local_participant.rb +138 -0
- data/lib/ruote/part/no_op_participant.rb +60 -0
- data/lib/ruote/part/null_participant.rb +54 -0
- data/lib/ruote/part/rev_participant.rb +169 -0
- data/lib/ruote/part/smtp_participant.rb +116 -0
- data/lib/ruote/part/storage_participant.rb +392 -0
- data/lib/ruote/part/template.rb +84 -0
- data/lib/ruote/participant.rb +7 -0
- data/lib/ruote/reader.rb +278 -0
- data/lib/ruote/reader/json.rb +49 -0
- data/lib/ruote/reader/radial.rb +290 -0
- data/lib/ruote/reader/ruby_dsl.rb +186 -0
- data/lib/ruote/reader/xml.rb +99 -0
- data/lib/ruote/receiver/base.rb +212 -0
- data/lib/ruote/storage/base.rb +364 -0
- data/lib/ruote/storage/composite_storage.rb +121 -0
- data/lib/ruote/storage/fs_storage.rb +139 -0
- data/lib/ruote/storage/hash_storage.rb +211 -0
- data/lib/ruote/svc/dispatch_pool.rb +158 -0
- data/lib/ruote/svc/dollar_sub.rb +298 -0
- data/lib/ruote/svc/error_handler.rb +138 -0
- data/lib/ruote/svc/expression_map.rb +97 -0
- data/lib/ruote/svc/participant_list.rb +397 -0
- data/lib/ruote/svc/tracker.rb +172 -0
- data/lib/ruote/svc/treechecker.rb +141 -0
- data/lib/ruote/tree_dot.rb +85 -0
- data/lib/ruote/util/filter.rb +525 -0
- data/lib/ruote/util/hashdot.rb +79 -0
- data/lib/ruote/util/look.rb +128 -0
- data/lib/ruote/util/lookup.rb +127 -0
- data/lib/ruote/util/misc.rb +167 -0
- data/lib/ruote/util/ometa.rb +71 -0
- data/lib/ruote/util/serializer.rb +103 -0
- data/lib/ruote/util/subprocess.rb +88 -0
- data/lib/ruote/util/time.rb +100 -0
- data/lib/ruote/util/tree.rb +58 -0
- data/lib/ruote/version.rb +29 -0
- data/lib/ruote/worker.rb +386 -0
- data/lib/ruote/workitem.rb +394 -0
- data/phil.txt +14 -0
- data/ruote.gemspec +44 -0
- data/test/bm/ci.rb +55 -0
- data/test/bm/ici.rb +71 -0
- data/test/bm/juuman.rb +54 -0
- data/test/bm/launch_bench.rb +37 -0
- data/test/bm/load_26c.rb +97 -0
- data/test/bm/mega.rb +64 -0
- data/test/bm/seq_thousand.rb +31 -0
- data/test/bm/t.rb +35 -0
- data/test/functional/base.rb +247 -0
- data/test/functional/concurrent_base.rb +98 -0
- data/test/functional/crunner.rb +31 -0
- data/test/functional/ct_0_concurrence.rb +65 -0
- data/test/functional/ct_1_iterator.rb +67 -0
- data/test/functional/ct_2_cancel.rb +81 -0
- data/test/functional/eft_0_process_definition.rb +65 -0
- data/test/functional/eft_10_cancel_process.rb +46 -0
- data/test/functional/eft_11_wait.rb +109 -0
- data/test/functional/eft_12_listen.rb +500 -0
- data/test/functional/eft_13_iterator.rb +342 -0
- data/test/functional/eft_14_cursor.rb +456 -0
- data/test/functional/eft_15_loop.rb +69 -0
- data/test/functional/eft_16_if.rb +183 -0
- data/test/functional/eft_17_equals.rb +55 -0
- data/test/functional/eft_18_concurrent_iterator.rb +410 -0
- data/test/functional/eft_19_reserve.rb +136 -0
- data/test/functional/eft_1_echo.rb +68 -0
- data/test/functional/eft_20_save.rb +116 -0
- data/test/functional/eft_21_restore.rb +61 -0
- data/test/functional/eft_22_noop.rb +28 -0
- data/test/functional/eft_23_apply.rb +168 -0
- data/test/functional/eft_24_add_branches.rb +98 -0
- data/test/functional/eft_25_command.rb +28 -0
- data/test/functional/eft_26_error.rb +77 -0
- data/test/functional/eft_27_inc.rb +280 -0
- data/test/functional/eft_28_once.rb +135 -0
- data/test/functional/eft_29_cron.rb +64 -0
- data/test/functional/eft_2_sequence.rb +58 -0
- data/test/functional/eft_30_ref.rb +155 -0
- data/test/functional/eft_31_registerp.rb +130 -0
- data/test/functional/eft_32_lose.rb +93 -0
- data/test/functional/eft_33_let.rb +31 -0
- data/test/functional/eft_34_given.rb +123 -0
- data/test/functional/eft_35_filter.rb +375 -0
- data/test/functional/eft_36_read.rb +95 -0
- data/test/functional/eft_3_participant.rb +149 -0
- data/test/functional/eft_4_set.rb +296 -0
- data/test/functional/eft_5_subprocess.rb +163 -0
- data/test/functional/eft_6_concurrence.rb +304 -0
- data/test/functional/eft_7_forget.rb +61 -0
- data/test/functional/eft_8_undo.rb +114 -0
- data/test/functional/eft_9_redo.rb +138 -0
- data/test/functional/ft_0_worker.rb +65 -0
- data/test/functional/ft_10_dollar.rb +304 -0
- data/test/functional/ft_11_recursion.rb +109 -0
- data/test/functional/ft_12_launchitem.rb +43 -0
- data/test/functional/ft_13_variables.rb +151 -0
- data/test/functional/ft_14_re_apply.rb +324 -0
- data/test/functional/ft_15_timeout.rb +226 -0
- data/test/functional/ft_16_participant_params.rb +98 -0
- data/test/functional/ft_17_conditional.rb +102 -0
- data/test/functional/ft_18_kill.rb +138 -0
- data/test/functional/ft_19_participant_code.rb +67 -0
- data/test/functional/ft_1_process_status.rb +796 -0
- data/test/functional/ft_20_storage_participant.rb +543 -0
- data/test/functional/ft_21_forget.rb +153 -0
- data/test/functional/ft_22_process_definitions.rb +90 -0
- data/test/functional/ft_23_load_defs.rb +79 -0
- data/test/functional/ft_24_block_participant.rb +235 -0
- data/test/functional/ft_25_receiver.rb +207 -0
- data/test/functional/ft_26_participant_rtimeout.rb +179 -0
- data/test/functional/ft_27_var_indirection.rb +128 -0
- data/test/functional/ft_28_null_noop_participants.rb +51 -0
- data/test/functional/ft_29_part_template.rb +60 -0
- data/test/functional/ft_2_errors.rb +380 -0
- data/test/functional/ft_30_smtp_participant.rb +122 -0
- data/test/functional/ft_31_part_blocking.rb +72 -0
- data/test/functional/ft_33_participant_subprocess_priority.rb +32 -0
- data/test/functional/ft_34_cursor_rewind.rb +101 -0
- data/test/functional/ft_35_add_service.rb +56 -0
- data/test/functional/ft_36_storage_history.rb +150 -0
- data/test/functional/ft_37_default_history.rb +109 -0
- data/test/functional/ft_38_participant_more.rb +193 -0
- data/test/functional/ft_39_wait_for.rb +136 -0
- data/test/functional/ft_3_participant_registration.rb +574 -0
- data/test/functional/ft_40_wait_logger.rb +62 -0
- data/test/functional/ft_41_participants.rb +91 -0
- data/test/functional/ft_42_storage_copy.rb +71 -0
- data/test/functional/ft_43_participant_on_reply.rb +87 -0
- data/test/functional/ft_44_var_participant.rb +35 -0
- data/test/functional/ft_45_participant_accept.rb +64 -0
- data/test/functional/ft_46_launch_single.rb +83 -0
- data/test/functional/ft_47_wfid_generator.rb +54 -0
- data/test/functional/ft_48_lose.rb +112 -0
- data/test/functional/ft_49_engine_on_error.rb +201 -0
- data/test/functional/ft_4_cancel.rb +132 -0
- data/test/functional/ft_50_engine_config.rb +22 -0
- data/test/functional/ft_51_misc.rb +67 -0
- data/test/functional/ft_52_case.rb +134 -0
- data/test/functional/ft_53_engine_on_terminate.rb +95 -0
- data/test/functional/ft_54_patterns.rb +104 -0
- data/test/functional/ft_55_engine_participant.rb +303 -0
- data/test/functional/ft_56_filter_attribute.rb +259 -0
- data/test/functional/ft_57_rev_participant.rb +252 -0
- data/test/functional/ft_58_workitem.rb +69 -0
- data/test/functional/ft_59_pause.rb +343 -0
- data/test/functional/ft_5_on_error.rb +384 -0
- data/test/functional/ft_60_code_participant.rb +45 -0
- data/test/functional/ft_61_trailing_fields.rb +34 -0
- data/test/functional/ft_62_exp_name_and_dollar_substitution.rb +35 -0
- data/test/functional/ft_6_on_cancel.rb +221 -0
- data/test/functional/ft_7_tags.rb +177 -0
- data/test/functional/ft_8_participant_consumption.rb +124 -0
- data/test/functional/ft_9_subprocesses.rb +146 -0
- data/test/functional/restart_base.rb +34 -0
- data/test/functional/rt_0_wait.rb +55 -0
- data/test/functional/rt_1_listen.rb +56 -0
- data/test/functional/rt_2_errors.rb +56 -0
- data/test/functional/rt_3_once.rb +70 -0
- data/test/functional/rt_4_cron.rb +64 -0
- data/test/functional/rt_5_timeout.rb +60 -0
- data/test/functional/rtest.rb +8 -0
- data/test/functional/storage_helper.rb +93 -0
- data/test/functional/test.rb +44 -0
- data/test/functional/vertical.rb +46 -0
- data/test/path_helper.rb +15 -0
- data/test/test.rb +13 -0
- data/test/test_helper.rb +28 -0
- data/test/unit/storage.rb +428 -0
- data/test/unit/storages.rb +37 -0
- data/test/unit/test.rb +28 -0
- data/test/unit/ut_0_ruby_reader.rb +223 -0
- data/test/unit/ut_11_lookup.rb +122 -0
- data/test/unit/ut_13_serializer.rb +65 -0
- data/test/unit/ut_14_is_uri.rb +28 -0
- data/test/unit/ut_15_util.rb +57 -0
- data/test/unit/ut_16_reader.rb +225 -0
- data/test/unit/ut_18_engine.rb +47 -0
- data/test/unit/ut_19_part_template.rb +86 -0
- data/test/unit/ut_1_fei.rb +165 -0
- data/test/unit/ut_20_composite_storage.rb +74 -0
- data/test/unit/ut_21_svc_participant_list.rb +46 -0
- data/test/unit/ut_22_filter.rb +1094 -0
- data/test/unit/ut_23_svc_tracker.rb +48 -0
- data/test/unit/ut_24_radial_reader.rb +332 -0
- data/test/unit/ut_25_merge.rb +113 -0
- data/test/unit/ut_3_wait_logger.rb +39 -0
- data/test/unit/ut_4_expmap.rb +20 -0
- data/test/unit/ut_5_tree.rb +54 -0
- data/test/unit/ut_6_condition.rb +303 -0
- data/test/unit/ut_7_workitem.rb +99 -0
- data/test/unit/ut_8_tree_to_dot.rb +72 -0
- data/test/unit/ut_9_xml_reader.rb +61 -0
- metadata +504 -0
@@ -0,0 +1,208 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
require 'ruote/log/pretty'
|
26
|
+
|
27
|
+
|
28
|
+
module Ruote
|
29
|
+
|
30
|
+
class TestLogger
|
31
|
+
|
32
|
+
include PrettyLogging
|
33
|
+
|
34
|
+
attr_reader :seen
|
35
|
+
attr_reader :log
|
36
|
+
|
37
|
+
attr_accessor :noisy
|
38
|
+
|
39
|
+
def initialize(context)
|
40
|
+
|
41
|
+
@context = context
|
42
|
+
|
43
|
+
if @context.worker
|
44
|
+
#
|
45
|
+
# this is a worker context, DO log
|
46
|
+
#
|
47
|
+
@context.worker.subscribe(:all, self)
|
48
|
+
#else
|
49
|
+
#
|
50
|
+
# this is not a worker context, DO NOT log, but be ready to
|
51
|
+
# be queried
|
52
|
+
#
|
53
|
+
end
|
54
|
+
|
55
|
+
@seen = []
|
56
|
+
@log = []
|
57
|
+
@waiting = []
|
58
|
+
|
59
|
+
@count = -1
|
60
|
+
@color = 33
|
61
|
+
@noisy = false
|
62
|
+
end
|
63
|
+
|
64
|
+
def notify(msg)
|
65
|
+
|
66
|
+
puts(pretty_print(msg)) if @noisy
|
67
|
+
|
68
|
+
if msg['action'] != 'noop'
|
69
|
+
@seen << msg
|
70
|
+
@log << msg
|
71
|
+
end
|
72
|
+
|
73
|
+
check_waiting
|
74
|
+
end
|
75
|
+
|
76
|
+
# Blocks until one or more interests are satisfied.
|
77
|
+
#
|
78
|
+
# interests must be an array of interests. Please refer to
|
79
|
+
# Engine#wait_for documentation for allowed values of each interest.
|
80
|
+
#
|
81
|
+
# If multiple interests are given, wait_for blocks until
|
82
|
+
# all of the interests are satisfied.
|
83
|
+
#
|
84
|
+
# wait_for may only be used by one thread at a time. If one
|
85
|
+
# thread calls wait_for and later another thread calls wait_for
|
86
|
+
# while the first thread is waiting, the first thread's
|
87
|
+
# interests are lost and the first thread will never wake up.
|
88
|
+
#
|
89
|
+
def wait_for(interests)
|
90
|
+
|
91
|
+
@waiting << [ Thread.current, interests ]
|
92
|
+
|
93
|
+
#check_waiting
|
94
|
+
@context.storage.put_msg('noop', {})
|
95
|
+
#
|
96
|
+
# forces the #check_waiting via #notify
|
97
|
+
# (ie let it happen in the worker)
|
98
|
+
|
99
|
+
Thread.stop if @waiting.find { |w| w.first == Thread.current }
|
100
|
+
|
101
|
+
# and when this thread gets woken up, go on and return __result__
|
102
|
+
|
103
|
+
Thread.current['__result__']
|
104
|
+
end
|
105
|
+
|
106
|
+
# Debug only : dumps all the seen events to STDOUTS
|
107
|
+
#
|
108
|
+
def dump
|
109
|
+
|
110
|
+
@seen.collect { |msg| pretty_print(msg) }.join("\n")
|
111
|
+
end
|
112
|
+
|
113
|
+
def color=(c)
|
114
|
+
|
115
|
+
@color = c
|
116
|
+
end
|
117
|
+
|
118
|
+
def self.pp(msg)
|
119
|
+
|
120
|
+
@logger ||= TestLogger.new(nil)
|
121
|
+
puts @logger.send(:pretty_print, msg)
|
122
|
+
end
|
123
|
+
|
124
|
+
protected
|
125
|
+
|
126
|
+
def check_waiting
|
127
|
+
|
128
|
+
while @waiting.any? and msg = @seen.shift
|
129
|
+
check_msg(msg)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def check_msg(msg)
|
134
|
+
|
135
|
+
wakeup = []
|
136
|
+
|
137
|
+
@waiting.each do |thread, interests|
|
138
|
+
|
139
|
+
wakeup << thread if matches(interests, msg)
|
140
|
+
end
|
141
|
+
|
142
|
+
@waiting.delete_if { |t, i| i.size < 1 }
|
143
|
+
|
144
|
+
wakeup.each do |thread|
|
145
|
+
|
146
|
+
thread['__result__'] = msg
|
147
|
+
thread.wakeup
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
FINAL_ACTIONS = %w[ terminated ceased error_intercepted ]
|
152
|
+
|
153
|
+
# Checks whether message msg matches any of interests being waited for.
|
154
|
+
#
|
155
|
+
# Some interests look for actions on particular workflows (e.g.,
|
156
|
+
# waiting for some workflow to finish). Other interests are not
|
157
|
+
# attached to any particular workflow (e.g., :inactive waits until
|
158
|
+
# the engine finishes processing all active and pending workflows)
|
159
|
+
# but are still satisfied when actions happen on workflows (e.g.,
|
160
|
+
# the last workflow being run finishes).
|
161
|
+
#
|
162
|
+
# Returns true if all interests being waited for have been satisfied,
|
163
|
+
# false otherwise.
|
164
|
+
#
|
165
|
+
def matches(interests, msg)
|
166
|
+
|
167
|
+
action = msg['action']
|
168
|
+
|
169
|
+
interests.each do |interest|
|
170
|
+
|
171
|
+
satisfied = case interest
|
172
|
+
|
173
|
+
when :inactive
|
174
|
+
|
175
|
+
(FINAL_ACTIONS.include?(action) && @context.worker.inactive?)
|
176
|
+
|
177
|
+
when :empty
|
178
|
+
|
179
|
+
(action == 'terminated' && @context.storage.empty?('expressions'))
|
180
|
+
|
181
|
+
when Symbol
|
182
|
+
|
183
|
+
(action == 'dispatch' && msg['participant_name'] == interest.to_s)
|
184
|
+
|
185
|
+
when Fixnum
|
186
|
+
|
187
|
+
interests.delete(interest)
|
188
|
+
|
189
|
+
if (interest > 1)
|
190
|
+
interests << (interest - 1)
|
191
|
+
false
|
192
|
+
else
|
193
|
+
true
|
194
|
+
end
|
195
|
+
|
196
|
+
else # wfid
|
197
|
+
|
198
|
+
(FINAL_ACTIONS.include?(action) && msg['wfid'] == interest)
|
199
|
+
end
|
200
|
+
|
201
|
+
interests.delete(interest) if satisfied
|
202
|
+
end
|
203
|
+
|
204
|
+
interests.size < 1
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
require 'ruote/log/test_logger'
|
26
|
+
|
27
|
+
|
28
|
+
module Ruote
|
29
|
+
|
30
|
+
#
|
31
|
+
# A helper logger for quickstart examples.
|
32
|
+
#
|
33
|
+
# Keeps a maximum of 147 messages.
|
34
|
+
#
|
35
|
+
class WaitLogger < TestLogger
|
36
|
+
|
37
|
+
attr_accessor :noisy
|
38
|
+
|
39
|
+
def initialize(context)
|
40
|
+
|
41
|
+
@context = context
|
42
|
+
@color = 33
|
43
|
+
|
44
|
+
@context.worker.subscribe(:all, self) if @context.worker
|
45
|
+
|
46
|
+
@noisy = false
|
47
|
+
@count = -1
|
48
|
+
|
49
|
+
@seen = []
|
50
|
+
@waiting = []
|
51
|
+
end
|
52
|
+
|
53
|
+
def notify(msg)
|
54
|
+
|
55
|
+
puts(pretty_print(msg)) if @noisy
|
56
|
+
|
57
|
+
@seen << msg if msg['action'] != 'noop'
|
58
|
+
@seen.shift if @seen.size > 147
|
59
|
+
|
60
|
+
check_waiting
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
@@ -0,0 +1,137 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
|
26
|
+
module Ruote
|
27
|
+
|
28
|
+
#
|
29
|
+
# One of the simplest participants. Simply passes a workitem to a block
|
30
|
+
# of ruby code.
|
31
|
+
#
|
32
|
+
# engine.register_participant :alpha do |workitem|
|
33
|
+
# workitem.fields['time'] = Time.now
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# This participant implicitely replies to the engine when the block execution
|
37
|
+
# is over.
|
38
|
+
#
|
39
|
+
# You can pass the flow_expression (participant expression) as well.
|
40
|
+
#
|
41
|
+
# engine.register_participant :alpha do |workitem, flow_exp|
|
42
|
+
# workitem.fields['amount'] = flow_exp.lookup_variable('amount')
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
#
|
46
|
+
# == do_not_thread
|
47
|
+
#
|
48
|
+
# By default, this participant (like most other participants) is executed
|
49
|
+
# in its own thread.
|
50
|
+
#
|
51
|
+
class BlockParticipant
|
52
|
+
|
53
|
+
include LocalParticipant
|
54
|
+
|
55
|
+
attr_accessor :context
|
56
|
+
|
57
|
+
def initialize(opts)
|
58
|
+
|
59
|
+
@opts = opts
|
60
|
+
end
|
61
|
+
|
62
|
+
def consume(workitem)
|
63
|
+
|
64
|
+
block = get_block('on_workitem', 'block')
|
65
|
+
|
66
|
+
r = if block.arity == 1
|
67
|
+
|
68
|
+
block.call(workitem)
|
69
|
+
|
70
|
+
else
|
71
|
+
|
72
|
+
block.call(
|
73
|
+
workitem, Ruote::Exp::FlowExpression.fetch(@context, workitem.h.fei))
|
74
|
+
end
|
75
|
+
|
76
|
+
if r != nil && r != workitem
|
77
|
+
workitem.result = (Rufus::Json.dup(r) rescue nil)
|
78
|
+
end
|
79
|
+
|
80
|
+
reply_to_engine(workitem)
|
81
|
+
end
|
82
|
+
|
83
|
+
def cancel(fei, flavour)
|
84
|
+
|
85
|
+
if block = get_block('on_cancel')
|
86
|
+
block.call(fei, flavour)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def on_reply(workitem)
|
91
|
+
|
92
|
+
if block = get_block('on_reply')
|
93
|
+
block.call(workitem)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def accept?(workitem)
|
98
|
+
|
99
|
+
if block = get_block('accept?')
|
100
|
+
block.call(workitem)
|
101
|
+
else
|
102
|
+
true
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def do_not_thread(workitem)
|
107
|
+
|
108
|
+
dnt = @opts['do_not_thread']
|
109
|
+
|
110
|
+
return dnt unless dnt.is_a?(String)
|
111
|
+
|
112
|
+
block = get_block('do_not_thread')
|
113
|
+
|
114
|
+
block.call(workitem)
|
115
|
+
end
|
116
|
+
|
117
|
+
protected
|
118
|
+
|
119
|
+
def get_block(*keys)
|
120
|
+
|
121
|
+
key = keys.find { |k| @opts[k] }
|
122
|
+
|
123
|
+
return nil unless key
|
124
|
+
|
125
|
+
block = @opts[key]
|
126
|
+
|
127
|
+
@context.treechecker.block_check(block)
|
128
|
+
# raises in case of 'security' violation
|
129
|
+
|
130
|
+
#eval(block, @context.send(:binding))
|
131
|
+
# doesn't work with ruby 1.9.2-p136
|
132
|
+
eval(block, @context.instance_eval { binding })
|
133
|
+
# works OK with ruby 1.8.7-249 and 1.9.2-p136
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
# Made in Japan.
|
23
|
+
#++
|
24
|
+
|
25
|
+
|
26
|
+
module Ruote
|
27
|
+
|
28
|
+
#
|
29
|
+
# TODO
|
30
|
+
#
|
31
|
+
class CodeParticipant
|
32
|
+
|
33
|
+
include LocalParticipant
|
34
|
+
|
35
|
+
attr_accessor :context
|
36
|
+
|
37
|
+
def initialize(opts)
|
38
|
+
|
39
|
+
@opts = opts
|
40
|
+
end
|
41
|
+
|
42
|
+
def context=(con)
|
43
|
+
|
44
|
+
@context = con
|
45
|
+
|
46
|
+
@context.treechecker.code_check(@opts['code'])
|
47
|
+
|
48
|
+
instance_eval(@opts['code'])
|
49
|
+
|
50
|
+
#instance_eval do
|
51
|
+
# alias code_consume consume
|
52
|
+
# def consume(workitem)
|
53
|
+
# code_consume(workitem)
|
54
|
+
# rescue => e
|
55
|
+
# raise e
|
56
|
+
# end
|
57
|
+
# # what about doing that with other methods
|
58
|
+
#end
|
59
|
+
end
|
60
|
+
|
61
|
+
protected
|
62
|
+
|
63
|
+
# def get_block(*keys)
|
64
|
+
#
|
65
|
+
# key = keys.find { |k| @opts[k] }
|
66
|
+
#
|
67
|
+
# return nil unless key
|
68
|
+
#
|
69
|
+
# block = @opts[key]
|
70
|
+
#
|
71
|
+
# @context.treechecker.block_check(block)
|
72
|
+
# # raises in case of 'security' violation
|
73
|
+
#
|
74
|
+
# #eval(block, @context.send(:binding))
|
75
|
+
# # doesn't work with ruby 1.9.2-p136
|
76
|
+
# eval(block, @context.instance_eval { binding })
|
77
|
+
# # works OK with ruby 1.8.7-249 and 1.9.2-p136
|
78
|
+
# end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|