openwferu 0.9.0 → 0.9.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.
Files changed (51) hide show
  1. data/README +50 -2
  2. data/bin/validate-workflow.rb +64 -0
  3. data/lib/codec.rb +2 -0
  4. data/lib/controlclient.rb +19 -0
  5. data/lib/definitions.rb +2 -0
  6. data/lib/exception.rb +2 -0
  7. data/lib/flowexpressionid.rb +7 -5
  8. data/lib/openwferu.rb +2 -0
  9. data/lib/osocket.rb +2 -0
  10. data/lib/otime.rb +2 -0
  11. data/lib/restclient.rb +2 -0
  12. data/lib/ru/contextual.rb +2 -0
  13. data/lib/ru/dollar.rb +2 -0
  14. data/lib/ru/engine.rb +2 -0
  15. data/lib/ru/environment.rb +2 -0
  16. data/lib/ru/expressionmap.rb +5 -0
  17. data/lib/ru/expressionpool.rb +49 -6
  18. data/lib/ru/expressionstorage.rb +3 -1
  19. data/lib/ru/fe_base.rb +4 -1
  20. data/lib/ru/fe_concurrence.rb +82 -10
  21. data/lib/ru/fe_define.rb +2 -0
  22. data/lib/ru/fe_misc.rb +47 -0
  23. data/lib/ru/fe_participant.rb +2 -0
  24. data/lib/ru/fe_raw.rb +35 -19
  25. data/lib/ru/fe_subprocess.rb +2 -0
  26. data/lib/ru/fe_time.rb +2 -0
  27. data/lib/ru/fe_utils.rb +2 -0
  28. data/lib/ru/fe_value.rb +23 -12
  29. data/lib/ru/flowexpression.rb +26 -4
  30. data/lib/ru/logging.rb +2 -0
  31. data/lib/ru/participant.rb +2 -0
  32. data/lib/ru/participantmap.rb +2 -0
  33. data/lib/ru/participants.rb +2 -0
  34. data/lib/ru/rudefinitions.rb +9 -2
  35. data/lib/ru/ruutils.rb +3 -1
  36. data/lib/ru/scheduler.rb +2 -0
  37. data/lib/ru/schedulers.rb +2 -0
  38. data/lib/ru/service.rb +2 -0
  39. data/lib/test.rb +2 -0
  40. data/lib/utils.rb +49 -0
  41. data/lib/workitem.rb +9 -10
  42. data/lib/worklistclient.rb +18 -8
  43. data/test/flowtestbase.rb +7 -0
  44. data/test/ft_2_concurrence.rb +14 -2
  45. data/test/ft_6_lambda.rb +40 -0
  46. data/test/ft_7_losfor.rb +123 -0
  47. data/test/fulltest.rb +14 -0
  48. data/test/misctest.rb +30 -0
  49. data/test/{runtest.rb → quicktest.rb} +2 -2
  50. data/test/timetest.rb +2 -2
  51. metadata +54 -41
data/README CHANGED
@@ -7,7 +7,10 @@ Ruby 1.8.0 or later
7
7
  TODO
8
8
 
9
9
  == Installation
10
- TODO
10
+ Installation can be handled by Ruby gems. This will pull in any libraries
11
+ you will need to install
12
+
13
+ gem install -y openwferu
11
14
 
12
15
  == Overview
13
16
  OpenWFEru is a Ruby port of the OpenWFE workflow engine
@@ -29,11 +32,56 @@ These are mostly stolen from the unit tests
29
32
 
30
33
  Creating an workflow engine instance
31
34
 
35
+ require 'pp'
32
36
  require 'openwferu'
33
37
 
34
- engine = OpenWFEru::Engine.new()
38
+ # Create an engine to launch the flow
39
+ engine = OpenWFEru::Engine.new
35
40
  engine.register_participant('test-.*',
36
41
  OpenWFEru::PrintParticipant.new())
42
+ # Create a flow definition and assign to a new instance
43
+ flow = '''<process-definition name="equals_0" revision="0">
44
+ <sequence>
45
+ <equals value="a" other-value="a" />
46
+ <print>${field:__result__}</print>
47
+ </sequence>
48
+ </process-definition>'''
49
+ li = OpenWFE::LaunchItem.new
50
+ li.workflowDefinitionUrl = "field:__definition"
51
+ li.attributes['__definition'] = flow
52
+ # Launch the instance
53
+ engine.launch(li)
54
+ # Examine it
55
+ exp_storage = engine.application_context[OpenWFEru::S_EXPRESSION_STORAGE]
56
+ pp exp_storage
57
+
58
+ == How to help
59
+
60
+ If you want to help hacking on openwferu you'll probably want the following
61
+ libraries:
62
+ [+rake+] Handle builds, generating documentation, and running unit tests
63
+ [rubygems] Handles creation of the gems
64
+ [rote] A framework being used to help with managing the offline written docs
65
+ [redcloth] Openwferu uses textile-markup for its docs. Redcloth provides an engine for it.
66
+ [tidy] General cleanup
67
+ [libxml-ruby] Allows XSD validation
68
+
69
+ It's best if you use gems to install these as the process can get rather
70
+ tedious by hand.
71
+
72
+ === Prerequisites
73
+ You'll need libxml2-dev in order to compile the native libraries
74
+ for libxml. Please check your your packaging system for the appropriate
75
+ name.
76
+
77
+ On Ubuntu you can install libxml2 with:
78
+ sudo apt-get install libxml2-dev
79
+
80
+ === Ruby Libraries Install
81
+ 1. gem install -r rake
82
+ 2. gem install -r rote redcloth
83
+ 3. gem install -r tidy
84
+ 4. gem install -r libxml-ruby
37
85
 
38
86
  == Documentation
39
87
 
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Program Name: validate-workflow.rb
4
+ # Purpose: A helper script that validates a workflow document against
5
+ # a XML Schema
6
+ # Author: Alain Hoang
7
+ # Version: 0.1
8
+ # Notes: Uses Ruby's libxml library to handle the parsing
9
+
10
+ # Stdlib
11
+ require 'net/http'
12
+ require 'uri'
13
+ # From the gems archive
14
+ require 'rubygems'
15
+ require 'xml/libxml'
16
+
17
+
18
+ module OpenWFEru
19
+ # Validates a workflow definition against the Workflow XML Schema
20
+ # defined at http://www.openwfe.org/flowdef.xsd
21
+ class WorkflowValidator
22
+ OPENWFE_FLOWDEF_URL='http://www.openwfe.org/flowdef.xsd'
23
+
24
+ # Class method for validating a xml file against the
25
+ # OpenWFE XML Schema
26
+ def WorkflowValidator.validate(file)
27
+ # Should only be initialized once during the lifetime
28
+ # of the program
29
+ if not defined? @@schema
30
+ xsd_str = Net::HTTP.get URI.parse(OPENWFE_FLOWDEF_URL)
31
+ @@schema = XML::Schema.from_string(xsd_str)
32
+ end
33
+ xmldoc = XML::Document.file(file)
34
+ xmldoc.validate_schema(@@schema)
35
+ end
36
+ end
37
+ end
38
+
39
+ def usage
40
+ print "Usage: #{$0} <workflow def> [workflow def] [workflow def] ...\n"
41
+ print " <workflow def> - workflow definition file\n"
42
+ end
43
+
44
+ def main
45
+ # Make sure we have at least one argument or bail
46
+ if ARGV.length == 0
47
+ usage
48
+ exit 1
49
+ end
50
+
51
+ # Loop through all arguments and validate the file
52
+ ARGV.each do |f|
53
+ print "Trying to validate #{f}... "
54
+ if OpenWFEru::WorkflowValidator.validate(f)
55
+ print "PASSED\n"
56
+ else
57
+ print "FAILED\n"
58
+ end
59
+ end
60
+ end
61
+
62
+ if $0 == __FILE__
63
+ main
64
+ end
data/lib/codec.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #<tt>
2
3
  # Copyright (c) 2005-2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #</tt>
30
32
  #
31
33
  # $Id: codec.rb 2865 2006-06-23 14:54:07Z jmettraux $
32
34
  #
data/lib/controlclient.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2005-2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: controlclient.rb 3454 2006-10-08 16:51:00Z jmettraux $
32
34
  #
@@ -64,6 +66,19 @@ module OpenWFE
64
66
  return decode(r)
65
67
  end
66
68
 
69
+ #
70
+ # Returns the list of expressions currently applied for a given
71
+ # workflow instance
72
+ #
73
+ def get_flow_position (workflowInstanceId)
74
+
75
+ params = {}
76
+ params['id'] = workflowInstanceId
77
+
78
+ r = self.get('getflowposition', nil, params)
79
+ return decode(r)
80
+ end
81
+
67
82
  #
68
83
  # Cancels a given expression (and potentially its whole subtree)
69
84
  #
@@ -100,6 +115,10 @@ module OpenWFE
100
115
  return decode(self.post('unfreezeexpression', nil, params, fei))
101
116
  end
102
117
 
118
+ alias list_expressions listExpressions
119
+ alias cancel_expression cancelExpression
120
+ alias freeze_expression freezeExpression
121
+ alias unfreeze_expression unfreezeExpression
103
122
 
104
123
  protected
105
124
 
data/lib/definitions.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #<tt>
2
3
  # Copyright (c) 2005-2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #</tt>
30
32
  #
31
33
  # $Id: definitions.rb 3454 2006-10-08 16:51:00Z jmettraux $
32
34
  #
data/lib/exception.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #<tt>
2
3
  # Copyright (c) 2005-2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #</tt>
30
32
  #
31
33
  # $Id: exception.rb 3454 2006-10-08 16:51:00Z jmettraux $
32
34
  #
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2005-2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: workitem.rb 3555 2006-11-13 00:47:53Z jmettraux $
32
34
  #
@@ -65,7 +67,7 @@ module OpenWFE
65
67
  # overrides the classical to_s()
66
68
  #
67
69
  def to_s ()
68
- return "(fei #{@owfeVersion} #{@engineId}/#{@initialEngineId} #{@workflowDefinitionUrl} #{@workflowDefinitionName} #{@workflowDefinitionRevision} #{@workflowInstanceId} #{@expressionName} #{@expressionId} )"
70
+ return "(fei #{@owfeVersion} #{@engineId}/#{@initialEngineId} #{@workflowDefinitionUrl} #{@workflowDefinitionName} #{@workflowDefinitionRevision} #{@workflowInstanceId} #{@expressionName} #{@expressionId})"
69
71
  end
70
72
 
71
73
  #
@@ -127,10 +129,10 @@ module OpenWFE
127
129
 
128
130
  alias eql? ==
129
131
 
130
- #alias to_debug_s to_s
131
- def to_debug_s
132
- "#{to_s} (h#{hash}) (i#{object_id})"
133
- end
132
+ alias to_debug_s to_s
133
+ #def to_debug_s
134
+ # "#{to_s} (h#{hash}) (i#{object_id})"
135
+ #end
134
136
  end
135
137
 
136
138
  end
data/lib/openwferu.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #<tt>
2
3
  # Copyright (c) 2005-2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #</tt>
30
32
  #
31
33
  #++
32
34
  #
data/lib/osocket.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #<tt>
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #</tt>
30
32
  #
31
33
  # $Id: codec.rb 2515 2006-04-26 18:38:39Z jmettraux $
32
34
  #
data/lib/otime.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #<tt>
2
3
  # Copyright (c) 2005-2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #</tt>
30
32
  #
31
33
  # $Id: otime.rb 3509 2006-10-21 12:00:52Z jmettraux $
32
34
  #
data/lib/restclient.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2005-2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: restclient.rb 3454 2006-10-08 16:51:00Z jmettraux $
32
34
  #
data/lib/ru/contextual.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
data/lib/ru/dollar.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #<tt>
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #</tt>
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
data/lib/ru/engine.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
@@ -1,4 +1,5 @@
1
1
  #
2
+ #<tt>
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #</tt>
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
@@ -89,6 +91,9 @@ module OpenWFEru
89
91
 
90
92
  @map["reval"] = RevalExpression
91
93
  @map["print"] = PrintExpression
94
+
95
+ @map["lose"] = LoseExpression
96
+ @map["forget"] = ForgetExpression
92
97
  end
93
98
 
94
99
  #
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
@@ -119,18 +121,40 @@ module OpenWFEru
119
121
  end
120
122
 
121
123
  #
122
- # Applies a given expression (id)
124
+ # Evaluates a raw definition expression and
125
+ # returns its body fei
123
126
  #
124
- def apply (flowExpressionId, workitem)
127
+ def evaluate (rawExpression, workitem)
128
+ exp = rawExpression.instantiate_real_expression(workitem)
129
+ fei = exp.evaluate(workitem)
130
+ remove(rawExpression)
131
+ return fei
132
+ end
125
133
 
126
- ldebug { "apply() #{flowExpressionId.to_debug_s}" }
134
+ #
135
+ # Applies a given expression (id or expression)
136
+ #
137
+ def apply (exp, workitem)
127
138
 
128
- workitem.lastExpressionId = flowExpressionId
139
+ exp = fetch(exp) if exp.kind_of? OpenWFE::FlowExpressionId
140
+
141
+ ldebug { "apply() #{exp.fei.to_debug_s}" }
142
+
143
+ workitem.lastExpressionId = exp.fei
129
144
 
130
- exp = fetch(flowExpressionId)
131
145
  exp.apply(workitem)
132
146
  end
133
147
 
148
+ #
149
+ # Cancels the given expression
150
+ #
151
+ def cancel (exp)
152
+ exp = fetch(exp) if exp.kind_of? OpenWFE::FlowExpressionId
153
+ inflowitem = exp.cancel()
154
+ remove(exp)
155
+ return inflowitem
156
+ end
157
+
134
158
  #
135
159
  # Replies to the parent of the given expression.
136
160
  #
@@ -154,8 +178,23 @@ module OpenWFEru
154
178
  # Triggers the reply expression of the expression given by its id.
155
179
  #
156
180
  def reply (flowExpressionId, workitem)
157
- ldebug { "reply() #{flowExpressionId.to_debug_s}" }
181
+
182
+ ldebug { "reply() to #{flowExpressionId.to_debug_s}" }
183
+ ldebug { "reply() from #{workitem.last_expression_id}" }
184
+
158
185
  exp = fetch(flowExpressionId)
186
+
187
+ if not exp
188
+ #raise \
189
+ # "cannot reply to missing expression " +
190
+ # flowExpressionId.to_debug_s
191
+ lwarn do
192
+ "reply() cannot reply to missing "+
193
+ flowExpressionId.to_debug_s
194
+ end
195
+ return
196
+ end
197
+
159
198
  exp.reply(workitem)
160
199
  end
161
200
 
@@ -266,6 +305,10 @@ module OpenWFEru
266
305
 
267
306
  protected
268
307
 
308
+ def evaluate_definition (raw_definition, workitem)
309
+ expression = raw_definition.instantiate(workitem)
310
+ end
311
+
269
312
  def remove_environment (environment_id)
270
313
  env = fetch(environment_id)
271
314
  env.unbind()
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
@@ -82,7 +84,7 @@ module OpenWFEru
82
84
  if v.kind_of?(RawExpression)
83
85
  s << "*raw"
84
86
  else
85
- s << " "
87
+ s << " "
86
88
  end
87
89
  s << v.to_s
88
90
  s << " key/value mismatch !" if k != v.fei
data/lib/ru/fe_base.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
@@ -86,7 +88,8 @@ module OpenWFEru
86
88
  end
87
89
  found = false
88
90
  @children.each do |c|
89
- ldebug { "next_fei() considering #{c} (found ? #{found})" }
91
+ #ldebug { "next_fei() considering #{c} (found ? #{found})" }
92
+ ldebug { "next_fei() considering #{c}" }
90
93
  if found
91
94
  return c if c.kind_of?(OpenWFE::FlowExpressionId)
92
95
  next
@@ -1,4 +1,5 @@
1
1
  #
2
+ #--
2
3
  # Copyright (c) 2006, John Mettraux, OpenWFE.org
3
4
  # All rights reserved.
4
5
  #
@@ -27,6 +28,7 @@
27
28
  # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
29
  # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
30
  # POSSIBILITY OF SUCH DAMAGE.
31
+ #++
30
32
  #
31
33
  # $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
32
34
  #
@@ -37,6 +39,7 @@
37
39
  # John Mettraux at openwfe.org
38
40
  #
39
41
 
42
+ require 'monitor'
40
43
  require 'ru/flowexpression'
41
44
  require 'ru/rudefinitions'
42
45
  require 'ru/ruutils'
@@ -57,14 +60,20 @@ module OpenWFEru
57
60
 
58
61
  sync = lookup_attribute(A_SYNC, workitem)
59
62
  sync = "generic" if not sync
60
- @sync_expression = get_expression_map().get_sync_class(sync).new()
63
+
64
+ @sync_expression = \
65
+ get_expression_map().get_sync_class(sync).new(@attributes)
61
66
 
62
67
  #threads = []
63
68
 
69
+ @children.each do |child|
70
+ @sync_expression.add_child(child)
71
+ end
72
+
64
73
  @children.each do |child|
65
74
  t = Thread.new do
66
75
  begin
67
- @sync_expression.apply_child(self, child, workitem)
76
+ get_expression_pool().apply(child, workitem.dup)
68
77
  rescue Exception => e
69
78
  lwarn do
70
79
  "apply() caught exception in concurrent child\n" +
@@ -93,29 +102,92 @@ module OpenWFEru
93
102
 
94
103
  class GenericSyncExpression < SyncExpression
95
104
 
96
- def initialize ()
105
+ attr_accessor \
106
+ :remaining_children,
107
+ :count,
108
+ :reply_count,
109
+ :cancel_remaining
110
+
111
+ def initialize (attributes)
112
+
97
113
  super()
114
+
115
+ @remaining_children = []
98
116
  @reply_count = 0
117
+
118
+ @count = determine_count(attributes)
119
+ @cancel_remaining = determine_remaining(attributes)
99
120
  end
100
121
 
101
- def apply_child (synchable, child, workitem)
102
- synchronize do
103
- @application_context = synchable.application_context
104
- ldebug { "apply_child() #{child.to_debug_s}" }
105
- synchable.get_expression_pool().apply(child, workitem.dup)
106
- end
122
+ def add_child (child)
123
+ @remaining_children << child
107
124
  end
108
125
 
109
126
  def reply (synchable, workitem)
110
127
  synchronize do
128
+
111
129
  @application_context = synchable.application_context
130
+ #
131
+ # ldebug uses the application context
132
+
112
133
  ldebug { "reply() #{workitem.lastExpressionId.to_debug_s}" }
134
+
113
135
  @reply_count = @reply_count + 1
136
+
137
+ @remaining_children.delete(workitem.last_expression_id)
138
+
114
139
  return workitem \
115
- if @reply_count >= synchable.children.length
140
+ if @remaining_children.length <= 0
141
+
142
+ if @count > 0 and @reply_count >= @count
143
+ treat_remaining_children(synchable)
144
+ return workitem
145
+ end
146
+
116
147
  return nil
117
148
  end
118
149
  end
150
+
151
+ protected
152
+
153
+ def treat_remaining_children (synchable)
154
+
155
+ expool = synchable.get_expression_pool
156
+
157
+ @remaining_children.each do |child|
158
+ if @cancel_remaining
159
+ expool.cancel(child)
160
+ else
161
+ expool.remove(child)
162
+ end
163
+ end
164
+ end
165
+
166
+ def determine_remaining (attributes)
167
+ return attributes[A_REMAINING] == REM_CANCEL
168
+ end
169
+
170
+ def determine_count (attributes)
171
+ s = attributes[A_COUNT]
172
+ return -1 if not s
173
+ i = s.to_i
174
+ return -1 if i < 1
175
+ return i
176
+ end
177
+ end
178
+
179
+ #
180
+ # Merges a workitem (source) into another (target).
181
+ # If inPlace is left to false, a brand new workitem is returned,
182
+ # else the merge occurs directly into the target workitem.
183
+ #
184
+ def merge (wiTarget, wiSource, inPlace=false)
185
+
186
+ wiTarget = wiTarget.dup if not inPlace
187
+
188
+ wiSource.attributes.each do | k, v |
189
+ wiTarget.attributes[k.dup] = v.dup
190
+ end
119
191
  end
120
192
 
121
193
  end