lib/openwfe/expressions/fe_command.rb in ruote-0.9.19 vs lib/openwfe/expressions/fe_command.rb in ruote-0.9.20
- old
+ new
@@ -1,43 +1,29 @@
-#
#--
-# Copyright (c) 2007-2008, John Mettraux, OpenWFE.org
-# All rights reserved.
+# Copyright (c) 2007-2009, John Mettraux, jmettraux@gmail.com
#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
#
-# . Redistributions of source code must retain the above copyright notice, this
-# list of conditions and the following disclaimer.
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
#
-# . Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
-# and/or other materials provided with the distribution.
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
#
-# . Neither the name of the "OpenWFE" nor the names of its contributors may be
-# used to endorse or promote products derived from this software without
-# specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-# POSSIBILITY OF SUCH DAMAGE.
+# Made in Japan.
#++
-#
-#
-# "made in Japan"
-#
-# John Mettraux at openwfe.org
-#
require 'openwfe/expressions/condition'
module OpenWFE
@@ -48,93 +34,103 @@
#
module CommandConstants
protected
- A_COMMAND_FIELD = "command-field"
- F_COMMAND = "__cursor_command__"
- A_DISALLOW = "disallow"
+ A_COMMAND_FIELD = 'command-field'
+ F_COMMAND = '__cursor_command__'
+ A_DISALLOW = 'disallow'
- C_BACK = "back"
- C_SKIP = "skip"
- C_BREAK = "break"
- C_CANCEL = "cancel"
- C_REWIND = "rewind"
- C_CONTINUE = "continue"
- C_JUMP = "jump"
+ C_BACK = 'back'
+ C_SKIP = 'skip'
- A_STEP = "step"
+ C_BREAK = 'break'
+ C_CANCEL = 'cancel'
+ C_OVER = 'over'
+ BREAK_COMMANDS = [ C_BREAK, C_CANCEL, C_OVER ]
+
+ C_REWIND = 'rewind'
+ C_CONTINUE = 'continue'
+ C_JUMP = 'jump'
+
+ A_STEP = 'step'
end
#
# A mixin shared by 'iterator' and 'cursor' ('loop'), simply
# provides the methods for looking up the "command" (break, skip,
# rewind, ...) from the workitem and the process.
#
module CommandMixin
include CommandConstants
+ include ConditionMixin
protected
- def determine_command_and_step (workitem)
+ def determine_command_and_step (workitem)
- command_field = lookup_command_field workitem
+ #
+ # at first, look at the condition attribute
- command, step = lookup_command command_field, workitem
+ %w{ break rewind }.each do |cmd|
+ return [ cmd, 0 ] \
+ if eval_condition("#{cmd}-if", workitem, "#{cmd}-unless")
+ end
- disallow_list = lookup_disallow workitem
+ #
+ # then look at the command field
- command = nil \
- if disallow_list and disallow_list.include?(command)
+ command_field = lookup_command_field(workitem)
- workitem.attributes.delete(command_field)
+ command, step = lookup_command(command_field, workitem)
- [ command, step ]
- end
+ disallow_list = lookup_disallow(workitem)
- private
+ command = nil \
+ if disallow_list and disallow_list.include?(command)
- #
- # Looks up the value in the command field.
- #
- def lookup_command_field (workitem)
+ workitem.attributes.delete(command_field)
- lookup_attribute(
- A_COMMAND_FIELD, workitem, :default => F_COMMAND)
- end
+ [ command, step ]
+ end
- #
- # Returns the command and the step
- #
- def lookup_command (command_field, workitem)
+ private
- command = workitem.attributes[command_field]
+ #
+ # Looks up the value in the command field.
+ #
+ def lookup_command_field (workitem)
- return [ nil, 1 ] unless command
- #
- # this corresponds to the "just one step forward" default
+ lookup_attribute(A_COMMAND_FIELD, workitem, :default => F_COMMAND)
+ end
- command, step = command.strip.split
+ #
+ # Returns the command and the step
+ #
+ def lookup_command (command_field, workitem)
- step = if step
- step.to_i
- else
- 1
- end
+ command = workitem.attributes[command_field]
- step = -step if command == C_BACK
+ return [ nil, 1 ] unless command
+ #
+ # this corresponds to the "just one step forward" default
- [ command, step ]
- end
+ command, step = command.strip.split
- #
- # Fetches the value of the 'disallow' cursor attribute.
- #
- def lookup_disallow (workitem)
+ step = step ? step.to_i : 1
+ step = -step if command == C_BACK
- lookup_array_attribute A_DISALLOW, workitem
- end
+ [ command, step ]
+ end
+
+ #
+ # Fetches the value of the 'disallow' cursor attribute.
+ #
+ def lookup_disallow (workitem)
+
+ lookup_array_attribute(A_DISALLOW, workitem)
+ end
end
#
# This class implements the following expressions : back, break,
# cancel, continue, jump, rewind, skip.
@@ -209,11 +205,11 @@
#
class CursorCommandExpression < FlowExpression
include CommandConstants
include ConditionMixin
- names :back, :skip, :continue, :break, :cancel, :rewind, :jump
+ names :back, :skip, :continue, :break, :cancel, :rewind, :jump, :over
def apply (workitem)
conditional = eval_condition(:if, workitem, :unless)
#
@@ -231,10 +227,10 @@
command = "#{command} #{step}" #if step != 1
workitem.attributes[F_COMMAND] = command
end
- reply_to_parent workitem
+ reply_to_parent(workitem)
end
end
end