openwferu 0.9.6 → 0.9.7
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/validate-workflow.rb +1 -0
- data/examples/openwferu.rb +57 -0
- data/lib/openwfe/contextual.rb +2 -0
- data/lib/openwfe/engine/engine.rb +109 -17
- data/lib/openwfe/engine/file_persisted_engine.rb +11 -1
- data/lib/openwfe/exceptions.rb +53 -0
- data/lib/openwfe/expool/expressionpool.rb +195 -137
- data/lib/openwfe/expool/journal.rb +175 -0
- data/lib/openwfe/expool/journal_replay.rb +121 -0
- data/lib/openwfe/expool/wfidgen.rb +318 -0
- data/lib/openwfe/expool/yamlexpstorage.rb +23 -54
- data/lib/openwfe/expressions/condition.rb +14 -2
- data/lib/openwfe/expressions/environment.rb +47 -37
- data/lib/openwfe/expressions/expressionmap.rb +73 -67
- data/lib/openwfe/expressions/fe_cancel.rb +2 -0
- data/lib/openwfe/expressions/fe_concurrence.rb +14 -1
- data/lib/openwfe/expressions/fe_cron.rb +186 -0
- data/lib/openwfe/expressions/fe_cursor.rb +6 -0
- data/lib/openwfe/expressions/fe_define.rb +2 -0
- data/lib/openwfe/expressions/fe_fqv.rb +2 -0
- data/lib/openwfe/expressions/fe_iterator.rb +2 -0
- data/lib/openwfe/expressions/fe_losfor.rb +4 -0
- data/lib/openwfe/expressions/fe_misc.rb +16 -1
- data/lib/openwfe/expressions/fe_participant.rb +7 -0
- data/lib/openwfe/expressions/fe_raw.rb +125 -8
- data/lib/openwfe/expressions/fe_sequence.rb +2 -0
- data/lib/openwfe/expressions/fe_sleep.rb +213 -0
- data/lib/openwfe/expressions/fe_subprocess.rb +2 -0
- data/lib/openwfe/expressions/fe_value.rb +8 -0
- data/lib/openwfe/expressions/fe_when.rb +205 -0
- data/lib/openwfe/expressions/flowexpression.rb +62 -9
- data/lib/openwfe/expressions/raw_prog.rb +147 -45
- data/lib/openwfe/expressions/raw_xml.rb +50 -5
- data/lib/openwfe/expressions/timeout.rb +32 -5
- data/lib/openwfe/flowexpressionid.rb +6 -4
- data/lib/openwfe/listeners/listeners.rb +4 -3
- data/lib/openwfe/listeners/socketlisteners.rb +30 -4
- data/lib/openwfe/logging.rb +9 -1
- data/lib/openwfe/participants/participants.rb +9 -9
- data/lib/openwfe/participants/socketparticipants.rb +41 -8
- data/lib/openwfe/rudefinitions.rb +21 -0
- data/lib/openwfe/storage/yamlextras.rb +115 -0
- data/lib/openwfe/storage/yamlfilestorage.rb +23 -4
- data/lib/openwfe/util/csvtable.rb +76 -6
- data/lib/openwfe/util/dollar.rb +5 -0
- data/lib/openwfe/util/kotoba.rb +236 -0
- data/lib/openwfe/util/ometa.rb +64 -0
- data/lib/openwfe/util/safe.rb +2 -0
- data/lib/openwfe/util/scheduler.rb +58 -11
- data/lib/openwfe/utils.rb +27 -0
- data/lib/openwfe/version.rb +1 -1
- data/lib/openwfe/worklist/storeparticipant.rb +2 -3
- data/test/csv_test.rb +57 -0
- data/test/expmap_test.rb +54 -0
- data/test/file_persistence_test.rb +9 -9
- data/test/flowtestbase.rb +19 -1
- data/test/ft_11_ppd.rb +18 -0
- data/test/ft_15_iterator.rb +27 -0
- data/test/ft_23b_when.rb +2 -2
- data/test/ft_27_getflowpos.rb +19 -9
- data/test/ft_29_httprb.rb +31 -2
- data/test/ft_30_socketlistener.rb +3 -5
- data/test/ft_31_flowname.rb +40 -0
- data/test/ft_32_journal.rb +60 -0
- data/test/ft_33_description.rb +100 -0
- data/test/ft_34_cancelwfid.rb +69 -0
- data/test/ft_35_localdefs.rb +63 -0
- data/test/ft_7_lose.rb +0 -61
- data/test/ft_7b_lose.rb +85 -0
- data/test/ft_tests.rb +49 -0
- data/test/kotoba_test.rb +72 -0
- data/test/misc_test.rb +4 -12
- data/test/param_test.rb +284 -0
- data/test/rake_qtest.rb +13 -35
- data/test/rake_test.rb +2 -3
- data/test/raw_prog_test.rb +9 -7
- data/test/restart_cron_test.rb +9 -5
- data/test/restart_sleep_test.rb +104 -0
- data/test/restart_tests.rb +15 -0
- data/test/restart_when_test.rb +105 -0
- data/test/scheduler_test.rb +2 -2
- data/test/sec_test.rb +163 -0
- data/test/wfid_test.rb +69 -13
- metadata +31 -16
- data/lib/openwfe/expressions/fe_time.rb +0 -454
- data/test/restart_test.rb +0 -79
data/bin/validate-workflow.rb
CHANGED
@@ -0,0 +1,57 @@
|
|
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
|
+
def make
|
40
|
+
sequence do
|
41
|
+
concurrence do
|
42
|
+
participant :alice
|
43
|
+
participant :bob
|
44
|
+
end
|
45
|
+
participant :summarize
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# launching the process
|
52
|
+
|
53
|
+
li = OpenWFE::LaunchItem.new(TheProcessDefinition0)
|
54
|
+
|
55
|
+
li.initial_comment = "please give your impressions about http://ruby-lang.org"
|
56
|
+
|
57
|
+
engine.launch(li)
|
data/lib/openwfe/contextual.rb
CHANGED
@@ -47,6 +47,7 @@ require 'openwfe/rudefinitions'
|
|
47
47
|
require 'openwfe/service'
|
48
48
|
require 'openwfe/util/scheduler'
|
49
49
|
require 'openwfe/util/schedulers'
|
50
|
+
require 'openwfe/expool/wfidgen'
|
50
51
|
require 'openwfe/expool/expressionpool'
|
51
52
|
require 'openwfe/expool/expstorage'
|
52
53
|
require 'openwfe/expressions/expressionmap'
|
@@ -82,20 +83,41 @@ module OpenWFE
|
|
82
83
|
|
83
84
|
build_expression_map()
|
84
85
|
|
86
|
+
build_wfid_generator()
|
85
87
|
build_expression_pool()
|
86
88
|
build_expression_storage()
|
87
89
|
|
88
90
|
build_participant_map()
|
89
91
|
|
90
|
-
#
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
# a cron)
|
92
|
+
#get_expression_pool.reschedule()
|
93
|
+
|
94
|
+
linfo { "new() --- engine started --- #{self.object_id}" }
|
95
|
+
end
|
95
96
|
|
97
|
+
#
|
98
|
+
# Call this method once the participant for a persisted engine
|
99
|
+
# have been [re]added.
|
100
|
+
# If you call this method too soon, missing participants will
|
101
|
+
# cause troubles... Call this method after all the participants
|
102
|
+
# have been added.
|
103
|
+
#
|
104
|
+
def reschedule
|
96
105
|
get_expression_pool.reschedule()
|
106
|
+
end
|
97
107
|
|
98
|
-
|
108
|
+
alias :reload :reschedule
|
109
|
+
|
110
|
+
#
|
111
|
+
# When 'parameters' are used at the top of a process definition, this
|
112
|
+
# method can be used to assert a launchitem before launch.
|
113
|
+
# An expression will get raised if the parameters do not match the
|
114
|
+
# requirements.
|
115
|
+
#
|
116
|
+
# Note that the launch method will raise those exceptions as well.
|
117
|
+
# This method can be useful in some scenarii though.
|
118
|
+
#
|
119
|
+
def pre_launch_check (launchitem)
|
120
|
+
get_expression_pool.prepare_raw_expression(launchitem)
|
99
121
|
end
|
100
122
|
|
101
123
|
#
|
@@ -137,16 +159,6 @@ module OpenWFE
|
|
137
159
|
get_expression_pool.launch(launchitem, async)
|
138
160
|
end
|
139
161
|
|
140
|
-
#
|
141
|
-
# Returns the list of applied expressions belonging to a given
|
142
|
-
# workflow instance.
|
143
|
-
# May be used to determine where a process instance currently is.
|
144
|
-
#
|
145
|
-
def get_flow_position (workflow_instance_id)
|
146
|
-
|
147
|
-
get_expression_pool.get_flow_position(workflow_instance_id)
|
148
|
-
end
|
149
|
-
|
150
162
|
#
|
151
163
|
# This method is used to feed a workitem back to the engine (after
|
152
164
|
# it got sent to a worklist or wherever by a participant).
|
@@ -282,8 +294,11 @@ module OpenWFE
|
|
282
294
|
linfo { "stop() stopping engine '#{@service_name}'" }
|
283
295
|
|
284
296
|
@application_context.each do |name, service|
|
297
|
+
|
285
298
|
next if name == self.service_name
|
299
|
+
|
286
300
|
#service.stop if service.respond_to? :stop
|
301
|
+
|
287
302
|
if service.kind_of? ServiceMixin
|
288
303
|
service.stop
|
289
304
|
linfo do
|
@@ -294,6 +309,67 @@ module OpenWFE
|
|
294
309
|
end
|
295
310
|
end
|
296
311
|
|
312
|
+
#
|
313
|
+
# METHODS FROM THE EXPRESSION POOL
|
314
|
+
#
|
315
|
+
# These methods are 'proxy' to method found in the expression pool.
|
316
|
+
# They are made available here for a simpler model.
|
317
|
+
#
|
318
|
+
|
319
|
+
#
|
320
|
+
# Returns the list of applied expressions belonging to a given
|
321
|
+
# workflow instance.
|
322
|
+
# May be used to determine where a process instance currently is.
|
323
|
+
#
|
324
|
+
def get_flow_position (workflow_instance_id)
|
325
|
+
get_expression_pool.get_flow_position(workflow_instance_id)
|
326
|
+
end
|
327
|
+
alias :get_process_position :get_flow_position
|
328
|
+
|
329
|
+
#
|
330
|
+
# Lists all workflows (processes) currently in the expool (in
|
331
|
+
# the engine).
|
332
|
+
# This method will return a list of "process-definition" expressions
|
333
|
+
# (root of flows).
|
334
|
+
#
|
335
|
+
# If consider_subprocesses is set to true, "process-definition"
|
336
|
+
# expressions of subprocesses will be returned as well.
|
337
|
+
#
|
338
|
+
# "wfid_prefix" allows your to query for specific workflow instance
|
339
|
+
# id prefixes.
|
340
|
+
#
|
341
|
+
def list_workflows (consider_subprocesses=false, wfid_prefix=nil)
|
342
|
+
|
343
|
+
get_expression_pool.list_workflows(
|
344
|
+
consider_subprocesses, wfid_prefix)
|
345
|
+
end
|
346
|
+
alias :list_processes :list_workflows
|
347
|
+
|
348
|
+
#
|
349
|
+
# Given any expression of a process, cancels the complete process
|
350
|
+
# instance.
|
351
|
+
#
|
352
|
+
def cancel_flow (exp_or_wfid)
|
353
|
+
get_expression_pool.cancel_flow(exp_or_wfid)
|
354
|
+
end
|
355
|
+
alias :cancel_process :cancel_flow
|
356
|
+
|
357
|
+
#
|
358
|
+
# Cancels the given expression (and its children if any)
|
359
|
+
# (warning : advanced method)
|
360
|
+
#
|
361
|
+
def cancel_expression (exp_or_fei)
|
362
|
+
get_expression_pool.cancel(exp_or_fei)
|
363
|
+
end
|
364
|
+
|
365
|
+
#
|
366
|
+
# Forgets the given expression (make it an orphan)
|
367
|
+
# (warning : advanced method)
|
368
|
+
#
|
369
|
+
def forget_expression (exp_or_fei)
|
370
|
+
get_expression_pool.forget(exp_or_fei)
|
371
|
+
end
|
372
|
+
|
297
373
|
protected
|
298
374
|
|
299
375
|
#
|
@@ -303,7 +379,23 @@ module OpenWFE
|
|
303
379
|
|
304
380
|
def build_expression_map ()
|
305
381
|
|
306
|
-
|
382
|
+
@application_context[S_EXPRESSION_MAP] = ExpressionMap.new
|
383
|
+
#
|
384
|
+
# the expression map is not a Service anymore,
|
385
|
+
# it's a simple instance (that will be reused in other
|
386
|
+
# OpenWFEru components)
|
387
|
+
|
388
|
+
#ldebug do
|
389
|
+
# "build_expression_map() :\n" +
|
390
|
+
# get_expression_map.to_s
|
391
|
+
#end
|
392
|
+
end
|
393
|
+
|
394
|
+
def build_wfid_generator ()
|
395
|
+
|
396
|
+
#init_service(S_WFID_GENERATOR, DefaultWfidGenerator)
|
397
|
+
#init_service(S_WFID_GENERATOR, UuidWfidGenerator)
|
398
|
+
init_service(S_WFID_GENERATOR, KotobaWfidGenerator)
|
307
399
|
end
|
308
400
|
|
309
401
|
def build_expression_pool ()
|
@@ -47,7 +47,12 @@ require 'openwfe/expool/yamlexpstorage'
|
|
47
47
|
module OpenWFE
|
48
48
|
|
49
49
|
#
|
50
|
-
# An engine persisted to a tree of yaml files
|
50
|
+
# An engine persisted to a tree of yaml files.
|
51
|
+
#
|
52
|
+
# Remember that once you have added the participants to a persisted
|
53
|
+
# engine, you should call its reload method, to reschedule expressions
|
54
|
+
# like 'sleep', 'cron', ... But if you do it before registering the
|
55
|
+
# participants you'll end up with broken processes.
|
51
56
|
#
|
52
57
|
class FilePersistedEngine < Engine
|
53
58
|
|
@@ -68,6 +73,11 @@ module OpenWFE
|
|
68
73
|
#
|
69
74
|
# An engine with a cache in front of its file persisted expression storage.
|
70
75
|
#
|
76
|
+
# Remember that once you have added the participants to a persisted
|
77
|
+
# engine, you should call its reload method, to reschedule expressions
|
78
|
+
# like 'sleep', 'cron', ... But if you do it before registering the
|
79
|
+
# participants you'll end up with broken processes.
|
80
|
+
#
|
71
81
|
class CachedFilePersistedEngine < Engine
|
72
82
|
|
73
83
|
protected
|
@@ -0,0 +1,53 @@
|
|
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: workitem.rb 3555 2006-11-13 00:47:53Z jmettraux $
|
34
|
+
#
|
35
|
+
|
36
|
+
#
|
37
|
+
# Made in Japan
|
38
|
+
#
|
39
|
+
# john.mettraux@openwfe.org
|
40
|
+
#
|
41
|
+
|
42
|
+
|
43
|
+
module OpenWFE
|
44
|
+
|
45
|
+
#
|
46
|
+
# The exception thrown at launch time, when there are parameter missing
|
47
|
+
# or whose value isn't matching what is required.
|
48
|
+
#
|
49
|
+
class ParameterException < Exception
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|