lib/openwfe/expressions/fe_command.rb in ruote-0.9.18 vs lib/openwfe/expressions/fe_command.rb in ruote-0.9.19
- old
+ new
@@ -1,34 +1,34 @@
#
#--
# Copyright (c) 2007-2008, John Mettraux, OpenWFE.org
# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
+#
+# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
-#
+#
# . Redistributions of source code must retain the above copyright notice, this
-# list of conditions and the following disclaimer.
-#
-# . Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimer in the documentation
+# list of conditions and the following disclaimer.
+#
+# . 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.
-#
+#
# . 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
+#
+# 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.
#++
#
#
@@ -40,202 +40,202 @@
require 'openwfe/expressions/condition'
module OpenWFE
- #
- # Some constants shared by 'cursor', 'loop', 'iterator' and
- # the CommandExpression.
- #
- module CommandConstants
+ #
+ # Some constants shared by 'cursor', 'loop', 'iterator' and
+ # the CommandExpression.
+ #
+ module CommandConstants
- protected
+ 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"
+ C_BREAK = "break"
+ C_CANCEL = "cancel"
+ C_REWIND = "rewind"
+ C_CONTINUE = "continue"
+ C_JUMP = "jump"
- A_STEP = "step"
- end
+ 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
+ #
+ # 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
- protected
+ protected
- def determine_command_and_step (workitem)
+ def determine_command_and_step (workitem)
- command_field = lookup_command_field workitem
+ command_field = lookup_command_field workitem
- command, step = lookup_command command_field, workitem
+ command, step = lookup_command command_field, workitem
- disallow_list = lookup_disallow workitem
+ disallow_list = lookup_disallow workitem
- command = nil \
- if disallow_list and disallow_list.include?(command)
+ command = nil \
+ if disallow_list and disallow_list.include?(command)
- workitem.attributes.delete(command_field)
+ workitem.attributes.delete(command_field)
- [ command, step ]
- end
+ [ command, step ]
+ end
- private
+ private
- #
- # Looks up the value in the command field.
- #
- def lookup_command_field (workitem)
+ #
+ # Looks up the value in the command field.
+ #
+ def lookup_command_field (workitem)
- lookup_attribute(
- A_COMMAND_FIELD, workitem, :default => F_COMMAND)
- end
+ lookup_attribute(
+ A_COMMAND_FIELD, workitem, :default => F_COMMAND)
+ end
- #
- # Returns the command and the step
- #
- def lookup_command (command_field, workitem)
+ #
+ # Returns the command and the step
+ #
+ def lookup_command (command_field, workitem)
- command = workitem.attributes[command_field]
+ command = workitem.attributes[command_field]
- return [ nil, 1 ] unless command
- #
- # this corresponds to the "just one step forward" default
+ return [ nil, 1 ] unless command
+ #
+ # this corresponds to the "just one step forward" default
- command, step = command.strip.split
+ command, step = command.strip.split
- step = if step
- step.to_i
- else
- 1
- end
+ step = if step
+ step.to_i
+ else
+ 1
+ end
- step = -step if command == C_BACK
+ step = -step if command == C_BACK
- [ command, step ]
- end
+ [ command, step ]
+ end
- #
- # Fetches the value of the 'disallow' cursor attribute.
- #
- def lookup_disallow (workitem)
+ #
+ # Fetches the value of the 'disallow' cursor attribute.
+ #
+ def lookup_disallow (workitem)
- lookup_array_attribute A_DISALLOW, workitem
- end
- end
+ lookup_array_attribute A_DISALLOW, workitem
+ end
+ end
- #
- # This class implements the following expressions : back, break,
- # cancel, continue, jump, rewind, skip.
- #
- # They are generally used inside of a 'cursor' (CursorExpression) or
- # a 'loop' (LoopExpression), they can be used outside, but their result
- # (the value of the field '\_\_cursor_command__' will be used as soon as the
- # flow enters a cursor or a loop).
- #
- # In fact, this expression is only a nice wrapper that sets the
- # value of the field "\_\_cursor_command__" to its name ('back' for example)
- # plus to the 'step' attribute value.
- #
- # For example <skip step="3"/> simply sets the value of the field
- # '\_\_cursor_command__' to 'skip 3'.
- #
- # (The field \_\_cursor_command__ is, by default, read and
- # obeyed by the 'cursor' expression).
- #
- # With Ruby process definitions, you can directly write :
- #
- # skip 2
- # jump "0"
- #
- # instead of
- #
- # skip :step => "2"
- # jump :step => "0"
- #
- # Likewise, in an XML process definition, you can write
- #
- # <skip>2</skip>
- #
- # although that might still look lighter (it's longer though) :
- #
- # <skip step="2"/>
- #
- #
- # About the command themselves :
- #
- # * back : will go back from the number of given steps, 1 by default
- # * break : will exit the cursor (or the loop)
- # * cancel : an alias for 'break'
- # * continue : will exit the cursor, if in a loop, will get back at step 0
- # * jump : will move the cursor (or loop) to an absolute given position (count starts at 0)
- # * rewind : an alias for continue
- # * skip : skips the given number of steps
- #
- #
- # All those command support an 'if' attribute to restrict their execution :
- #
- # cursor do
- # go_to_shop
- # check_prices
- # _break :if => "${price} > ${f:current_cash}"
- # buy_stuff
- # end
- #
- # The 'rif' attribute may be used instead of the 'if' attribute. Its value
- # is some ruby code that, when evaluating to true will let the command
- # be executed.
- #
- # _skip 2, :rif => "workitem.customers.size % 2 == 0"
- # #
- # # skips if the nb of customers is pair
- #
- # Note that the 'rif' attribute will work only if the
- # <tt>:ruby_eval_allowed</tt> parameter is set to true in the engine's
- # application context.
- #
- # engine.application_context[:ruby_eval_allowed] = true
- #
- class CursorCommandExpression < FlowExpression
- include CommandConstants
- include ConditionMixin
+ #
+ # This class implements the following expressions : back, break,
+ # cancel, continue, jump, rewind, skip.
+ #
+ # They are generally used inside of a 'cursor' (CursorExpression) or
+ # a 'loop' (LoopExpression), they can be used outside, but their result
+ # (the value of the field '\_\_cursor_command__' will be used as soon as the
+ # flow enters a cursor or a loop).
+ #
+ # In fact, this expression is only a nice wrapper that sets the
+ # value of the field "\_\_cursor_command__" to its name ('back' for example)
+ # plus to the 'step' attribute value.
+ #
+ # For example <skip step="3"/> simply sets the value of the field
+ # '\_\_cursor_command__' to 'skip 3'.
+ #
+ # (The field \_\_cursor_command__ is, by default, read and
+ # obeyed by the 'cursor' expression).
+ #
+ # With Ruby process definitions, you can directly write :
+ #
+ # skip 2
+ # jump "0"
+ #
+ # instead of
+ #
+ # skip :step => "2"
+ # jump :step => "0"
+ #
+ # Likewise, in an XML process definition, you can write
+ #
+ # <skip>2</skip>
+ #
+ # although that might still look lighter (it's longer though) :
+ #
+ # <skip step="2"/>
+ #
+ #
+ # About the command themselves :
+ #
+ # * back : will go back from the number of given steps, 1 by default
+ # * break : will exit the cursor (or the loop)
+ # * cancel : an alias for 'break'
+ # * continue : will exit the cursor, if in a loop, will get back at step 0
+ # * jump : will move the cursor (or loop) to an absolute given position (count starts at 0)
+ # * rewind : an alias for continue
+ # * skip : skips the given number of steps
+ #
+ #
+ # All those command support an 'if' attribute to restrict their execution :
+ #
+ # cursor do
+ # go_to_shop
+ # check_prices
+ # _break :if => "${price} > ${f:current_cash}"
+ # buy_stuff
+ # end
+ #
+ # The 'rif' attribute may be used instead of the 'if' attribute. Its value
+ # is some ruby code that, when evaluating to true will let the command
+ # be executed.
+ #
+ # _skip 2, :rif => "workitem.customers.size % 2 == 0"
+ # #
+ # # skips if the nb of customers is pair
+ #
+ # Note that the 'rif' attribute will work only if the
+ # <tt>:ruby_eval_allowed</tt> parameter is set to true in the engine's
+ # application context.
+ #
+ # engine.application_context[:ruby_eval_allowed] = true
+ #
+ class CursorCommandExpression < FlowExpression
+ include CommandConstants
+ include ConditionMixin
- names :back, :skip, :continue, :break, :cancel, :rewind, :jump
+ names :back, :skip, :continue, :break, :cancel, :rewind, :jump
- def apply (workitem)
+ def apply (workitem)
- conditional = eval_condition(:if, workitem, :unless)
- #
- # for example : <break if="${approved} == true"/>
+ conditional = eval_condition(:if, workitem, :unless)
+ #
+ # for example : <break if="${approved} == true"/>
- if conditional == nil or conditional
+ if conditional == nil or conditional
- command = @fei.expression_name
+ command = @fei.expression_name
- step = lookup_attribute(A_STEP, workitem)
- step = fetch_text_content(workitem) unless step
- step = 1 unless step
- step = Integer(step)
+ step = lookup_attribute(A_STEP, workitem)
+ step = fetch_text_content(workitem) unless step
+ step = 1 unless step
+ step = Integer(step)
- command = "#{command} #{step}" #if step != 1
+ command = "#{command} #{step}" #if step != 1
- workitem.attributes[F_COMMAND] = command
- end
+ workitem.attributes[F_COMMAND] = command
+ end
- reply_to_parent workitem
- end
+ reply_to_parent workitem
end
+ end
end