lib/openwfe/expressions/fe_cursor.rb in openwferu-0.9.12 vs lib/openwfe/expressions/fe_cursor.rb in openwferu-0.9.12.863
- old
+ new
@@ -28,44 +28,25 @@
# 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.
#++
#
-# $Id: definitions.rb 2725 2006-06-02 13:26:32Z jmettraux $
-#
#
# "made in Japan"
#
# John Mettraux at openwfe.org
#
require 'openwfe/expressions/condition'
require 'openwfe/expressions/wtemplate'
require 'openwfe/expressions/flowexpression'
+require 'openwfe/expressions/fe_command'
-#
-# 'cursor' and 'loop' expressions
-#
-
module OpenWFE
- 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"
-
- A_STEP = "step"
-
#
# The 'cursor' is much like a sequence, but you can go
# back and forth within it, as it reads the field '\_\_cursor_command__' (or
# the field specified in the 'command-field' attribute) at each
# transition (each time it's supposed to move from one child expression to
@@ -91,10 +72,11 @@
# As you can see, you can directly set the value of the field
# '\_\_cursor_command__' or use a CursorCommandExpression like 'skip' or
# 'jump'.
#
class CursorExpression < WithTemplateExpression
+ include CommandMixin
names :cursor
attr_accessor \
:loop_id,
@@ -123,19 +105,12 @@
#
reply_to_parent(workitem)
return
end
- command_field = lookup_command_field workitem
+ command, step = determine_command_and_step workitem
- command, step = lookup_command command_field, workitem
-
- disallow_list = lookup_disallow workitem
-
- command = nil \
- if disallow_list and disallow_list.include?(command)
-
ldebug { "reply() command is '#{command} #{step}'" }
if command == C_BREAK or command == C_CANCEL
reply_to_parent workitem
return
@@ -167,12 +142,10 @@
@loop_id += 1
@current_child_id = 0
end
end
- workitem.attributes.delete(command_field)
-
@current_child_fei = nil
store_itself()
@current_child_fei = @children[@current_child_id]
@@ -213,50 +186,10 @@
c.each do |child|
@children << child \
if child.kind_of?(OpenWFE::FlowExpressionId)
end
end
-
- #
- # Looks up the value in the command field.
- #
- def lookup_command_field (workitem)
-
- lookup_attribute(A_COMMAND_FIELD, workitem, F_COMMAND)
- end
-
- #
- # Returns the command and the step
- #
- def lookup_command (command_field, workitem)
-
- command = workitem.attributes[command_field]
-
- return [ nil, 1 ] unless command
- #
- # this corresponds to the "just one step forward" default
-
- command, step = command.strip.split
-
- step = if step
- step.to_i
- else
- 1
- end
-
- step = -step if command == C_BACK
-
- [ command, step ]
- end
-
- #
- # Fetches the value of the 'disallow' cursor attribute.
- #
- def lookup_disallow (workitem)
-
- lookup_comma_list_attribute(A_DISALLOW, workitem)
- end
end
#
# The 'loop' expression is like 'cursor' but it doesn't exit until
# it's broken (with 'break' or 'cancel').
@@ -265,96 +198,9 @@
names :loop
def is_loop
true
- 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
- #
- class CursorCommandExpression < FlowExpression
- include ConditionMixin
-
- names :back, :skip, :continue, :break, :cancel, :rewind, :jump
-
- def apply (workitem)
-
- conditional = eval_condition(:if, workitem, :unless)
- #
- # for example : <break if="${approved} == true"/>
-
- if conditional == nil or conditional
-
- command = @fei.expression_name
-
- 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
-
- workitem.attributes[F_COMMAND] = command
- end
-
- reply_to_parent workitem
end
end
end