openwferu 0.9.6 → 0.9.7
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/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
|
+
|