| Class | OpenWFE::CursorExpression |
| In: |
lib/openwfe/expressions/fe_cursor.rb
|
| Parent: | WithTemplateExpression |
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 the next).
cursor do
participant "alpha"
skip :step => "2"
participant "bravo"
participant "charly"
set :field => "__cursor_command__", value => "2"
participant "delta"
participant "echo"
skip 2
participant "fox"
#
# in that cursor example, only the participants alpha, charly and
# echo will be handed a workitem
# (notice the last 'skip' with its light syntax)
#
end
As you can see, you can directly set the value of the field ‘__cursor_command__’ or use a CursorCommandExpression like ‘skip’ or ‘jump’.
| current_child_id | [RW] | what is the index of the child we‘re currently executing |
| loop_id | [RW] | the integer identifier for the current loop |
# File lib/openwfe/expressions/fe_cursor.rb, line 92
92: def apply (workitem)
93:
94: new_environment
95:
96: @loop_id = 0
97:
98: @current_child_id = -1
99:
100: clean_children_list
101:
102: reply workitem
103: end
takes care of cancelling the current child if necessary
# File lib/openwfe/expressions/fe_cursor.rb, line 166
166: def cancel
167:
168: cfei = current_child_fei
169: get_expression_pool.cancel(cfei) if cfei
170:
171: super
172: end
Returns false, the child class LoopExpression does return true.
# File lib/openwfe/expressions/fe_cursor.rb, line 177
177: def is_loop
178:
179: false
180: end
# File lib/openwfe/expressions/fe_cursor.rb, line 105
105: def reply (workitem)
106:
107: return reply_to_parent(workitem) \
108: if @children.length < 1
109: #
110: # well, currently, no infinite empty loop allowed
111:
112: command, step = determine_command_and_step workitem
113:
114: ldebug { "reply() command is '#{command} #{step}'" }
115:
116: if command == C_BREAK or command == C_CANCEL
117: return reply_to_parent(workitem)
118: end
119:
120: if command == C_REWIND or command == C_CONTINUE
121:
122: @current_child_id = 0
123:
124: elsif command and command.match("^#{C_JUMP}")
125:
126: @current_child_id = step
127: @current_child_id = 0 if @current_child_id < 0
128:
129: @current_child_id = @children.length - 1 \
130: if @current_child_id >= @children.length
131:
132: else # C_SKIP or C_BACK
133:
134: @current_child_id = @current_child_id + step
135:
136: @current_child_id = 0 if @current_child_id < 0
137:
138: if @current_child_id >= @children.length
139:
140: return reply_to_parent(workitem) unless is_loop
141:
142: @loop_id += 1
143: @current_child_id = 0
144: end
145: end
146:
147: template_fei = @children[@current_child_id]
148:
149: #
150: # launch the next child as a template
151:
152: get_expression_pool.launch_template(
153: self,
154: @environment_id,
155: @loop_id,
156: template_fei,
157: workitem,
158: nil)
159:
160: store_itself
161: end
Makes sure that only flow expression are left in the cursor children list (text and comment nodes get discarded).
# File lib/openwfe/expressions/fe_cursor.rb, line 202
202: def clean_children_list
203:
204: c = @children
205: @children = []
206: c.each do |child|
207: @children << child \
208: if child.kind_of?(OpenWFE::FlowExpressionId)
209: end
210: end
Determines the fei of the child being currently executed. This method is used by cancel().
# File lib/openwfe/expressions/fe_cursor.rb, line 188
188: def current_child_fei
189:
190: cfei = @children[@current_child_id].dup
191:
192: return nil unless cfei
193:
194: cfei.wfid = cfei.wfid + '.' + @loop_id.to_s
195: cfei
196: end