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