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